找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3573|回复: 3
收起左侧

LABVIEW基于单片机串口的温度显示DS8B20并用文本保存

[复制链接]
ID:210588 发表于 2020-4-28 11:00 | 显示全部楼层 |阅读模式
这个是LABVIEW界面,DS18B20的传感器接收温度,给单片机,单片机显示并通过串口发送给LABVIEW,labview生成TXT文件,并保存历史数据。压缩包里的单片机程序。如果问题加群QQ:721277962(备注来自51黑)互相学习。单片机采用是51的单片机,数码管显示。使用的时候一定要连接串口。
11.png

单片机源程序如下:
  1. #include<reg51.h>  
  2. #include<intrins.h>

  3. sbit PS0=P2^4;//数码管小数点后第1位   
  4. sbit PS1=P2^5;//数码管个位   
  5. sbit PS2=P2^6;//数码管十位           
  6. sbit PS3=P2^7;//数码管百位
  7. sfr  P_data=0x80;//P0口为显示数据输出口
  8. sbit DQ=P3^6;//DS18B20数据接口

  9. void delay(unsigned int);//延时函数
  10. void DS18B20_init(void);   //DS18B20初始化
  11. unsigned int get_temper(void);    //读取温度程序
  12. void DS18B20_write(unsigned char in_data); //DS18B20写数据函数
  13. unsigned char DS18B20_read(void);////读取数据程序         
  14. unsigned int htd(unsigned int a); //进制转换函数
  15. void display(unsigned int a);//显示函数

  16. float temp;//温度寄存器
  17. bit DS18B20; //        18B20存在标志,1---存在 0---不存在
  18.    
  19. unsigned char tab[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字段转换表
  20.    
  21. void main(void)
  22.     {        
  23.             unsigned int a,temp;                                                         
  24.         TMOD=0x20;           //定时器1--方式2
  25.         //PCON=0x80;           //电源控制   19200
  26.         TL1=0xfd;            
  27.         TH1=0xfd;            //11.0592MHZ晶振,波特率为9600
  28.         SCON=0x50;           //方式1
  29.         TR1=1;               //启动定时
  30.                         
  31.                 temp=get_temper();//这段程序用于避开刚上电时显示85的问题
  32.                 for(a=0;a<200;a++)
  33.                 delay(500);

  34.                 while(1)
  35.                 {
  36.                     temp=get_temper();//测量温度
  37.                     for(a=0;a<100;a++)//显示,兼有延时的作用
  38.                             display(htd(temp));
  39.                         SBUF=(unsigned char)(temp>>8);                //将温度发送给PC   
  40.             while(TI!=1);
  41.                         TI=0;                        
  42.                         SBUF=(unsigned char)temp;
  43.             while(TI!=1);
  44.                         TI=0;
  45.                 }
  46.     }

  47. /****************************DS18B20读取温度函数**************************/
  48. /*函数原型:void get_temper(void)
  49. /*函数功能:DS18B20读取温度
  50. /*输入参数:无
  51. /*输出参数:无
  52. /*调用模块:
  53. /**********************************************************************/
  54. unsigned int get_temper(void)
  55.         {        
  56.             unsigned char k,T_sign,T_L,T_H;
  57.                 DS18B20_init();   //DS18B20初始化
  58.             if(DS18B20)    //判断DS1820是否存在?若DS18B20不存在则返回
  59.                 {
  60.             DS18B20_write(0xcc);    // 跳过ROM匹配
  61.             DS18B20_write(0x44);  //发出温度转换命令
  62.                     DS18B20_init();   //DS18B20初始化
  63.                 if(DS18B20)    //判断DS1820是否存在?若DS18B20不存在则返回
  64.                     {
  65.                 DS18B20_write(0xcc);//跳过ROM匹配
  66.                 DS18B20_write(0xbe);//发出读温度命令
  67.                                 T_L=DS18B20_read();//数据读出
  68.                                 T_H=DS18B20_read();
  69.                                 k=T_H&0xf8;  
  70.                 if(k==0xf8)
  71.                     T_sign=1;   //温度是负数
  72.                 else
  73.                     T_sign=0;  //温度是正数
  74.                 T_H=T_H&0x07;
  75.                 temp=(T_H*256+T_L)*10*0.0625;  //温度转换常数 乘以10 是因为要保留1位小数
  76.                                 return (temp);
  77.             }
  78.         }

  79.         
  80.         }

  81. /****************************DS18B20写数据函数**************************/
  82. /*函数原型:void DS18B20_write(uchar in_data)
  83. /*函数功能:DS18B20写数据
  84. /*输入参数:要发送写入的数据
  85. /*输出参数:无
  86. /*调用模块:_cror_()
  87. /**********************************************************************/
  88. void DS18B20_write(unsigned char in_data) //写DS18B20的子程序(有具体的时序要求)
  89.     {  
  90.         unsigned char i,out_data,k;
  91.         out_data=in_data;
  92.         for(i=1;i<9;i++)  //串行发送数据
  93.         {
  94.             DQ=0;
  95.                 DQ=1;
  96.                 _nop_();
  97.             _nop_();
  98.             k=out_data&0x01;
  99.                 if(k==0x01)  //判断数据  写1
  100.                 {
  101.                     DQ=1;
  102.             }
  103.                 else   //写0
  104.             {
  105.                     DQ=0;
  106.                 }
  107.                 delay(4); //延时62us
  108.                 DQ=1;
  109.             out_data=_cror_(out_data,1);  //循环左移1位
  110.         }
  111.     }

  112. /**************************DS18B20读函数**************************/
  113. /*函数原型:void DS18B20_read()
  114. /*函数功能:DS18B20读数据
  115. /*输入参数:无
  116. /*输出参数:读到的一字节内容
  117. /*调用模块:delay()
  118. /******************************************************************/
  119. unsigned char DS18B20_read()
  120.     {
  121.         unsigned char i,in_data,k;
  122.         in_data=0;
  123.         for(i=1;i<9;i++)  //串行发送数据
  124.         {
  125.             DQ=0;
  126.                 DQ=1;
  127.                 _nop_();
  128.                 _nop_();
  129.             k=DQ; //读DQ端
  130.                 if(k==1)  //读到的数据是1
  131.                 {
  132.                     in_data=in_data|0x01;
  133.                 }
  134.                 else
  135.                 {
  136.                     in_data=in_data|0x00;
  137.                 }
  138.                 delay(3);  //延时51us
  139.                 DQ=1;
  140.                 in_data=_cror_(in_data,1); //循环右移1位
  141.         }
  142.         return(in_data);
  143.     }

  144. /**************************DS18B20初始化函数**************************/
  145. /*函数原型:void DS18B20_init(void)
  146. /*函数功能:DS18B20初始化
  147. /*输入参数:无
  148. /*输出参数:无
  149. /*调用模块:delay()
  150. /******************************************************************/  
  151. void DS18B20_init(void)
  152.     {
  153.             unsigned char a;
  154.               DQ=1;//主机发出复位低脉冲
  155.                 DQ=0;
  156.                 delay(44);        //延时540US
  157.                 DQ=1;
  158.                 for(a=0;a<0x36&&DQ==1;a++)
  159.                 {
  160.                     a++;
  161.                     a--;        //等待DS18B20回应
  162.                 }
  163.                 if(DQ)
  164.                         DS18B20=0;  //18B20不存在
  165.                 else
  166.                 {  
  167.                         DS18B20=1;  // 18B20存在
  168.                         delay(120); //复位成功!延时240US
  169.                 }
  170.     }
  171.          

  172. /**************************数码管显示函数**************************/
  173. /*函数原型:void display(void)
  174. /*函数功能:数码管显示
  175. /*输入参数:无
  176. /*输出参数:无
  177. /*调用模块:delay()
  178. /******************************************************************/
  179. void display(unsigned int a)
  180.     {        
  181.         P_data=tab[a&0x0f];//显示小数点后第1位
  182.         PS0=0;                 
  183.         PS1=1;
  184.         PS2=1;
  185.         PS3=1;
  186.         delay(200);
  187.         P_data=tab[(a>>4)&0x0f]|0x01; //显示个位
  188.         PS0=1;                 
  189.         PS1=0;
  190.         delay(200);        
  191.         P_data=tab[(a>>8)&0x0f];//显示十位
  192.         PS1=1;
  193.         PS2=0;
  194.         delay(200);
  195.         P_data=tab[(a>>12)&0x0f];//显示百位
  196.         PS2=1;         
  197.         PS3=0;
  198.         delay(200);
  199.         PS3=1;
  200.         P_data=0xff;//恢复数据口
  201.     }


  202. /**************************十六进制转十进制函数**************************/
  203. /*函数原型:uint htd(uint a)
  204. /*函数功能:十六进制转十进制
  205. /*输入参数:要转换的数据
  206. /*输出参数:转换后的数据
  207. /*调用模块:无
  208. /******************************************************************/
  209. unsigned int htd(unsigned int a)
  210.     {
  211.             unsigned int b,c;
  212.                 b=a%10;
  213.                 c=b;
  214.                 a=a/10;
  215.                 b=a%10;
  216.                 c=c+(b<<4);
  217.                 a=a/10;
  218.                 b=a%10;
  219.                 c=c+(b<<8);
  220.                 a=a/10;
  221.                 b=a%10;
  222.                 c=c+(b<<12);
  223.             return c;
  224.     }


  225. /*******************************延时函数*********************************/
  226. /*函数原型:delay(unsigned int delay_time)
  227. /*函数功能:延时函数
  228. /*输入参数:delay_time (输入要延时的时间)
  229. /*输出参数:无
  230. /*调用模块:无
  231. /**********************************************************************/
  232. void delay(unsigned int delay_time)   //延时子程序
  233. {for(;delay_time>0;delay_time--)
  234. {}
  235.   }
复制代码
回复

使用道具 举报

ID:110875 发表于 2020-9-12 23:36 | 显示全部楼层
可惜没有附件?
回复

使用道具 举报

ID:816849 发表于 2020-9-18 20:47 | 显示全部楼层
没有看到附件,也想学习
回复

使用道具 举报

ID:27536 发表于 2020-10-29 10:59 | 显示全部楼层
对新手来说,有参考意义
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表