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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于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^0;                         // 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. sbit ds=P3^1;
  21. bit closeflag,openflag;
  22. uchar gMode=1;                                                                // 1是手動模式,2是時間自動模式,3是亮度自動模式
  23. uchar OpenHour    = 18;                                // 開啟窗簾的小時
  24. uchar OpenMinute  = 20;                                // 開啟窗簾的分鐘
  25. uchar CloseHour   = 10;                                // 關閉窗簾的小時
  26. uchar CloseMinute = 30;                                // 關閉窗簾的分鐘
  27. uchar gLight      = 40;                                // 窗簾開關的閾值

  28. uchar wDu=35;
  29. uint wd=13,t;
  30. uchar xsflag;

  31. uchar code Clock[]={0x8f,0x4f,0x2f,0x1f};                         // 步進電機順時針旋轉數組
  32. uchar code AntiClock[]={0x1f,0x2f,0x4f,0x8f};                // 步進電機逆時針旋轉數組

  33. uchar TimeBuff[7]={17,9,1,6,18,30,40};                                        // 時間數組,默認2017年9月1日,星期五,18:30:40


  34. /*********************************************************/
  35. // 毫秒級的延時函數,time是要延時的毫秒數
  36. /*********************************************************/
  37. void DelayMs(uint time)
  38. {
  39.         uint i,j;
  40.         for(i=0;i<time;i++)
  41.                 for(j=0;j<112;j++);
  42. }
  43. void delay(uint z)                                                  //延時函數
  44. {
  45.         uint x,y;
  46.         for(x=z;x>0;x--)
  47.                 for(y=110;y>0;y--);
  48. }

  49. /*********************************************************/
  50. // 1602液晶寫命令函數,cmd就是要寫入的命令
  51. /*********************************************************/
  52. void LcdWriteCmd(uchar cmd)
  53. {
  54.         LcdRs_P = 0;
  55.         LcdRw_P = 0;
  56.         LcdEn_P = 0;
  57.         P0=cmd;
  58.         DelayMs(2);
  59.         LcdEn_P = 1;   
  60.         DelayMs(2);
  61.         LcdEn_P = 0;       
  62. }


  63. /*********************************************************/
  64. // 1602液晶寫數據函數,dat就是要寫入的數據
  65. /*********************************************************/
  66. void LcdWriteData(uchar dat)
  67. {
  68.         LcdRs_P = 1;
  69.         LcdRw_P = 0;
  70.         LcdEn_P = 0;
  71.         P0=dat;
  72.         DelayMs(2);
  73.         LcdEn_P = 1;   
  74.         DelayMs(2);
  75.         LcdEn_P = 0;
  76. }


  77. /*********************************************************/
  78. // 1602液晶初始化函數
  79. /*********************************************************/
  80. void LcdInit()
  81. {
  82.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點陣,8位數據口
  83.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標
  84.         LcdWriteCmd(0x06);        // 地址加1,當寫入數據后光標右移
  85.         LcdWriteCmd(0x01);        // 清屏
  86. }


  87. /*********************************************************/
  88. // 液晶光標定位函數
  89. /*********************************************************/
  90. void LcdGotoXY(uchar line,uchar column)
  91. {
  92.         // 第一行
  93.         if(line==0)        
  94.                 LcdWriteCmd(0x80+column);
  95.         // 第二行
  96.         if(line==1)        
  97.                 LcdWriteCmd(0x80+0x40+column);
  98. }


  99. /*********************************************************/
  100. // 液晶輸出字符串函數
  101. /*********************************************************/
  102. void LcdPrintStr(uchar *str)
  103. {
  104.         while(*str!='\0')
  105.                         LcdWriteData(*str++);
  106. }


  107. /*********************************************************/
  108. // 液晶輸出數字(0-99)
  109. /*********************************************************/
  110. void LcdPrintNum(uchar num)
  111. {
  112.        
  113.         LcdWriteData(num/10+0x30);                // 十位
  114.         LcdWriteData(num%10+0x30);                 // 個位
  115.        
  116.         //LcdWriteData(num%10+'0');                 // 個位
  117. }

  118. void LcdPrintNum2(uchar num2)
  119. {
  120.        
  121.         LcdWriteData(num2/100+0x30);                // 百位
  122.         LcdWriteData(num2%100/10+0x30);                // 十位
  123.         LcdWriteData(num2%100%10+0x30);                 // 個位

  124. }
  125. /*********************************************************/
  126. // 顯示模式
  127. /*********************************************************/
  128. void LcdPrintMode(uchar num)
  129. {
  130.         switch(num)                       
  131.         {
  132.                 case 1: LcdPrintStr("Manual");        break;
  133.                 case 2: LcdPrintStr(" TIME ");        break;
  134.                 case 3: LcdPrintStr("LIGHT ");        break;
  135.                 case 4: LcdPrintStr(" TEMP ");        break;
  136.                 default:                                                                                                break;
  137.         }
  138. }


  139. /*********************************************************/
  140. // 液晶顯示內容的初始化
  141. /*********************************************************/
  142. void LcdShowInit()
  143. {
  144.         LcdGotoXY(0,0);
  145.         LcdPrintStr("20'C   -     :  ");
  146.         LcdGotoXY(1,0);
  147.         LcdPrintStr("         gz:    ");
  148.         LcdGotoXY(1,0);
  149.         LcdPrintMode(gMode);
  150. }



  151. /*********************************************************/
  152. // 刷新時間顯示
  153. /*********************************************************/
  154. void FlashTime()
  155. {
  156.         LcdGotoXY(0,0);                                                                                // 年份
  157.         LcdPrintNum(wd);
  158.         LcdGotoXY(0,5);                                                                                // 月份
  159.         LcdPrintNum(TimeBuff[1]);
  160.         LcdGotoXY(0,8);                                                                                // 日期
  161.         LcdPrintNum(TimeBuff[2]);
  162.         LcdGotoXY(0,11);                                                                        // 小時
  163.         LcdPrintNum(TimeBuff[4]);
  164.         LcdGotoXY(0,14);                                                                        // 分鐘
  165.         LcdPrintNum(TimeBuff[5]);
  166.         LcdGotoXY(0,13);                                                                        // 秒鐘
  167.         if(TimeBuff[6]%2==0)                                                        // 秒鐘是偶數顯示冒號
  168.                 LcdWriteData(':');
  169.         else                                                                                                                        // 秒鐘是奇數顯示空格
  170.                 LcdWriteData(' ');
  171. }


  172. /*********************************************************/
  173. // 初始化DS1302
  174. /*********************************************************/
  175. void DS1302_Init(void)
  176. {
  177.         RST_P=0;                        // RST腳置低
  178.         SCK_P=0;                        // SCK腳置低
  179.         SDA_P=0;                        // SDA腳置低                               
  180. }


  181. /*********************************************************/
  182. // 從DS1302讀出一字節數據
  183. /*********************************************************/
  184. uchar DS1302_Read_Byte(uchar addr)
  185. {
  186.         uchar i;
  187.         uchar temp;
  188.        
  189.         RST_P=1;                                                               
  190.        
  191.         /* 寫入目標地址:addr*/
  192.         for(i=0;i<8;i++)
  193.         {     
  194.                 if(addr&0x01)
  195.                         SDA_P=1;
  196.                 else
  197.                         SDA_P=0;
  198.                
  199.                 SCK_P=1;
  200.                 _nop_();
  201.                 SCK_P=0;
  202.                 _nop_();
  203.                
  204.                 addr=addr>> 1;
  205.         }
  206.        
  207.         /* 讀出該地址的數據 */
  208.         for(i=0;i<8;i++)
  209.         {
  210.                 temp=temp>>1;
  211.                
  212.                 if(SDA_P)
  213.                         temp|= 0x80;
  214.                 else
  215.                         temp&=0x7F;
  216.                
  217.                 SCK_P=1;
  218.                 _nop_();
  219.                 SCK_P=0;
  220.                 _nop_();
  221.         }
  222.        
  223.         RST_P=0;
  224.        
  225.         return temp;
  226. }


  227. /*********************************************************/
  228. // 向DS1302寫入一字節數據
  229. /*********************************************************/
  230. void DS1302_Write_Byte(uchar addr, uchar dat)
  231. {
  232.         uchar i;
  233.        
  234.         RST_P = 1;
  235.        
  236.         /* 寫入目標地址:addr*/
  237.         for(i=0;i<8;i++)
  238.         {
  239.                 if(addr&0x01)
  240.                         SDA_P=1;
  241.                 else
  242.                         SDA_P=0;

  243.                 SCK_P=1;
  244.                 _nop_();
  245.                 SCK_P=0;
  246.                 _nop_();
  247.                
  248.                 addr=addr>>1;
  249.         }
  250.        
  251.         /* 寫入數據:dat*/
  252.         for(i=0;i<8;i++)
  253.         {
  254.                 if(dat&0x01)
  255.                         SDA_P=1;
  256.                 else
  257.                         SDA_P=0;
  258.        
  259.                 SCK_P=1;
  260.                 _nop_();
  261.                 SCK_P=0;
  262.                 _nop_();
  263.                
  264.                 dat=dat>>1;
  265.         }
  266.        
  267.         RST_P=0;                                       
  268. }


  269. /*********************************************************/
  270. // 向DS1302寫入時間數據
  271. /*********************************************************/
  272. void DS1302_Write_Time()
  273. {
  274.   uchar i;
  275.         uchar temp1;
  276.         uchar temp2;
  277.        
  278.         for(i=0;i<7;i++)                        // 十進制轉BCD碼
  279.         {
  280.                 temp2=TimeBuff[i]%10;
  281.                 TimeBuff[i]=temp1+temp2;
  282.         }
  283.        
  284.         DS1302_Write_Byte(0x8E,0x00);                                                                // 關閉寫保護
  285.         DS1302_Write_Byte(0x80,0x80);                                                                // 暫停時鐘
  286.         DS1302_Write_Byte(0x8C,TimeBuff[0]);                                // 年
  287.         DS1302_Write_Byte(0x88,TimeBuff[1]);                                // 月
  288.         DS1302_Write_Byte(0x86,TimeBuff[2]);                                // 日
  289.         DS1302_Write_Byte(0x8A,TimeBuff[3]);                                // 星期
  290.         DS1302_Write_Byte(0x84,TimeBuff[4]);                                // 時
  291.         DS1302_Write_Byte(0x82,TimeBuff[5]);                                // 分
  292.         DS1302_Write_Byte(0x80,TimeBuff[6]);                                // 秒
  293.         DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F);                // 運行時鐘
  294.         DS1302_Write_Byte(0x8E,0x80);                                                                // 打開寫保護  
  295. }



  296. /*********************************************************/
  297. // 從DS1302讀出時間數據
  298. /*********************************************************/
  299. void DS1302_Read_Time()  
  300. {
  301.         uchar i;

  302.         TimeBuff[0]=DS1302_Read_Byte(0x8D);                                                // 年
  303.         TimeBuff[1]=DS1302_Read_Byte(0x89);                                                // 月
  304.         TimeBuff[2]=DS1302_Read_Byte(0x87);                                                // 日
  305.         TimeBuff[3]=DS1302_Read_Byte(0x8B);                                                // 星期
  306.         TimeBuff[4]=DS1302_Read_Byte(0x85);                                                // 時
  307.         TimeBuff[5]=DS1302_Read_Byte(0x83);                                                // 分
  308.         TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F;                // 秒

  309.         for(i=0;i<7;i++)                // BCD轉十進制
  310.         {           
  311.                 TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
  312.         }
  313. }


  314. /*********************************************************/
  315. // ADC0832的時鐘脈沖
  316. /*********************************************************/
  317. void WavePlus()
  318. {
  319.         _nop_();
  320.         ADC_CLK = 1;
  321.         _nop_();
  322.         ADC_CLK = 0;
  323. }


  324. /*********************************************************/
  325. // 獲取指定通道的A/D轉換結果
  326. /*********************************************************/
  327. uchar Get_ADC0832(unsigned char num1 )
  328. {
  329.                
  330.         uchar i,dat1=0,dat2=0;
  331.         ADC_CS  = 0; ADC_CLK = 0;ADC_DAT = 1; _nop_(); _nop_();
  332.         ADC_CLK = 1; _nop_(); _nop_(); ADC_CLK = 0;                         //準備

  333.         ADC_CLK = 1; _nop_(); _nop_();ADC_CLK = 0;                 //開始          核實準備工作
  334.         ADC_DAT = num1; _nop_(); _nop_();ADC_CLK = 1;              //上升沿傳地地址的低位
  335.         ADC_DAT = num1; _nop_(); _nop_();ADC_CLK = 0;                    //下降沿傳地地址的高位
  336.         ADC_DAT = 1; _nop_(); _nop_();                                   //準備傳輸數據
  337.         for(i=0;i<8;i++)
  338.         {   
  339.             dat1 = dat1 | ADC_DAT;
  340.                  ADC_CLK = 1; _nop_(); _nop_();
  341.                 ADC_CLK = 0; _nop_(); _nop_();
  342.                
  343.                 dat1 = dat1 << 1 ;
  344.              
  345.         }
  346.         ADC_CS = 1;
  347.         return dat1;
  348.        
  349. }


  350. /*********************************************************/
  351. // 按鍵掃描(設置當前時間)
  352. /*********************************************************/
  353. void KeyScanf1()
  354. {
  355.         if(KeySet_P==0)
  356.         {
  357.                 LcdGotoXY(0,13);                                // 顯示秒鐘的冒號
  358.                 LcdWriteData(':');
  359.                
  360.                
  361.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  362.                 while(!KeySet_P);                                // 等待按鍵釋放
  363.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  364.                

  365.                
  366.                 LcdGotoXY(0,6);                                        // 定位光標到月份閃爍
  367.                 LcdWriteCmd(0x0f);                        // 啟動光標閃爍
  368.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  369.                 while(!KeySet_P);                                // 等待按鍵釋放
  370.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  371.                        
  372.                 /* 調整月份 */
  373.                 while(1)
  374.                 {
  375.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  376.                         {
  377.                                 if(TimeBuff[1]>1)                                                // 判斷月份是否大于1               
  378.                                         TimeBuff[1]--;                                                // 是的話就減去1
  379.                                 LcdGotoXY(0,5);                                                        // 光標定位到月份的位置
  380.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  381.                                 LcdGotoXY(0,6);                                                        // 定位光標到月份閃爍
  382.                                 DelayMs(300);                                                                // 延時0.3秒左右
  383.                         }
  384.                        
  385.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  386.                         {
  387.                                 if(TimeBuff[1]<12)                                        // 判斷月份是否小于12
  388.                                         TimeBuff[1]++;                                                // 是的話就加上1
  389.                                 LcdGotoXY(0,5);                                                        // 光標定位到月份的位置
  390.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  391.                                 LcdGotoXY(0,6);                                                        // 定位光標到月份閃爍
  392.                                 DelayMs(300);                                                                // 延時0.3秒左右
  393.                         }
  394.                        
  395.                         if(KeySet_P==0)
  396.                         {
  397.                                 break;
  398.                         }
  399.                 }
  400.                
  401.                 LcdGotoXY(0,9);                                        // 定位光標到日期閃爍
  402.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  403.                 while(!KeySet_P);                                // 等待按鍵釋放
  404.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  405.                
  406.                 /* 調整日期 */
  407.                 while(1)
  408.                 {
  409.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  410.                         {
  411.                                 if(TimeBuff[2]>1)                                                // 判斷日期是否大于1               
  412.                                         TimeBuff[2]--;                                                // 是的話就減去1
  413.                                 LcdGotoXY(0,8);                                                        // 光標定位到日期的位置
  414.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  415.                                 LcdGotoXY(0,9);                                                        // 定位光標到日期閃爍
  416.                                 DelayMs(300);                                                                // 延時0.3秒左右
  417.                         }
  418.                        
  419.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  420.                         {
  421.                                 if(TimeBuff[2]<31)                                        // 判斷日期是否小于31
  422.                                         TimeBuff[2]++;                                                // 是的話就加上1
  423.                                 LcdGotoXY(0,8);                                                        // 光標定位到日期的位置
  424.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  425.                                 LcdGotoXY(0,9);                                                        // 定位光標到日期閃爍
  426.                                 DelayMs(300);                                                                // 延時0.3秒左右
  427.                         }
  428.                        
  429.                         if(KeySet_P==0)
  430.                         {
  431.                                 break;
  432.                         }
  433.                 }
  434.                
  435.                 LcdGotoXY(0,12);                                // 定位光標到小時閃爍
  436.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  437.                 while(!KeySet_P);                                // 等待按鍵釋放
  438.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  439.                
  440.                
  441.                 /* 調整小時 */
  442.                 while(1)
  443.                 {
  444.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  445.                         {
  446.                                 if(TimeBuff[4]>0)                                                // 判斷小時是否大于0
  447.                                         TimeBuff[4]--;                                                // 是的話就減去1
  448.                                 LcdGotoXY(0,11);                                                // 光標定位到小時的位置
  449.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時
  450.                                 LcdGotoXY(0,12);                                                // 定位光標到小時閃爍
  451.                                 DelayMs(300);                                                                // 延時0.3秒左右
  452.                         }
  453.                        
  454.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  455.                         {
  456.                                 if(TimeBuff[4]<23)                                        // 判斷小時是否小于23
  457.                                         TimeBuff[4]++;                                                // 是的話就加上1
  458.                                 LcdGotoXY(0,11);                                                // 光標定位到小時的位置
  459.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時
  460.                                 LcdGotoXY(0,12);                                                // 定位光標到小時閃爍
  461.                                 DelayMs(300);                                                                // 延時0.3秒左右
  462.                         }
  463.                        
  464.                         if(KeySet_P==0)
  465.                         {
  466.                                 break;
  467.                         }
  468.                 }
  469.                
  470.                 LcdGotoXY(0,15);                                // 定位光標到分鐘閃爍
  471.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  472.                 while(!KeySet_P);                                // 等待按鍵釋放
  473.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  474.                
  475.                 /* 調整分鐘 */
  476.                 while(1)
  477.                 {
  478.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  479.                         {
  480.                                 if(TimeBuff[5]>0)                                                // 判斷分鐘是否大于0
  481.                                         TimeBuff[5]--;                                                // 是的話就減去1
  482.                                 LcdGotoXY(0,14);                                                // 光標定位到分鐘的位置
  483.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  484.                                 LcdGotoXY(0,15);                                                // 定位光標到分鐘閃爍
  485.                                 DelayMs(300);                                                                // 延時0.3秒左右
  486.                         }
  487.                        
  488.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  489.                         {
  490.                                 if(TimeBuff[5]<59)                                        // 判斷分鐘是否小于59
  491.                                         TimeBuff[5]++;                                                // 是的話就加上1
  492.                                 LcdGotoXY(0,14);                                                // 光標定位到分鐘的位置
  493.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  494.                                 LcdGotoXY(0,15);                                                // 定位光標到分鐘閃爍
  495.                                 DelayMs(300);                                                                // 延時0.3秒左右
  496.                         }
  497.                        
  498.                         if(KeySet_P==0)
  499.                         {
  500.                                 break;
  501.                         }
  502.                 }
  503.                
  504.                 /* 退出前的設置 */
  505.                 LcdWriteCmd(0x0C);                        // 關閉光標閃爍
  506.                 DS1302_Write_Time();                // 把新設置的時間值存入DS1302芯片
  507.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  508.                 while(!KeySet_P);                                // 等待按鍵釋放
  509.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  510.         }
  511. }
  512. uint temp,mm;uchar i;float f_temp;
  513. /*******************************************************
  514. 溫度函數
  515. *******************************************************/
  516. void dsreset(void)                                           //下邊是溫度獲取子程衼E
  517. {
  518.         uint i;
  519.         ds=0;
  520.         i=103;
  521.         while(i>0)i--;
  522.         ds=1;
  523.         i=4;
  524.         while(i>0)i--;
  525. }
  526. bit tempreadbit(void)                                   //讀一位
  527. {
  528.         uint i;
  529.         bit dat;
  530.         ds=0;i++;
  531.         ds=1;i++;i++;
  532.         dat=ds;
  533.         i=8;while(i>0)i--;
  534.         return(dat);
  535. }
  536. uchar tempread(void)                                         //獲取溫度
  537. {
  538.         uchar i,j,dat;
  539.         dat=0;
  540.         for(i=1;i<=8;i++)
  541.         {
  542.                 j=tempreadbit();
  543.                 dat=(j<<7)|(dat>>1);
  544.         }
  545.         return(dat);
  546. }
  547. void tempwritebyte(uchar dat)                           //寫一個字節
  548. {
  549.         uint i;
  550.         uchar j;
  551.         bit testb;
  552.         for(j=1;j<=8;j++)
  553.         {
  554.                 testb=dat&0x01;
  555.                 dat=dat>>1;
  556.                 if(testb)
  557.                 {
  558.                         ds=0;
  559.                         i++;i++;
  560.                         ds=1;
  561.                         i=8;while(i>0)i--;
  562.                 }
  563.                 else
  564.                 {
  565.                         ds=0;
  566.                         i=8;while(i>0)i--;
  567.                         ds=1;
  568.                         i++;i++;
  569.                 }
  570.         }
  571. }
  572. void tempchange(void)                                           //溫度轉換
  573. {
  574.         dsreset();
  575.         delay(1);
  576.         tempwritebyte(0xcc);
  577.         tempwritebyte(0x44);
  578. }
  579. uint get_temp()                                                        //獲取溫度
  580. {
  581.         uchar a,b;
  582.         dsreset();
  583.         delay(1);
  584.         tempwritebyte(0xcc);
  585.         tempwritebyte(0xbe);
  586.         a=tempread();
  587.         b=tempread();
  588.         temp=b;
  589.         temp<<=8;
  590.         temp=temp|a;
  591.         f_temp=temp*0.0625;
  592.         temp=f_temp*10+0.5;
  593.         f_temp=f_temp+0.05;
  594.         return temp;
  595. }
  596. /***********************************/

  597. /*********************************************************/
  598. // 按鍵掃描(設置窗簾的動作)
  599. /*********************************************************/
  600. void KeyScanf2()
  601. {
  602.         if(KeySet2_P==0)
  603.         {
  604.                 LcdGotoXY(0,0);                                                                                // 光標定位
  605.                 LcdPrintStr(" OpenTime   :   ");        // 顯示第1行內容
  606.                 LcdGotoXY(1,0);                                                                                // 光標定位
  607.                 LcdPrintStr("CloseTime   :   ");        // 顯示第2行內容
  608.                 LcdGotoXY(0,10);                                                                        // 光標定位
  609.                 LcdPrintNum(OpenHour);                                                // 顯示開啟窗簾的小時
  610.                 LcdGotoXY(0,13);                                                                        // 光標定位
  611.                 LcdPrintNum(OpenMinute);                                        // 顯示開啟窗簾的分鐘
  612.                 LcdGotoXY(1,10);                                                                        // 光標定位
  613.                 LcdPrintNum(CloseHour);                                                // 顯示關閉窗簾的小時
  614.                 LcdGotoXY(1,13);                                                                        // 光標定位
  615.                 LcdPrintNum(CloseMinute);                                        // 顯示關閉窗簾的分鐘               
  616.                
  617.                 LcdWriteCmd(0x0f);                                                        // 啟動光標閃爍
  618.                 LcdGotoXY(0,11);                                                                // 定位光標
  619.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  620.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  621.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  622.                
  623.                 /* 調整開啟的小時 */
  624.                 while(1)
  625.                 {
  626.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  627.                         {
  628.                                 if(OpenHour>0)                                                        // 判斷小時是否大于0               
  629.                                         OpenHour--;                                                                // 是的話就減去1
  630.                                 LcdGotoXY(0,10);                                                // 光標定位
  631.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時
  632.                                 LcdGotoXY(0,11);                                                // 定位光標
  633.                                 DelayMs(300);                                                                // 延時0.3秒左右
  634.                         }
  635.                        
  636.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  637.                         {
  638.                                 if(OpenHour<23)                                                        // 判斷小時是否小于23
  639.                                         OpenHour++;                                                                // 是的話就加上1
  640.                                 LcdGotoXY(0,10);                                                // 光標定位
  641.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時
  642.                                 LcdGotoXY(0,11);                                                // 定位光標
  643.                                 DelayMs(300);                                                                // 延時0.3秒左右
  644.                         }
  645.                        
  646.                         if(KeySet2_P==0)
  647.                         {
  648.                                 break;
  649.                         }
  650.                 }
  651.                
  652.                 LcdGotoXY(0,14);                                                                // 定位光標
  653.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  654.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  655.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  656.                
  657.                 /* 調整開啟的分鐘 */
  658.                 while(1)
  659.                 {
  660.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  661.                         {
  662.                                 if(OpenMinute>0)                                                // 判斷分鐘是否大于0
  663.                                         OpenMinute--;                                                        // 是的話就減去1
  664.                                 LcdGotoXY(0,13);                                                // 光標定位
  665.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  666.                                 LcdGotoXY(0,14);                                                // 定位光標
  667.                                 DelayMs(300);                                                                // 延時0.3秒左右
  668.                         }
  669.                        
  670.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  671.                         {
  672.                                 if(OpenMinute<59)                                                // 判斷分鐘是否小于59
  673.                                         OpenMinute++;                                                        // 是的話就加上1
  674.                                 LcdGotoXY(0,13);                                                // 光標定位
  675.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  676.                                 LcdGotoXY(0,14);                                                // 定位光標
  677.                                 DelayMs(300);                                                                // 延時0.3秒左右
  678.                         }
  679.                        
  680.                         if(KeySet2_P==0)
  681.                         {
  682.                                 break;
  683.                         }
  684.                 }
  685.                
  686.                 LcdGotoXY(1,11);                                                                // 定位光標
  687.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  688.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  689.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  690.                
  691.                 /* 調整關閉的小時 */
  692.                 while(1)
  693.                 {
  694.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  695.                         {
  696.                                 if(CloseHour>0)                                                        // 判斷小時是否大于0               
  697.                                         CloseHour--;                                                        // 是的話就減去1
  698.                                 LcdGotoXY(1,10);                                                // 光標定位
  699.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時
  700.                                 LcdGotoXY(1,11);                                                // 定位光標
  701.                                 DelayMs(300);                                                                // 延時0.3秒左右
  702.                         }
  703.                        
  704.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  705.                         {
  706.                                 if(CloseHour<23)                                                // 判斷小時是否小于23
  707.                                         CloseHour++;                                                        // 是的話就加上1
  708.                                 LcdGotoXY(1,10);                                                // 光標定位
  709.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時
  710.                                 LcdGotoXY(1,11);                                                // 定位光標
  711.                                 DelayMs(300);                                                                // 延時0.3秒左右
  712.                         }
  713.                        
  714.                         if(KeySet2_P==0)
  715.                         {
  716.                                 break;
  717.                         }
  718.                 }
  719.                
  720.                 LcdGotoXY(1,14);                                                                // 定位光標
  721.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  722.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  723.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  724.                
  725.                 /* 調整關閉的分鐘 */
  726.                 while(1)
  727.                 {
  728.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  729.                         {
  730.                                 if(CloseMinute>0)                                                // 判斷分鐘是否大于0
  731.                                         CloseMinute--;                                                // 是的話就減去1
  732.                                 LcdGotoXY(1,13);                                                // 光標定位
  733.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  734.                                 LcdGotoXY(1,14);                                                // 定位光標
  735.                                 DelayMs(300);                                                                // 延時0.3秒左右
  736.                         }
  737.                        
  738.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  739.                         {
  740.                                 if(CloseMinute<59)                                        // 判斷分鐘是否小于59
  741.                                         CloseMinute++;                                                // 是的話就加上1
  742.                                 LcdGotoXY(1,13);                                                // 光標定位
  743.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  744.                                 LcdGotoXY(1,14);                                                // 定位光標
  745.                                 DelayMs(300);                                                                // 延時0.3秒左右
  746.                         }
  747.                        
  748.                         if(KeySet2_P==0)
  749.                         {
  750.                                 break;
  751.                         }
  752.                 }
  753.                
  754.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  755.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  756.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  757.                
  758.                 /* 光照強度的設置 */
  759.                 LcdWriteCmd(0x0C);                                                                // 關閉光標閃爍
  760.                 LcdGotoXY(0,0);                                                                                // 光標定位
  761.                 LcdPrintStr("   LIGHT Set    ");        // 顯示第1行內容
  762.                 LcdGotoXY(1,0);                                                                                // 光標定位
  763.                 LcdPrintStr("                ");        // 顯示第2行內容
  764.                 LcdGotoXY(1,7);                                                                                // 光標定位
  765.                 LcdPrintNum(gLight);                                                        // 顯示窗簾的光線控制強度閾值
  766.                
  767.                 while(1)
  768.                 {
  769.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  770.                         {
  771.                                 if(gLight>0)                                                                // 判斷光線閾值是否大于0
  772.                                         gLight--;                                                                        // 是的話就減去1
  773.                                 LcdGotoXY(1,7);                                                        // 光標定位
  774.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  775.                                 DelayMs(300);                                                                // 延時0.3秒左右
  776.                         }
  777.                        
  778.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  779.                         {
  780.                                 if(gLight<99)                                                                // 判斷光線閾值是否小于59
  781.                                         gLight++;                                                                        // 是的話就加上1
  782.                                 LcdGotoXY(1,7);                                                        // 光標定位
  783.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  784.                                 DelayMs(300);                                                                // 延時0.3秒左右
  785.                         }
  786.                        
  787.                         if(KeySet2_P==0)
  788.                         {
  789.                                 break;
  790.                         }
  791.                 }

  792.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  793.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  794.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動

  795.         //                 設置溫度
  796.                 LcdWriteCmd(0x0C);                                                                // 關閉光眮E了?
  797.                 LcdGotoXY(0,0);                                                                                // 光眮Eㄎ?
  798.                 LcdPrintStr("   TEMP  Set    ");        // 顯示第1行內容
  799.                 LcdGotoXY(1,0);                                                                                // 光眮Eㄎ?
  800.                 LcdPrintStr("                ");        // 顯示第2行內容
  801.                 LcdGotoXY(1,7);                                                                                // 光眮Eㄎ?
  802.                 LcdPrintNum(wDu);                                                        // 顯示窗簾的光線控制強度閾值       
  803.                 while(1){
  804.                          LcdGotoXY(1,7);                                                                                // 光眮Eㄎ?
  805.                         LcdPrintNum(wDu);                                                        // 顯示窗簾的光線控制強度閾值
  806.                         if(KeyDown_P==0)                                                        // 如果減按紒E幌氯?
  807.                         {
  808.                                 if(wDu>0)                                                                // 判斷光線閾值是否大于0
  809.                                         wDu--;                                                                        // 是的話就減去1
  810.                                 DelayMs(300);                                                                // 延時0.3脕E笥?
  811.                         }
  812.                        
  813.                         if(KeyUp_P==0)                                                                // 如果加按紒E幌氯?
  814.                         {
  815.                                 if(wDu<99)                                                                // 判斷光線閾值是否小于59
  816.                                         wDu++;                                                                        // 是的話就加上1
  817.                                 DelayMs(300);                                                                // 延時0.3脕E笥?
  818.                         }
  819.                         if(KeySet2_P==0)
  820.                         {
  821.                                 break;
  822.                         }
  823.                 }

  824.                
  825.                 /* 退出前的設置 */
  826.                 LcdShowInit();                                        // 液晶顯示內容初始化
  827.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  828.                 while(!KeySet2_P);                        // 等待按鍵釋放
  829.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  830.         }
  831. }


  832. /*********************************************************/
  833. // 按鍵掃描(模式切換)
  834. /*********************************************************/
  835. void KeyScanf3()
  836. {
  837.         if(KeyMode_P==0)
  838.         {
  839.                 gMode++;                                                        // 切換到下一模式
  840.                 if(gMode==5)                                        // 如果到盡頭了
  841.                         gMode=1;                                                // 回到第一種模式
  842.                 LcdGotoXY(1,0);                                // 光標定位
  843.                 LcdPrintMode(gMode);        // 顯示模式
  844.                 DelayMs(10);                                        // 去除按鍵按下的抖動
  845.                 while(!KeyMode_P);                // 等待按鍵是否
  846.                 DelayMs(10);                                        // 去除按鍵松開的抖動
  847.         }
  848. }


  849. /*********************************************************/
  850. // 開窗
  851. /*********************************************************/
  852. void Open()
  853. {
  854.         uint i,j;
  855.         for(j=0;j<255;j++)                // 控制步進電機正轉
  856.         {
  857.                 for(i=0;i<4;i++)
  858.                 {
  859.                         P2=Clock[i];
  860.                         DelayMs(3);
  861.                 }
  862.         }
  863.         Led_P=0;
  864. }



  865. /*********************************************************/
  866. // 關窗
  867. /*********************************************************/
  868. void Close()
  869. {
  870.         uint i,j;
  871.         for(j=0;j<255;j++)                // 控制步進電機反轉
  872.         {
  873.                 for(i=0;i<4;i++)
  874.                 {
  875.                         P2=AntiClock[i];
  876.                         DelayMs(3);
  877.                 }
  878.         }
  879.         Led_P=1;
  880. }



  881. /*********************************************************/
  882. // 主函數
  883. /*********************************************************/
  884. void main()
  885. {
  886.         uchar light;
  887.        
  888.         LcdInit();                        // 執行液晶初始化       
  889.         DS1302_Init();        // 時鐘芯片的初始化
  890.         LcdShowInit();        // 液晶顯示內容的初始化
  891.         if(DS1302_Read_Byte(0x81)>=128)                        // 判斷時鐘芯片是否正在運行
  892.         {
  893.                 DS1302_Write_Time();                                                        // 如果沒有,則初始化一個時間
  894.         }
  895.        
  896.         while(1)
  897.         {
  898.                 tempchange();
  899.                 t=get_temp();
  900.                 if(t>=0&&t<=1250)  //溫度合法范圍,不在這個范圍就是沒有獲取到合適的值
  901.                 {
  902.                         wd=t/10;
  903.                 }
  904.                        
  905. //                if(yudi==0 && gMode > 1){  //檢測到有雨,并且不在手動模式(雨天想開窗必須是手動模式下才能開)
  906. //                        delay(5);
  907. //                        if(yudi==0){
  908. //                           gMode=5;//立即切換到手動模式,防止雨停自動開啟窗簾
  909. //                           LcdGotoXY(1,0);                                // 光標定位
  910. //                                LcdPrintMode(gMode);        // 顯示模式
  911. //                                DelayMs(10);                                        // 去除按鍵按下的抖動
  912. //                                 if(Led_P==0)                        // 如果窗簾當前是打開的
  913. //                                {
  914. //                                        Close();                                // 則關閉窗簾
  915. //                                }
  916. //                        }
  917. //                }

  918.                 DS1302_Read_Time();                                // 獲取當前時鐘芯片的時間,存在數組time_buf中
  919.                 FlashTime();                                                        // 刷新時間顯示

  920.                 light=Get_ADC0832(1);                        // 讀取光照強度
  921.                 //light=light/2;                                        // 縮小光照檢測結果(在0-99)
  922.                 LcdGotoXY(1,13);                                        // 光標定位
  923.           LcdPrintNum2(light);
  924. ……………………

  925. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有程序51hei提供下載:
窗簾程序.rar (71.3 KB, 下載次數: 60)
電路原理圖.pdf (65.8 KB, 下載次數: 57)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:28992 發表于 2021-6-14 06:39 | 只看該作者
very good job, thank u sir!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆精品国产免费 | 天堂中文在线观看 | 亚洲精品视频在线 | 亚州精品天堂中文字幕 | 亚洲精品电影网在线观看 | 韩日一区二区三区 | 亚洲视频中文字幕 | 天堂中文在线播放 | 国产粉嫩尤物极品99综合精品 | 欧美mv日韩mv国产网站91进入 | 亚洲精品久久久一区二区三区 | 91精品国产一区二区三区动漫 | 91正在播放| 一区二区三区回区在观看免费视频 | 久久国产香蕉 | 成人午夜免费视频 | 成人精品视频在线观看 | 亚洲综合小视频 | 日韩精品免费在线 | 久久精品欧美一区二区三区不卡 | 久久久www成人免费精品 | 久久国产精品一区二区三区 | 黄色大片在线播放 | 69亚洲精品 | 免费黄色片视频 | 久久久久久91香蕉国产 | 久久久精品一区 | 激情欧美一区二区三区 | 91视视频在线观看入口直接观看 | 毛片高清 | 欧美精品一区二区在线观看 | 日韩国产欧美视频 | 一二三区在线 | 欧美日韩高清一区 | 日韩国产精品一区二区三区 | 国产成人免费在线 | 日韩成人av在线 | 精品成人在线观看 | 深夜福利亚洲 | 久久天天躁狠狠躁夜夜躁2014 | 特级a欧美做爰片毛片 |