久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開始

搜索
查看: 2459|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)智能窗戶程序與Proteus仿真設(shè)計(jì) 光敏電阻自動(dòng)控制與時(shí)間控制

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
整個(gè)系統(tǒng)以AT89C52單片機(jī)為核心器件,配合電阻電容晶振等器件,構(gòu)成單片機(jī)的最小系統(tǒng)。其它個(gè)模塊圍繞著單片機(jī)最小系統(tǒng)展開。其中包括,顯示設(shè)備使用1602液晶,可以同時(shí)顯示年、月、日、時(shí)、分、控制模式、光照強(qiáng)度等基本信息;時(shí)鐘模塊采用DS1302芯片,初始化之后,就會(huì)開始運(yùn)行計(jì)算時(shí)間,單片機(jī)只需進(jìn)行時(shí)間信息的讀取即可;光照檢測(cè)電路采用光敏電阻和模數(shù)轉(zhuǎn)換芯片ADC0832,將模擬量數(shù)字化并顯示出來;窗簾使用步進(jìn)電機(jī)進(jìn)行代替模擬,同時(shí)配有一個(gè)LED燈用來指示窗簾當(dāng)前的開關(guān)狀態(tài);本設(shè)計(jì)還有5個(gè)按鍵作為操作輸入設(shè)備,可以對(duì)當(dāng)前時(shí)間進(jìn)行調(diào)整設(shè)置和設(shè)置窗簾開關(guān)時(shí)間和光控閾值等;最后是供電采用常用的USB 5V進(jìn)行供電。智能窗簾控制系統(tǒng)具有以下幾個(gè)基本功能:  
(1)手動(dòng)控制:該功能是根據(jù)用戶的需求通過按鍵進(jìn)行窗簾的開關(guān),此功能可以使窗簾的開閉處于任何一種狀態(tài);  
(2)光照自動(dòng)控制:系統(tǒng)可以根據(jù)用戶設(shè)定的光照強(qiáng)度值通過感光器采集光照自動(dòng)開光窗簾;  
(3)時(shí)間控制:此功能是根據(jù)用戶設(shè)定的時(shí)間一次性開關(guān)窗簾。   
(4)可以通過按鍵是上面三種控制模式循環(huán)切換。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替


  5. sbit ADC_CS     = P1^6;                         // ADC0832的CS引腳
  6. sbit ADC_CLK    = P1^7;                         // ADC0832的CLK引腳
  7. sbit ADC_DAT    = P3^2;                         // ADC0832的DI/DO引腳
  8. sbit SCK_P      = P1^0;                                // 時(shí)鐘芯片DS1302的SCK管腳
  9. sbit SDA_P      = P1^1;                                // 時(shí)鐘芯片DS1302的SDA管腳
  10. sbit RST_P      = P1^2;                                // 時(shí)鐘芯片DS1302的RST管腳
  11. sbit LcdRs_P    = P1^3;       // 1602液晶的RS管腳      
  12. sbit LcdRw_P    = P1^4;       // 1602液晶的RW管腳
  13. sbit LcdEn_P    = P1^5;       // 1602液晶的EN管腳
  14. sbit KeyMode_P  = P3^3;                                // 模式切換
  15. sbit KeySet_P   = P3^4;                                // 設(shè)置時(shí)間按鍵
  16. sbit KeySet2_P  = P3^5;                                // 設(shè)置時(shí)間模式的開關(guān)時(shí)間和光照控制強(qiáng)度
  17. sbit KeyDown_P  = P3^6;                                // 減按鍵
  18. sbit KeyUp_P    = P3^7;                                // 加按鍵
  19. sbit Led_P      = P2^0;                                // 指示燈

  20. uchar gMode=1;                                                                // 1是手動(dòng)模式,2是時(shí)間自動(dòng)模式,3是亮度自動(dòng)模式
  21. uchar OpenHour    = 18;                                // 開啟窗簾的小時(shí)
  22. uchar OpenMinute  = 20;                                // 開啟窗簾的分鐘
  23. uchar CloseHour   = 10;                                // 關(guān)閉窗簾的小時(shí)
  24. uchar CloseMinute = 30;                                // 關(guān)閉窗簾的分鐘
  25. uchar gLight      = 40;                                // 窗簾開關(guān)的閾值

  26. uchar code Clock[]={0x10,0x90,0x80,0xc0};                         // 步進(jìn)電機(jī)順時(shí)針旋轉(zhuǎn)數(shù)組
  27. uchar code AntiClock[]={0x80,0x90,0x10,0x30};                // 步進(jìn)電機(jī)逆時(shí)針旋轉(zhuǎn)數(shù)組


  28. uchar code Clock1[]={0x10,0x90,0x80,0xc0};


  29. uchar TimeBuff[7]={17,9,1,6,18,30,40};                                        // 時(shí)間數(shù)組,默認(rèn)2017年9月1日,星期五,18:30:40
  30. // TimeBuff[0] 代表年份,范圍00-99
  31. // TimeBuff[1] 代表月份,范圍1-12
  32. // TimeBuff[2] 代表日期,范圍1-31
  33. // TimeBuff[3] 代表星期,范圍1-7
  34. // TimeBuff[4] 代表小時(shí),范圍00-23
  35. // TimeBuff[5] 代表分鐘,范圍00-59
  36. // TimeBuff[6] 代表秒鐘,范圍00-59




  37. /*********************************************************/
  38. // 按鍵掃描(設(shè)置當(dāng)前時(shí)間)
  39. /*********************************************************/
  40. void KeyScanf1()
  41. {
  42.         if(KeySet_P==0)
  43.         {
  44.                 LcdGotoXY(0,13);                                // 顯示秒鐘的冒號(hào)
  45.                 LcdWriteData(':');
  46.                 LcdWriteCmd(0x0f);                        // 啟動(dòng)光標(biāo)閃爍
  47.                 LcdGotoXY(0,3);                                        // 定位光標(biāo)到年份閃爍
  48.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  49.                 while(!KeySet_P);                                // 等待按鍵釋放
  50.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  51.                
  52.                 /* 調(diào)整年份 */
  53.                 while(1)
  54.                 {
  55.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  56.                         {
  57.                                 if(TimeBuff[0]>0)                                                // 判斷年份是否大于0               
  58.                                         TimeBuff[0]--;                                                // 是的話就減去1
  59.                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  60.                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  61.                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  62.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  63.                         }
  64.                         
  65.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  66.                         {
  67.                                 if(TimeBuff[0]<99)                                        // 判斷年份是否小于99
  68.                                         TimeBuff[0]++;                                                // 是的話就加上1
  69.                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  70.                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  71.                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  72.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  73.                         }
  74.                         
  75.                         if(KeySet_P==0)
  76.                         {
  77.                                 break;
  78.                         }
  79.                 }
  80.                
  81.                 LcdGotoXY(0,6);                                        // 定位光標(biāo)到月份閃爍
  82.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  83.                 while(!KeySet_P);                                // 等待按鍵釋放
  84.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  85.                         
  86.                 /* 調(diào)整月份 */
  87.                 while(1)
  88.                 {
  89.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  90.                         {
  91.                                 if(TimeBuff[1]>1)                                                // 判斷月份是否大于1               
  92.                                         TimeBuff[1]--;                                                // 是的話就減去1
  93.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  94.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  95.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  96.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  97.                         }
  98.                         
  99.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  100.                         {
  101.                                 if(TimeBuff[1]<12)                                        // 判斷月份是否小于12
  102.                                         TimeBuff[1]++;                                                // 是的話就加上1
  103.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  104.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  105.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  106.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  107.                         }
  108.                         
  109.                         if(KeySet_P==0)
  110.                         {
  111.                                 break;
  112.                         }
  113.                 }
  114.                
  115.                 LcdGotoXY(0,9);                                        // 定位光標(biāo)到日期閃爍
  116.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  117.                 while(!KeySet_P);                                // 等待按鍵釋放
  118.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  119.                
  120.                 /* 調(diào)整日期 */
  121.                 while(1)
  122.                 {
  123.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  124.                         {
  125.                                 if(TimeBuff[2]>1)                                                // 判斷日期是否大于1               
  126.                                         TimeBuff[2]--;                                                // 是的話就減去1
  127.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  128.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  129.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  130.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  131.                         }
  132.                         
  133.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  134.                         {
  135.                                 if(TimeBuff[2]<31)                                        // 判斷日期是否小于31
  136.                                         TimeBuff[2]++;                                                // 是的話就加上1
  137.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  138.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  139.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  140.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  141.                         }
  142.                         
  143.                         if(KeySet_P==0)
  144.                         {
  145.                                 break;
  146.                         }
  147.                 }
  148.                
  149.                 LcdGotoXY(0,12);                                // 定位光標(biāo)到小時(shí)閃爍
  150.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  151.                 while(!KeySet_P);                                // 等待按鍵釋放
  152.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  153.                
  154.                
  155.                 /* 調(diào)整小時(shí) */
  156.                 while(1)
  157.                 {
  158.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  159.                         {
  160.                                 if(TimeBuff[4]>0)                                                // 判斷小時(shí)是否大于0
  161.                                         TimeBuff[4]--;                                                // 是的話就減去1
  162.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時(shí)的位置
  163.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時(shí)
  164.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時(shí)閃爍
  165.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  166.                         }
  167.                         
  168.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  169.                         {
  170.                                 if(TimeBuff[4]<23)                                        // 判斷小時(shí)是否小于23
  171.                                         TimeBuff[4]++;                                                // 是的話就加上1
  172.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時(shí)的位置
  173.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時(shí)
  174.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時(shí)閃爍
  175.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  176.                         }
  177.                         
  178.                         if(KeySet_P==0)
  179.                         {
  180.                                 break;
  181.                         }
  182.                 }
  183.                
  184.                 LcdGotoXY(0,15);                                // 定位光標(biāo)到分鐘閃爍
  185.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  186.                 while(!KeySet_P);                                // 等待按鍵釋放
  187.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  188.                
  189.                 /* 調(diào)整分鐘 */
  190.                 while(1)
  191.                 {
  192.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  193.                         {
  194.                                 if(TimeBuff[5]>0)                                                // 判斷分鐘是否大于0
  195.                                         TimeBuff[5]--;                                                // 是的話就減去1
  196.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  197.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  198.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  199.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  200.                         }
  201.                         
  202.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  203.                         {
  204.                                 if(TimeBuff[5]<59)                                        // 判斷分鐘是否小于59
  205.                                         TimeBuff[5]++;                                                // 是的話就加上1
  206.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  207.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  208.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  209.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  210.                         }
  211.                         
  212.                         if(KeySet_P==0)
  213.                         {
  214.                                 break;
  215.                         }
  216.                 }
  217.                
  218.                 /* 退出前的設(shè)置 */
  219.                 LcdWriteCmd(0x0C);                        // 關(guān)閉光標(biāo)閃爍
  220.                 DS1302_Write_Time();                // 把新設(shè)置的時(shí)間值存入DS1302芯片
  221.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  222.                 while(!KeySet_P);                                // 等待按鍵釋放
  223.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  224.         }
  225. }


  226. /*********************************************************/
  227. // 按鍵掃描(設(shè)置窗簾的動(dòng)作)
  228. /*********************************************************/
  229. void KeyScanf2()
  230. {
  231.         if(KeySet2_P==0)
  232.         {
  233.                 LcdGotoXY(0,0);                                                                                // 光標(biāo)定位
  234.                 LcdPrintStr(" OpenTime   :   ");        // 顯示第1行內(nèi)容
  235.                 LcdGotoXY(1,0);                                                                                // 光標(biāo)定位
  236.                 LcdPrintStr("CloseTime   :   ");        // 顯示第2行內(nèi)容
  237.                 LcdGotoXY(0,10);                                                                        // 光標(biāo)定位
  238.                 LcdPrintNum(OpenHour);                                                // 顯示開啟窗簾的小時(shí)
  239.                 LcdGotoXY(0,13);                                                                        // 光標(biāo)定位
  240.                 LcdPrintNum(OpenMinute);                                        // 顯示開啟窗簾的分鐘
  241.                 LcdGotoXY(1,10);                                                                        // 光標(biāo)定位
  242.                 LcdPrintNum(CloseHour);                                                // 顯示關(guān)閉窗簾的小時(shí)
  243.                 LcdGotoXY(1,13);                                                                        // 光標(biāo)定位
  244.                 LcdPrintNum(CloseMinute);                                        // 顯示關(guān)閉窗簾的分鐘               
  245.                
  246.                 LcdWriteCmd(0x0f);                                                        // 啟動(dòng)光標(biāo)閃爍
  247.                 LcdGotoXY(0,11);                                                                // 定位光標(biāo)
  248.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  249.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  250.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  251.                
  252.                 /* 調(diào)整開啟的小時(shí) */
  253.                 while(1)
  254.                 {
  255.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  256.                         {
  257.                                 if(OpenHour>0)                                                        // 判斷小時(shí)是否大于0               
  258.                                         OpenHour--;                                                                // 是的話就減去1
  259.                                 LcdGotoXY(0,10);                                                // 光標(biāo)定位
  260.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時(shí)
  261.                                 LcdGotoXY(0,11);                                                // 定位光標(biāo)
  262.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  263.                         }
  264.                         
  265.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  266.                         {
  267.                                 if(OpenHour<23)                                                        // 判斷小時(shí)是否小于23
  268.                                         OpenHour++;                                                                // 是的話就加上1
  269.                                 LcdGotoXY(0,10);                                                // 光標(biāo)定位
  270.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時(shí)
  271.                                 LcdGotoXY(0,11);                                                // 定位光標(biāo)
  272.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  273.                         }
  274.                         
  275.                         if(KeySet2_P==0)
  276.                         {
  277.                                 break;
  278.                         }
  279.                 }
  280.                
  281.                 LcdGotoXY(0,14);                                                                // 定位光標(biāo)
  282.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  283.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  284.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  285.                
  286.                 /* 調(diào)整開啟的分鐘 */
  287.                 while(1)
  288.                 {
  289.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  290.                         {
  291.                                 if(OpenMinute>0)                                                // 判斷分鐘是否大于0
  292.                                         OpenMinute--;                                                        // 是的話就減去1
  293.                                 LcdGotoXY(0,13);                                                // 光標(biāo)定位
  294.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  295.                                 LcdGotoXY(0,14);                                                // 定位光標(biāo)
  296.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  297.                         }
  298.                         
  299.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  300.                         {
  301.                                 if(OpenMinute<59)                                                // 判斷分鐘是否小于59
  302.                                         OpenMinute++;                                                        // 是的話就加上1
  303.                                 LcdGotoXY(0,13);                                                // 光標(biāo)定位
  304.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  305.                                 LcdGotoXY(0,14);                                                // 定位光標(biāo)
  306.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  307.                         }
  308.                         
  309.                         if(KeySet2_P==0)
  310.                         {
  311.                                 break;
  312.                         }
  313.                 }
  314.                
  315.                 LcdGotoXY(1,11);                                                                // 定位光標(biāo)
  316.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  317.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  318.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  319.                
  320.                 /* 調(diào)整關(guān)閉的小時(shí) */
  321.                 while(1)
  322.                 {
  323.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  324.                         {
  325.                                 if(CloseHour>0)                                                        // 判斷小時(shí)是否大于0               
  326.                                         CloseHour--;                                                        // 是的話就減去1
  327.                                 LcdGotoXY(1,10);                                                // 光標(biāo)定位
  328.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時(shí)
  329.                                 LcdGotoXY(1,11);                                                // 定位光標(biāo)
  330.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  331.                         }
  332.                         
  333.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  334.                         {
  335.                                 if(CloseHour<23)                                                // 判斷小時(shí)是否小于23
  336.                                         CloseHour++;                                                        // 是的話就加上1
  337.                                 LcdGotoXY(1,10);                                                // 光標(biāo)定位
  338.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時(shí)
  339.                                 LcdGotoXY(1,11);                                                // 定位光標(biāo)
  340.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  341.                         }
  342.                         
  343.                         if(KeySet2_P==0)
  344.                         {
  345.                                 break;
  346.                         }
  347.                 }
  348.                
  349.                 LcdGotoXY(1,14);                                                                // 定位光標(biāo)
  350.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  351.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  352.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  353.                
  354.                 /* 調(diào)整關(guān)閉的分鐘 */
  355.                 while(1)
  356.                 {
  357.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  358.                         {
  359.                                 if(CloseMinute>0)                                                // 判斷分鐘是否大于0
  360.                                         CloseMinute--;                                                // 是的話就減去1
  361.                                 LcdGotoXY(1,13);                                                // 光標(biāo)定位
  362.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  363.                                 LcdGotoXY(1,14);                                                // 定位光標(biāo)
  364.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  365.                         }
  366.                         
  367.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  368.                         {
  369.                                 if(CloseMinute<59)                                        // 判斷分鐘是否小于59
  370.                                         CloseMinute++;                                                // 是的話就加上1
  371.                                 LcdGotoXY(1,13);                                                // 光標(biāo)定位
  372.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  373.                                 LcdGotoXY(1,14);                                                // 定位光標(biāo)
  374.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  375.                         }
  376.                         
  377.                         if(KeySet2_P==0)
  378.                         {
  379.                                 break;
  380.                         }
  381.                 }
  382.                
  383.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  384.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  385.                 DelayMs(10);                                                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  386.                
  387.                 /* 光照強(qiáng)度的設(shè)置 */
  388.                 LcdWriteCmd(0x0C);                                                                // 關(guān)閉光標(biāo)閃爍
  389.                 LcdGotoXY(0,0);                                                                                // 光標(biāo)定位
  390.                 LcdPrintStr("   Light Set    ");        // 顯示第1行內(nèi)容
  391.                 LcdGotoXY(1,0);                                                                                // 光標(biāo)定位
  392.                 LcdPrintStr("                ");        // 顯示第2行內(nèi)容
  393.                 LcdGotoXY(1,7);                                                                                // 光標(biāo)定位
  394.                 LcdPrintNum(gLight);                                                        // 顯示窗簾的光線控制強(qiáng)度閾值
  395.                
  396.                 while(1)
  397.                 {
  398.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  399.                         {
  400.                                 if(gLight>0)                                                                // 判斷光線閾值是否大于0
  401.                                         gLight--;                                                                        // 是的話就減去1
  402.                                 LcdGotoXY(1,7);                                                        // 光標(biāo)定位
  403.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  404.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  405.                         }
  406.                         
  407.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  408.                         {
  409.                                 if(gLight<99)                                                                // 判斷光線閾值是否小于59
  410.                                         gLight++;                                                                        // 是的話就加上1
  411.                                 LcdGotoXY(1,7);                                                        // 光標(biāo)定位
  412.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  413.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  414.                         }
  415.                         
  416.                         if(KeySet2_P==0)
  417.                         {
  418.                                 break;
  419.                         }
  420.                 }
  421.                
  422.                 /* 退出前的設(shè)置 */
  423.                 LcdShowInit();                                        // 液晶顯示內(nèi)容初始化
  424.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  425.                 while(!KeySet2_P);                        // 等待按鍵釋放
  426.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  427.         }
  428. }


  429. /*********************************************************/
  430. // 按鍵掃描(模式切換)
  431. /*********************************************************/
  432. void KeyScanf3()
  433. {
  434.         if(KeyMode_P==0)
  435.         {
  436.                 gMode++;                                                        // 切換到下一模式
  437.                 if(gMode==4)                                        // 如果到盡頭了
  438.                         gMode=1;                                                // 回到第一種模式
  439.                 LcdGotoXY(1,0);                                // 光標(biāo)定位
  440.                 LcdPrintMode(gMode);        // 顯示模式
  441.                 DelayMs(10);                                        // 去除按鍵按下的抖動(dòng)
  442.                 while(!KeyMode_P);                // 等待按鍵是否
  443.                 DelayMs(10);                                        // 去除按鍵松開的抖動(dòng)
  444.         }
  445. }


  446. /*********************************************************/
  447. // 開窗
  448. /*********************************************************/
  449. void Open()
  450. {
  451.         uint i;
  452.         for(i=0;i<4;i++)
  453.         {
  454.                 P2=Clock[i];
  455.                 DelayMs(250);
  456.         }
  457.         Led_P=0;
  458. }



  459. /*********************************************************/
  460. // 關(guān)窗
  461. /*********************************************************/
  462. void Close()
  463. {
  464.         uint i;
  465.         for(i=0;i<4;i++)
  466.         {
  467.                 P2=AntiClock[i];
  468.                 DelayMs(250);
  469.         }
  470.         Led_P=1;
  471. }



  472. /*********************************************************/
  473. // 主函數(shù)
  474. /*********************************************************/
  475. void main()
  476. {
  477.         uchar light;
  478.         
  479.         LcdInit();                        // 執(zhí)行液晶初始化        
  480.         DS1302_Init();        // 時(shí)鐘芯片的初始化
  481.         LcdShowInit();        // 液晶顯示內(nèi)容的初始化
  482.         
  483.         if(DS1302_Read_Byte(0x81)>=128)                        // 判斷時(shí)鐘芯片是否正在運(yùn)行
  484.         {
  485.                 DS1302_Write_Time();                                                        // 如果沒有,則初始化一個(gè)時(shí)間
  486.         }
  487.         
  488.         while(1)
  489.         {
  490.                 DS1302_Read_Time();                                // 獲取當(dāng)前時(shí)鐘芯片的時(shí)間,存在數(shù)組time_buf中
  491.                 FlashTime();                                                        // 刷新時(shí)間顯示

  492.                 light=Get_ADC0832();                        // 讀取光照強(qiáng)度
  493.                 light=light/2.5;                                        // 縮小光照檢測(cè)結(jié)果(在0-99)
  494.                 if(light>99)                                                        // 如果大于99
  495.                         light=99;                                                                // 則依然保持99
  496.                 LcdGotoXY(1,14);                                        // 光標(biāo)定位
  497.                 LcdPrintNum(light);                                // 顯示光照強(qiáng)度
  498.                
  499.                 KeyScanf1();                                                        // 按鍵掃描(時(shí)間的設(shè)置)
  500.                 KeyScanf2();                                                        // 按鍵掃描(閾值的設(shè)置)
  501.                 KeyScanf3();                                                        // 按鍵掃描(模式切換)
  502.         
  503.                 /*手動(dòng)控制模式*/
  504.                 if(gMode==1)
  505.                 {
  506.                         if(KeyDown_P==0)                // 如果關(guān)窗簾鍵按下了        
  507.                         {
  508.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  509.                                 {
  510.                                         Close();                                // 則關(guān)閉窗簾
  511.                                 }
  512.                         }
  513.                         if(KeyUp_P==0)                        // 如果開窗簾鍵按下了
  514.                         {
  515.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  516.                                 {
  517.                                         Open();                                        // 則打開窗簾
  518.                                 }
  519.                         }        
  520.                 }
  521.                
  522.                 /*時(shí)間控制模式*/
  523.                 if(gMode==2)
  524.                 {
  525.                         if((TimeBuff[4]==CloseHour)&&(TimeBuff[5]==CloseMinute)&&(TimeBuff[6]==0))        // 如果到了關(guān)窗簾的時(shí)間        
  526.                         {
  527.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  528.                                 {
  529.                                         Close();                                // 則關(guān)閉窗簾
  530.                                 }
  531.                         }
  532.                         if((TimeBuff[4]==OpenHour)&&(TimeBuff[5]==OpenMinute)&&(TimeBuff[6]==0))                // 如果到了開窗簾的時(shí)間        
  533.                         {
  534.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  535.                                 {
  536.                                         Open();                                        // 則打開窗簾
  537.                                 }
  538.                         }        
  539.                 }
  540.                
  541.                 /*光線控制模式*/
  542.                 if(gMode==3)
  543.                 {
  544.                         if(light<gLight)                // 當(dāng)前光線小于設(shè)置的閾值
  545.                         {
  546.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  547.                                 {
  548.                                         Close();                                // 則關(guān)閉窗簾
  549.                                 }
  550.                         }
  551.                         else                                                                // 當(dāng)前光線大于或等于設(shè)置的閾值
  552.                         {
  553.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  554.                                 {
  555.                                         Open();                                        // 則打開窗簾
  556.                                 }
  557.                         }        
  558.                 }
  559.                
  560.                 DelayMs(100);                                                        // 延時(shí)0.1秒
  561.         }
  562. }
復(fù)制代碼

所有資料51hei附件下載:
仿真程序.7z (89.02 KB, 下載次數(shù): 57)

評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天干天天爱天天爽 | www精品美女久久久tv | 中文字幕的av | 男女精品久久 | 一色一黄视频 | 福利一区视频 | 精品国产91亚洲一区二区三区www | 国产精品视频观看 | 99久久99 | 毛片一区二区 | av在线免费不卡 | 亚洲第一成年免费网站 | 久久高清国产 | 日本手机在线 | 巨大荫蒂视频欧美另类大 | 国产精品精品视频一区二区三区 | 午夜国产一级 | 毛片免费看 | 国产精品成人一区二区三区 | 天天操网| 日韩精品免费 | 日本精品一区二区三区在线观看 | 18gay男同69亚洲网站 | 涩爱av一区二区三区 | 久久久久久久久久一区二区 | 成人在线观看欧美 | 成人在线中文 | 自拍偷拍中文字幕 | 精精精精xxxx免费视频 | 欧美精品一区二区三区四区 在线 | 日韩中文一区二区 | 国产区精品 | 成人在线视频网 | 99精品免费在线观看 | 国产精品视频中文字幕 | 成人欧美一区二区三区色青冈 | 精品自拍视频在线观看 | 久久久久国产一区二区三区四区 | 中日韩毛片 | 国产精品日韩在线 | 91成人在线 |