找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DS18B20温度超出阈值报警,调上下限程序

[复制链接]
跳转到指定楼层
楼主
ID:228755 发表于 2017-8-23 15:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DS18B20温度,调上下限,数码管显示,超出阈值报警

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. bit flag;
  6. sbit ds=P2^2;
  7. sbit beep=P1^0;
  8. uint temp;
  9. sbit led3=P1^2;
  10. sbit dula=P2^6;
  11. sbit wela=P2^7;
  12. sbit key1=P3^4;
  13. sbit key2=P3^6;
  14. sbit key3=P3^7;
  15. uchar num,num_shang=0,num_xia=0,numled,flag_qiehuan;
  16. uchar code table_du[]={
  17. 0x3f,0x06,0x5b,0x4f,
  18. 0x66,0x6d,0x7d,0x07,
  19. 0x7f,0x6f,0x77,0x7c,
  20. 0x39,0x5e,0x79,0x71};
  21. void delay(xms)                                   //延时函数
  22. {
  23.         uint i,j;
  24.         for(i=xms;i>0;i--)
  25.                 for(j=100;j>0;j--);
  26. }
  27. void delayus(uint t)
  28. {
  29.         while(t--);
  30. }
  31. void init()                                                   //初始化函数
  32. {
  33.         TMOD=0x01;                                                   //设置定时器0位工作方式(00000001)
  34.         TH0=(65536-22500)/256;                           //装初值
  35.         TL0=(65536-22500)%256;                          
  36.         EA=1;                                                             //开总中断
  37.         ET0=1;                                                           //开定时器0中断
  38.         TR0=1;
  39. }
  40. void display_shumaguan()                                        //显示子函数,中间两位数码管
  41. {                                                                               
  42.         uchar qian,bai,shi,ge;;
  43.         qian=num_shang/10;                                   //分离要显示的函数
  44.         bai=num_shang%10;
  45.         dula=1;
  46.         P0=table_du[qian];                                                 //送千位段选
  47.         dula=0;
  48.         P0=0xff;                                                         //送位选数据前关闭所有显示
  49.         wela=1;                                                                 
  50.         P0=0xfb;                                                         //送位选数据
  51.         wela=0;
  52.         delay(4);
  53.         dula=1;                                                                 //送各位段选函数
  54.         P0=table_du[bai];
  55.         dula=0;
  56.         P0=0xff;
  57.         wela=1;
  58.         P0=0xf7;
  59.         wela=0;
  60.         delay(4);
  61.        
  62.         shi=num_xia/10;
  63.         ge=num_xia%10;
  64.         dula=1;
  65.         P0=table_du[shi];
  66.         dula=0;
  67.         P0=0xff;
  68.         wela=1;
  69.         P0=0xef;
  70.         wela=0;
  71.         delay(4);
  72.         dula=1;
  73.         P0=table_du[ge];
  74.         dula=0;
  75.         P0=0xff;
  76.         wela=1;
  77.         P0=0xdf;
  78.         wela=0;
  79. //        delay(1);
  80. }

  81. void ds_reset()           //复位函数
  82. {
  83.         ds=1;
  84.         delayus(5);     //         延时
  85.         ds=0;
  86.         delayus(80);
  87.         ds=1;
  88.         delayus(14);
  89.         if(ds==0)
  90.                 flag=1;
  91.         else
  92.                 flag=0;                                //flag作为标志位,等1表示18b20存在
  93.         delayus(20);
  94. }
  95. bit ds_read_bit(void)                        //读一位数据函数
  96. {
  97.         bit dat;
  98.         ds=0;
  99.         _nop_();                                   //延时机器周期
  100.         _nop_();
  101.         ds=1;                                                //释放总线
  102.         _nop_();
  103.         dat=ds;
  104.         delayus(10);               //延时100us
  105.         return dat;
  106. }
  107. uchar ds_read_byte()                   //读一个字节函数
  108. {
  109.         uchar i,j,k;
  110.         for(i=0;i<8;i++)                  //一个字节8位组成,循环八次
  111.         {
  112.                 j=ds_read_bit();
  113.                 k=(j<<7)|(k>>1);                //读出的数据最低位在最前面
  114.         }
  115.         return k;
  116. }
  117. void ds_write_byte(uchar dat)      //写一个字节的函数
  118. {
  119.         uchar i;
  120.         for(i=0;i<8;i++)                        //循环八位将一个字节由低到高写入
  121.         {
  122.                 ds=0;
  123.                 _nop_();
  124.                 ds=dat&0x01;                        //保留dat的最低位
  125.                 delayus(6);
  126.                 ds=1;                 //释放总线
  127.                 dat=dat>>1;
  128.         }
  129.         delayus(6);
  130. }
  131. uint read_temp()                //读取温度函数
  132. {
  133.         uchar a,b;
  134.         ds_reset();
  135.         ds_write_byte(0xcc);
  136.         ds_write_byte(0xbe);
  137.         a=ds_read_byte();           //读低八位
  138.         b=ds_read_byte();                        //读高八位
  139.         temp=b;
  140.         temp=temp<<8;
  141.         temp=temp|a;
  142.         temp=temp*0.0625;                //得到实际温度值
  143.         return temp;
  144. }
  145. void display(uint temp)
  146. {
  147.         P0=table_du[temp/10];
  148.         dula=1;
  149.         dula=0;
  150.         P0=0xff;
  151.         wela=1;
  152.         P0=0xfe;
  153.         wela=0;
  154.         delay(4);
  155.         P0=table_du[temp%10];
  156.         dula=1;
  157.         dula=0;
  158.         P0=0xff;
  159.         wela=1;
  160.         P0=0xfd;
  161.         wela=0;
  162. //        delay(1);
  163. }
  164. void keyscan()
  165. {
  166.         if(key1==0)//按键1处理
  167.         {        
  168.                 if(flag_qiehuan==0)
  169.                 {
  170.                         flag_qiehuan=1;                                           //切换设置上限                       
  171.                 }               
  172.                 else if(flag_qiehuan==1)
  173.                 {
  174.                         flag_qiehuan=0;                                        //切换设置下限
  175.                 }                       
  176.         }       
  177.         if((key2==0)&&(flag_qiehuan==0))                                                                                          //k2长按
  178.         {       
  179.                 delay(30);
  180.                 if((key2==0)&&(flag_qiehuan==0))
  181.                 {                         
  182.                         num_xia++;
  183.                 }       
  184.         }
  185.         else if((key2==0)&&(flag_qiehuan==0))                                                                           //K2短按
  186.         {
  187.                 delay(3);
  188.                 if((key2==0)&&(flag_qiehuan==0))
  189.                 {
  190.                         num_xia++;
  191.                         while(!key2);                 
  192.                 }
  193.         }
  194.         if((key3==0)&&(flag_qiehuan==0))
  195.         {
  196.                 delay(30);
  197.                 if((key3==0)&&(flag_qiehuan==0))
  198.                 {
  199.                         num_xia--;
  200.                 }       
  201.         }
  202.         else if((key3==0)&&(flag_qiehuan==0))                                                                                //K3短按
  203.         {
  204.                 delay(3);
  205.                 if((key3==0)&&(flag_qiehuan==0))
  206.                 {
  207.                         num_xia--;
  208.                         while(!key3);                 
  209.                 }       
  210.         }
  211.         if((key2==0)&&(flag_qiehuan==1))                                         
  212.         {
  213.                 delay(30);
  214.                 if((key2==0)&&(flag_qiehuan==1))
  215.                 {
  216.                         num_shang++;
  217.                 }       
  218.         }
  219.         else if((key2==0)&&(flag_qiehuan==1))                                  
  220.         {
  221.                 delay(3);
  222.                 if((key2==0)&&(flag_qiehuan==1))
  223.                 {
  224.                         num_shang++;
  225.                         while(!key2);                 
  226.                 }
  227.         }
  228.         if((key3==0)&&(flag_qiehuan==1))
  229.         {
  230.                 delay(30);
  231.                 if((key3==0)&&(flag_qiehuan==1))
  232.                 {
  233.                         num_shang--;
  234.                 }
  235.         }       
  236.         else if((key3==0)&&(flag_qiehuan==1))
  237.         {
  238.                 delay(3);
  239.                 if((key3==0)&&(flag_qiehuan==1))
  240.                 {
  241.                         num_shang--;
  242.                         while(!key3);                 
  243.                 }
  244.         }       
  245. }
  246. void deal()
  247. {
  248.         if((temp>=num_xia)||(temp<=num_shang))
  249.         {
  250.                 beep=0;
  251.         }
  252.         if((temp<num_xia)&&(temp>num_shang))
  253. ……………………

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

所有资料51hei提供下载:
完全品.zip (39.28 KB, 下载次数: 108)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:189773 发表于 2017-8-26 10:27 | 只看该作者
不错不错。
回复

使用道具 举报

板凳
ID:189773 发表于 2017-8-26 10:28 | 只看该作者
很详细,正好有需要。
回复

使用道具 举报

地板
ID:294554 发表于 2018-5-5 16:01 | 只看该作者
很详细
回复

使用道具 举报

5#
ID:323386 发表于 2018-5-10 11:43 | 只看该作者
感谢分享,借鉴学习
回复

使用道具 举报

6#
ID:357000 发表于 2018-7-18 16:14 | 只看该作者
学到了
回复

使用道具 举报

7#
ID:80372 发表于 2018-10-13 11:17 | 只看该作者
很好、不错
回复

使用道具 举报

8#
ID:18797 发表于 2021-7-13 09:47 | 只看该作者
做了个小温度计,放在窗外,夜深了的时候,当室外温度低于25度的时候,关闭空调,很不错的
回复

使用道具 举报

9#
ID:18797 发表于 2021-7-13 09:54 | 只看该作者
正在扩展程序,精确到小数后一位,看能否成功
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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