找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12183|回復(fù): 7
收起左側(cè)

51單片機(jī)自動(dòng)窗簾系統(tǒng)源程序+proteus仿真+設(shè)計(jì)詳解(手動(dòng)和自動(dòng)模式)

  [復(fù)制鏈接]
ID:413133 發(fā)表于 2018-10-22 11:02 | 顯示全部樓層 |閱讀模式
本窗簾設(shè)計(jì)帶手動(dòng)和自動(dòng)切換,自動(dòng)模式LED亮,手動(dòng)模式LED滅。
0.png
所有資料51hei提供下載:
基于單片機(jī)浴室窗簾控制系統(tǒng)-1.7z (77.33 KB, 下載次數(shù): 390)

單片機(jī)自動(dòng)窗簾仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
0.png

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include"delay.h"
  3. #include"lcd602.h"
  4. #include"adc0832.h"
  5. /*****************************數(shù)組定義*******************************/
  6. uchar code tab1[]={"Now_G: "};         //
  7. uchar code tab5[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xff7,0xf6};  //1-2勵(lì)磁順序表 //半步
  8. /************************端口定義**************************/
  9. sbit k1 = P2^0;        // 手-正
  10. sbit k2 = P2^1;        // 手-反
  11. sbit k3 = P2^2;        // 手-停
  12. sbit k4 = P2^3;        // 自-上
  13. sbit k5 = P2^4;        // 自-下
  14. sbit led = P3^3; // 自-手-lED
  15. sbit k6 = P3^4; // 自-手
  16. /************************變量定義*****************************/
  17. uint sec,min,h;        //BCD碼格式
  18. int second,minute,hour; //十進(jìn)制
  19. double youliang = 0;
  20. uchar i = 0;
  21. bit flag = 0; //暫停開(kāi)始標(biāo)志
  22. bit flag1 = 0; //正反轉(zhuǎn)標(biāo)志
  23. bit flag2 = 0;
  24. bit flag3 = 0;
  25. bit mode = 1;
  26. /*************************按鍵*******************************/
  27. void key()
  28. {
  29.           if(k1==0)
  30.           {
  31.                      delayxms(5);
  32.                    while(k1==0);
  33.                    flag1 = 0; flag = 1;
  34.                    write_zifu(1,15,'Z');
  35.           }
  36.           if(k2==0)        
  37.           {
  38.                         delayxms(5);
  39.                         while(k2==0);
  40.                         flag1 = 1; flag = 1;
  41.                         write_zifu(1,15,'F');
  42.           }
  43.           if(k3==0)        
  44.           {
  45.                         delayxms(5);
  46.                         while(k3==0);
  47.                         flag = 0;
  48.           }
  49. }

  50. void key1()
  51. {
  52.           if(k4==0)
  53.           {
  54.                      delayxms(5);
  55.                    while(k4==0);
  56.                    flag = 0;
  57.                    write_zifu(1,15,'T');
  58.                    flag2 = 1; flag3 = 0;
  59.           }
  60.           if(k5==0)        
  61.           {
  62.                         delayxms(5);
  63.                         while(k5==0);
  64.                         flag = 0;
  65.                         write_zifu(1,15,'T');
  66.                         flag2 = 0; flag3 = 1;
  67.           }
  68. }
  69. /*******************定時(shí)器T0初始化********************/
  70. void T0_init()
  71. {
  72.           TMOD=TMOD | 0x01;              //設(shè)T0為方式1
  73.           TH0=(65535-50000)/256;       //計(jì)數(shù)50000個(gè)
  74.           TL0=(65535-50000)%256;
  75.           EA=1;                        //開(kāi)啟總中斷         
  76.           ET0=1;                       //允許T0中斷
  77.           //TR0=1;                       //啟動(dòng)
  78. }
  79. /**************************************************************
  80.                       主程序
  81. **************************************************************/
  82. void main()
  83. {
  84.   chushihua(); //LCD1602初始化
  85.   write_string(1,0,tab1);
  86.   T0_init();
  87.   while(1)
  88.   {
  89.                             /*自動(dòng)和手動(dòng)判斷*/
  90.                             if(k6==0)
  91.                                 {
  92.                                              delayxms(5);
  93.                                            while(k6==0);
  94.                                            mode = ~mode;
  95.                                 }
  96.                                 /*重力計(jì)算 0-100*/
  97.                         youliang = adc0832()/2.55;
  98.                         write_num3(1,7,youliang); //重力顯示
  99.                                 /*手動(dòng)模式*/
  100.                                 if(mode == 1)
  101.                                 {
  102.                                    flag2 = 0; flag3 = 0;
  103.                                    led = 1; //LED關(guān)
  104.                                    key(); //按鍵檢測(cè)
  105.                                    if(flag == 0)
  106.                                    {TR0 = 0; write_zifu(1,15,'T');}
  107.                                    else
  108.                                    {TR0 = 1;}
  109.                                 }
  110.                                 /*自動(dòng)模式*/
  111.                                 if(mode == 0)
  112.                                 {
  113.                                    led = 0; //LED開(kāi)
  114.                                    key1(); //按鍵檢測(cè)
  115.                                    if(flag == 0)
  116.                                    {TR0 = 0;}
  117.                                    else
  118.                                    {TR0 = 1;}
  119.                                    /*根據(jù)重力判斷正反轉(zhuǎn)*/
  120.                                    if(youliang > 50 && flag2 == 0) //正轉(zhuǎn)
  121.                                    {
  122.                                              flag = 1; flag1 = 0;
  123.                                           write_zifu(1,15,'Z');
  124.                                    }
  125.                                    if(youliang <= 50 && flag3 == 0) //反轉(zhuǎn)
  126.                                    {
  127.                                              flag = 1; flag1 = 1;
  128.                                           write_zifu(1,15,'F');
  129.                                    }
  130.                                    if(flag == 0)
  131.                                    {TR0 = 0;}
  132.                                    else
  133.                                    {TR0 = 1;}
  134.                                 }
  135.   }
  136. }
  137. /**************************定時(shí)器T0中斷服務(wù)函數(shù)************************************/
  138. void T0_time() interrupt 1   
  139. {
  140.           TR0 = 0;
  141.       TH0=(65535-50000)/256;      
  142.           TL0=(65535-50000)%256;     
  143.           if(i > 7)
  144.           {i = 0;}
  145.           if(flag1 == 0)
  146.           {P1 = tab5[i];} //正轉(zhuǎn)
  147.           else
  148.           {P1 = tab5[7-i];} //反轉(zhuǎn)
  149.           i += 1;
  150.           TR0 = 1;
  151. }
復(fù)制代碼

隨著人民生活水平的不斷提高,人們對(duì)家庭生活舒適性的需求越來(lái)越強(qiáng)烈,窗簾作為每個(gè)家庭生活中最必須的家居用品之一,自然也需要滿(mǎn)足人民更舒適性的需求。窗簾最基本的作用無(wú)非是保護(hù)業(yè)主的個(gè)人隱私以及遮陽(yáng)擋塵等功能,但傳統(tǒng)的窗簾您必須手動(dòng)去開(kāi)關(guān),每天早開(kāi)晚關(guān)也是挺麻煩的,特別是別墅或復(fù)式房的大窗簾,比較長(zhǎng),而且重,用時(shí)需要很大的力才能開(kāi)關(guān)窗簾,特別不方便;于是遙控電動(dòng)窗簾在最近幾年被廣泛應(yīng)用于高級(jí)公寓,只要遙控器輕按一下,窗簾就自動(dòng)開(kāi)合,非常方便;當(dāng)然,如果采用智能窗簾控制系統(tǒng)還可以實(shí)現(xiàn)窗簾的定時(shí)開(kāi)關(guān),場(chǎng)景控制等更多高級(jí)的窗簾控制功能,真正讓窗簾成為現(xiàn)代家居的一道亮麗"風(fēng)景線(xiàn)".

  1 系統(tǒng)總體設(shè)計(jì)與工作原理

  PWM是一種模擬控制方式,其根據(jù)相應(yīng)載荷的變化來(lái)調(diào)制晶體管柵極或基極的偏置,來(lái)實(shí)現(xiàn)開(kāi)關(guān)穩(wěn)壓電源輸出晶體管或晶體管導(dǎo)通時(shí)間的改變,這種方式能使電源的輸出電壓在工作條件變化時(shí)保持恒定,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。

  本系統(tǒng)由單片機(jī)、紅外接收、光敏測(cè)光、電機(jī)驅(qū)動(dòng)、數(shù)碼管顯示以及鳴響提示模塊組成。主要應(yīng)用模塊的選擇包括電動(dòng)機(jī)驅(qū)動(dòng)模塊的、PWM調(diào)速方式、PWM調(diào)脈寬方式、PWM軟件實(shí)現(xiàn)方式的選擇。其中,電機(jī)驅(qū)動(dòng)模塊的選擇采用由達(dá)林頓管組成的H型PWM電路;PWM調(diào)速工作方式采用單極性工作制;PWM調(diào)脈寬方式選擇采用定頻調(diào)寬方式;PWM軟件實(shí)現(xiàn)方式采用軟件延時(shí)方式。系統(tǒng)總體框圖如圖1所示。

20110520195821250.gif

  AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用。

  該窗簾控制系統(tǒng)采用AT89S52單片機(jī)的最小系統(tǒng)設(shè)計(jì),可以實(shí)現(xiàn)使用紅外遙控器進(jìn)行遠(yuǎn)程手動(dòng)開(kāi)、手動(dòng)關(guān)和手動(dòng)?刂,數(shù)碼管顯示窗簾的開(kāi)、關(guān),可以通過(guò)自行設(shè)定相應(yīng)的數(shù)字表示;也可以按事先輸入的開(kāi)啟時(shí)間和關(guān)閉時(shí)間進(jìn)行時(shí)間控制,但只能順序顯示,顯示一遍后,略等片刻,再顯示下一遍時(shí)間;還可以根據(jù)室外環(huán)境亮度實(shí)現(xiàn)光控,由驅(qū)動(dòng)數(shù)碼管顯示出當(dāng)時(shí)的狀態(tài)。每一組數(shù)據(jù)由5個(gè)數(shù)字組成,前4個(gè)數(shù)字順序顯示時(shí)十位、時(shí)個(gè)位、分十位、分個(gè)位,第5個(gè)數(shù)字包含工作方式和工作狀態(tài):顯示"一"(1橫)表示手動(dòng)方式;"二"(2橫)表示半手動(dòng)方式;"三"(3橫)表示光控方式;不顯示橫則表示時(shí)控方式。左上角的"豎"點(diǎn)亮表示電機(jī)工作時(shí)發(fā)出鳴響提示,不點(diǎn)亮表示電機(jī)工作無(wú)提示;右上角的"豎"點(diǎn)亮表示整點(diǎn)報(bào)時(shí)開(kāi)啟,不點(diǎn)亮表示無(wú)整點(diǎn)報(bào)時(shí)。左下角"豎"點(diǎn)亮表示窗簾正在打開(kāi),右下角"豎"點(diǎn)亮表示窗簾正在關(guān)閉。

  2 硬件電路設(shè)計(jì)

  該窗簾控制系統(tǒng)電路分為8個(gè)部分:電源、顯示、光控電路測(cè)光、電機(jī)控制執(zhí)行、紅外接收、鳴響提示、數(shù)據(jù)存儲(chǔ)、單片機(jī)主控器件。其中,電源部分通過(guò)外接插座輸入交流12 V或者直流13 V~14 V電壓供電,經(jīng)過(guò)三端集成穩(wěn)壓器穩(wěn)壓后輸出5 V電壓,為鳴響電路、紅外接收電路、顯示電路提供電源。使用2節(jié)5號(hào)普通電池提供直流電源。

  2.1 光采集電路設(shè)計(jì)

  測(cè)光電路如圖2所示,由GM1、C3、V3組成。GM1采用光敏二極管[1],C3和GM1組成RC充放電回路。當(dāng)P3.4處于高電平時(shí),P3.4的高電壓通過(guò)GM1的正向電阻向C3充電;當(dāng)P3.4被單片機(jī)拉低為低電平時(shí),C3通過(guò)光敏元件放電。光敏二極管工作在反向電壓狀態(tài)下,此時(shí)環(huán)境亮度決定了光敏二極管的光阻值,光阻值大,C3放電速度慢,反之放電速度快。適當(dāng)控制P3.4的拉低脈沖寬度,使得C3放電工作在線(xiàn)性比較好的工作段上。P3.5用來(lái)檢測(cè)C3在P3.4拉成低電平期間的放電電壓狀態(tài),當(dāng)C3電壓降到小于1/2VCC后,P3.5測(cè)得數(shù)據(jù)"0",反之測(cè)得數(shù)據(jù)"1".

20110520195821266.gif

  2.2 紅外接收電路及數(shù)據(jù)存儲(chǔ)部分設(shè)計(jì)

  紅外接收電路使用型號(hào)為HS3008的集成型紅外接收器,靜態(tài)時(shí)輸出端輸出高電平,當(dāng)接收到紅外信號(hào)后,按紅外信號(hào)的數(shù)據(jù)波形輸出負(fù)脈沖數(shù)據(jù)信號(hào),紅外信號(hào)輸出到單片機(jī)的P3.2口,該口對(duì)應(yīng)的第二功能是外部中斷0(INT0),利用該功能,一旦紅外信號(hào)到來(lái),P3.2被拉成低電平,使單片機(jī)中止當(dāng)前的工作并轉(zhuǎn)到接收及處理紅外信號(hào)。開(kāi)啟中斷功能的目的是:既減輕了單片機(jī)的工作負(fù)擔(dān),又保證接收到的紅外信號(hào)的完整性,同時(shí)在手動(dòng)工作狀態(tài)下,單片機(jī)進(jìn)入睡眠后,利用外部中斷功能完成對(duì)單片機(jī)的喚醒。紅外接收電路和數(shù)據(jù)存儲(chǔ)電路如圖3所示。

20110520195821282.gif

  2.3 窗簾框架構(gòu)造設(shè)計(jì)

  窗簾框架構(gòu)造設(shè)計(jì)包括窗簾微動(dòng)開(kāi)關(guān)連接電路設(shè)計(jì)和窗簾架的制作與設(shè)計(jì)。本設(shè)計(jì)中的微動(dòng)開(kāi)關(guān)通過(guò)電容、電阻組成的復(fù)位電路與單片機(jī)的復(fù)位引腳相連,微動(dòng)開(kāi)關(guān)安裝在窗簾滑桿上,當(dāng)窗簾移動(dòng)到預(yù)定位置時(shí),觸動(dòng)微動(dòng)開(kāi)關(guān),使單片機(jī)復(fù)位,此時(shí)電機(jī)停轉(zhuǎn),窗簾停到指定位置。窗簾架的制作方法如下:先加工兩只滑輪作為主動(dòng)輪和從動(dòng)輪,輪子類(lèi)似皮帶輪,底徑約為25 mm,槽寬和槽深約為4 mm;1根曬衣繩,直徑約為4 mm;在主動(dòng)輪的槽底用膠水粘一圈薄膠皮以增加摩擦力;將主動(dòng)輪固定在電動(dòng)機(jī)軸上,而將電動(dòng)機(jī)固定在窗簾盒的一端,將從動(dòng)輪固定在窗簾盒的另一端,固定時(shí)最好調(diào)節(jié)裝置,用以繃緊拉繩。窗簾桿選用19 mm的不銹鋼管,采用2根桿其目的在于左右窗簾能重合。窗簾架的構(gòu)成及窗簾的布置如圖4所示。

20110520195821313.gif

  3 系統(tǒng)軟件設(shè)計(jì)

  本系統(tǒng)中單片機(jī)微處理器的主要任務(wù)是完成對(duì)HS3008接收到的紅外信號(hào)的控制與處理,從而完成對(duì)相應(yīng)控制單元的控制。主程序首先完成初始化,然后啟動(dòng)HS3008等待接收控制指令,進(jìn)行相應(yīng)的輸出操作。系統(tǒng)流程圖如圖5所示。

20110520195821328.gif

  單片機(jī)對(duì)接收到的紅外信號(hào)控制指令通過(guò)P3.2口來(lái)完成,其對(duì)應(yīng)第二功能時(shí)為外部中斷0(INT0),通過(guò)接收到不同的紅外信號(hào)脈沖實(shí)現(xiàn)相應(yīng)的操作。程序中重要的子程序有:串口初始化、串口接收中斷以及紅外信號(hào)處理子程序等。當(dāng)串口設(shè)置完畢、程序初始化后,程序?qū)3.2口進(jìn)行實(shí)時(shí)檢測(cè),一旦檢測(cè)到有低脈沖到來(lái),則進(jìn)行解碼后,提取相應(yīng)的子程序以實(shí)現(xiàn)對(duì)電機(jī)的控制。當(dāng)接收到手動(dòng)控制信號(hào)時(shí),則直接對(duì)電機(jī)進(jìn)行控制,實(shí)現(xiàn)窗簾的拉開(kāi)、關(guān)閉或停止;當(dāng)接收到半自動(dòng)控制信號(hào)時(shí),操作者只需按下拉開(kāi)或關(guān)閉按鈕來(lái)程序執(zhí)行,從而實(shí)現(xiàn)窗簾拉開(kāi)或關(guān)閉。對(duì)于電機(jī)如何停止的問(wèn)題,本設(shè)計(jì)在窗簾滑桿上安裝了微動(dòng)開(kāi)關(guān),一旦窗簾拉動(dòng)到指定位置就會(huì)觸碰微動(dòng)開(kāi)關(guān),從而送給單片機(jī)一個(gè)低脈沖,單片機(jī)在接收到低脈沖后,則認(rèn)為窗簾已完全拉開(kāi)或關(guān)閉,調(diào)用程序?qū)崿F(xiàn)電機(jī)的停止轉(zhuǎn)動(dòng);當(dāng)接收到光控信號(hào)時(shí),單片機(jī)調(diào)用相應(yīng)的程序,驅(qū)動(dòng)光敏二極管檢測(cè)環(huán)境亮度,根據(jù)檢測(cè)結(jié)果,實(shí)現(xiàn)窗簾的拉開(kāi)或關(guān)閉。

  基于單片機(jī)的智能遙控窗簾的設(shè)計(jì),在實(shí)時(shí)性要求較低的測(cè)控與采集系統(tǒng)的應(yīng)用中具有很好的發(fā)展前景和應(yīng)用價(jià)值。在國(guó)內(nèi)外,自動(dòng)調(diào)光窗簾成為人們家居生活的首選布置。本文介紹的自動(dòng)調(diào)光窗簾利用紅外遙控實(shí)現(xiàn)了其控制功能,在設(shè)計(jì)過(guò)程中遇到了一些典型的問(wèn)題,但采取了相應(yīng)的措施:

 。1)電機(jī)驅(qū)動(dòng)問(wèn)題。電機(jī)的驅(qū)動(dòng)電壓為5 V,但是經(jīng)過(guò)三極管的降壓后,電機(jī)驅(qū)動(dòng)能力明顯下降,為了增大電機(jī)驅(qū)動(dòng)能力,在控制部分與電機(jī)執(zhí)行部分加了4N25光耦隔離,將兩部分隔離開(kāi)來(lái),外接12 V電壓,以增大電機(jī)的驅(qū)動(dòng)能力。(2)電機(jī)停機(jī)問(wèn)題。單獨(dú)靠程序來(lái)實(shí)現(xiàn)電機(jī)的停機(jī),對(duì)時(shí)間控制的要求非常高,且不易實(shí)現(xiàn)。如果通過(guò)繼電器來(lái)實(shí)現(xiàn)停機(jī)也可以,但由于繼電器響應(yīng)時(shí)間慢、機(jī)械結(jié)構(gòu)易損壞、壽命較短、可靠性不高,故采用了微動(dòng)開(kāi)關(guān),通過(guò)送單片機(jī)低脈沖來(lái)實(shí)現(xiàn)電機(jī)停機(jī),實(shí)時(shí)性也很好。



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:417062 發(fā)表于 2018-10-29 13:58 | 顯示全部樓層
設(shè)計(jì)很合理,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:436886 發(fā)表于 2018-12-1 22:26 | 顯示全部樓層
樓主、您好 我想問(wèn)一下您的那個(gè)自動(dòng)窗簾設(shè)設(shè)計(jì) 就是圖中有幾個(gè)零件不是很懂 可以為我講解下嗎  
回復(fù)

使用道具 舉報(bào)

ID:349040 發(fā)表于 2018-12-2 18:02 | 顯示全部樓層
樓主,有些問(wèn)題想請(qǐng)教你,真誠(chéng),希望你可以指導(dǎo)一下
回復(fù)

使用道具 舉報(bào)

ID:661737 發(fā)表于 2019-12-11 21:23 | 顯示全部樓層
多謝分享
回復(fù)

使用道具 舉報(bào)

ID:766592 發(fā)表于 2020-6-2 11:16 | 顯示全部樓層
有詳細(xì)的解答嗎
回復(fù)

使用道具 舉報(bào)

ID:753910 發(fā)表于 2020-7-1 16:24 | 顯示全部樓層
仿真運(yùn)行怎么不亮呀
回復(fù)

使用道具 舉報(bào)

ID:1017407 發(fā)表于 2022-4-13 09:43 | 顯示全部樓層
直接仿真不了啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表