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

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

QQ登錄

只需一步,快速開始

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

單片機(jī)程序 固定的時(shí)間內(nèi)溫度控制窗簾開關(guān) 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:630692 發(fā)表于 2019-10-26 22:12 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
每天在一定時(shí)候打開窗戶,關(guān)上窗戶,然后在這個(gè)時(shí)間內(nèi)溫度控制窗簾關(guān)和開,用51單片機(jī)


這個(gè)用不了

  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;                                // 時(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. sbit ds=P3^1;
  21. bit closeflag,openflag;
  22. uchar gMode=1;                                                                // 1是手動(dòng)模式,2是時(shí)間自動(dòng)模式,3是亮度自動(dòng)模式
  23. uchar gLight      = 40;                                // 窗簾開關(guān)的閾值
  24. uchar wDu=35;
  25. uint wd=13,t;
  26. uchar xsflag;

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

  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. // 毫秒級(jí)的延時(shí)函數(shù),time是要延時(shí)的毫秒數(shù)
  39. /*********************************************************/
  40. void DelayMs(uint time)
  41. {
  42.         uint i,j;
  43.         for(i=0;i<time;i++)
  44.                 for(j=0;j<112;j++);
  45. }
  46. void delay(uint z)                                                  //延時(shí)函數(shù)
  47. {
  48.         uint x,y;
  49.         for(x=z;x>0;x--)
  50.                 for(y=110;y>0;y--);
  51. }

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


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


  80. /*********************************************************/
  81. // 1602液晶初始化函數(shù)
  82. /*********************************************************/
  83. void LcdInit()
  84. {
  85.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
  86.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標(biāo)
  87.         LcdWriteCmd(0x06);        // 地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
  88.         LcdWriteCmd(0x01);        // 清屏
  89. }


  90. /*********************************************************/
  91. // 液晶光標(biāo)定位函數(shù)
  92. /*********************************************************/
  93. void LcdGotoXY(uchar line,uchar column)
  94. {
  95.         // 第一行
  96.         if(line==0)        
  97.                 LcdWriteCmd(0x80+column);
  98.         // 第二行
  99.         if(line==1)        
  100.                 LcdWriteCmd(0x80+0x40+column);
  101. }


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


  110. /*********************************************************/
  111. // 液晶輸出數(shù)字(0-99)
  112. /*********************************************************/
  113. void LcdPrintNum(uchar num)
  114. {
  115.         LcdWriteData(num/10+48);                // 十位
  116.         LcdWriteData(num%10+48);                 // 個(gè)位
  117. }


  118. /*********************************************************/
  119. // 顯示模式
  120. /*********************************************************/
  121. void LcdPrintMode(uchar num)
  122. {
  123.         switch(num)                        
  124.         {
  125.                 case 1: LcdPrintStr("Manual");        break;
  126.         /*        case 2: LcdPrintStr("Timing");        break;*/
  127.                 case 2: LcdPrintStr("Liging");        break;
  128.                 case 3: LcdPrintStr(" Wendu");        break;
  129.                 default:                                                                                                break;
  130.         }
  131. }


  132. /*********************************************************/
  133. // 液晶顯示內(nèi)容的初始化
  134. /*********************************************************/
  135. void LcdShowInit()
  136. {
  137.         LcdGotoXY(0,0);
  138.         LcdPrintStr("20du   -     :  ");
  139.         LcdGotoXY(1,0);
  140.         LcdPrintStr("           gz:  ");
  141.         LcdGotoXY(1,0);
  142.         LcdPrintMode(gMode);
  143. }



  144. /*********************************************************/
  145. // 刷新時(shí)間顯示
  146. /*********************************************************/
  147. void FlashTime()
  148. {
  149.         LcdGotoXY(0,0);                                                                                // 年份
  150.         LcdPrintNum(wd);
  151.         LcdGotoXY(0,5);                                                                                // 月份
  152.         LcdPrintNum(TimeBuff[1]);
  153.         LcdGotoXY(0,8);                                                                                // 日期
  154.         LcdPrintNum(TimeBuff[2]);
  155.         LcdGotoXY(0,11);                                                                        // 小時(shí)
  156.         LcdPrintNum(TimeBuff[4]);
  157.         LcdGotoXY(0,14);                                                                        // 分鐘
  158.         LcdPrintNum(TimeBuff[5]);
  159.         LcdGotoXY(0,13);                                                                        // 秒鐘
  160.         if(TimeBuff[6]%2==0)                                                        // 秒鐘是偶數(shù)顯示冒號(hào)
  161.                 LcdWriteData(':');
  162.         else                                                                                                                        // 秒鐘是奇數(shù)顯示空格
  163.                 LcdWriteData(' ');
  164. }


  165. /*********************************************************/
  166. // 初始化DS1302
  167. /*********************************************************/
  168. void DS1302_Init(void)
  169. {
  170.         RST_P=0;                        // RST腳置低
  171.         SCK_P=0;                        // SCK腳置低
  172.         SDA_P=0;                        // SDA腳置低                                
  173. }


  174. /*********************************************************/
  175. // 從DS1302讀出一字節(jié)數(shù)據(jù)
  176. /*********************************************************/
  177. uchar DS1302_Read_Byte(uchar addr)
  178. {
  179.         uchar i;
  180.         uchar temp;

  181.         RST_P=1;                                                               

  182.         /* 寫入目標(biāo)地址:addr*/
  183.         for(i=0;i<8;i++)
  184.         {     
  185.                 if(addr&0x01)
  186.                         SDA_P=1;
  187.                 else
  188.                         SDA_P=0;
  189.                 _nop_();

  190.                 addr=addr>> 1;
  191.         }

  192.         /* 讀出該地址的數(shù)據(jù) */
  193.         for(i=0;i<8;i++)
  194.         {
  195.                 temp=temp>>1;

  196.                 if(SDA_P)
  197.                         temp|= 0x80;
  198.                 else
  199.                         temp&=0x7F;

  200.                 SCK_P=1;
  201.                 _nop_();
  202.                 SCK_P=0;
  203.                 _nop_();
  204.         }

  205.         RST_P=0;

  206.         return temp;
  207. }


  208. /*********************************************************/
  209. // 向DS1302寫入一字節(jié)數(shù)據(jù)
  210. /*********************************************************/
  211. void DS1302_Write_Byte(uchar addr, uchar dat)
  212. {
  213.         uchar i;

  214.         RST_P = 1;

  215.         /* 寫入目標(biāo)地址:addr*/
  216.         for(i=0;i<8;i++)
  217.         {
  218.                 if(addr&0x01)
  219.                         SDA_P=1;
  220.                 else
  221.                         SDA_P=0;

  222.                 SCK_P=1;
  223.                 _nop_();
  224.                 SCK_P=0;
  225.                 _nop_();

  226.                 addr=addr>>1;
  227.         }

  228.         /* 寫入數(shù)據(jù):dat*/
  229.         for(i=0;i<8;i++)
  230.         {
  231.                 if(dat&0x01)
  232.                         SDA_P=1;
  233.                 else
  234.                         SDA_P=0;

  235.                 SCK_P=1;
  236.                 _nop_();
  237.                 SCK_P=0;
  238.                 _nop_();

  239.                 dat=dat>>1;
  240.         }

  241.         RST_P=0;                                       
  242. }


  243. /*********************************************************/
  244. // 向DS1302寫入時(shí)間數(shù)據(jù)
  245. /*********************************************************/
  246. void DS1302_Write_Time()
  247. {
  248.   uchar i;
  249.         uchar temp1;
  250.         uchar temp2;

  251.         for(i=0;i<7;i++)                        // 十進(jìn)制轉(zhuǎn)BCD碼
  252.         {
  253.                 temp1=(TimeBuff[i]/10)<<4;
  254.                 temp2=TimeBuff[i]%10;
  255.                 TimeBuff[i]=temp1+temp2;
  256.         }

  257.         DS1302_Write_Byte(0x8E,0x00);                                                                // 關(guān)閉寫保護(hù)
  258.         DS1302_Write_Byte(0x80,0x80);                                                                // 暫停時(shí)鐘
  259.         DS1302_Write_Byte(0x8C,TimeBuff[0]);                                // 年
  260.         DS1302_Write_Byte(0x88,TimeBuff[1]);                                // 月
  261.         DS1302_Write_Byte(0x86,TimeBuff[2]);                                // 日
  262.         DS1302_Write_Byte(0x8A,TimeBuff[3]);                                // 星期
  263.         DS1302_Write_Byte(0x84,TimeBuff[4]);                                // 時(shí)
  264.         DS1302_Write_Byte(0x82,TimeBuff[5]);                                // 分
  265.         DS1302_Write_Byte(0x80,TimeBuff[6]);                                // 秒
  266.         DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F);                // 運(yùn)行時(shí)鐘
  267.         DS1302_Write_Byte(0x8E,0x80);                                                                // 打開寫保護(hù)  
  268. }



  269. /*********************************************************/
  270. // 從DS1302讀出時(shí)間數(shù)據(jù)
  271. /*********************************************************/
  272. void DS1302_Read_Time()  
  273. {
  274.         uchar i;

  275.         TimeBuff[0]=DS1302_Read_Byte(0x8D);                                                // 年
  276.         TimeBuff[1]=DS1302_Read_Byte(0x89);                                                // 月
  277.         TimeBuff[2]=DS1302_Read_Byte(0x87);                                                // 日
  278.         TimeBuff[3]=DS1302_Read_Byte(0x8B);                                                // 星期
  279.         TimeBuff[4]=DS1302_Read_Byte(0x85);                                                // 時(shí)
  280.         TimeBuff[5]=DS1302_Read_Byte(0x83);                                                // 分
  281.         TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F;                // 秒

  282.         for(i=0;i<7;i++)                // BCD轉(zhuǎn)十進(jìn)制
  283.         {           
  284.                 TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
  285.         }
  286. }


  287. /*********************************************************/
  288. // ADC0832的時(shí)鐘脈沖
  289. /*********************************************************/
  290. void WavePlus()
  291. {
  292.         _nop_();
  293.         ADC_CLK = 1;
  294.         _nop_();
  295.         ADC_CLK = 0;
  296. }


  297. /*********************************************************/
  298. // 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
  299. /*********************************************************/
  300. uchar Get_ADC0832()
  301. {
  302.         uchar i;
  303.         uchar dat1=0;
  304.         uchar dat2=0;

  305.         ADC_CLK = 0;                                // 電平初始化
  306.         ADC_DAT = 1;
  307.         _nop_();
  308.         ADC_CS = 0;
  309.         WavePlus();                                        // 起始信號(hào)
  310.         ADC_DAT = 1;
  311.         WavePlus();                                        // 通道選擇的第一位
  312.         ADC_DAT = 0;      
  313.         WavePlus();                                        // 通道選擇的第二位
  314.         ADC_DAT = 1;

  315.         for(i=0;i<8;i++)                // 第一次讀取
  316.         {
  317.                 dat1<<=1;
  318.                 WavePlus();
  319.                 if(ADC_DAT)
  320.                         dat1=dat1|0x01;
  321.                 else
  322.                         dat1=dat1|0x00;
  323.         }

  324.         for(i=0;i<8;i++)                // 第二次讀取
  325.         {
  326.                 dat2>>= 1;
  327.                 if(ADC_DAT)
  328.                         dat2=dat2|0x80;
  329.                 else
  330.                         dat2=dat2|0x00;
  331.                 WavePlus();
  332.         }

  333.         _nop_();                                                // 結(jié)束此次傳輸
  334.         ADC_CS  = 1;   

  335.         if(dat1==dat2)                        // 返回采集結(jié)果
  336.                 return dat1;
  337.         else
  338.                 return 0;
  339. }


  340. /*********************************************************/
  341. // 按鍵掃描(設(shè)置當(dāng)前時(shí)間)
  342. /*********************************************************/
  343. void KeyScanf1()
  344. {
  345.         if(KeySet_P==0)
  346.         {
  347.                 LcdGotoXY(0,13);                                // 顯示秒鐘的冒號(hào)
  348.                 LcdWriteData(':');
  349.                 LcdWriteCmd(0x0f);                        // 啟動(dòng)光標(biāo)閃爍
  350.                 LcdGotoXY(0,6);                                        // 定位光標(biāo)到年份閃爍
  351.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  352.                 while(!KeySet_P);                                // 等待按鍵釋放
  353.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)

  354. //                 /* 調(diào)整年份 */
  355. //                 while(1)
  356. //                 {
  357. //                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  358. //                         {
  359. //                                 if(TimeBuff[0]>0)                                                // 判斷年份是否大于0               
  360. //                                         TimeBuff[0]--;                                                // 是的話就減去1
  361. //                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  362. //                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  363. //                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  364. //                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  365. //                         }
  366. //                        
  367. //                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  368. //                         {
  369. //                                 if(TimeBuff[0]<99)                                        // 判斷年份是否小于99
  370. //                                         TimeBuff[0]++;                                                // 是的話就加上1
  371. //                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  372. //                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  373. //                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  374. //                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  375. //                         }
  376. //                        
  377. //                         if(KeySet_P==0)
  378. //                         {
  379. //                                 break;
  380. //                         }
  381. //                 }

  382.                 LcdGotoXY(0,6);                                        // 定位光標(biāo)到月份閃爍
  383.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  384.                 while(!KeySet_P);                                // 等待按鍵釋放
  385.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)

  386.                 /* 調(diào)整月份 */
  387.                 while(1)
  388.                 {
  389.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  390.                         {
  391.                                 if(TimeBuff[1]>1)                                                // 判斷月份是否大于1               
  392.                                         TimeBuff[1]--;                                                // 是的話就減去1
  393.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  394.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  395.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  396.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  397.                         }

  398.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  399.                         {
  400.                                 if(TimeBuff[1]<12)                                        // 判斷月份是否小于12
  401.                                         TimeBuff[1]++;                                                // 是的話就加上1
  402.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  403.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  404.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  405.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  406.                         }

  407.                         if(KeySet_P==0)
  408.                         {
  409.                                 break;
  410.                         }
  411.                 }

  412.                 LcdGotoXY(0,9);                                        // 定位光標(biāo)到日期閃爍
  413.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  414.                 while(!KeySet_P);                                // 等待按鍵釋放
  415.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)

  416.                 /* 調(diào)整日期 */
  417.                 while(1)
  418.                 {
  419.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  420.                         {
  421.                                 if(TimeBuff[2]>1)                                                // 判斷日期是否大于1               
  422.                                         TimeBuff[2]--;                                                // 是的話就減去1
  423.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  424.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  425.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  426.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  427.                         }

  428.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  429.                         {
  430.                                 if(TimeBuff[2]<31)                                        // 判斷日期是否小于31
  431.                                         TimeBuff[2]++;                                                // 是的話就加上1
  432.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  433.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  434.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  435.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  436.                         }

  437.                         if(KeySet_P==0)
  438.                         {
  439.                                 break;
  440.                         }
  441.                 }

  442.                 LcdGotoXY(0,12);                                // 定位光標(biāo)到小時(shí)閃爍
  443.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  444.                 while(!KeySet_P);                                // 等待按鍵釋放
  445.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)


  446.                 /* 調(diào)整小時(shí) */
  447.                 while(1)
  448.                 {
  449.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  450.                         {
  451.                                 if(TimeBuff[4]>0)                                                // 判斷小時(shí)是否大于0
  452.                                         TimeBuff[4]--;                                                // 是的話就減去1
  453.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時(shí)的位置
  454.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時(shí)
  455.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時(shí)閃爍
  456.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  457.                         }

  458.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  459.                         {
  460.                                 if(TimeBuff[4]<23)                                        // 判斷小時(shí)是否小于23
  461.                                         TimeBuff[4]++;                                                // 是的話就加上1
  462.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時(shí)的位置
  463.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時(shí)
  464.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時(shí)閃爍
  465.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  466.                         }

  467.                         if(KeySet_P==0)
  468.                         {
  469.                                 break;
  470.                         }
  471.                 }

  472.                 LcdGotoXY(0,15);                                // 定位光標(biāo)到分鐘閃爍
  473.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  474.                 while(!KeySet_P);                                // 等待按鍵釋放
  475.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)

  476.                 /* 調(diào)整分鐘 */
  477.                 while(1)
  478.                 {
  479.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  480.                         {
  481.                                 if(TimeBuff[5]>0)                                                // 判斷分鐘是否大于0
  482.                                         TimeBuff[5]--;                                                // 是的話就減去1
  483.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  484.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  485.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  486.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  487.                         }

  488.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  489.                         {
  490.                                 if(TimeBuff[5]<59)                                        // 判斷分鐘是否小于59
  491.                                         TimeBuff[5]++;                                                // 是的話就加上1
  492.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  493.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  494.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  495.                                 DelayMs(300);                                                                // 延時(shí)0.3秒左右
  496.                         }

  497.                         if(KeySet_P==0)
  498.                         {
  499.                                 break;
  500.                         }
  501.                 }

  502.                 /* 退出前的設(shè)置 */
  503.                 LcdWriteCmd(0x0C);                        // 關(guān)閉光標(biāo)閃爍
  504.                 DS1302_Write_Time();                // 把新設(shè)置的時(shí)間值存入DS1302芯片
  505.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵按下的抖動(dòng)
  506.                 while(!KeySet_P);                                // 等待按鍵釋放
  507.                 DelayMs(10);                                                // 延時(shí)等待,消除按鍵松開的抖動(dòng)
  508.         }
  509. }
  510. uint temp,mm;uchar i;float f_temp;
  511. /*******************************************************
  512. 溫度函數(shù)
  513. *******************************************************/
  514. void dsreset(void)                                           //下邊是溫度獲取子程衼E
  515. {
  516.         uint i;
  517.         ds=0;
  518.         i=103;
  519.         while(i>0)i--;
  520.         ds=1;
  521.         i=4;
  522.         while(i>0)i--;
  523. }
  524. bit tempreadbit(void)                                   //讀一位
  525. {
  526.         uint i;
  527.         bit dat;
  528.         ds=0;i++;
  529.         ds=1;i++;i++;
  530.         dat=ds;
  531.         i=8;while(i>0)i--;
  532.         return(dat);
  533. }
  534. uchar tempread(void)                                         //獲取溫度
  535. {
  536.         uchar i,j,dat;
  537.         dat=0;
  538.         for(i=1;i<=8;i++)
  539.         {
  540.                 j=tempreadbit();
  541.                 dat=(j<<7)|(dat>>1);
  542.         }
  543.         return(dat);
  544. }
  545. void tempwritebyte(uchar dat)                           //寫一個(gè)字節(jié)
  546. {
  547.         uint i;
  548.         uchar j;
  549.         bit testb;
  550.         for(j=1;j<=8;j++)
  551.         {
  552.                 testb=dat&0x01;
  553.                 dat=dat>>1;
  554.                 if(testb)
  555.                 {
  556.                         ds=0;
  557.                         i++;i++;
  558.                         ds=1;
  559.                         i=8;while(i>0)i--;
  560.                 }
  561.                 else
  562.                 {
  563.                         ds=0;
  564.                         i=8;while(i>0)i--;
  565.                         ds=1;
  566.                         i++;i++;
  567.                 }
  568.         }
  569. }
  570. void tempchange(void)                                           //溫度轉(zhuǎn)換
  571. {
  572.         dsreset();
  573.         delay(1);
  574.         tempwritebyte(0xcc);
  575.         tempwritebyte(0x44);
  576. }
  577. uint get_temp()                                                        //獲取溫度
  578. {
  579.         uchar a,b;
  580.         dsreset();
  581.         delay(1);
  582.         tempwritebyte(0xcc);
  583.         tempwritebyte(0xbe);
  584.         a=tempread();
  585.         b=tempread();
  586.         temp=b;
  587.         temp<<=8;
  588.         temp=temp|a;
  589.         f_temp=temp*0.0625;
  590.         temp=f_temp*10+0.5;
  591.         f_temp=f_temp+0.05;
  592.         return temp;
  593. }
  594. /***********************************/

  595. /*********************************************************/
  596. // 按鍵掃描(設(shè)置窗簾的動(dòng)作)
  597. /*********************************************************/
  598. void KeyScanf2()
  599. {
  600.         if(KeySet2_P==0)
  601.         {
  602.                 xsflag++;
  603.                 if(xsflag>=2)
  604.                         xsflag=0;
  605.                 while(!KeySet2_P);
  606.         }
  607.         if(xsflag==1)
  608.         {
  609.                 //                 /* 光照強(qiáng)度的設(shè)置 */
  610.                 LcdWriteCmd(0x0C);                                                                // 關(guān)閉光眮E了?
  611.                 LcdGotoXY(0,0);                                                                                // 光眮Eㄎ?
  612.                 LcdPrintStr("   Light Set    ");        // 顯示第1行內(nèi)容
  613.                 LcdGotoXY(1,0);                                                                                // 光眮Eㄎ?
  614.                 LcdPrintStr("                ");        // 顯示第2行內(nèi)容
  615.                 LcdGotoXY(1,7);                                                                                // 光眮Eㄎ?
  616.                 LcdPrintNum(gLight);                                                        // 顯示窗簾的光線控制強(qiáng)度閾值

  617.                 while(1)
  618.                 {
  619.                         if(KeySet2_P==0)
  620.                         {
  621.                                 xsflag++;
  622.                                 if(xsflag>=3)
  623.                                         xsflag=0;
  624.                                 while(!KeySet2_P);
  625.                         }
  626.                         if(xsflag==1)
  627.                         {
  628.                                 if(KeyDown_P==0)                                                        // 如果減按紒E幌氯?
  629.                                 {
  630.                                         if(gLight>0)                                                                // 判斷光線閾值是否大于0
  631.                                                 gLight--;                                                                        // 是的話就減去1
  632.                                         LcdGotoXY(1,7);                                                        // 光眮Eㄎ?
  633.                                         LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  634.                                         DelayMs(300);                                                                // 延時(shí)0.3脕E笥?
  635.                                 }

  636.                                 if(KeyUp_P==0)                                                                // 如果加按紒E幌氯?
  637.                                 {
  638.                                         if(gLight<99)                                                                // 判斷光線閾值是否小于59
  639.                                                 gLight++;                                                                        // 是的話就加上1
  640.                                         LcdGotoXY(1,7);                                                        // 光眮Eㄎ?
  641.                                         LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  642.                                         DelayMs(300);                                                                // 延時(shí)0.3脕E笥?
  643.                                 }
  644.                         }
  645.                         if(xsflag==2)
  646.                         {
  647.                                 //                 設(shè)置溫度
  648.                                 LcdWriteCmd(0x0C);                                                                // 關(guān)閉光眮E了?
  649.                                 LcdGotoXY(0,0);                                                                                // 光眮Eㄎ?
  650.                                 LcdPrintStr("   Wendu Set    ");        // 顯示第1行內(nèi)容
  651.                                 LcdGotoXY(1,0);                                                                                // 光眮Eㄎ?
  652.                                 LcdPrintStr("                ");        // 顯示第2行內(nèi)容
  653.                                 LcdGotoXY(1,7);                                                                                // 光眮Eㄎ?
  654.                                 LcdPrintNum(wDu);                                                        // 顯示窗簾的光線控制強(qiáng)度閾值        
  655.                                 while(!KeySet2_P);
  656.                                 while(1)
  657.                                 {
  658.                                         LcdGotoXY(1,7);                                                                                // 光眮Eㄎ?
  659.                                         LcdPrintNum(wDu);                                                        // 顯示窗簾的光線控制強(qiáng)度閾值
  660.                                         if(KeyDown_P==0)                                                        // 如果減按紒E幌氯?
  661.                                         {
  662.                                                 if(wDu>0)                                                                // 判斷光線閾值是否大于0
  663.                                                         wDu--;                                                                        // 是的話就減去1
  664.                                                 DelayMs(300);                                                                // 延時(shí)0.3脕E笥?
  665.                                         }

  666.                                         if(KeyUp_P==0)                                                                // 如果加按紒E幌氯?
  667.                                         {
  668.                                                 if(wDu<99)                                                                // 判斷光線閾值是否小于59
  669.                                                         wDu++;                                                                        // 是的話就加上1
  670.                                                 DelayMs(300);                                                                // 延時(shí)0.3脕E笥?
  671.                                         }
  672.                                         if(KeySet2_P==0)
  673.                                         {
  674.                                                 break;
  675.                                         }
  676.                                 }
  677.                         }
  678.                         if(xsflag==0)
  679.                         {
  680.                                 break;
  681.                         }
  682.                 }
  683.                         //                 /* 退出前的設(shè)置 */
  684.                 LcdShowInit();                                        // 液晶顯示內(nèi)容初始化
  685.                 DelayMs(10);                                                // 延時(shí)等待,消除按紒E聰碌畝抖?
  686.                 while(!KeySet2_P);                        // 等待按紒E頭?
  687.                 DelayMs(10);
  688.         }
  689. }


  690. /*********************************************************/
  691. // 按鍵掃描(模式切換)
  692. /*********************************************************/
  693. void KeyScanf3()
  694. {
  695.         if(KeyMode_P==0)
  696.         {
  697.                 DelayMs(10);
  698.                 if(KeyMode_P==0)
  699.                 {
  700.                 gMode++;                                                        // 切換到下一模式
  701.                 if(gMode==4)                                        // 如果到盡頭了
  702.                         gMode=1;                                                // 回到第一種模式
  703.                 LcdGotoXY(1,0);                                // 光標(biāo)定位
  704.                 LcdPrintMode(gMode);        // 顯示模式

  705.                 while(!KeyMode_P);                // 等待按鍵是否
  706.                 }
  707.         }
  708. }


  709. /*********************************************************/
  710. // 開窗
  711. /*********************************************************/
  712. void Open()
  713. {
  714.         uint i,j;
  715.         for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)正轉(zhuǎn)
  716.         {
  717.                 for(i=0;i<4;i++)
  718.                 {
  719.                         P2=Clock[i];
  720.                         DelayMs(3);
  721.                 }
  722.         }
  723.         Led_P=0;
  724. }



  725. /*********************************************************/
  726. // 關(guān)窗
  727. /*********************************************************/
  728. void Close()
  729. {
  730.         uint i,j;
  731.         for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)反轉(zhuǎn)
  732.         {
  733.                 for(i=0;i<4;i++)
  734.                 {
  735.                         P2=AntiClock[i];
  736.                         DelayMs(3);
  737.                 }
  738.         }
  739.         Led_P=1;
  740. }



  741. /*********************************************************/
  742. // 主函數(shù)
  743. /*********************************************************/
  744. void main()
  745. {
  746.         uchar light;

  747.         LcdInit();                        // 執(zhí)行液晶初始化        
  748.         DS1302_Init();        // 時(shí)鐘芯片的初始化
  749.         LcdShowInit();        // 液晶顯示內(nèi)容的初始化
  750.         if(DS1302_Read_Byte(0x81)>=128)                        // 判斷時(shí)鐘芯片是否正在運(yùn)行
  751.         {
  752.                 DS1302_Write_Time();                                                        // 如果沒有,則初始化一個(gè)時(shí)間
  753.         }
  754.         while(1)
  755.         {
  756.                 tempchange();
  757.                 t=get_temp();
  758.                 if(t>=0&&t<=1250)  //溫度合法范圍,不在這個(gè)范圍就是沒有獲取到合適的值
  759.                 {
  760.                         wd=t/10;
  761.                 }
  762.                 DS1302_Read_Time();                                // 獲取當(dāng)前時(shí)鐘芯片的時(shí)間,存在數(shù)組time_buf中
  763.                 FlashTime();                                                        // 刷新時(shí)間顯示

  764.                 light=Get_ADC0832();                        // 讀取光照強(qiáng)度
  765.                 light=light/2.5;                                        // 縮小光照檢測(cè)結(jié)果(在0-99)
  766.                 if(light>99)                                                        // 如果大于99
  767.                         light=99;                                                                // 則依然保持99
  768.                 LcdGotoXY(1,14);                                        // 光標(biāo)定位
  769.                 LcdPrintNum(light);                                // 顯示光照強(qiáng)度

  770.                 KeyScanf1();                                                        // 按鍵掃描(時(shí)間的設(shè)置)
  771.                 KeyScanf2();                                                        // 按鍵掃描(閾值的設(shè)置)
  772.                 KeyScanf3();                                                        // 按鍵掃描(模式切換)

  773.                 /*手動(dòng)控制模式*/
  774.                 if(gMode==1)
  775.                 {
  776.                         if(closeflag==1)
  777.                         {
  778.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  779.                                 {
  780.                                         closeflag=0;
  781.                                         Close();                                // 則光標(biāo)窗簾
  782.                                 }else
  783.                                 closeflag=0;
  784.                         }
  785.                         if(KeyDown_P==0)                // 如果關(guān)窗簾鍵按下了        
  786.                         {
  787.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  788.                                 {
  789.                                         Close();                                // 則光標(biāo)窗簾
  790.                                 }
  791.                         }
  792.                         if(openflag==1)
  793.                         {
  794.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  795.                                 {
  796.                                         openflag=0;
  797.                                         Open();                                        // 則打開窗簾
  798.                                 }else{
  799.                                         openflag=0;
  800.                                 }

  801.                         }
  802.                         if(KeyUp_P==0)                        // 如果開窗簾鍵按下了
  803.                         {
  804.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  805.                                 {
  806.                                         Open();                                        // 則打開窗簾
  807.                                 }
  808.                         }        
  809.                 }



  810.                 /*光線控制模式*/
  811.                 if(gMode==2)
  812.                 {
  813.                         if(light<gLight)                // 當(dāng)前光線小于設(shè)置的閾值
  814.                         {
  815.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  816.                                 {
  817.                                         Close();                                // 則光標(biāo)窗簾
  818.                                 }
  819.                         }
  820.                         else                                                                // 當(dāng)前光線大于或等于設(shè)置的閾值
  821.                         {
  822.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  823.                                 {
  824.                                         Open();                                        // 則打開窗簾
  825.                                 }
  826.                         }        
  827.                 }

  828.                 if(gMode==3)
  829.                 {
  830.                         if(wd<wDu)                // 當(dāng)前溫度小于設(shè)置的閾值
  831.                         {
  832.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  833.                                 {
  834.                                         Close();                                // 則關(guān)閉窗簾
  835.                                 }
  836.                         }
  837.                         else                                                                // 當(dāng)前溫度大于或等于設(shè)置的閾值
  838.                         {
  839.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  840.                                 {
  841.                                         Open();                                        // 則打開窗簾
  842.                                 }
  843.                         }        
  844.                 }

  845.                 DelayMs(100);                                                        // 延時(shí)0.1秒
  846.         }
  847. }  
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:630692 發(fā)表于 2019-10-31 13:49 | 只看該作者
可以了,只需要把s改成*s就行了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级淫片免费视频黄 | 激情婷婷| 精品国产18久久久久久二百 | 亚洲久久 | jlzzjlzz国产精品久久 | 伊人超碰在线 | 亚洲精品一区二区三区蜜桃久 | 亚洲欧美日韩精品久久亚洲区 | 中文字幕一区在线 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 亚洲精品久久嫩草网站秘色 | 一级做a爰片性色毛片16美国 | 成人激情视频在线 | 亚洲欧美在线视频 | 欧美日韩久久久久 | 国产高清精品一区 | 99久久精品国产一区二区三区 | 丁香久久 | 黄色片在线观看网址 | 黑人粗黑大躁护士 | 国产精品免费大片 | 日韩久久久久久久 | 国产成人久久 | 亚洲国产欧美一区二区三区久久 | 亚洲成人精选 | 在线观看日韩av | 亚洲精品一区在线 | 精品国产乱码久久久久久a丨 | 毛片免费观看视频 | 日韩欧美三级电影 | 午夜在线观看视频 | 在线观看亚 | av免费在线播放 | 日韩不卡视频在线观看 | 国产福利资源在线 | 中文在线日韩 | 国产精品久久在线观看 | 精品久久久久久久久久久久 | 久久777| 欧美一区二区三区在线视频 | 香蕉大人久久国产成人av |