一、功能簡介
本項目使用Proteus8仿真STM32單片機控制器,使用LCD1602液晶、按鍵、蜂鳴器、L298N電機驅動模塊、直流電機、DS18B20溫度傳感器等。
系統功能:
系統運行后,LCD1602顯示傳感器檢測的溫度值;默認以自動模式運行,若按下K4鍵切換為手動模式,此時可以通過K1和K2控制風扇加減速,風扇檔位共5檔(0-5)。當再次按下K4鍵切換為自動模式;自動模式下,實時檢測溫度值,當溫度高于上限且在2C范圍內,以3檔運行。當溫度高于上限且在4C范圍內,以4檔運行。當溫度高于上限且在6C范圍內,以5擋運行。當溫度高于上限且超過6C范圍,以5檔運行且蜂鳴器報警。若溫度在上下限范圍內,風扇以2檔運行。若溫度低于下限,風扇停止。可通過K3鍵進入閾值設置,K1和K2調節。
主要功能如下:
(1)溫度檢測與LCD顯示;
(2)超上限溫度越高風扇越快;
(3)低下限風扇停止;
(4)溫度閾值設置;
(5)超限報警。
二、軟件設計
//系統初始界面顯示
void sys_open_show(void)
{
lcd1602_clear();
lcd1602_show_string(0,0,"Tp: C");
lcd1602_show_string(14,0,"Au");
lcd1602_show_string(0,1,"TL: C");
lcd1602_show_string(10,1,"TH: C");
}
//系統數據獲取
void sys_data_get(void)
{
static u8 i=0;
while(1)
{
//溫度獲取
i++;
if(i%1==0)
{
sys_ctrl.temp=DS18B20_GetTemperture()*10;
TIM_Cmd(TIM3,ENABLE);//打開定時器
}
break;
}
}
//系統數據顯示
void sys_data_show(void)
{
u8 buf[5];
while(1)
{
//溫度顯示
buf[0]=sys_ctrl.temp/100+0x30;
buf[1]=sys_ctrl.temp%100/10+0x30;
buf[2]='.';
buf[3]=sys_ctrl.temp%100%10+0x30;
buf[4]='?';
lcd1602_show_string(3,0,buf);
//溫度閾值顯示
lcd1602_show_nums(3,1,sys_ctrl.templ,2,0);
lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);
//閾值閃爍指示
switch(sys_ctrl.mode)
{
case 1://溫度下限
lcd1602_show_string(3,1," ");
delay_ms(50);
lcd1602_show_nums(3,1,sys_ctrl.templ,2,0);
break;
case 2://溫度上限
lcd1602_show_string(13,1," ");
delay_ms(50);
lcd1602_show_nums(13,1,sys_ctrl.temph,2,0);
break;
}
//檔位顯示
lcd1602_show_nums(10,0,sys_ctrl.gear,1,0);
//手動狀態顯示
if(sys_ctrl.auto_flag)lcd1602_show_string(14,0,"SD");
else lcd1602_show_string(14,0,"Au");
break;
}
}
//系統數據設置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
//自動手動模式設置
if(key==KEY4_PRESS)
{
sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
}
//閾值模式設置
else if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>2)sys_ctrl.mode=0;
}
//閾值設置模式下,K1和K2加減
if(sys_ctrl.mode!=0)
{
//加
if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度下限
sys_ctrl.templ++;
if(sys_ctrl.templ >99)sys_ctrl.templ=0;
break;
case 2://溫度上限
sys_ctrl.temph++;
if(sys_ctrl.temph >99)sys_ctrl.temph=0;
break;
}
}
//減
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://溫度下限
sys_ctrl.templ--;
if(sys_ctrl.templ< 0)sys_ctrl.templ=99;
break;
case 2://溫度上限
sys_ctrl.temph++;
if(sys_ctrl.temph< 0)sys_ctrl.temph=99;
break;
}
}
}
//手動模式下,檔位調節
if(sys_ctrl.auto_flag==1)
{
//加速
if(key==KEY1_PRESS)
{
sys_ctrl.gear++;
if(sys_ctrl.gear>5)sys_ctrl.gear=5;
}
//減速
else if(key==KEY2_PRESS)
{
sys_ctrl.gear--;
if(sys_ctrl.gear<0)sys_ctrl.gear=0;
}
}
}
//系統功能控制
void sys_fun_ctrl(void)
{
//手動模式下,速度控制
if(sys_ctrl.auto_flag==1)
{
pwm_set_duty(sys_ctrl.gear*20);//占空比
}
//自動模式下,速度控制
else
{
//如果溫度高于上限,溫度越高,風扇越快
if(sys_ctrl.temp>=sys_ctrl.temph*10)
{
if(sys_ctrl.temp>=sys_ctrl.temph10 && sys_ctrl.temp10+20)
sys_ctrl.gear=3;
else if(sys_ctrl.temp>=sys_ctrl.temph10+20 && sys_ctrl.temp10+40)**
sys_ctrl.gear=4;
else if(sys_ctrl.temp>=sys_ctrl.temph*10+40)
{
sys_ctrl.gear=5;
//高于設定值則蜂鳴器報警
if(sys_ctrl.temp >=sys_ctrl.temph*10+60)
{
beep_alarm(100,20);
}
}
}
//如果溫度低于下限,風扇停止
else if(sys_ctrl.temp<=sys_ctrl.templ*10)
sys_ctrl.gear=0;
//溫度在閾值范圍內,風扇以固定速度運行
else
sys_ctrl.gear=2;
pwm_set_duty(sys_ctrl.gear*20);//占空比
}
}
//應用控制系統
void appdemo_show(void)
{
u8 i=10;
sys_parm_init();//系統參數初始化
KEY_Init();
BEEP_Init();
DS18B20_Init();
lcd1602_init();//LCD1602初始化
//讀取溫度數據,等待穩定
while(i--)
{
sys_ctrl.temp=DS18B20_GetTemperture();
delay_ms(100);
}
dc_motor_init();
pwm_init(100-1,800-1);//初始時,PWM占空比為0
pwm_set_duty(0);
dc_motor_dir_ctrl(0);
sys_open_show();//系統初始界面顯示
while(1)
{
sys_data_get();//系統數據獲取
sys_data_show();//系統數據顯示
sys_data_set();//系統數據設置
sys_fun_ctrl();//系統功能控制
}
}
三、實驗現象
評論
查看更多