實驗說明:
根據自己使用的LCD1602是否帶有轉接板,如果帶有轉接板的即為4位,需在LCD.H頭文件中
將宏#define LCD1602_4PINS打開,我們這里使用的LCD1602是8位,所以默認將該宏注釋。
實驗接線:
1,LCD1602液晶模塊-->單片機管腳
參考LCD1602液晶顯示實驗接線(開發攻略內在對應的實驗章節內實驗現象有接線說明)
2,獨立按鍵模塊-->單片機管腳
K1-->P34
K2-->P35
K3-->P32
3,蜂鳴器模塊-->單片機管腳
BEEP-->P15
4,LED模塊-->單片機管腳
D1-->P24
5,LED模塊-->單片機管腳
D1-->P24
6,繼電器模塊-->單片機管腳
RELAY-->P14
7,直流電機模塊-->單片機管腳
IN1-->P10(參考直流電機實驗接線)
8,EEPROM模塊-->單片機管腳
參考EEPROM實驗接線
9,DS18B20模塊-->單片機管腳
參考DS18B20溫度傳感器實驗接線
實驗現象:
首先它能顯示環境的溫度并能設置上下限閥值,這是最基本的功能,系統上電的時候顯示的是當前環境溫度
和設定的溫度閥值,我們可以通過按鍵來修改溫度上下限閥值。我們看,按下這個K1鍵會進入溫度閥值設置
界面,每按一下,切換一次閥值設置(上下閥值)界面,按第3次時,會自動回到主界面,如此循環。
在進入溫度閥值設計界面時,可以通過K2、K3鍵對閥值進行加減,這里我們只對溫度整數部分進行設置,
小數部分我們就不需要了,將設置好的上下限閥值保存到AT24C02(EEPROM)內,當下一次開啟系統時只需
從AT24C02內讀取保存的閥值數據,而不需要重復設置上下限閥值。這樣的話,我們用3個按鍵就實現了溫度上下
限閥值的設定,這是溫度檢測控制系統基本的功能。假如我們把溫度上限設置為32°C,下限設置為30°C。
另外還有恒定溫度的功能。當設定好上下限閥值時,系統即會把當前的溫度與設定的上下限閥值對比,
如果高于上限溫度,開啟散熱進行降溫,同時報警;如果低于下限溫度,開啟加熱,同時報警;
如果當前溫度處于下限和上限溫度之間時,關閉散熱、加熱及報警。從而可將溫度控制在閥值的范圍內。
單片機源程序如下:
- #include "public.h"
- #include "lcd.h"
- #include "temp.h"
- #include "i2c.h"
- sbit k3=P3^2; //設置溫度上下限
- sbit k1=P3^4; //加
- sbit k2=P3^5; //減
- sbit led=P2^4; //報警指示燈
- sbit beep=P1^5; //蜂鳴器報警
- sbit relay=P1^4; //加熱設備
- sbit moto=P1^0; //電機散熱
- char set_templ=22,set_temph=40; //設定溫度上下限默認值
- u16 temp_val; //檢測的實際溫度
- u8 mode; //溫度模式
- 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); //顯示檢測的溫度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); //顯示設定的溫度上限值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); //顯示設定的溫度下限值xx
- }
- #define K1_MODE 1
- #define K2_ADD 2
- #define K3_DEC 3
- //mode: 0-單次掃描 1-連續掃描
- u8 KEY_Scan(u8 mode)
- {
- static u8 key=1;
- if(key&&(k1==0||k2==0||k3==0))
- {
- delay(1000); //消抖
- key=0;
- if(k3==0)
- {
- return K1_MODE;
- }
- else if(k1==0)
- {
- return K2_ADD;
- }
- else if(k2==0)
- {
- return K3_DEC;
- }
- }
- else if(k1==1&&k2==1&&k3==1)
- {
- key=1;
- }
- if(mode)
- {
- key=1;
- }
- return 0;
- }
- void KEY_Pros()
- {
- u8 key;
- u8 temph_buf[3];
- key=KEY_Scan(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) //溫度上限設置
- {
- 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) //溫度下限設置
- {
- 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) //實際溫度高于上限值 報警 散熱
- {
- led=1;
- moto=1;
- relay=1;
- sound();
- }
- else if(temp_val<set_templ*10) //實際溫度低于下限值 報警 加熱
- {
- led=1;
- moto=0;
- relay=0;
- sound();
- }
- else //實際溫度在下限值和上限值之間 取消報警 取消加熱 取消散熱
- {
- moto=0;
- led=0;
- 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: ");
- }
- void main()
- {
- moto=0;
- led=0;
- relay=1;
- LCD_Init();
- kai_display();
- while(1)
- {
- if(mode==0)
- Temp_DataPros();
- KEY_Pros();
- TempData_Compare();
- }
- }
復制代碼
所有程序51hei提供下載:
智能溫度檢測控制系統設計.rar
(41.86 KB, 下載次數: 31)
2020-9-17 16:34 上傳
點擊文件名下載附件
|