久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4850|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 色吧色综合 | 51ⅴ精品国产91久久久久久 | 日本久久视频 | 国产精品福利一区二区三区 | 免费一级欧美在线观看视频 | 成人免费看片又大又黄 | 日韩欧美在线观看 | 宅男噜噜噜66一区二区 | 亚洲成人精品一区二区 | 九九热在线视频 | 亚洲一本 | 欧美日韩国产一区二区 | 国产高清一区二区三区 | 成人a视频片观看免费 | 久久久久国产一区二区三区 | 久草在线青青草 | 狠狠色香婷婷久久亚洲精品 | 免费午夜视频 | 欧美在线综合 | 日韩一区二区在线观看视频 | 精品视频久久久 | 久久久久久女 | 精品亚洲一区二区 | 日本国产一区二区 | 国产精品久久久久久久久久 | 亚洲 中文 欧美 日韩 在线观看 | 色精品视频 | 久久综合九色综合欧美狠狠 | 91精品久久久久久久久中文字幕 | 手机在线一区二区三区 | 久在线观看 | 九九色综合 | 欧美成人一区二区三区 | 伊人久操| 综合激情网 | 成人在线视频免费看 | 91色视频在线观看 | 亚洲网在线 | 毛片免费在线 | 色资源av|