文章目錄
- 一、功能簡介
- 二、軟件設計
- 三、實驗現象
- 聯系作者
一、功能簡介
本項目使用Proteus8仿真51單片機控制器,使用LCD1602液晶、DS1302時鐘模塊、人體紅外感應模塊、開關LED指示燈、繼電器、PCF8591 ADC模塊、光敏傳感器、按鍵模塊等。
主要功能:
系統運行后,LCD1602顯示當前時間、光線強弱狀態,光線強度、有無人、燈開關狀態等。
如果檢測光線強度大于上限值,視為白天,此時不管有無人,都不會打開電燈;
如果檢測光線強度低于下限值,視為夜晚,此時檢測有人,打開電燈,無人則延遲2秒熄滅;可通過K3鍵進入閾值設置模式,K3可切換時間、閾值上下限位置,K1和K2鍵調節,K4確認并返回主界面;當時間到達設定時間,則進入手動控制模式,此時可通過開關來打開和關閉電燈;當時間到達次日早上,則又進入自動控制模式。
二、軟件設計
/*
作者:嗨小易(QQ技術交流群:570487280)*///系統數據采集
void sys_data_get(void)
{while(1){//獲取時間ds1302_read_time();sys_ctrl.hour=(gDS1302_TIME[2]/16)*10+gDS1302_TIME[2]%16;sys_ctrl.min=(gDS1302_TIME[1]/16)*10+gDS1302_TIME[1]%16;sys_ctrl.sec=(gDS1302_TIME[0]/16)*10+gDS1302_TIME[0]%16;//讀取光線值sys_ctrl.light=pcf8591_read_adcvalue(0);sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);//白天晚上狀態獲取if(sys_ctrl.light>sys_ctrl.setlight[1])sys_ctrl.dayflag=0;else if(sys_ctrl.light<sys_ctrl.setlight[0])sys_ctrl.dayflag=1; //檢測是否有人if(IRED==0)sys_ctrl.man=1;else sys_ctrl.man=0;break;}
}//系統數據顯示
void sys_data_show(void)
{u8 buf[3];while(1){//正常模式顯示if(sys_ctrl.mode==0){//時間顯示buf[0]=gDS1302_TIME[2]/16+0x30;buf[1]=gDS1302_TIME[2]%16+0x30;buf[2]='\0';lcd1602_show_string(0,0,buf);buf[0]=gDS1302_TIME[1]/16+0x30;buf[1]=gDS1302_TIME[1]%16+0x30;buf[2]=':';lcd1602_show_string(3,0,buf);buf[0]=gDS1302_TIME[0]/16+0x30;buf[1]=gDS1302_TIME[0]%16+0x30;buf[2]='\0';lcd1602_show_string(6,0,buf);//光線強度顯示lcd1602_show_nums(2,1,sys_ctrl.light,3,0);//白天夜晚狀態顯示if(sys_ctrl.dayflag==0)lcd1602_show_string(11,0,"day ");else lcd1602_show_string(11,0,"night");//有無人狀態顯示if(sys_ctrl.man==0)lcd1602_show_string(8,1,"N");else lcd1602_show_string(8,1,"Y");//自動手動模式顯示if(sys_ctrl.ctrl_flag==0)lcd1602_show_string(10,1,"Au");else lcd1602_show_string(10,1,"Sd");//電燈開關狀態顯示if(sys_ctrl.onoff==0)lcd1602_show_string(13,1,"OFF");else lcd1602_show_string(13,1," ON");}//設置模式顯示else{//時間閾值lcd1602_show_nums(8,0,sys_ctrl.settime[0],2,0x80);lcd1602_show_nums(11,0,sys_ctrl.settime[1],2,0x80);lcd1602_show_nums(14,0,sys_ctrl.settime[2],2,0x80); //光線閾值lcd1602_show_nums(8,1,sys_ctrl.setlight[0],2,0);lcd1602_show_nums(12,1,sys_ctrl.setlight[1],2,0);//對應位置閃爍switch(sys_ctrl.mode){case 1://時lcd1602_show_string(8,0," ");delay_ms(50);lcd1602_show_nums(8,0,sys_ctrl.settime[0],2,0x80); break;case 2://分lcd1602_show_string(11,0," ");delay_ms(50);lcd1602_show_nums(11,0,sys_ctrl.settime[1],2,0x80); break;case 3://秒lcd1602_show_string(14,0," ");delay_ms(50);lcd1602_show_nums(14,0,sys_ctrl.settime[2],2,0x80); break;case 4://光線下限lcd1602_show_string(8,1," ");delay_ms(50);lcd1602_show_nums(8,1,sys_ctrl.setlight[0],2,0); break;case 5://光線上限lcd1602_show_string(12,1," ");delay_ms(50);lcd1602_show_nums(12,1,sys_ctrl.setlight[1],2,0); break;} }break;}
}//系統數據設置
void sys_data_set(void)
{u8 key=0;static u8 oneflag=0;key=key_scan(0);//設置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>5)sys_ctrl.mode=1;if(oneflag==0){oneflag=1;sys_parm_set_show();//系統參數設置界面顯示}}//加else if(key==KEY1_PRESS){switch(sys_ctrl.mode){case 1://時sys_ctrl.settime[0]++;if(sys_ctrl.settime[0]>23)sys_ctrl.settime[0]=0;break;case 2://分sys_ctrl.settime[1]++;if(sys_ctrl.settime[1]>59)sys_ctrl.settime[1]=0;break;case 3://秒sys_ctrl.settime[2]++;if(sys_ctrl.settime[2]>59)sys_ctrl.settime[2]=0;break;case 4://光線下限sys_ctrl.setlight[0]++;if(sys_ctrl.setlight[0]>99)sys_ctrl.setlight[0]=0;break;case 5://光線上限sys_ctrl.setlight[1]++;if(sys_ctrl.setlight[1]>99)sys_ctrl.setlight[1]=0;break;} }//減else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://時sys_ctrl.settime[0]--;if(sys_ctrl.settime[0]<0)sys_ctrl.settime[0]=23;break;case 2://分sys_ctrl.settime[1]--;if(sys_ctrl.settime[1]<0)sys_ctrl.settime[1]=59;break;case 3://秒sys_ctrl.settime[2]--;if(sys_ctrl.settime[2]<0)sys_ctrl.settime[2]=59;break;case 4://光線下限sys_ctrl.setlight[0]--;if(sys_ctrl.setlight[0]<0)sys_ctrl.setlight[0]=99;break;case 5://光線上限sys_ctrl.setlight[1]--;if(sys_ctrl.setlight[1]<0)sys_ctrl.setlight[1]=99;break;} }//確定else if(key==KEY4_PRESS){if(sys_ctrl.mode!=0){sys_ctrl.mode=0;oneflag=0;sys_open_show();//系統開機界面顯示}}
}//系統功能控制
void sys_fun_ctrl(void)
{//如果是深夜,且時間到達設定時間if(sys_ctrl.hour==sys_ctrl.settime[0]){if(sys_ctrl.min==sys_ctrl.settime[1]){if(sys_ctrl.sec==sys_ctrl.settime[2]){sys_ctrl.ctrl_flag=1;//轉為手動 } } }if(sys_ctrl.ctrl_flag==1){//如果到達白天,轉為自動if(sys_ctrl.hour==6){if(sys_ctrl.min==0){if(sys_ctrl.sec==0){sys_ctrl.ctrl_flag=0;//轉為自動 } } } } //自動控制模式if(sys_ctrl.ctrl_flag==0){//正常模式if(sys_ctrl.mode==0){//光線大于上限閾值,白天if(sys_ctrl.dayflag==0){LED=1;//關閉電燈 }//光線小于下限值,晚上else {//如果感應到有人if(sys_ctrl.man==1){delay_ms(100);if(sys_ctrl.man==1){sys_ctrl.onoff=1;LED=0;//打開電燈 }}//如果人離開else{//電燈已打開if(sys_ctrl.onoff==1){delay_ms(2000);LED=1;//關閉電燈sys_ctrl.onoff=0; } } }} }//手動控制模式else{//如果手動按下遙控或機械開關if(SWITCH==0){LED=0;//打開電燈sys_ctrl.onoff=1; }else{ LED=1;//關閉電燈sys_ctrl.onoff=0; } }
}
三、實驗現象
B站演示視頻:https://space.bilibili.com/444388619
聯系作者
視頻地址:https://space.bilibili.com/444388619/video
專注于51單片機、STM32、國產32、DSP、Proteus、arduino、ESP32、物聯網軟件開發,PCB設計,視頻分享,技術交流。