目錄
1、設計描述
2、仿真圖
3、程序
4、資料內容
資料下載地址:單片機智能燈控制系統源程序仿真原理圖與論文全套資料下載
1、設計描述
設計了一款智能控制系統。
AT89C51+LCD1602+DS1302+按鍵+LED組成了這樣一個完整的設計。
P2.0-P2.3??4個LED等代表庭院內的4盞燈
P1.3-P1.7??5個開關,第一個代表光敏電阻傳感器,后四個都是熱釋電紅外傳感器
P3.2、P3.4、P3.5、P3.6為四個按鍵開關,可設置萬年歷時間。
人性化地加入了時間和溫度的LCD顯示,并可以通過按鍵去設置時間日期等。
智能燈控制分為自動和手動控制。
邏輯功能:
當P3.0為0,也就是按下的時候為手動控制,反之則為自動控制。
手動:
按下開關P3.1,所有的燈都打開,按下開關P3.2,所有的燈都關閉。
自動:
一個光敏電阻傳感器和四個紅外熱釋電傳感器,實現邏輯為:
當時間為晚上18點-早上6點之間或者光敏電阻傳感器為0時,一旦有人,則點亮燈,一個燈附近安裝一個紅外熱釋電傳感器,
當走進燈時,燈亮。
2、仿真圖
?3、程序
//主程序
void main()
{
Init_LCD();//液晶初始化
IE=0X87;//允許INT0,T0中斷
IP=0X05;
IT0=0X01;
IT1=0X01;
TMOD=0X01;
TH0=-50000/256;
TL0=-50000%256;
TR0=1;
while(1)
{ R_LED=Y_LED=G_LED=B_LED=1;if(key_1==0) //手動模式{key_LED(); //按鍵控制燈函數}else{if(DateTime[2]>18||DateTime[2]<6||guangmin==0){if(ren1==0){R_LED=0;Y_LED=1;G_LED=1;B_LED=1;}if(ren2==0){R_LED=0;Y_LED=0;G_LED=1;B_LED=1; }if(ren3==0){R_LED=0;Y_LED=0;G_LED=0;B_LED=1;}if(ren4==0){R_LED=0;Y_LED=0;G_LED=0;B_LED=0; }}}
switch(Adjust_flag)
{
case 0:GetTime(); break;
case 1:
if(K3==0&&DateTime[6]<99)
{
while(K3==0);
DateTime[6]++;}if(K4==0&&DateTime[6]>0)
{
while(K4==0);
DateTime[6]--;
}
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//如果年份變化后當前月份的天數大于上限則設為上限
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();//刷新星期break;case 2:
if(K3==0&&DateTime[4]<12)
{
while(K3==0);
DateTime[4]++;}if(K4==0&&DateTime[4]>1)
{
while(K4==0);
DateTime[4]--;
}
//獲取2月份天數
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//如果變化后當前月份的天數大于上限則設為上限
if(DateTime[3]>MonthsDays[DateTime[4]])
DateTime[3]=MonthsDays[DateTime[4]];
RefreshWeekDay();//刷新星期break;case 3://日00-28/29/30/31,調節之前首先根據年份得出該年中2月的天數
MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;
//根據當前的月份決定調節日期的上限
if(K3==0&&DateTime[3]<MonthsDays[DateTime[4]])
{
while(K3==0);DateTime[3]++;}
if(K4==0&&DateTime[3]>0)
{
while(K4==0);
DateTime[3]--;
}
break;case 4://時
if(K3==0&&DateTime[2]<23)
{
while(K3==0);
DateTime[2]++;}
if(K4==0&&DateTime[2]>0)
{
while(K4==0);DateTime[2]--; }
break;
case 5://分
if(K3==0&&DateTime[1]<59)
{ while(K3==0);
DateTime[1]++; }
if(K4==0&&DateTime[1]>0)
{while(K4==0);
DateTime[1]--; }
break;
}
}}