找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2426|回复: 1
打印 上一主题 下一主题
收起左侧

DS18B20温度检测显示控制

[复制链接]
跳转到指定楼层
楼主
ID:207245 发表于 2017-6-2 23:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DS18B20温度检测显示控制,已经过仿真验证
下载:
DS18B20温度检测控制.docx (15.85 KB, 下载次数: 9)

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit RS=P3^5;                                                                                //定义LCD端口
  6. sbit RW=P3^6;
  7. sbit E=P3^7;
  8. sbit DQ=P3^4;                                                                        //定义温度总线端口
  9. sbit Wa=P1^5;                                                                        //定义报警端口
  10. sbit ZR=P1^7;                                                                        //制热
  11. sbit ZL=P1^6;                                                                        //制冷
  12. uchar LCD_3,LCD_2,LCD_1,LCD_0;                                       
  13. uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
  14.                                                                                                
  15. uchar _romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
  16. uchar _romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
  17. uchar _romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};
  18. uint  key_[2]={4,0};                                                        //设置温度标准值
  19. uchar code  LCDData[] ="0123456789";  
  20. uchar code  dot_tab[] ="0112334456678899";
  21. uchar first_line[16]="A:000.0 B:000.0";                                 //LCD第一行显示缓存数组 A:温度 B:湿度
  22. void delay10us(uint t);                                                                          
  23. void check_busy();                                                                          
  24. void write_command(uchar tempdata);                                                                  
  25. void write_data(uchar tempdata);                                                                          
  26. void init_lcd1602();                                                                  
  27. bit resetpulse();                                                                          
  28. void ds18b20_init();                                                                  
  29. uchar read_bit()                                                                  
  30. uchar read_byte();                                                                          
  31. void write_bit(uchar bitval);                                                                          
  32. void write_byte(uchar val);                                                                          
  33. bit match_rom(uchar *rom);                                                                          
  34. void convert_T(uchar temp_data_h,uchar temp_data_l);                                                                          
  35. void display();                                                                                  
  36. void work_temp();                                                                  
  37. //************************************
  38. //延时程序
  39. //************************************
  40. //延时t*10us
  41. void delay10us(uint t)
  42. {
  43.         do
  44.         {
  45.                 _nop_();
  46.                 _nop_();
  47.                 _nop_();
  48.                 _nop_();
  49.                 _nop_();
  50.                 _nop_();
  51.                 _nop_();
  52.                 _nop_();
  53.                 _nop_();
  54.                 _nop_();
  55.         }
  56.         while(--t);
  57. }
  58. //************************************       
  59. //LCD1602测忙                                               
  60. //************************************
  61. void check_busy(void)
  62. {
  63.         while(1)
  64.         {
  65.         P0=0xff;
  66.         E=0;
  67.         _nop_();
  68.         RS=0;
  69.         _nop_();
  70.         _nop_();
  71.         RW=1;
  72.         _nop_();
  73.         _nop_();
  74.         E=1;
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         _nop_();
  79.         if((P0&0x80)==0)                           //等于1表示液晶正忙,重复检测直到其等于0为止
  80.         {
  81.                 break;
  82.         }
  83.         E=0;
  84.         }
  85. }
  86. //************************************
  87. //LCD1602写命令
  88. //************************************
  89. void write_command(uchar tempdata)
  90. {
  91.            E=0;
  92.         _nop_();
  93.         _nop_();
  94.         RS=0;
  95.         _nop_();
  96.         _nop_();
  97.         RW=0;
  98.         P0=tempdata;
  99.         _nop_();
  100.         _nop_();
  101.         E=1;
  102.         _nop_();
  103.         _nop_();
  104.         E=0;
  105.         _nop_();
  106.         check_busy();
  107. }
  108. //************************************
  109. //LCD1602写数据
  110. //************************************
  111. void write_data(uchar tempdata)
  112. {
  113.           E=0;
  114.         _nop_();
  115.         _nop_();
  116.         RS=1;
  117.         _nop_();
  118.         _nop_();
  119.         RW=0;
  120.         P0=tempdata;
  121.         _nop_();
  122.         _nop_();
  123.         E=1;
  124.         _nop_();
  125.         _nop_();
  126.         E=0;
  127.         _nop_();
  128.         check_busy();
  129. }  
  130. //************************************
  131. //初始化LCD1602
  132. //************************************
  133. void init_lcd1602()
  134. {
  135. write_command(0x01);                                                                //清除屏幕
  136. write_command(0x38);                                                                //功能设定(8位,2行,5*7点阵式)
  137. write_command(0x0c);                                                                //显示器ON,光标OFF,闪烁OFF
  138. write_command(0x06);                               //地址加1,光标右移,显示屏不移动
  139. }
  140. //************************************
  141. //初始化ds18b20                       
  142. //************************************
  143. bit resetpulse(void)
  144. {
  145.         DQ=0;
  146.         delay10us(60);                                                                        //延时600us
  147.         DQ=1;
  148.         delay10us(5);                                                                        //延时50us
  149.         return(DQ);                                                                         //读取P3.4的状态
  150. }
  151. void ds18b20_init(void)
  152. {
  153.         while(1)
  154.         {
  155.                 if(!resetpulse())                                                          //收到ds18b20的应答信号
  156.                 {       
  157.                         DQ=1;
  158.                         delay10us(20);                                                        //延时200us
  159.                         break;               
  160.                 }
  161.                 else
  162.                         resetpulse();                                                        //否则再发复位信号
  163.         }
  164. }
  165. //************************************
  166. //读ds18b20一位
  167. //************************************
  168. uchar read_bit(void)
  169. {
  170.           DQ=0;
  171.           _nop_();
  172.           _nop_();
  173.           DQ=1;
  174.           delay10us(3);                                                 //延时30us
  175.           return(DQ);                                                         //读取数据口状态
  176. }
  177. //************************************
  178. //读ds18b20一个字节
  179. //************************************
  180. uchar read_byte(void)
  181. {
  182.         uchar i,m,receive_data;
  183.         m=1;
  184.         receive_data=0;
  185.         for(i=0;i<8;i++)                          //低位在前
  186.         {       
  187.                   if(read_bit())
  188.                    {
  189.                            receive_data=receive_data+(m<<i);
  190.                    }
  191.                    delay10us(6);                         //延时60us
  192.            }
  193.           return(receive_data);
  194. }
  195. //************************************
  196. //向ds18b20写一位
  197. //************************************
  198. void write_bit(uchar bitval)
  199. {
  200.         DQ=0;
  201.         if(bitval==1)
  202.         DQ=1;
  203.         delay10us(6);                           //延时60us
  204.         DQ=1;
  205. }
  206. //************************************
  207. //向DS18B20写一个字节命令                                                                                 
  208. //************************************
  209. void write_byte(uchar val)
  210. {
  211.         uchar i,temp;
  212.         for(i=0;i<8;i++)
  213.         {
  214.                   temp=val>>i;
  215.                   temp=temp&0x01;
  216.                   write_bit(temp);
  217.                   delay10us(6);
  218.           }
  219. }
  220. //*************************************
  221. //温度的ROM序列号匹配                                                                                                          //*
  222. //*************************************
  223. bit match_rom(uchar *rom)
  224. {
  225.         uchar i;
  226.         ds18b20_init();
  227.         write_byte(0x55);
  228.         for(i=8;i>0;i--)
  229.         {
  230.                 write_byte(*(rom+i-1));
  231.         }
  232.         return 1;
  233. }
  234. //*************************************
  235. //温度转换,将从ds18b20中读出来的温度值
  236. //转化成十进制的温度值,并存放显示缓存
  237. //*************************************
  238. void convert_T(uchar temp_data_h,uchar temp_data_l)
  239. {
  240.         uchar temp;
  241.      if((temp_data_h&0xf0)==0xf0)                                        //如果温度寄存器里的高位为1,
  242.            {                                                                                        //则温度为负
  243.               temp_data_l=~temp_data_l;                                //负温度将补码转成二进制,
  244.               if(temp_data_l==0xff)                                                //取反再加1
  245.                 {
  246.                               temp_data_l=temp_data_l+0x01;
  247.                               temp_data_h=~temp_data_h;
  248.                                   temp_data_h=temp_data_h+0x01;
  249.                          }
  250.               else
  251.                {
  252.                                temp_data_l=temp_data_l+0x01;
  253.                               temp_data_h=~temp_data_h;
  254.            }
  255.                                  LCD_0=dot_tab[temp_data_l&0x0f];        //查表得小数位的值
  256.                              temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
  257.                              LCD_3='-';                                                //显示"-"号
  258.                              LCD_2=LCDData[(temp%100)/10];        //查表得负温度温度十位
  259.                              LCD_1=LCDData[(temp%100)%10];        //查表得负温度个位
  260.            }
  261.    else                                                                                         //温度为正
  262.        {  
  263.                               LCD_0=dot_tab[temp_data_l&0x0f];        //查表得小数位的值
  264.                              temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
  265.                              LCD_3=LCDData[temp/100];                //查表得温度百位
  266.                              LCD_2=LCDData[(temp%100)/10];        //查表得温度十位
  267.                              LCD_1=LCDData[(temp%100)%10];        //查表得温度个位
  268.             }
  269. }
  270. void display(void)                                                                 //LCD显示
  271. {
  272.    uchar i;
  273.             write_command(0x80);
  274.             for(i=0;i<16;i++)
  275.                 {
  276.                   write_data(first_line[i]);
  277.                 }
  278.             write_command(0xc0);
  279.             for(i=0;i<16;i++)
  280.                 {
  281.                   write_data(second_line[i]);
  282.                 }
  283. }
  284. //*************************************
  285. //加热控制,制冷控制,报警
  286. //*************************************
  287. void work_temp()
  288. {
  289.         uchar tt_[2];
  290.         uchar tt;
  291.         uchar temp_data_l;
  292.         uchar temp_data_h;
  293.         temp_data_l= read_byte();                                   //温度低8位
  294.     temp_data_h = read_byte();                                   //温度高8位
  295.         tt_[0]=temp_data_l&0xf0;
  296.     tt_[1]=temp_data_h&0x0f;
  297.         tt=tt_[0]+tt_[1];
  298.         if(tt>0x0A)                                                                        //判断是否高于10度
  299.                 {
  300.                         Wa=0;                                                           //报警
  301. ……………………

  302. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:44037 发表于 2017-6-3 06:32 | 只看该作者
谢谢分享   学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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