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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5469|回復: 2
打印 上一主題 下一主題
收起左側

基于51單片機的數字溫度計,上下限,蜂鳴器報警程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:632142 發表于 2020-1-4 10:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>
  2. #define key P2
  3. #define LCD1602_DB  P0
  4. sbit LCD1602_RS = P1^0;
  5. sbit LCD1602_RW = P1^1;
  6. sbit ADDR2 = P1^2;
  7. sbit ADDR3 = P1^3;//
  8. sbit ENLED = P1^4;//p1.4和p1.3是138使能端
  9. static unsigned char D=0;
  10. static unsigned char G=50;

  11.        sbitbuzz=P1^6;
  12. bit flag1s = 0;          //1s定時標志
  13. unsigned char T0RH = 0;  //T0重載值的高字節
  14. unsigned char T0RL = 0;  //T0重載值的低字節
  15. extern void delay_ms(unsigned int ms);
  16. extern void DelayX10us(unsigned char t);
  17. void ConfigTimer0(unsigned int ms);
  18. unsigned char IntToString(unsigned char*str, int dat);
  19. extern bit Start18B20();
  20. extern bit Get18B20Temp(int *temp);
  21. extern void InitLcd1602();
  22. extern void LcdShowStr(unsigned char x,unsigned char y, unsigned char *str);
  23. unsigned char code table0[]="D=";
  24. unsigned char code table1[]="G=";
  25. unsigned char code table2[]="TEMPIS:";
  26. unsigned char codetable3[]="DS18B20  ERR0R!";
  27. unsigned char codetable4[]="PLEASE   CHECK!";
  28. unsigned char code table5[]="'C";

  29. unsigned char code table7[]="Wlecometo you!!";
  30. unsigned char code table8[]=" I am YYY_Temp!";


  31. void main()
  32. {     
  33.    bit res;
  34.    int temp;        //讀取到的當前溫度值
  35.    int intT, decT;  //溫度值的整數和小數部分
  36.    unsigned char len;
  37.    unsigned char str[12];
  38.    InitLcd1602();   
  39.    LcdShowStr(0, 0, table7);
  40.    LcdShowStr(0, 1, table8);//5初始化顯示5s
  41.         delay_ms(5000);
  42.            EX0=1;
  43.            IT0=1;
  44.    EA = 1;            //開總中斷
  45.       
  46.    ConfigTimer0(10);  //T0定時10ms
  47.          
  48.    Start18B20();      //啟動DS18B20
  49.         delay_ms(5000);

  50.    while (1)
  51.     {
  52.        if (flag1s)  //每5秒更新一次溫度
  53.        {
  54.            flag1s = 0;
  55.            res = Get18B20Temp(&temp);  //讀取當前溫度
  56.            if (res)                    //讀取成功時,刷新當前溫度顯示
  57.            {
  58.                                                    intT = temp >> 4;             //分離出溫度值整數部分
  59.                 decT = temp & 0xF;            //分離出溫度值小數部分
  60.                 len = IntToString(str, intT);//整數部分轉換為字符串
  61.                 str[len++] = '.';             //添加小數點
  62.                 decT = (decT*10) / 16;        //二進制的小數部分轉換為1位十進制位
  63.                 str[len++] = decT + '0';      //十進制小數位再轉換為ASCII字符
  64.                 while (len < 6)               //用空格補齊到6個字符長度
  65.                 {
  66.                     str[len++] = ' ';
  67.                 }
  68.                 str[len] = '\0';              //添加字符串結束符
  69.                 LcdShowStr(8, 1, str);        //顯示到液晶屏         
  70.                                                         
  71.                                                         len= IntToString(str, D); //整數部分轉換為字符串
  72.                 while (len < 6)               //用空格補齊到6個字符長度
  73.                 {
  74.                     str[len++] = ' ';
  75.                 }
  76.                 str[len] = '\0';              //添加字符串結束符
  77.                 LcdShowStr(2, 0, str);
  78.                                                         
  79.                 len = IntToString(str, G); //整數部分轉換為字符串
  80.                 while (len < 6)               //用空格補齊到6個字符長度
  81.                 {
  82.                     str[len++] = ' ';
  83.                 }
  84.                 str[len] = '\0';              //添加字符串結束符
  85.                 LcdShowStr(10, 0, str);
  86.                                                       
  87.                                                         LcdShowStr(0,0, table0);
  88.                                                         LcdShowStr(8,0, table1);
  89.                                                         LcdShowStr(0,1, table2);
  90.                                                         LcdShowStr(13,1, table5);
  91.            }
  92.            else                        //讀取失敗時,提示錯誤信息
  93.            {
  94.                 LcdShowStr(0, 0, table3);
  95.                                                    LcdShowStr(0, 1, table4);
  96.            }
  97.            Start18B20();               //重新啟動下一次轉換
  98.        }
  99.                             //鍵盤設置上下限,0.3s掃描一次鍵值,同時更新一次上下限的顯示
  100.         key=0xf7;
  101.                             if(key!=0xf7)
  102.                                           {
  103.                delay_ms(10);
  104.                                                  switch(key)
  105.                                                  {
  106.                                                         case0xe7:
  107.                                                          D++;
  108.                                                          if(D==G)D=0;
  109.                                                                len= IntToString(str, D); //整數部分轉換為字符串
  110.                                                                while(len < 6)               //用空格補齊到6個字符長度
  111.                                                                {
  112.                                                                              str[len++]= ' ';
  113.                                                                }
  114.                                                                str[len]= '\0';              //添加字符串結束符
  115.                                                                LcdShowStr(2,0, str);
  116.                   break;        
  117.                                                         case0xd7:
  118.                                                                G--;
  119.                                                                if(G==D)G=50;
  120.                                                                len= IntToString(str, G); //整數部分轉換為字符串
  121.                                                                while(len < 6)               //用空格補齊到6個字符長度
  122.                                                                {
  123.                                                                              str[len++]= ' ';
  124.                                                                }
  125.                                                                str[len]= '\0';              //添加字符串結束符
  126.                                                                LcdShowStr(10,0, str);
  127.                                                                break;
  128.                                                  }
  129.                                             Start18B20();
  130.                                       delay_ms(300);//等待0.3s開始下一次掃描鍵值                                                        
  131.             }
  132.                                           //光和聲音警報部分
  133.                                           
  134.                                                         if(D>temp*0.0625||G<temp*0.0625)//超值報警
  135.                                                         {
  136.                                                         
  137.                                                                ENLED= 0;
  138.                                                                ADDR3= 1;
  139.                                                                ADDR2= 1;
  140.                                                                LCD1602_RW= 1;
  141.                                                                LCD1602_RS= 0;

  142.                                                                LCD1602_DB=0xf0;
  143.                                                                
  144.                                                                buzz=1;
  145.                                                                DelayX10us(17);
  146.                                                                buzz=0;
  147.                                                                DelayX10us(17);
  148.                                                                
  149.                                                                ENLED= 1;//138使能關閉
  150.                                                         }
  151.                                                                if(D==(temp*0.0625)||G==(temp*0.0625))//等值報警
  152.                                                         {
  153.                                                                ENLED= 0;
  154.                                                                ADDR3= 1;
  155.                                                                ADDR2= 1;
  156.                                                                LCD1602_RW = 1;
  157.                                                                LCD1602_RS= 0;

  158.                                                                LCD1602_DB=0xf8;
  159.                                                                buzz=1;
  160.                                                                DelayX10us(100);
  161.                                                                buzz=0;
  162.                                                                DelayX10us(100);
  163.                                                                ENLED= 1;//138使能關閉
  164.                                                         }      
  165.                                                         if((D<temp*0.0625&&(1.1*D)>temp*0.0625)||(G>temp*0.0625&&(0.9*G)<temp*0.0625))//接近報警
  166.                                                         {
  167.                                                                ENLED= 0;
  168.                                                                ADDR3= 1;
  169.                                                                ADDR2= 1;
  170.                                                                LCD1602_RW= 1;
  171.                                                                LCD1602_RS= 0;

  172.                                                                LCD1602_DB=0xfc;
  173.                                                                buzz=1;
  174.                                                                DelayX10us(2500);
  175.                                                                buzz=0;
  176.                                                                DelayX10us(2500);
  177.                                                                ENLED= 1;//138使能關閉
  178.                                                         }
  179.                                                 
  180.                                           
  181.     }
  182. }
  183. /* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度*/
  184. unsigned char IntToString(unsigned char*str, int dat)
  185. {
  186.    signed char i = 0;
  187.    unsigned char len = 0;
  188.    unsigned char buf[6];
  189.    
  190.    if (dat < 0)  //如果為負數,首先取絕對值,并在指針上添加負號
  191.     {
  192.        dat = -dat;
  193.        *str++ = '-';
  194.        len++;
  195.     }
  196.               else
  197.               {
  198.               *str++= ' ';
  199.     len++;
  200.               }
  201.    do {          //先轉換為低位在前的十進制數組
  202.        buf[i++] = dat % 10;
  203.        dat /= 10;
  204.     }while (dat > 0);
  205.    len += i;     //i最后的值就是有效字符的個數
  206.    while (i-- > 0)   //將數組值轉換為ASCII碼反向拷貝到接收指針上
  207.     {
  208.        *str++ = buf[i] + '0';
  209.     }
  210.    *str = '\0';  //添加字符串結束符
  211.    
  212.    return len;   //返回字符串長度
  213. }
  214. /* 配置并啟動T0,ms-T0定時時間 */
  215. void ConfigTimer0(unsigned int ms)
  216. {
  217.    unsigned long tmp;  //臨時變量
  218.    
  219.    tmp = 11059200 / 12;      //定時器計數頻率
  220.    tmp = (tmp * ms) / 1000;  //計算所需的計數值
  221.    tmp = 65536 - tmp;        //計算定時器重載值
  222.    tmp = tmp + 12;           //補償中斷響應延時造成的誤差
  223.    T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
  224.    T0RL = (unsigned char)tmp;
  225.    TMOD &= 0xF0;   //清零T0的控制位
  226.    TMOD |= 0x01;   //配置T0為模式1
  227.    TH0 = T0RH;     //加載T0重載值
  228.    TL0 = T0RL;
  229.    ET0 = 1;        //使能T0中斷
  230.    TR0 = 1;        //啟動T0
  231. }
  232. /* T0中斷服務函數,完成1秒定時 */
  233. void InterruptTimer0() interrupt 1
  234. {
  235.    static unsigned int tmr1s = 0;
  236.    
  237.    TH0 = T0RH;  //重新加載重載值
  238.    TL0 = T0RL;
  239.    tmr1s++;
  240.    if (tmr1s >= 500)  //定時5s
  241.     {
  242.        tmr1s = 0;
  243.        flag1s = 1;
  244.     }
  245. }
復制代碼

超級無敵終極版本數字溫度計.zip

64.21 KB, 下載次數: 75, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:293630 發表于 2020-4-28 23:04 來自手機 | 只看該作者
樓主方便把仿真也放一下么?麻煩了
回復

使用道具 舉報

板凳
ID:994797 發表于 2021-12-22 08:16 | 只看該作者
那個,溫度可以顯示負數啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区二区三区视频在线观看 | 色婷婷国产精品综合在线观看 | 亚洲视频一区 | 日本特黄a级高清免费大片 成年人黄色小视频 | 九九热在线免费视频 | 亚洲国产一区视频 | 欧美 日韩 亚洲91麻豆精品 | 在线欧美视频 | 爱操影视| 午夜影院在线观看免费 | 欧美日韩亚洲一区 | www久久国产 | 精品国产伦一区二区三区观看说明 | 黄色片在线 | 日本一二区视频 | a在线视频 | 91亚洲一区 | 一区二区三区免费 | www.亚洲| www久| 麻豆久久久9性大片 | 日韩在线小视频 | 亚洲国产精品91 | 在线观看国产精品一区二区 | 日韩1区 | 国产不卡视频 | 欧美成人精品一区二区男人看 | 熟女毛片 | 久久一本 | 成人在线网 | 欧美日韩综合一区 | 一级毛片黄片 | 亚洲一区二区三区在线视频 | 成人在线视频网 | 国产精品综合一区二区 | 男人的天堂avav | 一区二区视频在线 | 欧美国产日韩精品 | 欧美自拍视频 | 青久草视频 | 毛片a级毛片免费播放100 |