|
單片機(jī)源程序如下:
- /*
- 實(shí)驗(yàn)說(shuō)明:
- 根據(jù)自己使用的LCD1602是否帶有轉(zhuǎn)接板,如果帶有轉(zhuǎn)接板的即為4位,需在LCD.H頭文件中
- 將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認(rèn)將該宏注釋。
- 實(shí)驗(yàn)接線:
- 1,LCD1602液晶模塊-->單片機(jī)管腳
- 參考LCD1602液晶顯示實(shí)驗(yàn)接線(開發(fā)攻略內(nèi)在對(duì)應(yīng)的實(shí)驗(yàn)章節(jié)內(nèi)實(shí)驗(yàn)現(xiàn)象有接線說(shuō)明)
- 2,紅外遙控模塊-->單片機(jī)管腳
- P32
- 3,蜂鳴器模塊-->單片機(jī)管腳
- BEEP-->P15
- 4,LED模塊-->單片機(jī)管腳
- D1-->P24
- 5,LED模塊-->單片機(jī)管腳
- D1-->P24
- 6,繼電器模塊-->單片機(jī)管腳
- RELAY-->P14
- 7,直流電機(jī)模塊-->單片機(jī)管腳
- IN1-->P10(參考直流電機(jī)實(shí)驗(yàn)接線)
- 8,EEPROM模塊-->單片機(jī)管腳
- P20-->SDA
- P21-->SCL
- 9,DS18B20模塊-->單片機(jī)管腳
- P37
-
- 實(shí)驗(yàn)現(xiàn)象:
- 首先它能顯示環(huán)境的溫度并能設(shè)置上下限閥值,這是最基本的功能,系統(tǒng)上電的時(shí)候顯示的是當(dāng)前環(huán)境溫度
- 和設(shè)定的溫度閥值,我們可以通過(guò)紅外遙控鍵來(lái)修改溫度上下限閥值。我們看,按下這個(gè)1鍵會(huì)進(jìn)入溫度閥值設(shè)置
- 界面,每按一下,切換一次閥值設(shè)置(上下閥值)界面,按第3次時(shí),會(huì)自動(dòng)回到主界面,如此循環(huán)。
- 在進(jìn)入溫度閥值設(shè)計(jì)界面時(shí),可以通過(guò)2、3鍵對(duì)閥值進(jìn)行加減,這里我們只對(duì)溫度整數(shù)部分進(jìn)行設(shè)置,
- 小數(shù)部分我們就不需要了,將設(shè)置好的上下限閥值保存到AT24C02(EEPROM)內(nèi),當(dāng)下一次開啟系統(tǒng)時(shí)只需
- 從AT24C02內(nèi)讀取保存的閥值數(shù)據(jù),而不需要重復(fù)設(shè)置上下限閥值。這樣的話,我們用3個(gè)按鍵就實(shí)現(xiàn)了溫度上下
- 限閥值的設(shè)定,這是溫度檢測(cè)控制系統(tǒng)基本的功能。假如我們把溫度上限設(shè)置為32°C,下限設(shè)置為30°C。
- 另外還有恒定溫度的功能。當(dāng)設(shè)定好上下限閥值時(shí),系統(tǒng)即會(huì)把當(dāng)前的溫度與設(shè)定的上下限閥值對(duì)比,
- 如果高于上限溫度,開啟散熱進(jìn)行降溫,同時(shí)報(bào)警;如果低于下限溫度,開啟加熱,同時(shí)報(bào)警;
- 如果當(dāng)前溫度處于下限和上限溫度之間時(shí),關(guān)閉散熱、加熱及報(bào)警。從而可將溫度控制在閥值的范圍內(nèi)。
- */
- #include "public.h"
- #include "lcd.h"
- #include "temp.h"
- #include "i2c.h"
- sbit led=P2^4; //報(bào)警指示燈
- sbit beep=P1^5; //蜂鳴器報(bào)警
- sbit relay=P1^4; //加熱設(shè)備
- sbit moto=P1^0; //電機(jī)散熱
- sbit IRIN=P3^2;
- u8 IrValue[6];
- u8 Time,K;
- char set_templ=5,set_temph=20; //設(shè)定溫度上下限默認(rèn)值
- u16 temp_val; //檢測(cè)的實(shí)際溫度
- u8 mode; //溫度模式
- u8 irtime; //接收時(shí)間
- u8 startflag; //開始檢測(cè)
- u8 bitnum; //bit位數(shù)
- u8 irdata[33]; //寄存沒有個(gè)bit的時(shí)間
- u8 irreceok; //接收完成標(biāo)志位
- u8 ircode[4]; //將接收的四個(gè)字節(jié)數(shù)據(jù)保存
- u8 irprosok; //接收數(shù)據(jù)處理標(biāo)志位
- u8 irdisp[8]; //將四個(gè)字節(jié)的16進(jìn)制通過(guò)轉(zhuǎn)換變成十進(jìn)制存儲(chǔ)
- u8 dat1,dat2;
- u8 keynum;
- u8 motoflag;
- int motopros(u8 mode);
- void int0init()
- {
- EA=1;
- EX0=1;
- IT0=1;
- }
- void time0init()
- {
- TMOD=0X02; //設(shè)置定時(shí)器0模式2.該模式為自動(dòng)裝載模式
- TH0=0X00;
- TL0=0X00;//設(shè)定計(jì)數(shù)初值,每當(dāng)TL0計(jì)數(shù)到255時(shí),TH0將把自己的數(shù)據(jù)給TL0,又重新計(jì)數(shù)
- TR0=1;
- ET0=1;
- EA=1;
- }
- void irpros() //紅外接收數(shù)據(jù)處理 ,區(qū)分是數(shù)據(jù)0還是1
- {
- u8 i,j,value;
- u8 k=1; //引導(dǎo)碼去掉,所以令k=1;
- for(j=0;j<4;j++) //取出了一幀數(shù)據(jù)中的四個(gè)字節(jié)數(shù)據(jù)
- {
- for(i=0;i<8;i++) //取出了一個(gè)字節(jié)的數(shù)據(jù)
- {
- value>>=1;
- if(irdata[k]>6)
- {
- value=value|0x80;
- }
- k++;
- }
- ircode[j]=value;
- }
- irprosok=1;
- }
- void irwork() //將四個(gè)字節(jié)的數(shù)據(jù)轉(zhuǎn)換成10進(jìn)制數(shù)顯示
- {
- irdisp[0]=ircode[0]/16;//顯示高位
- irdisp[1]=ircode[0]%16;//顯示低位
- irdisp[2]=ircode[1]/16;
- irdisp[3]=ircode[1]%16; //同一個(gè)遙控器此2個(gè)字節(jié)的引導(dǎo)碼數(shù)據(jù)是不會(huì)改變的,改變的只是數(shù)據(jù)碼及反碼
- irdisp[4]=ircode[2]/16;
- irdisp[5]=ircode[2]%16;
- irdisp[6]=ircode[3]/16;
- irdisp[7]=ircode[3]%16;
- dat1=irdisp[4];
- dat2=irdisp[5];
- keynum++;
- }
- void Temp_DataPros()
- {
- short temp;
- u8 temp_buf[5];
- temp=Ds18b20ReadTemp();
- temp_val=temp;
- if(temp<0)
- {
- temp=-temp;
- LCD_Dispstring(2+5,0,"-");
- }
- else
- {
- LCD_Dispstring(2+5,0," ");
- }
- temp_buf[0]=temp/100+0x30;
- temp_buf[1]=temp%100/10+0x30;
- temp_buf[2]='.';
- temp_buf[3]=temp%100%10+0x30;
- temp_buf[4]='\0';
- LCD_Dispstring(2+6,0,temp_buf); //顯示檢測(cè)的溫度xx.x
- temp_buf[0]=set_temph/10+0x30;
- temp_buf[1]=set_temph%10+0x30;
- temp_buf[2]='\0';
- LCD_Dispstring(5,1,temp_buf); //顯示設(shè)定的溫度上限值xx
- temp_buf[0]=set_templ/10+0x30;
- temp_buf[1]=set_templ%10+0x30;
- temp_buf[2]='\0';
- LCD_Dispstring(14,1,temp_buf); //顯示設(shè)定的溫度下限值xx
- }
- #define K1_MODE 1
- #define K2_ADD 2
- #define K3_DEC 3
- void KEY_Pros()
- {
- u8 key;
- u8 temph_buf[3];
- key=motopros(0);
-
- if(key==K1_MODE) //模式選擇
- {
- mode++;
- LCD_Clear();
- if(mode==1)
- {
- LCD_Dispstring(0,0,"SETH: C");
- }
- else if(mode==2)
- {
- LCD_Dispstring(0,1,"SETL: C");
- }
- else
- {
- mode=0;
- LCD_Dispstring(2,0,"Temp: C");
- LCD_Dispstring(0,1,"SETH: ");
- LCD_Dispstring(9,1,"SETL: ");
- }
- }
- if(mode==1) //溫度上限設(shè)置
- {
- switch(key)
- {
- case K2_ADD: //加
- set_temph++;
- if(set_temph>=80)set_temph=80;
- break;
- case K3_DEC: //減
- set_temph--;
- if(set_temph<=0)set_temph=0;
- break;
- }
- temph_buf[0]=set_temph/10+0x30;
- temph_buf[1]=set_temph%10+0x30;
- temph_buf[2]='\0';
- LCD_Dispstring(6,0,temph_buf);
- At24c02Write(0,set_temph);
- }
- else if(mode==2) //溫度下限設(shè)置
- {
- switch(key)
- {
- case K2_ADD: //加
- set_templ++;
- if(set_templ>=80)set_templ=80;
- break;
- case K3_DEC: //減
- set_templ--;
- if(set_templ<=0)set_templ=0;
- break;
- }
- temph_buf[0]=set_templ/10+0x30;
- temph_buf[1]=set_templ%10+0x30;
- temph_buf[2]='\0';
- LCD_Dispstring(6,1,temph_buf);
- At24c02Write(2,set_templ);
- }
- }
- void sound()
- {
- u8 i=50;
- while(i--)
- {
- beep=!beep;
- delay(10);
- }
- }
- void TempData_Compare()
- {
- if(temp_val>set_temph*10) //實(shí)際溫度高于上限值 報(bào)警 散熱
- {
- led=0;
- moto=1;
- relay=0;
- sound();
- }
- else if(temp_val<set_templ*10) //實(shí)際溫度低于下限值 報(bào)警 加熱
- {
- led=0;
- moto=0;
- relay=0;
- sound();
- }
- else //實(shí)際溫度在下限值和上限值之間 取消報(bào)警 取消加熱 取消散熱
- {
- moto=0;
- led=1;
- relay=1;
- }
- }
- void kai_display()
- {
- if(At24c02Read(255)!=18)
- {
- At24c02Write(0,set_temph);
- At24c02Write(2,set_templ);
- At24c02Write(255,18);
- }
- else
- {
- set_temph=At24c02Read(0);
- set_templ=At24c02Read(2);
- }
- LCD_Dispstring(2,0,"Temp: C");
- LCD_Dispstring(0,1,"SETH: ");
- LCD_Dispstring(9,1,"SETL: ");
- }
- //mode: 0-單次掃描 1-連續(xù)掃描
- int motopros(u8 mode)
- {
- static u8 key=1;
- u8 k1,k2,k3;
- if(key)
- {
- key=0;
- if((dat1==0)&&(dat2==12)) //按下第一次按鍵開馬達(dá)
- {
- dat1=0;
- dat2=0;
- k1=0;
- return K1_MODE;
- }
-
- if((dat1==1)&&(dat2==8)) //按下第二次此按鍵時(shí)關(guān)閉馬達(dá)
- {
- dat1=0;
- dat2=0;
- k2=0;
- return K2_ADD;
- }
- if((dat1==5)&&(dat2==14)) //按下第二次此按鍵時(shí)關(guān)閉馬達(dá)
- {
- dat1=0;
- dat2=0;
- k3=0;
- return K3_DEC;
- }
- if((dat1==0)&&(dat2==8)) //按下第二次此按鍵時(shí)關(guān)閉馬達(dá)
- {
- dat1=0;
- dat2=0;
- keynum=0;
- }
- }
- else if(k1==1&&k2==1&&k3==1)
- {
- key=1;
- }
- if(mode)
- {
- key=1;
- }
- return 0;
- k1=1;k2=1;k3=1;
- }
- void main()
- {
- moto=0;
- led=1;
- relay=1;
- int0init();
- time0init();
- LCD_Init();
- kai_display();
- while(1)
- {
- if(irreceok)
- {
- irreceok=0;
- irpros();
- if(irprosok)
- {
- irwork();
- }
- }
- motopros();
- if(mode==0)
- Temp_DataPros();
- KEY_Pros();
- TempData_Compare();
- }
- }
- void time0() interrupt 1
- {
- irtime++;//每進(jìn)來(lái)一次就說(shuō)明定時(shí)時(shí)間為256us;
- }
- void init0() interrupt 0
- {
- if(startflag)
- {
- if(irtime>32)//檢測(cè)引導(dǎo)碼,求法是用引導(dǎo)碼時(shí)間除以一次計(jì)數(shù)時(shí)間,看看要多少次
- {
- bitnum=0;
- }
- irdata[bitnum]=irtime;
- irtime=0;
- bitnum++;
- if(bitnum==33)
- {
- bitnum=0;
- irreceok=1;//一幀紅外數(shù)據(jù)接收完成標(biāo)志
- }
- }
- else
- {
- startflag=1;//將開始標(biāo)志位置1,等到下次進(jìn)入中斷即可進(jìn)入if語(yǔ)句
- irtime=0;//將開始之前的計(jì)數(shù)器時(shí)間清零。等到下次進(jìn)入中斷的時(shí)候才是引導(dǎo)碼真正的時(shí)間
- }
- }
復(fù)制代碼
所有程序51hei提供下載:
智能溫度檢測(cè)控制系統(tǒng)設(shè)計(jì).rar
(72.88 KB, 下載次數(shù): 51)
2019-12-16 11:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|