这个是LABVIEW界面,DS18B20的传感器接收温度,给单片机,单片机显示并通过串口发送给LABVIEW,labview生成TXT文件,并保存历史数据。压缩包里的单片机程序。单片机采用是51的单片机,数码管显示。使用的时候一定要连接串口。
单片机源程序如下:- #include<reg51.h>
- #include<intrins.h>
- sbit PS0=P2^4;//数码管小数点后第1位
- sbit PS1=P2^5;//数码管个位
- sbit PS2=P2^6;//数码管十位
- sbit PS3=P2^7;//数码管百位
- sfr P_data=0x80;//P0口为显示数据输出口
- sbit DQ=P3^6;//DS18B20数据接口
- void delay(unsigned int);//延时函数
- void DS18B20_init(void); //DS18B20初始化
- unsigned int get_temper(void); //读取温度程序
- void DS18B20_write(unsigned char in_data); //DS18B20写数据函数
- unsigned char DS18B20_read(void);////读取数据程序
- unsigned int htd(unsigned int a); //进制转换函数
- void display(unsigned int a);//显示函数
- float temp;//温度寄存器
- bit DS18B20; // 18B20存在标志,1---存在 0---不存在
-
- unsigned char tab[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字段转换表
-
- void main(void)
- {
- unsigned int a,temp;
- TMOD=0x20; //定时器1--方式2
- //PCON=0x80; //电源控制 19200
- TL1=0xfd;
- TH1=0xfd; //11.0592MHZ晶振,波特率为9600
- SCON=0x50; //方式1
- TR1=1; //启动定时
-
- temp=get_temper();//这段程序用于避开刚上电时显示85的问题
- for(a=0;a<200;a++)
- delay(500);
- while(1)
- {
- temp=get_temper();//测量温度
- for(a=0;a<100;a++)//显示,兼有延时的作用
- display(htd(temp));
- SBUF=(unsigned char)(temp>>8); //将温度发送给PC
- while(TI!=1);
- TI=0;
- SBUF=(unsigned char)temp;
- while(TI!=1);
- TI=0;
- }
- }
- /****************************DS18B20读取温度函数**************************/
- /*函数原型:void get_temper(void)
- /*函数功能:DS18B20读取温度
- /*输入参数:无
- /*输出参数:无
- /*调用模块:
- /**********************************************************************/
- unsigned int get_temper(void)
- {
- unsigned char k,T_sign,T_L,T_H;
- DS18B20_init(); //DS18B20初始化
- if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
- {
- DS18B20_write(0xcc); // 跳过ROM匹配
- DS18B20_write(0x44); //发出温度转换命令
- DS18B20_init(); //DS18B20初始化
- if(DS18B20) //判断DS1820是否存在?若DS18B20不存在则返回
- {
- DS18B20_write(0xcc);//跳过ROM匹配
- DS18B20_write(0xbe);//发出读温度命令
- T_L=DS18B20_read();//数据读出
- T_H=DS18B20_read();
- k=T_H&0xf8;
- if(k==0xf8)
- T_sign=1; //温度是负数
- else
- T_sign=0; //温度是正数
- T_H=T_H&0x07;
- temp=(T_H*256+T_L)*10*0.0625; //温度转换常数 乘以10 是因为要保留1位小数
- return (temp);
- }
- }
-
- }
- /****************************DS18B20写数据函数**************************/
- /*函数原型:void DS18B20_write(uchar in_data)
- /*函数功能:DS18B20写数据
- /*输入参数:要发送写入的数据
- /*输出参数:无
- /*调用模块:_cror_()
- /**********************************************************************/
- void DS18B20_write(unsigned char in_data) //写DS18B20的子程序(有具体的时序要求)
- {
- unsigned char i,out_data,k;
- out_data=in_data;
- for(i=1;i<9;i++) //串行发送数据
- {
- DQ=0;
- DQ=1;
- _nop_();
- _nop_();
- k=out_data&0x01;
- if(k==0x01) //判断数据 写1
- {
- DQ=1;
- }
- else //写0
- {
- DQ=0;
- }
- delay(4); //延时62us
- DQ=1;
- out_data=_cror_(out_data,1); //循环左移1位
- }
- }
- /**************************DS18B20读函数**************************/
- /*函数原型:void DS18B20_read()
- /*函数功能:DS18B20读数据
- /*输入参数:无
- /*输出参数:读到的一字节内容
- /*调用模块:delay()
- /******************************************************************/
- unsigned char DS18B20_read()
- {
- unsigned char i,in_data,k;
- in_data=0;
- for(i=1;i<9;i++) //串行发送数据
- {
- DQ=0;
- DQ=1;
- _nop_();
- _nop_();
- k=DQ; //读DQ端
- if(k==1) //读到的数据是1
- {
- in_data=in_data|0x01;
- }
- else
- {
- in_data=in_data|0x00;
- }
- delay(3); //延时51us
- DQ=1;
- in_data=_cror_(in_data,1); //循环右移1位
- }
- return(in_data);
- }
- /**************************DS18B20初始化函数**************************/
- /*函数原型:void DS18B20_init(void)
- /*函数功能:DS18B20初始化
- /*输入参数:无
- /*输出参数:无
- /*调用模块:delay()
- /******************************************************************/
- void DS18B20_init(void)
- {
- unsigned char a;
- DQ=1;//主机发出复位低脉冲
- DQ=0;
- delay(44); //延时540US
- DQ=1;
- for(a=0;a<0x36&&DQ==1;a++)
- {
- a++;
- a--; //等待DS18B20回应
- }
- if(DQ)
- DS18B20=0; //18B20不存在
- else
- {
- DS18B20=1; // 18B20存在
- delay(120); //复位成功!延时240US
- }
- }
-
- /**************************数码管显示函数**************************/
- /*函数原型:void display(void)
- /*函数功能:数码管显示
- /*输入参数:无
- /*输出参数:无
- /*调用模块:delay()
- /******************************************************************/
- void display(unsigned int a)
- {
- P_data=tab[a&0x0f];//显示小数点后第1位
- PS0=0;
- PS1=1;
- PS2=1;
- PS3=1;
- delay(200);
- P_data=tab[(a>>4)&0x0f]|0x01; //显示个位
- PS0=1;
- PS1=0;
- delay(200);
- P_data=tab[(a>>8)&0x0f];//显示十位
- PS1=1;
- PS2=0;
- delay(200);
- P_data=tab[(a>>12)&0x0f];//显示百位
- PS2=1;
- PS3=0;
- delay(200);
- PS3=1;
- P_data=0xff;//恢复数据口
- }
- /**************************十六进制转十进制函数**************************/
- /*函数原型:uint htd(uint a)
- /*函数功能:十六进制转十进制
- /*输入参数:要转换的数据
- /*输出参数:转换后的数据
- /*调用模块:无
- /******************************************************************/
- unsigned int htd(unsigned int a)
- {
- unsigned int b,c;
- b=a%10;
- c=b;
- a=a/10;
- b=a%10;
- c=c+(b<<4);
- a=a/10;
- b=a%10;
- c=c+(b<<8);
- a=a/10;
- b=a%10;
- c=c+(b<<12);
- return c;
- }
- /*******************************延时函数*********************************/
- /*函数原型:delay(unsigned int delay_time)
- /*函数功能:延时函数
- /*输入参数:delay_time (输入要延时的时间)
- /*输出参数:无
- /*调用模块:无
- /**********************************************************************/
- void delay(unsigned int delay_time) //延时子程序
- {for(;delay_time>0;delay_time--)
- {}
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|
|