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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5834|回復: 3
打印 上一主題 下一主題
收起左側

基于51單片機的智能窗簾程序設計

[復制鏈接]
跳轉到指定樓層
樓主
硬件電路及程序,都是我最近寫文檔借鑒到的



單片機源程序如下:
  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;                // 時鐘芯片DS1302的SCK管腳
  9. sbit SDA_P      = P1^1;                // 時鐘芯片DS1302的SDA管腳
  10. sbit RST_P      = P1^2;                // 時鐘芯片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;                        // 設置時間按鍵
  16. sbit KeySet2_P  = P3^5;                        // 設置時間模式的開關時間和光照控制強度
  17. sbit KeyDown_P  = P3^6;                // 減按鍵
  18. sbit KeyUp_P    = P3^7;                // 加按鍵
  19. sbit Led_P      = P2^0;                // 指示燈

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

  26. uchar code Clock[]={0x10,0x20,0x40,0x80};                         // 步進電機順時針旋轉數組
  27. uchar code AntiClock[]={0x80,0x40,0x20,0x10};                // 步進電機逆時針旋轉數組

  28. uchar TimeBuff[7]={17,9,1,6,18,30,40};                                // 時間數組
  29. // TimeBuff[0] 代表年份,范圍00-99
  30. // TimeBuff[1] 代表月份,范圍1-12
  31. // TimeBuff[2] 代表日期,范圍1-31
  32. // TimeBuff[3] 代表星期,范圍1-7
  33. // TimeBuff[4] 代表小時,范圍00-23
  34. // TimeBuff[5] 代表分鐘,范圍00-59
  35. // TimeBuff[6] 代表秒鐘,范圍00-59


  36. /*********************************************************/
  37. // ADC0832的時鐘脈沖
  38. /*********************************************************/
  39. void WavePlus()
  40. {
  41.         _nop_();
  42.         ADC_CLK = 1;
  43.         _nop_();
  44.         ADC_CLK = 0;
  45. }

  46. /*********************************************************/
  47. // 獲取指定通道的A/D轉換結果
  48. /*********************************************************/
  49. uchar Get_ADC0832()
  50. {
  51.         uchar i;
  52.         uchar dat1=0;
  53.         uchar dat2=0;
  54.        
  55.         ADC_CLK = 0;                                // 電平初始化
  56.         ADC_DAT = 1;
  57.         _nop_();
  58.         ADC_CS = 0;
  59.         WavePlus();                                // 起始信號
  60.         ADC_DAT = 1;
  61.         WavePlus();                                // 通道選擇的第一位
  62.         ADC_DAT = 0;      
  63.         WavePlus();                                // 通道選擇的第二位
  64.         ADC_DAT = 1;
  65.        
  66.         for(i=0;i<8;i++)                        // 第一次讀取
  67.         {
  68.                 dat1<<=1;
  69.                 WavePlus();
  70.                 if(ADC_DAT)
  71.                         dat1=dat1|0x01;
  72.                 else
  73.                         dat1=dat1|0x00;
  74.         }
  75.        
  76.         for(i=0;i<8;i++)                        // 第二次讀取
  77.         {
  78.                 dat2>>= 1;
  79.                 if(ADC_DAT)
  80.                         dat2=dat2|0x80;
  81.                 else
  82.                         dat2=dat2|0x00;
  83.                 WavePlus();
  84.         }
  85.        
  86.         _nop_();                                        // 結束此次傳輸
  87.         ADC_DAT = 1;
  88.         ADC_CLK = 1;
  89.         ADC_CS  = 1;   

  90.         if(dat1==dat2)                                // 返回采集結果
  91.                 return dat1;
  92.         else
  93.                 return 0;
  94. }


  95. /*********************************************************/
  96. // 開窗
  97. /*********************************************************/
  98. void Open()
  99. {
  100.         uint i,j;
  101.         for(j=0;j<255;j++)                // 控制步進電機正轉
  102.         {
  103.                 for(i=0;i<4;i++)
  104.                 {
  105.                         P2=Clock[i];
  106.                         DelayMs(3);
  107.                 }
  108.         }
  109.         Led_P=0;
  110. }

  111. /*********************************************************/
  112. // 關窗
  113. /*********************************************************/
  114. void Close()
  115. {
  116.         uint i,j;
  117.         for(j=0;j<255;j++)                // 控制步進電機反轉
  118.         {
  119.                 for(i=0;i<4;i++)
  120.                 {
  121.                         P2=AntiClock[i];
  122.                         DelayMs(3);
  123.                 }
  124.         }
  125.         Led_P=1;
  126. }

  127. /*********************************************************/
  128. // 主函數
  129. /*********************************************************/
  130. void main()
  131. {
  132.         uchar light;
  133.         LcdInit();                        // 執行液晶初始化       
  134.         DS1302_Init();                // 時鐘芯片的初始化
  135.         LcdShowInit();                // 液晶顯示內容的初始化
  136.        
  137.         if(DS1302_Read_Byte(0x81)>=128)                // 判斷時鐘芯片是否正在運行
  138.                 DS1302_Write_Time();                                // 如果沒有,則初始化一個時間
  139.        
  140.         while(1)
  141.         {
  142.                 DS1302_Read_Time();                // 獲取當前時鐘芯片的時間,存在數組time_buf中
  143.                 FlashTime();                                // 刷新時間顯示

  144.                 light=Get_ADC0832();                // 讀取光照強度
  145.                 light=light/2.5;                                // 縮小光照檢測結果(在0-99)
  146.                 if(light>99)                                // 如果大于99
  147.                         light=99;                                // 則依然保持99
  148.                 LcdGotoXY(1,14);                        // 光標定位
  149.                 LcdPrintNum(light);                        // 顯示光照強度
  150.                
  151.                 KeyScanf1();                                // 按鍵掃描(時間的設置)
  152.                 KeyScanf2();                                // 按鍵掃描(閾值的設置)
  153.                 KeyScanf3();                                // 按鍵掃描(模式切換)
  154.        
  155.                 /*手動控制模式*/
  156.                 if(gMode==1)
  157.                 {
  158.                         if(KeyDown_P==0)                // 如果關窗簾鍵按下了       
  159.                         {
  160.                                 if(Led_P==0)                // 如果窗簾當前是打開的
  161.                                 {
  162.                                         Close();                // 則光閉窗簾
  163.                                 }
  164.                         }
  165.                         if(KeyUp_P==0)                // 如果開窗簾鍵按下了
  166.                         {
  167.                                 if(Led_P==1)                // 如果窗簾當前是關閉的
  168.                                 {
  169.                                         Open();                // 則打開窗簾
  170.                                 }
  171.                         }       
  172.                 }
  173.                
  174.                 /*時間控制模式*/
  175.                 if(gMode==2)
  176.                 {
  177.                         if((TimeBuff[4]==CloseHour)&&(TimeBuff[5]==CloseMinute)&&(TimeBuff[6]==0))
  178.                         {
  179.                                 if(Led_P==0)                        // 如果窗簾當前是打開的
  180.                                 {
  181.                                         Close();                        // 則光閉窗簾
  182.                                 }
  183.                         }
  184.                         if((TimeBuff[4]==OpenHour)&&(TimeBuff[5]==OpenMinute)&&(TimeBuff[6]==0))                        {
  185.                                 if(Led_P==1)                        // 如果窗簾當前是關閉的
  186.                                 {
  187.                                         Open();                        // 則打開窗簾
  188.                                 }
  189.                         }       
  190.                 }

  191.                 /*光線控制模式*/
  192.                 if(gMode==3)
  193.                 {
  194.                         if(light<gLight)                                // 當前光線小于設置的閾值
  195.                         {
  196.                                 if(Led_P==0)                        // 如果窗簾當前是打開的
  197.                                 {
  198.                                         Close();                        // 則光閉窗簾
  199.                                 }
  200.                         }
  201.                         else                                                // 當前光線大于或等于設置的閾值
  202.                         {
  203.                                 if(Led_P==1)                        // 如果窗簾當前是關閉的
  204.                                 {
  205.                                         Open();                        // 則打開窗簾
  206.                                 }
  207.                         }       
  208.                 }
  209.                 DelayMs(100);                                        // 延時0.1秒
  210.         }
  211. }
復制代碼

所有資料51hei提供下載:
基于51單片機的智能窗簾設計_.rar (77.29 KB, 下載次數: 129)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:727145 發表于 2020-4-16 17:36 | 只看該作者
怎么Proteus打不開呢
回復

使用道具 舉報

板凳
ID:368810 發表于 2020-5-23 11:11 | 只看該作者
a1273828767 發表于 2020-4-16 17:36
怎么Proteus打不開呢

版本問題?現在8.6用的比較多
回復

使用道具 舉報

地板
ID:1026086 發表于 2022-5-12 22:04 | 只看該作者
為啥會出現MIAN.C(6) : error C141: syntax error near sbit ' Target not created
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天插 | 午夜看电影在线观看 | 亚洲一区视频在线 | 神马久久春色视频 | 久在线观看| 欧美成人免费在线 | 国产在线a视频 | 99久久99| 99久热在线精品视频观看 | 日韩av免费在线电影 | 久综合 | av一级| 精品福利在线 | 国产一区免费视频 | www.婷婷亚洲基地 | 国产欧美一区二区三区在线播放 | 东京av男人的天堂 | 久久久免费毛片 | 欧美日韩免费视频 | 精品国产三级 | 色.com| 亚洲 中文 欧美 日韩 在线观看 | 欧美日韩一区二区在线观看 | 欧美精品第一区 | 国产精品成人免费 | 性生活毛片 | 日韩欧美在线播放 | 在线观看成人 | 国产一区二区精品在线 | 最新中文字幕一区 | 精品成人免费一区二区在线播放 | 韩日精品一区 | 中文字幕亚洲视频 | 久久久精彩视频 | 久久精品成人一区 | 伦理二区| 日韩欧美亚洲 | 久久久久久久一级 | 国产精品视频在线播放 | 欧美一级全黄 | 欧美精品一区在线发布 |