1. 簡介
自動窗簾控制系統核心採用的是單片機STC89C52,其次利用了光照傳感器、按鍵、顯示屏以及信號調理電路等外圍電路,使整個系統在各模塊的配合下可實現半自動控制、自動控制、定時控制等功能。其主要功能有6個,分別爲:
(1)手動控制:該功能是根據用戶的需求通過按鍵進行窗簾的開關,此功能可以使窗簾的開閉處於任何一種狀態;
(2)光照自動控制:系統可以根據用戶設定的光照強度值通過感光器採集光照自動開關窗簾;
(3)時間控制:此功能是根據用戶設定的時間一次性開關窗簾,並顯示當前溫度。
(4)溫度報警系統:可以自行設置溫度報警溫度。
(5)時間顯示及鬧鐘系統:可以自行設置鬧鐘時間。
(6)手動自動控制按鍵隨時切換
2.硬件設計
自動窗簾控制系統的構成主要由STC89C52單片機最小系統、蜂鳴器報警電路、電源模塊、按鍵電路、LCD1602液晶顯示電路、步進電機驅動電路、DS1302時鐘電路、光照檢測模塊和溫度檢測電路組成。其系統框圖如圖:
(1)光照檢測電路
窗簾自動控制系統的光控功能是可以根據光照的強弱來自動控制窗簾的開閉的,因此需要用到光照傳感元器件,在本設計中採用了光敏電阻,並和一個常規電阻串聯在一起,根據光線的變化改變光敏電阻的分壓值,然後通過ADC0832數模轉換芯片傳輸給單片機,經過單片機處理後在液晶上顯示。電路圖如圖:
(2)燈光驅動電路
燈光電路使用了3個LED燈作爲光源,採用了三極管作爲LED燈開關的控制芯片,同時也對驅動電流進行放大,以達到LED燈工作電流的要求。原理圖如圖:
(3)步進電機驅動電路
本系統的設計目的爲了高效控制步進電機的轉動,因此需要將單片機發出的脈衝轉化爲步進角度,才能控制步進電機轉動,我們在這裏採用ULN2003作爲步進電機的驅動芯片,其作用爲增強單片機的驅動能力。其工作原理爲:根據單片機引腳的輸出狀態,使ULN2003與單片機連接的四個管腳中每時刻只有一個管腳處於導通狀態(採用單拍方式對步進電機控制),其他管腳處於斷開狀態。這樣就使得與ULN2003連接的步進電機只有一個引出端導通。驅動原理圖如圖:
(4)按鍵電路
按鍵在單片機應用系統中能實現向單片機輸入數據,傳送命令等功能,是人工干預單片機的主要手段。本設計中的按鍵採用獨立按鍵式,共有五個。其中S2是自動和手動切換鍵,S3是設置退出鍵,S4是手動反轉和設置參數減鍵,S5是手動正轉和設置參數加鍵,S6是參數設置鍵。電路圖如圖:
(5)DS1302時鐘電路
本設計採用DS1302時鐘芯片爲系統提供時鐘源,它通過串行方式與單片機進行數據傳送,能夠向單片機提供包括秒、分、時、日、月、年等在內的實時時間信息,並可對月末日期、閏年天數自動進行調整;電路如圖:
電路圖中,Vcc1爲後備電源,Vcc2爲主電源。VCC1在單電源與電池供電的系統中提供低電源並提供低功率的電池備份。VCC2在雙電源系統中提供主電源,在這種運用方式中VCC1連接到備份電源,以便在沒有主電源的情況下能保存時間信息以及數據。
3.軟件設計
系統軟件設計主要有幾部分組成,主要分爲主程序和各個模塊子程序。
(1)主程序設計
主程序構成無限循環,主要完成單片機初始化,關中斷,菜單顯示內容初始化,按鍵掃描,電機運行,計時等功能。流程圖如圖:
代碼:
void main()
{
init_eepom(); //初始化EEPROM
init_1602(); //lcd1602初始化
init_1602_dis_csf(); //lcd1602初始化顯示
init_ds1302_io(); //初始化ds1302Io
init_time0(); //初始化定時器
menu_1_break(); //菜單初始界面
init_ds1302(); //ds1302初始化
temperature1 = read1_temp(); //讀溫度1
delay_1ms(650);
while(1)
{
key(); //按鍵程序
if(key_can < 10)
{
key_with();
}
shoudong_kaiguan(); //手動開關窗簾
if(flag_200ms == 1)
{
flag_200ms = 0;
temperature1 = read1_temp(); //讀溫度1 環境溫度
if(temperature1 >= 99)
temperature1 = 99;
zinengchuanglian_dis(); //智能窗簾處理函數
guanxian = ad0832read(1,0) * 9.0 / 255;
if((menu_1 == 0))
{
read_time(); //讀時間
init_1602_ds1302(); //顯示時鐘
write_sfm_18b20(2,13,temperature1); //顯示溫度
write_sfm1(2,0,guanxian); //顯示溫度
if(guanxian <= guanxian_set)
LED=0;
else
LED=1;
if(temperature1 >= t_high)
beep = ~beep; //溫度報警 ,蜂鳴器報警
else
beep = 1;
}
}
bujindj(); //步進電機函數
}
}
(2)步進電機驅動程序設計
步進電機程序設計主要實現的功能爲判斷旋轉方向;按順序傳送控制脈衝;判斷所要求的控制步數是否傳送完畢。程序流程圖如圖:
代碼:
uchar flag_z_f; //正反標誌位 0爲順時鐘 1爲逆時史上轉
unsigned char code zheng[4]={0xf8,0xf4,0xf2,0xf1};//正轉表格
unsigned char code fan[4]={0xf1,0xf2,0xf4,0xf8};//反轉表格
uint bjdj_value; //步進電機的量
uchar bjdj_zidong; //步進電機的量 自動
void bujindj() //步進電機函數
{
static uchar i;
if(flag_z_f != 0)
{
if(flag_z_f == 1) //開
{
if(bjdj_value >= 254)
{
flag_z_f = 0;
bjdj_value = 254;
P2 = P2 & 0xf0; //讓4個IO口都不輸出
write_eepom(); //保存
}else
bjdj_value ++;
}
if(flag_z_f == 2) //關
{
if(bjdj_value <= 1)
{
flag_z_f = 0;
bjdj_value = 1;
P2 = P2 & 0xf0; //讓4個IO口都不輸出
write_eepom(); //保存
}else
bjdj_value --;
}
for(i=0;i<4;i++) //4相
{
if(flag_z_f == 1) //開
P2=zheng[i];// & (P2 | 0xf0); //
else if(flag_z_f == 2)//關
P2=fan[i];// & (P2 | 0xf0); //
delay_uint(500); //改變這個參數可以調整電機轉速
}
}
}
由於代碼較多,其他子程序就不一一介紹,有興趣可下載源碼去看看。
源碼+AD原理圖 下載:關注公衆號,首頁回覆“自動窗簾”獲取資料