2022-4-13 16:21 上傳
點擊文件名下載附件
壓縮包內包涵程序圖以及程序代碼
單片機自動窗簾仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg51.h>
- #include"delay.h"
- #include"lcd602.h"
- #include"adc0832.h"
- /*****************************數組定義*******************************/
- uchar code tab1[]={"Now_G: "}; //
- uchar code tab5[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xff7,0xf6}; //1-2勵磁順序表 //半步
- /************************端口定義**************************/
- sbit k1 = P2^0; // 手-正
- sbit k2 = P2^1; // 手-反
- sbit k3 = P2^2; // 手-停
- sbit k4 = P2^3; // 自-上
- sbit k5 = P2^4; // 自-下
- sbit led = P3^3; // 自-手-lED
- sbit k6 = P3^4; // 自-手
- /************************變量定義*****************************/
- uint sec,min,h; //BCD碼格式
- int second,minute,hour; //十進制
- double youliang = 0;
- uchar i = 0;
- bit flag = 0; //暫停開始標志
- bit flag1 = 0; //正反轉標志
- bit flag2 = 0;
- bit flag3 = 0;
- bit mode = 1;
- /*************************按鍵*******************************/
- void key()
- {
- if(k1==0)
- {
- delayxms(5);
- while(k1==0);
- flag1 = 0; flag = 1;
- write_zifu(1,15,'Z');
- }
- if(k2==0)
- {
- delayxms(5);
- while(k2==0);
- flag1 = 1; flag = 1;
- write_zifu(1,15,'F');
- }
- if(k3==0)
- {
- delayxms(5);
- while(k3==0);
- flag = 0;
- }
- }
- void key1()
- {
- if(k4==0)
- {
- delayxms(5);
- while(k4==0);
- flag = 0;
- write_zifu(1,15,'T');
- flag2 = 1; flag3 = 0;
- }
- if(k5==0)
- {
- delayxms(5);
- while(k5==0);
- flag = 0;
- write_zifu(1,15,'T');
- flag2 = 0; flag3 = 1;
- }
- }
- /*******************定時器T0初始化********************/
- void T0_init()
- {
- TMOD=TMOD | 0x01; //設T0為方式1
- TH0=(65535-50000)/256; //計數50000個
- TL0=(65535-50000)%256;
- EA=1; //開啟總中斷
- ET0=1; //允許T0中斷
- //TR0=1; //啟動
- }
- /**************************************************************
- 主程序
- **************************************************************/
- void main()
- {
- chushihua(); //LCD1602初始化
- write_string(1,0,tab1);
- T0_init();
- while(1)
- {
- /*自動和手動判斷*/
- if(k6==0)
- {
- delayxms(5);
- while(k6==0);
- mode = ~mode;
- }
- /*重力計算 0-100*/
- youliang = adc0832()/2.55;
- write_num3(1,7,youliang); //重力顯示
- /*手動模式*/
- if(mode == 1)
- {
- flag2 = 0; flag3 = 0;
- led = 1; //LED關
- key(); //按鍵檢測
- if(flag == 0)
- {TR0 = 0; write_zifu(1,15,'T');}
- else
- {TR0 = 1;}
- }
- /*自動模式*/
- if(mode == 0)
- {
- led = 0; //LED開
- key1(); //按鍵檢測
- if(flag == 0)
- {TR0 = 0;}
- else
- {TR0 = 1;}
- /*根據重力判斷正反轉*/
- if(youliang > 50 && flag2 == 0) //正轉
- {
- flag = 1; flag1 = 0;
- write_zifu(1,15,'Z');
- }
- if(youliang <= 50 && flag3 == 0) //反轉
- {
- flag = 1; flag1 = 1;
- write_zifu(1,15,'F');
- }
- if(flag == 0)
- {TR0 = 0;}
- else
- {TR0 = 1;}
- }
- }
- }
- /**************************定時器T0中斷服務函數************************************/
- void T0_time() interrupt 1
- {
- TR0 = 0;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- if(i > 7)
- {i = 0;}
- if(flag1 == 0)
- {P1 = tab5[i];} //正轉
- else
- {P1 = tab5[7-i];} //反轉
- i += 1;
- TR0 = 1;
- }
復制代碼
隨著人民生活水平的不斷提高,人們對家庭生活舒適性的需求越來越強烈,窗簾作為每個家庭生活中最必須的家居用品之一,自然也需要滿足人民更舒適性的需求。窗簾最基本的作用無非是保護業主的個人隱私以及遮陽擋塵等功能,但傳統的窗簾您必須手動去開關,每天早開晚關也是挺麻煩的,特別是別墅或復式房的大窗簾,比較長,而且重,用時需要很大的力才能開關窗簾,特別不方便;于是遙控電動窗簾在最近幾年被廣泛應用于高級公寓,只要遙控器輕按一下,窗簾就自動開合,非常方便;當然,如果采用智能窗簾控制系統還可以實現窗簾的定時開關,場景控制等更多高級的窗簾控制功能,真正讓窗簾成為現代家居的一道亮麗"風景線".
1 系統總體設計與工作原理
PWM是一種模擬控制方式,其根據相應載荷的變化來調制晶體管柵極或基極的偏置,來實現開關穩壓電源輸出晶體管或晶體管導通時間的改變,這種方式能使電源的輸出電壓在工作條件變化時保持恒定,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。
本系統由單片機、紅外接收、光敏測光、電機驅動、數碼管顯示以及鳴響提示模塊組成。主要應用模塊的選擇包括電動機驅動模塊的、PWM調速方式、PWM調脈寬方式、PWM軟件實現方式的選擇。其中,電機驅動模塊的選擇采用由達林頓管組成的H型PWM電路;PWM調速工作方式采用單極性工作制;PWM調脈寬方式選擇采用定頻調寬方式;PWM軟件實現方式采用軟件延時方式。系統總體框圖如圖1所示。
AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得AT89S52在眾多嵌入式控制應用系統中得到廣泛應用。
該窗簾控制系統采用AT89S52單片機的最小系統設計,可以實現使用紅外遙控器進行遠程手動開、手動關和手動停控制,數碼管顯示窗簾的開、關,可以通過自行設定相應的數字表示;也可以按事先輸入的開啟時間和關閉時間進行時間控制,但只能順序顯示,顯示一遍后,略等片刻,再顯示下一遍時間;還可以根據室外環境亮度實現光控,由驅動數碼管顯示出當時的狀態。每一組數據由5個數字組成,前4個數字順序顯示時十位、時個位、分十位、分個位,第5個數字包含工作方式和工作狀態:顯示"一"(1橫)表示手動方式;"二"(2橫)表示半手動方式;"三"(3橫)表示光控方式;不顯示橫則表示時控方式。左上角的"豎"點亮表示電機工作時發出鳴響提示,不點亮表示電機工作無提示;右上角的"豎"點亮表示整點報時開啟,不點亮表示無整點報時。左下角"豎"點亮表示窗簾正在打開,右下角"豎"點亮表示窗簾正在關閉。
2 硬件電路設計
該窗簾控制系統電路分為8個部分:電源、顯示、光控電路測光、電機控制執行、紅外接收、鳴響提示、數據存儲、單片機主控器件。其中,電源部分通過外接插座輸入交流12 V或者直流13 V~14 V電壓供電,經過三端集成穩壓器穩壓后輸出5 V電壓,為鳴響電路、紅外接收電路、顯示電路提供電源。使用2節5號普通電池提供直流電源。
2.1 光采集電路設計
測光電路如圖2所示,由GM1、C3、V3組成。GM1采用光敏二極管[1],C3和GM1組成RC充放電回路。當P3.4處于高電平時,P3.4的高電壓通過GM1的正向電阻向C3充電;當P3.4被單片機拉低為低電平時,C3通過光敏元件放電。光敏二極管工作在反向電壓狀態下,此時環境亮度決定了光敏二極管的光阻值,光阻值大,C3放電速度慢,反之放電速度快。適當控制P3.4的拉低脈沖寬度,使得C3放電工作在線性比較好的工作段上。P3.5用來檢測C3在P3.4拉成低電平期間的放電電壓狀態,當C3電壓降到小于1/2VCC后,P3.5測得數據"0",反之測得數據"1".
2.2 紅外接收電路及數據存儲部分設計
紅外接收電路使用型號為HS3008的集成型紅外接收器,靜態時輸出端輸出高電平,當接收到紅外信號后,按紅外信號的數據波形輸出負脈沖數據信號,紅外信號輸出到單片機的P3.2口,該口對應的第二功能是外部中斷0(INT0),利用該功能,一旦紅外信號到來,P3.2被拉成低電平,使單片機中止當前的工作并轉到接收及處理紅外信號。開啟中斷功能的目的是:既減輕了單片機的工作負擔,又保證接收到的紅外信號的完整性,同時在手動工作狀態下,單片機進入睡眠后,利用外部中斷功能完成對單片機的喚醒。紅外接收電路和數據存儲電路如圖3所示。
2.3 窗簾框架構造設計
窗簾框架構造設計包括窗簾微動開關連接電路設計和窗簾架的制作與設計。本設計中的微動開關通過電容、電阻組成的復位電路與單片機的復位引腳相連,微動開關安裝在窗簾滑桿上,當窗簾移動到預定位置時,觸動微動開關,使單片機復位,此時電機停轉,窗簾停到指定位置。窗簾架的制作方法如下:先加工兩只滑輪作為主動輪和從動輪,輪子類似皮帶輪,底徑約為25 mm,槽寬和槽深約為4 mm;1根曬衣繩,直徑約為4 mm;在主動輪的槽底用膠水粘一圈薄膠皮以增加摩擦力;將主動輪固定在電動機軸上,而將電動機固定在窗簾盒的一端,將從動輪固定在窗簾盒的另一端,固定時最好調節裝置,用以繃緊拉繩。窗簾桿選用19 mm的不銹鋼管,采用2根桿其目的在于左右窗簾能重合。窗簾架的構成及窗簾的布置如圖4所示。
3 系統軟件設計
本系統中單片機微處理器的主要任務是完成對HS3008接收到的紅外信號的控制與處理,從而完成對相應控制單元的控制。主程序首先完成初始化,然后啟動HS3008等待接收控制指令,進行相應的輸出操作。系統流程圖如圖5所示。
單片機對接收到的紅外信號控制指令通過P3.2口來完成,其對應第二功能時為外部中斷0(INT0),通過接收到不同的紅外信號脈沖實現相應的操作。程序中重要的子程序有:串口初始化、串口接收中斷以及紅外信號處理子程序等。當串口設置完畢、程序初始化后,程序對P3.2口進行實時檢測,一旦檢測到有低脈沖到來,則進行解碼后,提取相應的子程序以實現對電機的控制。當接收到手動控制信號時,則直接對電機進行控制,實現窗簾的拉開、關閉或停止;當接收到半自動控制信號時,操作者只需按下拉開或關閉按鈕來程序執行,從而實現窗簾拉開或關閉。對于電機如何停止的問題,本設計在窗簾滑桿上安裝了微動開關,一旦窗簾拉動到指定位置就會觸碰微動開關,從而送給單片機一個低脈沖,單片機在接收到低脈沖后,則認為窗簾已完全拉開或關閉,調用程序實現電機的停止轉動;當接收到光控信號時,單片機調用相應的程序,驅動光敏二極管檢測環境亮度,根據檢測結果,實現窗簾的拉開或關閉。
基于單片機的智能遙控窗簾的設計,在實時性要求較低的測控與采集系統的應用中具有很好的發展前景和應用價值。在國內外,自動調光窗簾成為人們家居生活的首選布置。本文介紹的自動調光窗簾利用紅外遙控實現了其控制功能,在設計過程中遇到了一些典型的問題,但采取了相應的措施:
(1)電機驅動問題。電機的驅動電壓為5 V,但是經過三極管的降壓后,電機驅動能力明顯下降,為了增大電機驅動能力,在控制部分與電機執行部分加了4N25光耦隔離,將兩部分隔離開來,外接12 V電壓,以增大電機的驅動能力。(2)電機停機問題。單獨靠程序來實現電機的停機,對時間控制的要求非常高,且不易實現。如果通過繼電器來實現停機也可以,但由于繼電器響應時間慢、機械結構易損壞、壽命較短、可靠性不高,故采用了微動開關,通過送單片機低脈沖來實現電機停機,實時性也很好。