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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機智能溫度檢測系統(tǒng)源程序,紅外遙控控制設(shè)定閾值

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:629845 發(fā)表于 2019-12-16 11:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機源程序如下:
  1. /*
  2. 實驗說明:
  3.         根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
  4.         將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認(rèn)將該宏注釋。
  5. 實驗接線:
  6.         1,LCD1602液晶模塊-->單片機管腳
  7.         參考LCD1602液晶顯示實驗接線(開發(fā)攻略內(nèi)在對應(yīng)的實驗章節(jié)內(nèi)實驗現(xiàn)象有接線說明)
  8.         2,紅外遙控模塊-->單片機管腳
  9.         P32
  10.         3,蜂鳴器模塊-->單片機管腳
  11.         BEEP-->P15
  12.         4,LED模塊-->單片機管腳
  13.         D1-->P24
  14.         5,LED模塊-->單片機管腳
  15.         D1-->P24
  16.         6,繼電器模塊-->單片機管腳
  17.         RELAY-->P14
  18.         7,直流電機模塊-->單片機管腳
  19.         IN1-->P10(參考直流電機實驗接線)
  20.         8,EEPROM模塊-->單片機管腳
  21.         P20-->SDA
  22.         P21-->SCL
  23.         9,DS18B20模塊-->單片機管腳
  24.         P37
  25.         
  26. 實驗現(xiàn)象:
  27.         首先它能顯示環(huán)境的溫度并能設(shè)置上下限閥值,這是最基本的功能,系統(tǒng)上電的時候顯示的是當(dāng)前環(huán)境溫度
  28.         和設(shè)定的溫度閥值,我們可以通過紅外遙控鍵來修改溫度上下限閥值。我們看,按下這個1鍵會進入溫度閥值設(shè)置
  29.         界面,每按一下,切換一次閥值設(shè)置(上下閥值)界面,按第3次時,會自動回到主界面,如此循環(huán)。
  30.         在進入溫度閥值設(shè)計界面時,可以通過2、3鍵對閥值進行加減,這里我們只對溫度整數(shù)部分進行設(shè)置,
  31.         小數(shù)部分我們就不需要了,將設(shè)置好的上下限閥值保存到AT24C02(EEPROM)內(nèi),當(dāng)下一次開啟系統(tǒng)時只需
  32.         從AT24C02內(nèi)讀取保存的閥值數(shù)據(jù),而不需要重復(fù)設(shè)置上下限閥值。這樣的話,我們用3個按鍵就實現(xiàn)了溫度上下
  33.         限閥值的設(shè)定,這是溫度檢測控制系統(tǒng)基本的功能。假如我們把溫度上限設(shè)置為32°C,下限設(shè)置為30°C。
  34.         另外還有恒定溫度的功能。當(dāng)設(shè)定好上下限閥值時,系統(tǒng)即會把當(dāng)前的溫度與設(shè)定的上下限閥值對比,
  35.         如果高于上限溫度,開啟散熱進行降溫,同時報警;如果低于下限溫度,開啟加熱,同時報警;
  36.         如果當(dāng)前溫度處于下限和上限溫度之間時,關(guān)閉散熱、加熱及報警。從而可將溫度控制在閥值的范圍內(nèi)。
  37. */

  38. #include "public.h"
  39. #include "lcd.h"
  40. #include "temp.h"
  41. #include "i2c.h"                          

  42. sbit led=P2^4; //報警指示燈

  43. sbit beep=P1^5;          //蜂鳴器報警
  44. sbit relay=P1^4;  //加熱設(shè)備
  45. sbit moto=P1^0;   //電機散熱

  46. sbit IRIN=P3^2;

  47. u8 IrValue[6];
  48. u8 Time,K;
  49. char set_templ=5,set_temph=20;  //設(shè)定溫度上下限默認(rèn)值
  50. u16 temp_val;  //檢測的實際溫度
  51. u8 mode;  //溫度模式

  52. u8 irtime;          //接收時間
  53. u8 startflag;  //開始檢測
  54. u8 bitnum;          //bit位數(shù)
  55. u8 irdata[33]; //寄存沒有個bit的時間
  56. u8 irreceok;          //接收完成標(biāo)志位
  57. u8 ircode[4];  //將接收的四個字節(jié)數(shù)據(jù)保存
  58. u8 irprosok;          //接收數(shù)據(jù)處理標(biāo)志位
  59. u8 irdisp[8];  //將四個字節(jié)的16進制通過轉(zhuǎn)換變成十進制存儲
  60. u8 dat1,dat2;
  61. u8 keynum;
  62. u8 motoflag;

  63. int motopros(u8 mode);

  64. void int0init()
  65. {
  66.         EA=1;
  67.         EX0=1;
  68.         IT0=1;
  69. }
  70. void time0init()
  71. {
  72.         TMOD=0X02;        //設(shè)置定時器0模式2.該模式為自動裝載模式
  73.         TH0=0X00;
  74.         TL0=0X00;//設(shè)定計數(shù)初值,每當(dāng)TL0計數(shù)到255時,TH0將把自己的數(shù)據(jù)給TL0,又重新計數(shù)
  75.         TR0=1;
  76.         ET0=1;
  77.         EA=1;        
  78. }
  79. void irpros() //紅外接收數(shù)據(jù)處理 ,區(qū)分是數(shù)據(jù)0還是1
  80. {
  81.         u8 i,j,value;
  82.         u8 k=1;        //引導(dǎo)碼去掉,所以令k=1;
  83.         for(j=0;j<4;j++)  //取出了一幀數(shù)據(jù)中的四個字節(jié)數(shù)據(jù)
  84.         {
  85.                 for(i=0;i<8;i++)        //取出了一個字節(jié)的數(shù)據(jù)               
  86.                 {
  87.                         value>>=1;
  88.                         if(irdata[k]>6)
  89.                         {
  90.                                 value=value|0x80;
  91.                         }
  92.                         k++;
  93.                 }
  94.                 ircode[j]=value;
  95.         }
  96.         irprosok=1;
  97. }
  98. void irwork()  //將四個字節(jié)的數(shù)據(jù)轉(zhuǎn)換成10進制數(shù)顯示
  99. {
  100.         irdisp[0]=ircode[0]/16;//顯示高位
  101.         irdisp[1]=ircode[0]%16;//顯示低位  
  102.         irdisp[2]=ircode[1]/16;
  103.         irdisp[3]=ircode[1]%16;         //同一個遙控器此2個字節(jié)的引導(dǎo)碼數(shù)據(jù)是不會改變的,改變的只是數(shù)據(jù)碼及反碼
  104.         irdisp[4]=ircode[2]/16;
  105.         irdisp[5]=ircode[2]%16;
  106.         irdisp[6]=ircode[3]/16;
  107.         irdisp[7]=ircode[3]%16;
  108.         dat1=irdisp[4];
  109.         dat2=irdisp[5];
  110.         keynum++;
  111. }

  112. void Temp_DataPros()
  113. {
  114.         short temp;
  115.         u8 temp_buf[5];
  116.         temp=Ds18b20ReadTemp();
  117.         temp_val=temp;        
  118.         if(temp<0)
  119.         {
  120.                 temp=-temp;
  121.                 LCD_Dispstring(2+5,0,"-");
  122.         }
  123.         else
  124.         {
  125.                 LCD_Dispstring(2+5,0," ");
  126.         }

  127.         temp_buf[0]=temp/100+0x30;
  128.         temp_buf[1]=temp%100/10+0x30;
  129.         temp_buf[2]='.';
  130.         temp_buf[3]=temp%100%10+0x30;
  131.         temp_buf[4]='\0';
  132.         LCD_Dispstring(2+6,0,temp_buf);                 //顯示檢測的溫度xx.x

  133.         temp_buf[0]=set_temph/10+0x30;
  134.            temp_buf[1]=set_temph%10+0x30;
  135.         temp_buf[2]='\0';
  136.         LCD_Dispstring(5,1,temp_buf);          //顯示設(shè)定的溫度上限值xx

  137.         temp_buf[0]=set_templ/10+0x30;
  138.            temp_buf[1]=set_templ%10+0x30;
  139.         temp_buf[2]='\0';
  140.         LCD_Dispstring(14,1,temp_buf);         //顯示設(shè)定的溫度下限值xx
  141. }

  142. #define  K1_MODE  1
  143. #define  K2_ADD  2
  144. #define  K3_DEC  3

  145. void KEY_Pros()
  146. {
  147.         u8 key;
  148.         u8 temph_buf[3];

  149.         key=motopros(0);
  150.         
  151.         if(key==K1_MODE)   //模式選擇
  152.         {
  153.                 mode++;
  154.                 LCD_Clear();

  155.                 if(mode==1)
  156.                 {
  157.                         LCD_Dispstring(0,0,"SETH:   C");               
  158.                 }
  159.                 else if(mode==2)
  160.                 {
  161.                         LCD_Dispstring(0,1,"SETL:   C");        
  162.                 }
  163.                 else
  164.                 {
  165.                         mode=0;
  166.                         LCD_Dispstring(2,0,"Temp:     C");
  167.                         LCD_Dispstring(0,1,"SETH:  ");
  168.                         LCD_Dispstring(9,1,"SETL:  ");        
  169.                 }
  170.         }
  171.         if(mode==1)         //溫度上限設(shè)置
  172.         {
  173.                 switch(key)        
  174.                 {
  175.                         case K2_ADD:            //加
  176.                                                 set_temph++;
  177.                                                 if(set_temph>=80)set_temph=80;
  178.                                                 break;
  179.                         case K3_DEC:          //減
  180.                                                 set_temph--;
  181.                                                 if(set_temph<=0)set_temph=0;
  182.                                                 break;
  183.                 }

  184.                 temph_buf[0]=set_temph/10+0x30;
  185.                 temph_buf[1]=set_temph%10+0x30;
  186.                 temph_buf[2]='\0';
  187.                    LCD_Dispstring(6,0,temph_buf);
  188.                 At24c02Write(0,set_temph);
  189.         }

  190.         else if(mode==2)  //溫度下限設(shè)置
  191.         {
  192.                 switch(key)        
  193.                 {
  194.                         case K2_ADD:            //加
  195.                                                 set_templ++;
  196.                                                 if(set_templ>=80)set_templ=80;
  197.                                                 break;
  198.                         case K3_DEC:          //減
  199.                                                 set_templ--;
  200.                                                 if(set_templ<=0)set_templ=0;
  201.                                                 break;
  202.                 }

  203.                 temph_buf[0]=set_templ/10+0x30;
  204.                 temph_buf[1]=set_templ%10+0x30;
  205.                 temph_buf[2]='\0';
  206.                    LCD_Dispstring(6,1,temph_buf);
  207.                 At24c02Write(2,set_templ);
  208.         }
  209. }

  210. void sound()
  211. {
  212.         u8 i=50;
  213.         while(i--)
  214.         {
  215.                 beep=!beep;
  216.                 delay(10);
  217.         }
  218. }
  219. void TempData_Compare()
  220. {
  221.         if(temp_val>set_temph*10)        //實際溫度高于上限值   報警  散熱
  222.         {
  223.                 led=0;
  224.                 moto=1;
  225.                 relay=0;
  226.                 sound();               
  227.         }
  228.         else if(temp_val<set_templ*10)         //實際溫度低于下限值   報警  加熱
  229.         {
  230.                 led=0;
  231.                 moto=0;
  232.                 relay=0;
  233.                 sound();               
  234.         }
  235.         else                      //實際溫度在下限值和上限值之間   取消報警  取消加熱  取消散熱
  236.         {
  237.                 moto=0;
  238.                 led=1;
  239.                 relay=1;
  240.         }
  241. }

  242. void kai_display()
  243. {
  244.         if(At24c02Read(255)!=18)
  245.         {
  246.                 At24c02Write(0,set_temph);
  247.                 At24c02Write(2,set_templ);
  248.                 At24c02Write(255,18);        
  249.         }
  250.         else
  251.         {
  252.                 set_temph=At24c02Read(0);
  253.                 set_templ=At24c02Read(2);        
  254.         }

  255.         LCD_Dispstring(2,0,"Temp:     C");
  256.         LCD_Dispstring(0,1,"SETH:  ");
  257.         LCD_Dispstring(9,1,"SETL:  ");
  258. }

  259. //mode:  0-單次掃描   1-連續(xù)掃描
  260. int motopros(u8 mode)
  261. {
  262.         static u8 key=1;
  263.         u8 k1,k2,k3;
  264.         if(key)
  265.         {
  266.                 key=0;
  267.                 if((dat1==0)&&(dat2==12))  //按下第一次按鍵開馬達
  268.                 {                        
  269.                         dat1=0;
  270.                         dat2=0;
  271.                         k1=0;
  272.                         return K1_MODE;                                
  273.                 }
  274.                                 
  275.                 if((dat1==1)&&(dat2==8))        //按下第二次此按鍵時關(guān)閉馬達
  276.                 {
  277.                         dat1=0;
  278.                         dat2=0;
  279.                         k2=0;
  280.                         return K2_ADD;
  281.                 }
  282.                 if((dat1==5)&&(dat2==14))        //按下第二次此按鍵時關(guān)閉馬達
  283.                 {
  284.                         dat1=0;
  285.                         dat2=0;
  286.                         k3=0;
  287.                         return K3_DEC;
  288.                 }
  289.                 if((dat1==0)&&(dat2==8))        //按下第二次此按鍵時關(guān)閉馬達
  290.                 {
  291.                         dat1=0;
  292.                         dat2=0;
  293.                         keynum=0;               
  294.                 }
  295.         }

  296.         else if(k1==1&&k2==1&&k3==1)
  297.         {
  298.                 key=1;        
  299.         }
  300.         if(mode)
  301.         {
  302.                 key=1;
  303.         }
  304.         return 0;
  305.         k1=1;k2=1;k3=1;                                                
  306. }

  307. void main()
  308. {
  309.         moto=0;
  310.         led=1;
  311.         relay=1;

  312.         int0init();
  313.         time0init();
  314.         LCD_Init();
  315.         kai_display();
  316.         while(1)
  317.         {
  318.                 if(irreceok)
  319.                 {
  320.                         irreceok=0;
  321.                         irpros();
  322.                         if(irprosok)
  323.                         {
  324.                                 irwork();
  325.                         }
  326.                 }
  327.                 motopros();
  328.                 if(mode==0)
  329.                         Temp_DataPros();
  330.                 KEY_Pros();        
  331.                 TempData_Compare();                                
  332.         }
  333. }

  334. void time0() interrupt 1
  335. {
  336.         irtime++;//每進來一次就說明定時時間為256us;        
  337. }
  338. void init0() interrupt 0
  339. {
  340.         if(startflag)
  341.         {
  342.                 if(irtime>32)//檢測引導(dǎo)碼,求法是用引導(dǎo)碼時間除以一次計數(shù)時間,看看要多少次
  343.                 {
  344.                         bitnum=0;        
  345.                 }
  346.                 irdata[bitnum]=irtime;
  347.                 irtime=0;
  348.                 bitnum++;
  349.                 if(bitnum==33)
  350.                 {
  351.                         bitnum=0;
  352.                         irreceok=1;//一幀紅外數(shù)據(jù)接收完成標(biāo)志
  353.                 }
  354.         }
  355.         else
  356.         {
  357.                 startflag=1;//將開始標(biāo)志位置1,等到下次進入中斷即可進入if語句
  358.                 irtime=0;//將開始之前的計數(shù)器時間清零。等到下次進入中斷的時候才是引導(dǎo)碼真正的時間
  359.         }
  360. }
復(fù)制代碼

所有程序51hei提供下載:
智能溫度檢測控制系統(tǒng)設(shè)計.rar (72.88 KB, 下載次數(shù): 51)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:583775 發(fā)表于 2019-12-22 14:27 | 只看該作者
沒有原理圖
回復(fù)

使用道具 舉報

板凳
ID:629845 發(fā)表于 2019-12-27 20:47 | 只看該作者

我是用的普中51單片機開發(fā)板,可以把開發(fā)板的原理圖給你,沒有畫仿真電路圖
回復(fù)

使用道具 舉報

地板
ID:629845 發(fā)表于 2019-12-27 20:49 | 只看該作者
用的開發(fā)板,我把開發(fā)板原理圖給你

普中51-雙核-A6開發(fā)板原理圖.pdf

205.83 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報

5#
ID:861537 發(fā)表于 2020-12-16 17:00 | 只看該作者
你好,這個是按鍵控制還是紅外控制啊,為什么設(shè)置溫度加減時定義的是K2和K3
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国产精品-国产精品 | 色在线免费视频 | 九色视频网站 | 欧美日韩国产精品一区二区 | 久久久久久久久久久成人 | 中文字幕亚洲欧美 | 在线观看日本高清二区 | 黄色网址免费在线观看 | 成年免费大片黄在线观看一级 | 亚洲国产精品人人爽夜夜爽 | 亚洲男人的天堂网站 | 免费a v网站 | 国产高清在线 | 日本色高清 | 国产午夜精品一区二区三区嫩草 | 国产精品久久久久久久久免费 | 电影91久久久 | 国产美女久久久 | 亚洲精品久久久久久久久久吃药 | 久久精品毛片 | 久久久久黄色 | 午夜不卡福利视频 | 久久亚洲一区 | 91亚洲精品国偷拍自产在线观看 | 韩日一区二区三区 | 亚洲444kkkk在线观看最新 | 91精品入口蜜桃 | www.黄色在线观看 | 精品一区二区三区四区五区 | 免费观看一区二区三区毛片 | 成人水多啪啪片 | 成人欧美一区二区 | 美女黄视频网站 | 欧美国产日韩一区二区三区 | 久久宗合色| 久久久夜 | 婷婷色网 | 成人在线观看免费观看 | 九九热在线免费观看 | 国产欧美一区二区三区久久手机版 | a级黄色片在线观看 |