一、功能簡介
本項目使用Proteus8仿真STM32單片機控制器,使用LCD1602顯示模塊、按鍵模塊、LED和蜂鳴器、繼電器直流電機模塊、DS18B20溫度傳感器、MQ2煙霧傳感器等。
主要功能:
系統(tǒng)運行后,LCD1602顯示溫度和MQ2煙霧傳感器檢測的溫度及煙霧濃度;當檢測溫度或煙霧濃度高于設置的溫度或煙霧閾值,則聲光報警且澆水 滅火裝置開啟??赏ㄟ^按鍵K3進入閾值設置模式,K1和K2進行加減調(diào)節(jié), K4確定。
主要功能如下:
(1)溫度/煙霧濃度檢測;
(2)LCD1602顯示;
(3)溫度/煙霧閾值設置;
(4)超限聲光報警;
(5)自動滅火。
二、軟件設計
//參數(shù)初始化
void sys_parm_init(void)
{
sys_ctrl.mode=0;
sys_ctrl.temph=50;
sys_ctrl.smokeh=55;
}
//系統(tǒng)初始界面顯示
void sys_open_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0,"Tp: C");
lcd1602_show_string(9,0,"TpH: C");
lcd1602_show_string(0,1,"Yw: %");
lcd1602_show_string(9,1,"YwH: %");
}
//系統(tǒng)數(shù)據(jù)獲取
void sys_data_get(void)
{
static u8 i=0;
while(1)
{
//溫度獲取
i++;
if(i%10==0)
sys_ctrl.temp=DS18B20_GetTemperture();
//煙霧濃度獲取
sys_ctrl.smoke=pcf8591_read_adcvalue(0);
sys_ctrl.smoke=cal_map(sys_ctrl.smoke,0,255,0,99);
break;
}
}
//系統(tǒng)數(shù)據(jù)顯示
void sys_data_show(void)
{
while(1)
{
//溫度顯示
lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);
//煙霧濃度顯示
lcd1602_show_nums(3,1,sys_ctrl.smoke,2,0);
//溫度閾值顯示
lcd1602_show_nums(13,0,sys_ctrl.temph,2,0);
//煙霧濃度閾值顯示
lcd1602_show_nums(13,1,sys_ctrl.smokeh,2,0);
//閾值設定,數(shù)據(jù)位置閃爍
switch(sys_ctrl.mode)
{
case 1://溫度
lcd1602_show_string(13,0," ");
delay_ms(100);
lcd1602_show_nums(13,0,sys_ctrl.temph,2,0);
break;
case 2://煙霧濃度
lcd1602_show_string(13,1," ");
delay_ms(100);
lcd1602_show_nums(13,1,sys_ctrl.smokeh,2,0);
break;
}
break;
}
}
//系統(tǒng)數(shù)據(jù)設置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
//模式設置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>=3)sys_ctrl.mode=1;
}
//在設置模式下,加
else if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度閾值
sys_ctrl.temph++;
if(sys_ctrl.temph >99)sys_ctrl.temph=0;
break;
case 2://煙霧濃度閾值
sys_ctrl.smokeh++;
if(sys_ctrl.smokeh >99)sys_ctrl.smokeh=0;
break;
}
}
//在設置模式下,減
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度閾值
sys_ctrl.temph--;
if(sys_ctrl.temph< 0)sys_ctrl.temph=99;
break;
case 2://煙霧濃度閾值
sys_ctrl.smokeh--;
if(sys_ctrl.smokeh< 0)sys_ctrl.smokeh=99;
break;
}
}
//確定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
}
}
//系統(tǒng)功能控制
void sys_fun_ctrl(void)
{
//正常工作模式下
if(sys_ctrl.mode==0)
{
//若溫度高于閾值,或者,煙霧濃度高于閾值則蜂鳴器聲光報警,開啟滅火裝置
if(sys_ctrl.temp>sys_ctrl.temph || sys_ctrl.smoke>sys_ctrl.smokeh)
{
RELAY=0;//打開滅火裝置
beep_alarm(1,1000);//打開蜂鳴器報警
}
//若溫度和煙霧濃度都低于閾值,則關閉蜂鳴器,關閉滅火裝置
else
{
RELAY=1;//關閉滅火裝置
BEEP=1;//關閉蜂鳴器報警
}
}
}
//應用控制系統(tǒng)
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系統(tǒng)參數(shù)初始化
KEY_Init();
BEEP_Init();
DS18B20_Init();
ctrl_pin_init();
pcf8591_init();
lcd1602_init();//LCD1602初始化
//讀取溫度數(shù)據(jù),等待穩(wěn)定
while(i--)
{
//溫度獲取
sys_ctrl.temp=DS18B20_GetTemperture();
//煙霧濃度獲取
sys_ctrl.smoke=pcf8591_read_adcvalue(0);
sys_ctrl.smoke=cal_map(sys_ctrl.smoke,0,255,0,99);
delay_ms(100);
}
sys_open_show();//系統(tǒng)初始界面顯示
while(1)
{
sys_data_get();//系統(tǒng)數(shù)據(jù)獲取
sys_data_show();//系統(tǒng)數(shù)據(jù)顯示
sys_data_set();//系統(tǒng)數(shù)據(jù)設置
sys_fun_ctrl();//系統(tǒng)功能控制
}
}
三、實驗現(xiàn)象
評論
查看更多