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

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

QQ登錄

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

搜索
查看: 3438|回復(fù): 0
收起左側(cè)

DS18B20單片機(jī)矩陣鍵盤(pán)設(shè)置上限檢測(cè)、報(bào)警裝置(LED燈亮、電機(jī)轉(zhuǎn)動(dòng)散熱)

[復(fù)制鏈接]
ID:243507 發(fā)表于 2018-3-4 15:26 | 顯示全部樓層 |閱讀模式
該溫度檢測(cè)器,使用了10米線(xiàn)長(zhǎng)的DS18b20溫度傳感器和51開(kāi)發(fā)板,傳感器由于使用長(zhǎng)距離的接線(xiàn),所以需增加上拉電阻。使用Lcd1602顯示溫度和所設(shè)置的上限報(bào)警值,可使用矩陣鍵盤(pán)設(shè)置上限報(bào)警的溫度值,報(bào)警系統(tǒng)包括:LED燈由黃變紅,同時(shí)電機(jī)轉(zhuǎn)動(dòng)散熱。

制作出來(lái)的實(shí)物圖如下:

整體裝置(基于開(kāi)發(fā)板)

整體裝置(基于開(kāi)發(fā)板)


顯示情況

顯示情況



單片機(jī)源程序如下:
  1. #include "reg52.h"       
  2. #include "temp.h"        //包含ds18b20的相關(guān)函數(shù)
  3. #include "lcd.h"    //包含Lcd的相關(guān)函數(shù)

  4. #define GPIO_KEY P1        //薄膜按鍵接口

  5. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
  6. typedef unsigned char u8;

  7. void LcdWriteCom(uchar com);        //選擇Lcd屏寫(xiě)入位置的函數(shù)
  8. void LcdWriteData(uchar dat);        //在Lcd屏進(jìn)行寫(xiě)入數(shù)據(jù)操作的函數(shù)
  9. void LcdInit();                                        //Lcd初始化函數(shù)

  10. sbit LED_yello=P3^5;        //LED黃色正極
  11. sbit LED_red=P3^6;                //LED紅色正極
  12. sbit K3=P3^2;  //設(shè)置按鍵

  13. int Ceiling=27;     //初始上限值

  14. u8 LcdplayData[16]={'T','e','m','p',':',' ',' ',0,0,0,0,'.',0,0,'`','C'};
  15. u8 sz[16]="Please input:   ";
  16. u8 shezhi[16]={'C','e','i','l','i','n','g',':',' ','2','7','`','C',' ',' ',' '};

  17. void Delay_ms(unsigned int ms)//延時(shí)函數(shù),延時(shí)1ms
  18. {
  19.         int j;
  20.         for(;ms>0;ms--)
  21.           for(j=140;j>0;j--);
  22. }


  23. /*******************************************************************************
  24. * 函 數(shù) 名         : datapros()
  25. * 函數(shù)功能                   : 溫度讀取處理轉(zhuǎn)換函數(shù)
  26. * 輸    入         : temp
  27. * 輸    出         : 無(wú)
  28. *******************************************************************************/

  29. int datapros(int temp)          
  30. {
  31.            float tp;
  32.         int t;  
  33.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  34.           {
  35.                 LcdplayData[7] ='-';           //正負(fù)位為-
  36.                 //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
  37.                 temp=temp-1;
  38.                 temp=~temp;
  39.                 tp=temp;
  40.                 temp=tp*0.0625*100+0.5;
  41.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  42.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  43.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。

  44.           }
  45.         else
  46.           {                       
  47.                 LcdplayData[7] ='+';
  48.                 tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  49.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  50.                 temp=tp*0.0625*100+0.5;       
  51.                 //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  52.                 //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  53.                 //算加上0.5,還是在小數(shù)點(diǎn)后面。
  54.         }
  55.         t=temp;       
  56.         LcdplayData[8] = temp / 10000+48;       //提取各位
  57.         LcdplayData[9] = temp % 10000 / 1000+48;
  58.         LcdplayData[10] = temp % 1000 / 100+48;            
  59.         LcdplayData[12] = temp % 100 / 10+48;
  60.         LcdplayData[13] = temp % 10+48;

  61.         return t;
  62. }


  63. /*******************************************************************************
  64. * 函數(shù)名         :LcdDisplay()
  65. * 函數(shù)功能                 :Lcd1602顯示函數(shù)
  66. * 輸入           : 無(wú)
  67. * 輸出                  : 無(wú)
  68. *******************************************************************************/
  69. void LcdDisplay()
  70. {
  71.         LcdWriteCom(0x87);
  72.         LcdWriteData(LcdplayData[7]);         //寫(xiě)入+-號(hào)       
  73.         LcdWriteData(LcdplayData[8]=='0' ? ' ':LcdplayData[8]);         //輸出整數(shù)部分
  74.         LcdWriteData(LcdplayData[9]=='0' ? ' ':LcdplayData[9]);                //若是0,不輸出
  75.         LcdWriteData(LcdplayData[10]);
  76.         LcdWriteCom(0x8c);         
  77.         LcdWriteData(LcdplayData[12]);                                                                //輸出小數(shù)部分
  78.         LcdWriteData(LcdplayData[13]);
  79. //        Delay_ms(100);

  80. /*
  81.         SBUF = '0'+m;        //將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  82.         while (!TI);        //等待發(fā)送數(shù)據(jù)完成
  83.         TI = 0;                        //發(fā)送完成標(biāo)志位清零
  84. */
  85. }

  86. void xinxi()//輸出兩行中的固定信息
  87. {
  88.         u8 i;
  89.         LcdWriteCom(0x01);//清屏
  90.         LcdWriteCom(0x80);//輸出第一行的
  91.         for (i=0;i<7;i++)
  92.         {
  93.                 LcdWriteData(LcdplayData[i]);
  94.         }
  95.         LcdWriteCom(0x8b);
  96.         LcdWriteData(LcdplayData[11]);                       
  97.         LcdWriteCom(0x8e);
  98.         LcdWriteData(LcdplayData[14]);
  99.         LcdWriteData(LcdplayData[15]);
  100.         LcdWriteCom(0xc0);//輸出第二行的
  101.         for (i=0;i<16;i++)
  102.         {
  103.                 if (i==8&&shezhi[8]=='0')        shezhi[8]=' ';
  104.                 LcdWriteData(shezhi[i]);
  105.         }
  106. }


  107. void zdkg()            //        中斷開(kāi)關(guān)
  108. {
  109.      EA=1;
  110.      IT0=1;
  111.          EX0=1;
  112. }


  113. void Int0()        interrupt 0            //外部中斷0的中斷函數(shù)
  114. {
  115.         u8 i,j,KeyValue;
  116.         u16 key=0;
  117.         if(K3==0)
  118.         {
  119.                 Delay_ms(10);//消抖
  120.                 if(K3==0)
  121.                 {
  122.                         LcdWriteCom(0x80);
  123.                         for (i=0;i<16;i++)//輸出提示信息
  124.                         {
  125.                                 LcdWriteData(sz[i]);
  126.                         }
  127.                         while (K3==0)        ;//等待松手,必須確保第一次按下后已松手       
  128.                         while (1)
  129.                         {               
  130.                                 j=0;
  131.                             GPIO_KEY=0x0f;
  132.                             while (GPIO_KEY==0x0f)        //等待按下鍵盤(pán)
  133.                                 {
  134.                                         if (K3==0)
  135.                                         {
  136.                                                 Delay_ms(10);
  137.                                                 if (K3==0)
  138.                                                 {
  139.                                                         while (K3==0)        ;//等待松手,必須確保第2次按下后已松手
  140.                                                         goto over;        //若再次按下K3按鍵,則設(shè)置完畢,可以跳出中斷
  141.                                                 }                       
  142.                                         }               
  143.                                 }
  144.                                 if (GPIO_KEY!=0x0f)//讀取按鍵是否按下
  145.                                 {
  146.                                         Delay_ms(10);//延時(shí)消抖
  147.                                         if(GPIO_KEY!=0x0f)//再次檢測(cè)鍵盤(pán)是否按下
  148.                                         {                       
  149.                                                 //測(cè)試列
  150.                                                 GPIO_KEY=0X0f;
  151.                                                 switch(GPIO_KEY)
  152.                                                 {
  153.                                                         case(0X07):        KeyValue=0;break;
  154.                                                         case(0X0b):        KeyValue=1;break;
  155.                                                         case(0X0d): KeyValue=2;break;
  156.                                                         case(0X0e):        KeyValue=3;break;
  157.                                                 }
  158.                                                 //測(cè)試行
  159.                                                 GPIO_KEY=0Xf0;
  160.                                                 switch(GPIO_KEY)
  161.                                                 {
  162.                                                         case(0X70):        KeyValue=KeyValue+0;break;
  163.                                                         case(0Xb0):        KeyValue=KeyValue+4;break;
  164.                                                         case(0Xd0): KeyValue=KeyValue+8;break;
  165.                                                         case(0Xe0):        KeyValue=KeyValue+12;break;
  166.                                                 }
  167.                                                 while((j<40)&&(GPIO_KEY!=0xf0))         //松手檢測(cè)
  168.                                                 {
  169.                                                         Delay_ms(10);
  170.                                                         j++;
  171.                                                 }
  172.                                                 switch (KeyValue)
  173.                                                 {
  174.                                                         //key計(jì)算最新鍵入的值,Ceiling存放最新鍵入的值
  175.                                                         case  0:key=key*10+1;Ceiling=key;break;//鍵入1
  176.                                                            case  1:key=key*10+2;Ceiling=key;break;//鍵入2
  177.                                                          case  2:key=key*10+3;Ceiling=key;break;//鍵入3
  178.                                                         case  3:Ceiling++;key=0;break;                   //按“A”,則加1,同時(shí)變量key要清零
  179.                                                         case  4:key=key*10+4;Ceiling=key;break;//鍵入4
  180.                                                          case  5:key=key*10+5;Ceiling=key;break;//鍵入5
  181.                                                         case  6:key=key*10+6;Ceiling=key;break;//鍵入6
  182.                                                         case  7:Ceiling--;key=0;break;                   //按“B”,則減1,同時(shí)變量key要清零
  183.                                                         case  8:key=key*10+7;Ceiling=key;break;//鍵入7
  184.                                                         case  9:key=key*10+8;Ceiling=key;break;//鍵入8
  185.                                                         case 10:key=key*10+9;Ceiling=key;break;//鍵入9
  186.                                                         case 11:break;
  187.                                                         case 12:key=Ceiling=0;break;                   //按“*”,則所有清零
  188.                                                         case 13:key=key*10+0;Ceiling=key;break;//鍵入0
  189.                                                         case 14:break;
  190.                                                         case 15:break;                                                   //“C”“D”“#”無(wú)操作
  191.                                                 }
  192.                                                 shezhi[8] = Ceiling % 1000 / 100+48;            
  193.                                                 shezhi[9] = Ceiling % 100 / 10+48;
  194.                                                 shezhi[10] = Ceiling % 10+48;
  195.                                                 LcdWriteCom(0xc8);
  196.                                                 LcdWriteData(shezhi[8]=='0' ? ' ':shezhi[8]);          //顯示設(shè)置的上限值
  197.                                                 LcdWriteData(shezhi[9]=='0' ? ' ':shezhi[9]);                                       
  198.                                                 LcdWriteData(shezhi[10]);                                       
  199.                                         }
  200.                                 }
  201.                         }
  202.                 }
  203.         }
  204.         over:        xinxi();        //跳出中斷前重新輸出屏幕固定信息       
  205. }


  206. /*******************************************************************************
  207. * 函 數(shù) 名       : main
  208. * 函數(shù)功能                 : 主函數(shù)
  209. * 輸    入       : 無(wú)
  210. * 輸    出             : 無(wú)
  211. *******************************************************************************/
  212. void main()
  213. {
  214.         u16 temp;
  215.         LED_red=0;
  216.         LED_yello=1;       
  217.         LcdInit();//初始化Lcd       
  218.         zdkg();          //打開(kāi)中斷
  219.         xinxi();  //輸出屏幕固定信息
  220.         while(1)
  221.         {       
  222.                 temp=datapros(Ds18b20ReadTemp());         //數(shù)據(jù)處理函數(shù)
  223.                 LcdDisplay();                                             //Lcd顯示函數(shù)
  224.                 if (temp>=Ceiling*100)        LED_red=1,LED_yello=0;  //超限報(bào)警(LED燈變紅)
  225.                 else LED_red=0,LED_yello=1;               
  226. ……………………

  227. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
Ds18B20溫度檢測(cè)器(Lcd顯示、矩陣鍵盤(pán)設(shè)置上限報(bào)警、報(bào)警系統(tǒng)(LED燈亮、電機(jī)轉(zhuǎn)動(dòng)散熱).rar (2.04 MB, 下載次數(shù): 52)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人网站| www视频在线观看 | 黄色av网站在线观看 | 一级毛片色一级 | 国产www成人 | 国产小视频在线 | 日韩中文字幕在线观看 | 99热欧美 | 婷婷福利视频导航 | 天天色综 | h视频网站在线观看 | 亚洲精品视频免费 | 亚洲第一视频网 | 丝袜 亚洲 欧美 日韩 综合 | 国产午夜一级 | 国产一级片免费看 | 国产又色又爽又黄又免费 | 一区二区三区视频在线免费观看 | 久久久久久久综合 | 久久国产精品-久久精品 | 日韩亚洲视频 | 精品二三区 | 99免费精品视频 | 亚洲国产成人av好男人在线观看 | 精品久久香蕉国产线看观看亚洲 | 久久久tv | 色资源在线观看 | 日韩av在线不卡 | 国产精品久久久久久婷婷天堂 | av黄色在线 | 成人午夜电影在线观看 | 国产精品毛片无码 | 91久久国产综合久久91精品网站 | 欧美日韩高清在线观看 | 国产一区二区欧美 | 日韩精品久久一区二区三区 | 色久在线| 精品一二区| 97高清国语自产拍 | 91精品国产一区二区三区蜜臀 | 超碰免费在 |