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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2516|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STC89C52單片機(jī)多功能溫度計(jì)代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:432703 發(fā)表于 2019-3-25 22:10 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
設(shè)計(jì)了一種基于STC89C52單片機(jī)的溫度檢測(cè)系統(tǒng),該系統(tǒng)將溫度傳感器DS18B20接在控制器的端口上,對(duì)溫度進(jìn)行采集,將采集到的溫度值顯示在LCD1620液晶顯示。

基本設(shè)計(jì)要求
(1)能數(shù)字顯示被測(cè)溫度,測(cè)量溫度范圍0~100℃;
(2)分辨率不低于2℃;
(3)高、低兩路限溫控制點(diǎn)可在0~100℃范圍內(nèi)獨(dú)立設(shè)置;
(4)當(dāng)溫度達(dá)到高、低限溫控制點(diǎn)發(fā)出聲光報(bào)警。

DS18B20溫度傳感器經(jīng)對(duì)比,我們選擇DS18B20溫度傳感。DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過(guò)簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。
溫度報(bào)警         該部分由獨(dú)立按鍵和蜂鳴器組成。按鍵k1用來(lái)查看溫度上下限,k2,k3分別用來(lái)加減溫度上下限。當(dāng)測(cè)量溫度超過(guò)上下限溫度時(shí)相應(yīng)的led燈會(huì)亮起并且會(huì)蜂鳴器也會(huì)間斷的響起。

          程序所定義的變量與常量:
  1. 源程序:
  2. #include<reg51.h>
  3. #include<intrins.h>

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. #define LCD1602_DATAPINS P0

  7. #ifndef uchar
  8. #define uchar unsigned char
  9. #endif

  10. #ifndef uint8
  11. #define uint8 unsigned int
  12. #endif

  13. sbit beep=P1^5;                

  14. sbit DSPORT=P3^7;

  15. sbit LCD1602_E=P2^7;
  16. sbit LCD1602_RW=P2^5;
  17. sbit LCD1602_RS=P2^6;

  18. sbit k1=P3^1;           //模式
  19. sbit k2=P3^0;           //加
  20. sbit k3=P3^2;           //減

  21. sbit DHT11_DQ_OUT=P3^2;
  22. sbit led1=P2^3;
  23. sbit led2=P2^2;

  24. u8 mode=0;

  25. uint8 temph=80,templ=10;
  26. uint8 temp;
  27. uint8 flag;          //設(shè)定報(bào)警標(biāo)志
  28. uint8 tempvalue;
  29. uchar num[10]="0123456789";
  30. uint8 temphbuf[2];
  31. uint8 templbuf[2];
  32. uchar str1[]="Temp:";  //溫度
  33. uchar str2[]="TempH:";          //設(shè)定溫度上限顯示
  34. uchar str3[]="TempL:";          //設(shè)定溫度下限顯示

  35. void delay(u16 i)
  36. {
  37.    while (i--);
  38. }

  39. void delay1ms(uint8 y)
  40. {
  41.         uint8 x;
  42.         for( ; y>0; y--)
  43.         {
  44.                 for(x=110; x>0; x--);
  45.         }
  46. }

  47. void Lcd1602_Delay1ms(uint8 c)   //誤差 0us
  48. {
  49.     uchar a,b;
  50.         for (; c>0; c--)
  51.         {
  52.                  for (b=199;b>0;b--)
  53.                  {
  54.                           for(a=1;a>0;a--);
  55.                  }      
  56.         }
  57.            
  58. }

  59. void LcdWriteCom(uchar com)          //寫入命令
  60. {
  61.         LCD1602_E = 0;         //使能清零
  62.         LCD1602_RS = 0;         //選擇寫入命令
  63.         LCD1602_RW = 0;         //選擇寫入

  64.         LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  65.         Lcd1602_Delay1ms(1);

  66.         LCD1602_E = 1;         //寫入時(shí)序
  67.         Lcd1602_Delay1ms(5);
  68.         LCD1602_E = 0;

  69.         LCD1602_DATAPINS = com << 4; //發(fā)送低四位
  70.         Lcd1602_Delay1ms(1);

  71.         LCD1602_E = 1;         //寫入時(shí)序
  72.         Lcd1602_Delay1ms(5);
  73.         LCD1602_E = 0;
  74. }

  75. void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
  76. {
  77.         LCD1602_E = 0;          //使能清零
  78.         LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
  79.         LCD1602_RW = 0;          //選擇寫入

  80.         LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  81.         Lcd1602_Delay1ms(1);

  82.         LCD1602_E = 1;          //寫入時(shí)序
  83.         Lcd1602_Delay1ms(5);
  84.         LCD1602_E = 0;

  85.         LCD1602_DATAPINS = dat << 4; //寫入低四位
  86.         Lcd1602_Delay1ms(1);

  87.         LCD1602_E = 1;          //寫入時(shí)序
  88.         Lcd1602_Delay1ms(5);
  89.         LCD1602_E = 0;
  90. }

  91. void LcdInit()                                                  //LCD初始化子程序
  92. {
  93.         LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
  94.         LcdWriteCom(0x28);         //在四位線下的初始化
  95.         LcdWriteCom(0x0c);  //開(kāi)顯示不顯示光標(biāo)
  96.         LcdWriteCom(0x06);  //寫一個(gè)指針加1
  97.         LcdWriteCom(0x01);  //清屏
  98.         LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
  99. }

  100. char DS18B20init()
  101. {
  102.     uint8 i;
  103.            DSPORT=0;
  104.         i=70;
  105.         while (i--);
  106.         DSPORT=1;
  107.         i = 0;
  108.         while (DSPORT)
  109.         {
  110.           delay1ms(1);
  111.           i++;
  112.           if(i>5)
  113.           {
  114.             return 0 ;
  115.           }
  116.         }
  117.         return 1;
  118. }                                     // 一位一位的傳輸字節(jié)          ,先低位,后高位。

  119. void DS18B20writebyte(uchar dat)
  120. {
  121.    uint8 i,j;
  122.    for(i=0;i<8;i++)
  123.    {             
  124.          DSPORT=0;
  125.      j++;
  126.     DSPORT=dat & 0x01;
  127.         j=6;
  128.         while (j--);
  129.     DSPORT=1;
  130.         dat >>= 1;         
  131.    }
  132. }
  133. char DS18B20readbyte()          // 一位一位的接收數(shù)據(jù)
  134. {
  135.    uchar byte ,b;
  136.    uint8 i,j;
  137.    for(i=8;i>0;i--)
  138.    {
  139.      DSPORT=0;
  140.          j++;
  141.          DSPORT=1;
  142.          j++;
  143.          j++;
  144.          b=DSPORT;
  145.          byte=(byte >> 1)|(b << 7);
  146.          j=4;
  147.          while(j--);
  148.    }
  149.    return byte ;
  150. }

  151. void DS18B20changtemp()                   //轉(zhuǎn)換溫度
  152. {
  153.             DS18B20init();
  154.           delay1ms(1);
  155.           DS18B20writebyte(0xcc);        //跳過(guò)ROM操作命令
  156.           DS18B20writebyte(0x44);        //溫度轉(zhuǎn)換命令
  157. }

  158. void DS18B20sendreadtempc()
  159. {
  160.              DS18B20init();
  161.           delay1ms(1);
  162.           DS18B20writebyte(0xcc);        //跳過(guò)ROM操作命令
  163.           DS18B20writebyte(0xbe);        //發(fā)送讀取溫度命令
  164. }

  165. int  DS18B20readtemp()
  166. {
  167.           int temp=0;
  168.         uchar temph,templ;
  169.         DS18B20changtemp();
  170.     DS18B20sendreadtempc();
  171.         templ=DS18B20readbyte();         //讀取溫度值共16位,先讀低字節(jié)
  172.         temph=DS18B20readbyte();        //再讀高字節(jié)   templ與temph位置不可調(diào)換。
  173.         temp=temph;
  174.         temp<<=8;
  175.         temp|=templ;
  176.         return temp;
  177. }

  178. void key_pros()
  179. {
  180.     if(k1 == 0)
  181.         {
  182.           delay(1000);
  183.           if(k1 == 0)
  184.           {
  185.              mode++;
  186.                  if(mode==3)
  187.                  mode=0;
  188.                  LcdWriteCom(0x01);          
  189.           }
  190.           while(!k1);
  191.         }
  192.         if(mode==1)
  193.         {
  194.            if(k2==0)
  195.            {
  196.               delay(1000);
  197.                   if(k2==0)
  198.                   {
  199.                      temph++;
  200.                          if(temph>=80)temph=80;
  201.                   }
  202.                   while(!k2);
  203.            }
  204.            if(k3==0)
  205.            {
  206.               delay(1000);
  207.                   if(k3==0)
  208.                   {
  209.                      temph--;
  210.                          if(temph<=0)temph=0;

  211.                   }
  212.                   while(!k3);
  213.            }
  214.          }
  215.            if(mode==2)
  216.             {
  217.            if(k2==0)
  218.            {
  219.               delay(1000);
  220.                   if(k2==0)
  221.                   {
  222.                      templ++;
  223.                          if(templ>=80)templ=80;
  224.                   }
  225.                   while(!k2);
  226.            }
  227.            if(k3==0)
  228.            {
  229.              delay(1000);
  230.                  if(k3==0)
  231.                  {
  232.                    templ--;
  233.                    if(templ<=0)templ=0;
  234.              }
  235.                  while(!k3);
  236.        }
  237.      }
  238.   }

  239. void lcd_init_display()
  240. {
  241.      u8 i;
  242.          for(i=0;i<5;i++)
  243.             {
  244.                LcdWriteCom(0x80+i);
  245.                LcdWriteData(str1[i]);
  246.             }                       
  247. }

  248. void data_pros()
  249. {
  250.     u16        i;
  251.         u16 temphbuf[2],templbuf[2];
  252.         float dio;
  253.         u16 k;
  254.         tempvalue = DS18B20readtemp();         
  255.     dio=tempvalue*0.0625;
  256.         k=dio*100+0.5;//取小數(shù)點(diǎn)后兩位有效數(shù)字
  257.         temp=k;
  258.         temphbuf[0]=temph/10;
  259.         temphbuf[1]=temph%10;
  260.         templbuf[0]=templ/10;
  261.         templbuf[1]=templ%10;
  262.         if(mode==0)
  263.         {
  264.           lcd_init_display();
  265.           LcdWriteCom(0x85);
  266.           LcdWriteData(num[temp/1000]);
  267.           LcdWriteData(num[temp%1000/100]);
  268.           LcdWriteData('.');
  269.           LcdWriteData(num[k%100/10]);
  270.           LcdWriteData(num[k%10]);
  271.           LcdWriteData(0xdf);
  272.           LcdWriteData('C');
  273.         }       
  274.           if(mode==1)                          //溫度上限顯示
  275.         {         
  276.         LcdWriteCom(0x80);
  277.                 for(i=0;i<6;i++)
  278.                 {
  279.                         LcdWriteData(str2[i]);                  
  280.                 }
  281.                         LcdWriteData(num[temphbuf[0]]);
  282.                            LcdWriteData(num[temphbuf[1]]);

  283.                         LcdWriteData(0xdf);
  284.                 LcdWriteData('C');
  285.                 
  286.         }
  287.         if(mode==2)                          //溫度下限顯示
  288.         {       
  289.                 for(i=0;i<6;i++)
  290.                 {
  291.                     LcdWriteCom(0x80+i);
  292.                         LcdWriteData(str3[i]);                  
  293.                 }
  294.                 LcdWriteData(num[templbuf[0]]);
  295.                 LcdWriteData(num[templbuf[1]]);       
  296.                 LcdWriteData(0xdf);
  297.                         LcdWriteData('C');               
  298.         }
  299. }

  300. int baojinpros()
  301. {
  302.    float dio;
  303.    u16 k;
  304.    tempvalue = DS18B20readtemp();
  305.    dio=tempvalue*0.0625;
  306.    k=dio*100+0.5;//取小數(shù)點(diǎn)后兩位有效數(shù)字
  307.    tempvalue=k/100;
  308.    if(tempvalue >= temph)
  309.    {
  310.      led1=0;
  311.          led2=1;
  312.    }
  313.    if(tempvalue <= templ)
  314.    {
  315.      led1=1;
  316.          led2=0;
  317.          
  318.    }
  319.    if(tempvalue<temph&&tempvalue>templ)
  320.    {
  321.      led1=1;
  322.          led2=1;
  323.    }
  324.    return tempvalue;
  325. }

  326. void beepxx(uint8 a)
  327. {
  328.     u16 i=10;
  329.     if(a >= temph||a <= templ)
  330.    {
  331.       while(i--)
  332.           {
  333.                  beep=~beep;
  334.              delay(10);
  335.           }
  336.    }
  337. }

  338. void main()
  339. {
  340.    uint8 i=0,a;
  341.    led1=1;
  342.    led2=1;
  343.    LcdInit();  
  344.    lcd_init_display();
  345.    i=0;
  346.    while(1)
  347.    {       
  348.                 key_pros();
  349.                 a=baojinpros();        //報(bào)警處理
  350.                 beepxx(a);
  351.                 data_pros();         
  352.                 delay(100);        
  353.         }       
  354. }
復(fù)制代碼

全部資料51hei下載地址:
程序代碼.rar (2.24 KB, 下載次數(shù): 9)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-3-29 05:10 | 只看該作者
本帖需要補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲永久字幕 | 久草欧美 | 国产精品美女久久久久aⅴ国产馆 | 91网在线播放 | 亚洲精品福利视频 | 欧美日韩福利视频 | 国产午夜高清 | 中文字幕av第一页 | 男女啪啪高潮无遮挡免费动态 | 国产成人亚洲精品自产在线 | 你懂的国产| 久久九| 日韩欧美在线免费观看视频 | 一级毛片视频 | 在线一级片 | 久久不卡 | 午夜视频在线免费观看 | 日韩不卡视频在线 | 国产毛片视频 | 亚洲免费在线观看 | 国产亚洲欧美另类一区二区三区 | 国产中文字幕在线观看 | 精品一区二区在线视频 | 日韩一区中文字幕 | www.夜夜骑.com | 国产精品亚洲综合 | 日韩在线精品 | 日本a级大片 | 亚洲成人免费视频在线 | 国产精品久久久久久久久久免费看 | 久久精品99久久 | 久色网| 日韩欧美视频在线 | 色噜噜色综合 | 精品福利一区二区三区 | 日韩一区二区黄色片 | 欧洲亚洲一区 | 精品国产一区二区三区久久影院 | 人操人免费视频 | 精品伦精品一区二区三区视频 | 亚洲一区二区av在线 |