单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机18b20温度及按键可调上下限报警源程序

[复制链接]
跳转到指定楼层
楼主
小黑屋zzz 发表于 2017-12-7 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于18b20显示2位温度并显示上下限,超限报警,温度上下限均可调整,附带闪烁灯

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit ds=P2^2;               
  5. sbit key1=P3^4;
  6. sbit key2=P3^5;
  7. sbit key3=P3^6;
  8. sbit dula=P2^6;
  9. sbit wela=P2^7;
  10. sbit beep=P2^3;
  11. bit key=0;
  12. sbit led=P1^2;
  13. uint get_temp();
  14. void send(uchar);
  15. uint temp,num,p,cycle,high,low,zd,xs,TL;       
  16. uint l=19;                        //定义温度下限
  17. uint h=25;                        //定义温度上限
  18. uchar code table[]={0x3f,0x06,0x5b,0x4f,
  19.                                         0x66,0x6d,0x7d,0x07,
  20.                                         0x7f,0x6f,0xbf,0x86,
  21.                                     0xdb,0xcf,0xe6,0xed,
  22.                                     0xfd,0x87,0xff,0xef};
  23. void delay(uint z)  //延时函数
  24. {
  25. uint x,y;
  26. for(x=z;x>0;x--)
  27.   for(y=110;y>0;y--);
  28. }
  29. void delay1(uint ms)  
  30. {
  31.   uchar j;
  32.         while(ms--)
  33.          for(j=110;j>0;j--);
  34. }
  35. /////中断/////////////////////
  36. void init()
  37. {          
  38.         TMOD|=0X10;
  39.         TH0=(65536-2000)/256;
  40.         TL0=(65536-2000)%256;
  41.         EA=1;                  
  42.         ET0=1;
  43.         TR0=1;
  44. }
  45. //按键扫描程序******************************************************
  46. void keyscan()
  47. {
  48. if(key3==0)
  49.         delay1(5);
  50.   if(key3==0)
  51.   {    while(!key3);
  52.                 key=!key;
  53.                 while(key3==0);
  54.    }
  55. if(key==0)
  56.    {
  57.   if(key1==0)
  58.    {
  59.     delay1(5);
  60.   if(key1==0)
  61. {
  62.         //while(!key1)  ;
  63.                  l++;   
  64.                 delay(50);
  65.   if(l==99)
  66.             l=0;
  67.        }
  68.    }                     
  69. if(key2==0)
  70.    {
  71.     delay1(5);
  72.   if(key2==0)
  73. {//        while(!key2);
  74.            if(l!=0)
  75.            l--;          
  76.                    delay(50);
  77.       }
  78.           }
  79.           }
  80. if(key==1)
  81. {
  82.   if(key1==0)
  83.    {
  84.     delay1(5);
  85. if(key1==0)
  86. {//        while(!key1)  ;
  87.                  h++;
  88.                 delay(50);
  89.            if(h==99)
  90.             h=0;
  91.        }
  92.    }                     
  93.       if(key2==0)
  94.    {
  95.     delay1(5);
  96. if(key2==0)
  97. {//while(!key2);
  98.           if(h!=0)
  99.            h--;       
  100.                    delay(50);                  
  101. }  
  102. }
  103. }
  104. }
  105. //温度传感器********************************************************
  106. void dsreset()//ds18b20复位 初始化函数
  107. {
  108.         uint i;
  109.         ds=0;
  110.         i=80;
  111.         while(i>0)i--;
  112.         ds=1;
  113.         i=4;
  114.         while(i>0)i--;
  115. }
  116. bit tempreadbit()
  117. {
  118.         uint i;
  119.         bit dat;
  120.         ds=0;i++;         //i++起延时作用
  121.         ds=1;i++;i++;
  122.         dat=ds;
  123.         i=8;while(i>0)i--;
  124.         return(dat);
  125. }
  126. uchar tempread()                                                 
  127. {
  128.                 uchar i,j,dat;
  129.                 dat=0;
  130.                 for(i=1;i<=8;i++)
  131.                 {
  132.                         j=tempreadbit();
  133.                         dat=(j<<7)|(dat>>1);                //读出数据最低位在最前面,这样刚好一个字节在dat里

  134.                 }          
  135.                 return(dat);
  136.                 }
  137. void tempwritebyte(uchar dat)           //向ds18b20写一个字节数据函数                  
  138. {
  139.                 uint i;
  140.                 uchar j;
  141.         bit testb;
  142.         for(j=1;j<=8;j++)
  143.                 {
  144.                         testb=dat&0x01;
  145.                         dat=dat>>1;
  146.         if(testb)//写一
  147.                 {
  148.                          ds=0;
  149.                         i++;i++;
  150.                         ds=1;
  151.                         i=8;
  152.                 while(i>0)i--;
  153.                 }
  154.         else
  155.                         {
  156.                                 ds=0;//写0
  157.                                 i=8;while(i>0)i--;
  158.                                 ds=1;
  159.                                 i++;i++;

  160.                         }
  161.                 }
  162. }               
  163. void tempchange() //DS18B20开始获取温度并转换
  164. {
  165.                 dsreset();
  166.                 delay(1);
  167.                 tempwritebyte(0xcc);   //写跳过读ROM指令
  168.                 tempwritebyte(0x44);   //写温度转换指令
  169. }
  170. uint get_temp()
  171.                 {
  172.                         uchar a,b;
  173.                         dsreset();
  174.                         delay(1);
  175.                         tempwritebyte(0xcc);
  176.                         tempwritebyte(0xbe);
  177.                         a=tempread(); //读低八位
  178.                         b=tempread();         //读高八位
  179.                         temp=b;
  180.                         temp<<=8;//两个字节组合为一个字
  181.                         temp=temp|a;
  182.                         temp=temp*0.0625;        //温度在寄存器中为12位,分辨率位0.0625        度
  183.                 SBUF=temp;
  184.                         return temp;//temp是整型
  185.         }
  186. //数码管显示**********************************************************************
  187. void display(uchar num,uchar dat)//数据显示程序
  188. {                                                                //num是第几个数码管,dat是要显示的数字                                 
  189.         uchar i;
  190.         P0=0xff;
  191.         wela=1;                //消影               
  192.         wela=0;
  193.         P0=table[dat];//编码赋给P0口
  194.         dula=1;
  195.         dula=0;
  196.         wela=0;
  197.         i=0xFF;                                  
  198.         i=i&(~((0x01)<<(num))) ;
  199.         P0=i;
  200.         wela=1;
  201.         wela=0;
  202.         delay(1);
  203. }                  
  204. //显示温度和阈值*************************************************               
  205.         void dis_temp()  //显示温度数值函数t传递的是整型温度值
  206.                
  207.                 {                 
  208.                     // tempchange();//温度转换函数
  209.                         switch(xs)
  210.                         {
  211.                          case 1:
  212.                                          display(0,get_temp()%100/10);
  213.                                          break;
  214.                          case 2:
  215.                                          display(1,get_temp()%10);
  216.                                           break;
  217.                          case 3:
  218.                                          display(2,l%100/10);
  219.                                          break;
  220.                          case 4:
  221.                                          display(3,l%10);
  222.                                          break;       
  223.                          case 5:
  224.                                          display(4,h%100/10);
  225.                                          break;
  226.                          case 6:
  227.                                          display(5,h%10);
  228.                                         break;
  229.                                 
  230.                          }
  231.                          xs++;
  232.                          if(xs>6)
  233.                          {
  234.                                  xs=1;
  235.                          }
  236.                 }                       
  237. //报警**********************************************************                       
  238. void beep0()          
  239. {                               
  240.         if(temp<l)
  241.                 beep=0;
  242. ……………………

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

所有资料51hei提供下载:
18b20.rar (1.9 KB, 下载次数: 33)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
涅槃宝宝 发表于 2019-10-11 19:23 | 只看该作者
你好,请问这个是按键按下温度加一或减一么?
回复

使用道具 举报

板凳
人人学会单片机 发表于 2019-10-12 11:42 | 只看该作者
福建风采_[官网首页]这代码好垃圾啊!DS18B20 复位居然死等延迟?
回复

使用道具 举报

地板
chickji 发表于 2019-10-12 12:37 | 只看该作者
我是来学习的。。@
回复

使用道具 举报

5#
create1318 发表于 2020-2-14 18:31 | 只看该作者
很有用,感谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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