找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DS18B20+52单片机+温度报警+4位数码管显示程序

[复制链接]
跳转到指定楼层
楼主
ID:356418 发表于 2018-6-25 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #define TH0HIGH        0xe1
  4. #define TL0LOWW        0xa7
  5. #define LOW                0
  6. #define HIGH        1
  7. #define DIS_DAT        P0
  8. #define DIS_POS P2                //数码管只用到低四位
  9. #define NOP() _nop_()
  10. #define false                        0
  11. #define FALSE                        0
  12. #define true                        1
  13. #define TRUE                        1
  14. #define uint unsigned int
  15. extern unsigned char idata flag;       //定义外部变量,温度正负标志
  16. uint HNum = 50,LNum = 10;        //报警温度的高低值
  17. uint Tem;
  18. void delay_16us();
  19. void SetLowTem();
  20. void SetHighTem();
  21. void initalarm();
  22. void alarm();
  23. void delay_ms(uint timer);
  24. typedef unsigned char        u8;
  25. typedef unsigned int        u16;
  26. typedef unsigned long        u32;
  27. typedef signed char                s8;
  28. typedef signed int                s16;
  29. typedef signed long                s32;
  30. typedef bit                                BOOL;
  31. void delay_16us(u16 us);
  32. void init_various(void);
  33. void dynamic_display(void);
  34. float set_temp_data(void);
  35. u8 ds18b20_reset(void);
  36. void ds18b20_write_byte(u8 wByte);
  37. u8 ds18b20_read_byte(void);
  38. u16 ds18b20_get_temp(void);
  39. BOOL                b10msEvent;
  40. BOOL                b500msEvent;
  41. sbit k1 = P3^0;
  42. sbit k2 = P3^1;
  43. sbit k3 = P3^2;
  44. sbit k4 = P3^3;
  45. sbit led1 = P1^0;
  46. sbit led2 = P1^1;
  47. sbit led3 = P1^2;
  48. sbit buzzer = P3^7;
  49. sbit DQ_PIN        =        P3^6;//管脚定义
  50. code u8 float_tab[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数表
  51. code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xbf};
  52. u8 DisNum[4] = {0x0a, 0x0a, 0x00, 0x00};
  53. u8 DisPosition = 0;

  54. void delay_16us(u16 us)                //(14 + 16 * us) 微秒
  55. {
  56.         while(--us);
  57. }
  58. void init_c51(void)
  59. {
  60.         TMOD = 0x01;
  61.         TH0 = TH0HIGH;
  62.         TL0 = TL0LOWW;
  63.         ET0 = 1;
  64.         TR0 = 1;
  65. }
  66. void init_various(void)
  67. {
  68.         EA = 0;
  69.         init_c51();
  70.         ds18b20_reset();
  71.         ds18b20_get_temp();
  72.         EA = 1;
  73. }
  74. void dynamic_display(void)
  75. {
  76.         static u8 DisPinOn = 0x01;

  77.         DisPinOn <<= 1;//DisPinON位选
  78.         if(DisPinOn == 0x10)
  79.         {
  80.                 DisPosition = 0;
  81.                 DisPinOn = 0x01;
  82.         }
  83.         DIS_DAT = 0xff;
  84.         DIS_POS = DisPinOn;
  85.         DIS_DAT = DisCode[DisNum[DisPosition++]];
  86.         if(DisPinOn == 0x04)
  87.         DIS_DAT &= 0x7f;
  88. }
  89. void SetHighTem()//函 数:设置高温温度报警值函数
  90. {
  91.          
  92.   HNum = 50;
  93.   if(k1 == 0)                    //按键消抖
  94.       delay_ms(10);
  95.       if(k1 == 0)
  96.       {  while(!k1);             //等待按键释放
  97.                 while(1)
  98.                {
  99.                     dynamic_display();
  100.               if(k1 == 0)
  101.                  delay_ms(50);          //按键消抖
  102.                  if(k1 == 0)
  103.                  {   while(!k1);   //等待按键释放                     
  104.                        SetLowTem();   //设置低温报警温度
  105.                        break;
  106.                  }
  107.               if(k2 == 0)
  108.                  delay_ms(50);          //按键消抖
  109.                  if(k2 == 0)
  110.                  {   while(!k2);   //等待按键释放
  111.                    HNum++;
  112.                  }
  113.               if(k3 == 0)
  114.                  delay_ms(50);          //按键消抖
  115.                  if(k3 == 0)
  116.                  {    while(!k3);           //等待按键释放
  117.                       HNum--;
  118.                  }
  119.               if(k4 == 0)
  120.                  delay_ms(50);          //按键消抖
  121.                  if(k4 == 0)
  122.                  {  while(!k4);          //等待按键释放
  123.                     break;
  124.                  }   
  125.           }
  126.       }          
  127.      dynamic_display();
  128. }
  129. void SetLowTem()//函 数:设置低温温度报警值函数
  130. {  
  131.       while(1)
  132.       {
  133.           dynamic_display();
  134.           if(k2 == 0)
  135.               delay_ms(50);          //按键消抖
  136.               if(k2 == 0)
  137.               {   while(!k2);   //等待按键释放
  138.                  LNum++;
  139.               }
  140.           if(k3 == 0)
  141.              delay_ms(50);          //按键消抖
  142.              if(k3 == 0)
  143.              {    while(!k3);           //等待按键释放
  144.                   LNum--;
  145.              }
  146.           if(k4 == 0)
  147.              delay_ms(50);          //按键消抖
  148.              if(k4 == 0)
  149.              {    while(!k4);          //等待按键释放
  150.                   break;
  151.                    }  
  152.        }
  153. }
  154. float set_temp_data(void)
  155. {
  156.         u16 TempData;
  157.         float Temp;
  158.         u8 Negative;
  159.         s8 i;
  160.   float j;
  161.         TempData = ds18b20_get_temp();                //度温度数据


  162.         /* 小于零 */
  163.         if(TempData & 0xf000)
  164.         {
  165.                 TempData = ~TempData + 1;
  166.                 TempData &= 0x0fff;
  167.                 Negative = 1;
  168.         }
  169.         /* 大于零 */
  170.         else
  171.         {
  172.                 Negative = 0;
  173.         }

  174.         Temp = (TempData >> 4) * 10;                //温度读数乘以精度(0.0625),显示小数点一位,所以乘以10
  175.         j=Temp;
  176.         Temp = Temp + float_tab[(TempData & 0x000f)] + 0.5;        //加上小数部分,四舍五入所以加0.5
  177.         TempData = Temp;
  178.   
  179.         for(i=3; i>=0; i--)//循环4次,分别显示小,个,十,百
  180.         {
  181.                 DisNum[i] = TempData % 10;
  182.                 TempData /= 10;
  183.         }

  184.         for(i=0; i<2; i++)
  185.         {
  186.                 if(DisNum[i] != 0)
  187.                 {
  188.                         break;
  189.                 }
  190.                 else
  191.                 {
  192.                         DisNum[i] = 0x0a;                        //前面为0不显示
  193.                 }
  194.         }
  195.         /*  显示负号 */
  196.         if(Negative == 1)
  197.         {
  198.                 for(i=2; i>=0; i--)
  199.                 {
  200.                         if(DisNum[i] == 0x0a)
  201.                         {
  202.                                 DisNum[i] = 0x0b;                //'-'
  203.                                 break;
  204.                         }
  205.                 }
  206.         }
  207.           return j;
  208. }
  209. u8 ds18b20_reset(void)
  210. {
  211.         DQ_PIN = HIGH;
  212.         delay_16us(1);
  213.         DQ_PIN = LOW;
  214.         delay_16us(30);                //延时600us
  215.         DQ_PIN = HIGH;
  216.         delay_16us(5);                //延时80us
  217.         if(!DQ_PIN)
  218.         {
  219.                 delay_16us(30);        //延时420us
  220.                 return 1;
  221.         }
  222.         else
  223.         return 0;
  224. }
  225. void ds18b20_write_byte(u8 wByte)
  226. {
  227.         u8 i;
  228.         for(i=0; i<8; i++)
  229.         {
  230.                 DQ_PIN = LOW;
  231.                 NOP();
  232.                 NOP();
  233.                 NOP();
  234.                 NOP();
  235.                 NOP();
  236.                 NOP();
  237.                 NOP();
  238.                 DQ_PIN = wByte & 0x01;
  239.                 NOP();
  240.                 NOP();
  241.                 NOP();
  242.                 NOP();
  243.                 NOP();
  244.                 DQ_PIN = HIGH;
  245.                 NOP();
  246.                 NOP();
  247.                 NOP();
  248.                 wByte >>= 1;
  249.         }
  250. }
  251. u8 ds18b20_read_byte(void)
  252. {
  253.         u8 rByte;
  254.         u8 i;
  255.         for(i=0; i<8; i++)
  256.         {
  257.                 DQ_PIN = LOW;
  258.                 NOP();
  259.                 NOP();
  260.                 rByte >>= 1;
  261.                 NOP();
  262.                 NOP();
  263.                 NOP();
  264.                 NOP();
  265.                 NOP();
  266.                 NOP();
  267.                 DQ_PIN = HIGH;
  268.                 NOP();
  269.                 NOP();
  270.                 NOP();
  271.                 NOP();
  272.                 NOP();
  273.                 NOP();
  274.                 NOP();
  275.                 if(DQ_PIN)
  276.                 rByte |= 0x80;
  277.                 NOP();
  278.                 NOP();
  279.                 NOP();
  280.                 NOP();
  281.                 NOP();
  282.                 NOP();
  283.                 NOP();
  284.         }
  285.         DQ_PIN = HIGH;
  286.         return rByte;
  287. }
  288. u16 ds18b20_get_temp(void)
  289. {
  290.         u16 Temp;
  291.         if(ds18b20_reset() == 0)                        //复位
  292.         return 0;
  293.         ds18b20_write_byte(0xcc);                        //忽略ROM
  294.         ds18b20_write_byte(0x44);                        //发送温度转化命令
  295.         delay_16us(30);
  296.         if(ds18b20_reset() == 0)                        //再次复位
  297.         return 0;
  298.         ds18b20_write_byte(0xcc);                        //忽略ROM
  299.         ds18b20_write_byte(0xbe);
  300.         Temp = ds18b20_read_byte();
  301.         Temp |= ds18b20_read_byte() << 8;
  302.         return Temp;
  303. }
  304. void main()
  305. {
  306.         initalarm();
  307.         init_various();
  308.         while(1)
  309.         {
  310.                  alarm();
  311.                 SetHighTem();
  312.                 if(b10msEvent)
  313.                 {
  314.                         b10msEvent = false;
  315.                         dynamic_display();                        //显示

  316.                         if(b500msEvent)
  317.                         {
  318.                                 b500msEvent = false;
  319.                                 set_temp_data();                        //读温度
  320.                         }
  321.                 }
  322.         }
  323. }
  324. void timer0(void) interrupt 1
  325. {
  326.         static u8 SecCount = 0;

  327.         TH0 = TH0HIGH;
  328.         TL0 = TL0LOWW;
  329.   b10msEvent = true;                //10毫秒中断
  330.         if(++SecCount == 50)
  331.         {
  332.                 SecCount = 0;
  333.                 b500msEvent = true;                //1秒到时
  334.         }
  335. }
  336. void delay_ms(uint timer)
  337. {
  338.         uint i,j;
  339.         for(i=0; i<timer; i++)
  340.                 for(j=0; j<110; j++);
  341. }


  342. void initalarm()//led和蜂鸣器初始化
  343. {
  344.       led1 = 0;
  345.       led2 = 0;
  346.       led3 = 0;
  347.       buzzer = 1;
  348. }
  349. void alarm()//函 数:led和蜂鸣器控制
  350. {
  351.     Tem = set_temp_data();
  352.     if(Tem > HNum)
  353.     {
  354.             led2 = 1;
  355.         led1 = 0;
  356.         led3 = 0;
  357.         buzzer = 0;    //蜂鸣器工作
  358.     }
  359.     else if(Tem < LNum)
  360.     {
  361.             led3 = 1;
  362.         led1 = 0;
  363.         led2 = 0;
  364.         buzzer = 0;
  365.     }
  366.     else
  367.     {
  368.         led1 = 1;
  369.         led2 = 0;
  370.         led3 = 0;
  371.         buzzer = 1;
  372.     }
  373. }
  374.        
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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