仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計(jì)編號(hào):【F03】
1.? 簡(jiǎn)介
? 本文提出了一種基于51單片機(jī)的LCD12864溫濕度報(bào)警系統(tǒng)。該設(shè)計(jì)使用ATC89C51單片機(jī)、DHT11傳感器模塊、LCD12864液晶顯示屏模塊以及報(bào)警模塊,簡(jiǎn)單明了的實(shí)現(xiàn)可提要求。DHT11數(shù)字溫濕度傳感器把采集到的溫濕度數(shù)據(jù)傳給單片機(jī),經(jīng)過單片機(jī)的處理,準(zhǔn)確的顯示到液晶屏上。同時(shí),手動(dòng)設(shè)置溫濕度的上下限值,當(dāng)實(shí)時(shí)溫濕度超出上下限值時(shí),對(duì)應(yīng)的風(fēng)扇/水泵啟動(dòng),蜂鳴器報(bào)警。
2.? 主要功能
a.通過LCD12864顯示當(dāng)前溫濕度值及報(bào)警閾值,溫度測(cè)量范圍:0-99攝氏度。
b.通過獨(dú)立按鍵設(shè)置溫濕度報(bào)警上下限值。
c.當(dāng)溫濕度超過上下限值時(shí),對(duì)應(yīng)的風(fēng)扇/水泵啟動(dòng),蜂鳴器報(bào)警。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
unsigned char i;//臨時(shí)變量
unsigned char cnt_100ms=0;//計(jì)時(shí)變量100ms
unsigned char time_100ms_flag=0;//100ms到標(biāo)志變量
unsigned char tim_500ms_flg=0;//倒計(jì)時(shí)標(biāo)志500ms一次
unsigned char cnt_500ms=0;//計(jì)時(shí)變量500ms
sbit beep = P1^0;//蜂鳴器IO
sbit LedTL_P = P1^3; // 溫度過低報(bào)警指示燈
sbit LedTH_P = P1^4; // 溫度過高報(bào)警指示燈
sbit LedHL_P = P1^5; // 濕度過低報(bào)警指示燈
sbit LedHH_P = P1^6; // 濕度過高報(bào)警指示燈
/*******************************************************************************
* 函 數(shù) 名 : delay_ms
* 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
* 輸 入 : cnt
* 輸 出 : 無
* 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
*******************************************************************************/
void delay_ms(unsigned int cnt) //
{
unsigned int x;
for( ; cnt>0; cnt--)
{
for(x=110; x>0; x--);//軟件延時(shí)為1MS
}
}
void delay_us(unsigned int cnt)//延時(shí)函數(shù)1US
{
while(cnt--);
}
/******************************************************
** 函數(shù)名:time_init
** 描述 :定時(shí)器初始化
** 輸入 :無
** 輸出 :無
******************************************************/
void time_init(void)
{
TMOD |= 0x01;//time0 工作方式為1
TH0 = 0xf8;//裝載初值
TL0 = 0x2f;//裝載初值,為2ms(65535-63535)
TR0 = 1;//開啟定時(shí)器
ET0 = 1;//打開中斷
EA=1;//開總中斷
}
/******************************************************
** 函數(shù)名:key_scan
** 描述 :按鍵掃描
** 輸入 :無
** 輸出 :無
******************************************************/
void key_scan(void)
{
static unsigned char key_in_flag = 0;//按鍵按下標(biāo)志
unsigned char key_l;//存儲(chǔ)掃描到行列值。
key_value = 20;//按鍵值清除
if((P3 & 0x0f) != 0x0f)//按鍵按下
{
delay_ms(1);//按鍵消抖動(dòng)
if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
{
key_in_flag = 0;//松手檢測(cè)防止一直觸發(fā)
P3 = 0x0f;
//delay_ms(1);//按鍵消抖動(dòng)
key_l = P3;//掃描得到按鍵值
switch(key_l)
{
//獲取按鍵值
case 0x0e:
{
key_value = 1;//按鍵賦值
}
break;
case 0x0d:
{
key_value = 2;//按鍵賦值
}
break;
case 0x0b:
{
key_value = 3;//按鍵賦值
}
break;
}
}
}
else
{
key_in_flag = 1;//(按鍵松開標(biāo)志)
}
}
/*******************************************************************************
* 函 數(shù) 名 : LCDSel
* 函數(shù)功能 : LCD左右半屏選擇
* 輸 入 : u8_Sel
* 輸 出 : 無
********************************************************************************/
void lcd_scr_sel(unsigned char sel) //LCD左右半屏選擇
{
switch (sel)
{
case 0x00://全屏
CS1=0;CS2=0;
break;
case 0x01: //左半屏
CS1=0;CS2=1;
break;
case 0x02://右半屏
CS1=1;CS2=0;
break;
default:
break;
}
}
/*******************************************************************************
* 函 數(shù) 名 : WriteCmd
* 函數(shù)功能 : LCD寫命令
* 輸 入 : u8_Cmd
* 輸 出 : 無
********************************************************************************/
void write_cmd(unsigned char cmd) //寫命令
{
delay_us(1);//延時(shí)
RS=0;
EN=0;
RW=0;
DATPORT=cmd;//送數(shù)據(jù)
EN=1;
EN=0;
}
/*******************************************************************************
* 函 數(shù) 名 : WriteDat
* 函數(shù)功能 : LCD寫數(shù)據(jù)
* 輸 入 : u8_Dat
* 輸 出 : 無
********************************************************************************/
void write_dat(unsigned char dat) //寫數(shù)據(jù)
{
delay_us(1);//延時(shí)
RS=1;
EN=0;
RW=0;
DATPORT=dat;//送數(shù)據(jù)
EN=1;
EN=0;
}
/*******************************************************************************
* 函 數(shù) 名 : ClearLcd
* 函數(shù)功能 : LCD清屏
* 輸 入 : 無
* 輸 出 : 無
********************************************************************************/
void clear_lcd(void) //清屏
{
unsigned char i,j;
lcd_scr_sel(All);//左右兩屏同時(shí)清理
write_cmd(STALINE);
for(i=0;i<8;i++)
{
write_cmd(LCDON);
write_cmd(PAGE+i);//從第0頁即屏幕最上面開始清除
write_cmd(YCONT);//從第0列即屏幕最左邊開始清除
for(j=0;j<64;j++)
{
write_dat(0x00);
}
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
當(dāng)前溫濕度:
當(dāng)溫度高于閾值時(shí),風(fēng)扇啟動(dòng)開始散熱:
當(dāng)溫度低于閾值時(shí),電熱絲開始加熱:
當(dāng)濕度高于閾值時(shí),水泵關(guān)閉,蜂鳴器報(bào)警:
當(dāng)濕度低于閾值時(shí),水泵開始工作:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說明+元件清單+操作視頻等。
百度網(wǎng)盤下載鏈接:【F03】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集