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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)自動窗簾控制程序(兩個電機(jī))Proteus仿真原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:311912 發(fā)表于 2020-12-8 15:23 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
自動窗簾仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


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


  4. void io_inithw(void);
  5. void int_init(void);
  6. void io_inithw(void)
  7. {
  8.         P0=0xff;
  9.         P1=0xff;
  10.         P2=0xff;
  11.         P3=0xff;
  12. }

  13. void int_inithw(void)
  14. {
  15.         EX0=1;
  16.         EA=1;
  17. }
  18. /*********************************************************/
  19. // 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)
  20. /*********************************************************/
  21. void DelayMs(uint time)
  22. {
  23.         uint i,j;
  24.         for(i=0;i<time;i++)
  25.                 for(j=0;j<112;j++);
  26. }


  27. /*********************************************************/
  28. // 1602液晶寫命令函數(shù),cmd就是要寫入的命令
  29. /*********************************************************/
  30. void LcdWriteCmd(uchar cmd)
  31. {
  32.         LcdRs_P = 0;
  33.         LcdRw_P = 0;
  34.         LcdEn_P = 0;
  35.         P0=cmd;
  36.         DelayMs(2);
  37.         LcdEn_P = 1;   
  38.         DelayMs(2);
  39.         LcdEn_P = 0;        
  40. }


  41. /*********************************************************/
  42. // 1602液晶寫數(shù)據(jù)函數(shù),dat就是要寫入的數(shù)據(jù)
  43. /*********************************************************/
  44. void LcdWriteData(uchar dat)
  45. {
  46.         LcdRs_P = 1;
  47.         LcdRw_P = 0;
  48.         LcdEn_P = 0;
  49.         P0=dat;
  50.         DelayMs(2);
  51.         LcdEn_P = 1;   
  52.         DelayMs(2);
  53.         LcdEn_P = 0;
  54. }


  55. /*********************************************************/
  56. // 1602液晶初始化函數(shù)
  57. /*********************************************************/
  58. void LcdInit()
  59. {
  60.         LcdWriteCmd(0x38);        // 16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
  61.         LcdWriteCmd(0x0C);        // 開顯示,不顯示光標(biāo)
  62.         LcdWriteCmd(0x06);        // 地址加1,當(dāng)寫入數(shù)據(jù)后光標(biāo)右移
  63.         LcdWriteCmd(0x01);        // 清屏
  64. }


  65. /*********************************************************/
  66. // 液晶光標(biāo)定位函數(shù)
  67. /*********************************************************/
  68. void LcdGotoXY(uchar line,uchar column)
  69. {
  70.         // 第一行
  71.         if(line==0)        
  72.                 LcdWriteCmd(0x80+column);
  73.         // 第二行
  74.         if(line==1)        
  75.                 LcdWriteCmd(0x80+0x40+column);
  76. }


  77. /*********************************************************/
  78. // 液晶輸出字符串函數(shù)
  79. /*********************************************************/
  80. void LcdPrintStr(uchar *str)
  81. {
  82.         while(*str!='\0')
  83.                         LcdWriteData(*str++);
  84. }


  85. /*********************************************************/
  86. // 液晶輸出數(shù)字(0-99)
  87. /*********************************************************/
  88. void LcdPrintNum(uchar num)
  89. {
  90.         LcdWriteData(num/10+48);                // 十位
  91.         LcdWriteData(num%10+48);                 // 個位
  92. }


  93. /*********************************************************/
  94. // 顯示模式
  95. /*********************************************************/
  96. void LcdPrintMode(uchar num)
  97. {
  98.         switch(num)                        
  99.         {
  100.                 case 1: LcdPrintStr("Manual");        break;
  101.                 case 2: LcdPrintStr("Timing");        break;
  102.                 case 3: LcdPrintStr("Liging");        break;
  103.                 default:                                                                                                break;
  104.         }
  105. }


  106. /*********************************************************/
  107. // 液晶顯示內(nèi)容的初始化
  108. /*********************************************************/
  109. void LcdShowInit()
  110. {
  111.         LcdGotoXY(0,0);
  112.         LcdPrintStr("20  -  -     :  ");
  113.         LcdGotoXY(1,0);
  114.         LcdPrintStr("           gz:  ");
  115.         LcdGotoXY(1,0);
  116.         LcdPrintMode(gMode);
  117. }



  118. /*********************************************************/
  119. // 刷新時間顯示
  120. /*********************************************************/
  121. void FlashTime()
  122. {
  123.         LcdGotoXY(0,2);                                                                                // 年份
  124.         LcdPrintNum(TimeBuff[0]);
  125.         LcdGotoXY(0,5);                                                                                // 月份
  126.         LcdPrintNum(TimeBuff[1]);
  127.         LcdGotoXY(0,8);                                                                                // 日期
  128.         LcdPrintNum(TimeBuff[2]);
  129.         LcdGotoXY(0,11);                                                                        // 小時
  130.         LcdPrintNum(TimeBuff[4]);
  131.         LcdGotoXY(0,14);                                                                        // 分鐘
  132.         LcdPrintNum(TimeBuff[5]);
  133.         LcdGotoXY(0,13);                                                                        // 秒鐘
  134.         if(TimeBuff[6]%2==0)                                                        // 秒鐘是偶數(shù)顯示冒號
  135.                 LcdWriteData(':');
  136.         else                                                                                                                        // 秒鐘是奇數(shù)顯示空格
  137.                 LcdWriteData(' ');
  138. }


  139. /*********************************************************/
  140. // 初始化DS1302
  141. /*********************************************************/
  142. void DS1302_Init(void)
  143. {
  144.         RST_P=0;                        // RST腳置低
  145.         SCK_P=0;                        // SCK腳置低
  146.         SDA_P=0;                        // SDA腳置低                                
  147. }


  148. /*********************************************************/
  149. // 從DS1302讀出一字節(jié)數(shù)據(jù)
  150. /*********************************************************/
  151. uchar DS1302_Read_Byte(uchar addr)
  152. {
  153.         uchar i;
  154.         uchar temp;
  155.         
  156.         RST_P=1;                                                               
  157.         
  158.         /* 寫入目標(biāo)地址:addr*/
  159.         for(i=0;i<8;i++)
  160.         {     
  161.                 if(addr&0x01)
  162.                         SDA_P=1;
  163.                 else
  164.                         SDA_P=0;
  165.                
  166.                 SCK_P=1;
  167.                 _nop_();
  168.                 SCK_P=0;
  169.                 _nop_();
  170.                
  171.                 addr=addr>> 1;
  172.         }
  173.         
  174.         /* 讀出該地址的數(shù)據(jù) */
  175.         for(i=0;i<8;i++)
  176.         {
  177.                 temp=temp>>1;
  178.                
  179.                 if(SDA_P)
  180.                         temp|= 0x80;
  181.                 else
  182.                         temp&=0x7F;
  183.                
  184.                 SCK_P=1;
  185.                 _nop_();
  186.                 SCK_P=0;
  187.                 _nop_();
  188.         }
  189.         
  190.         RST_P=0;
  191.         
  192.         return temp;
  193. }


  194. /*********************************************************/
  195. // 向DS1302寫入一字節(jié)數(shù)據(jù)
  196. /*********************************************************/
  197. void DS1302_Write_Byte(uchar addr, uchar dat)
  198. {
  199.         uchar i;
  200.         
  201.         RST_P = 1;
  202.         
  203.         /* 寫入目標(biāo)地址:addr*/
  204.         for(i=0;i<8;i++)
  205.         {
  206.                 if(addr&0x01)
  207.                         SDA_P=1;
  208.                 else
  209.                         SDA_P=0;

  210.                 SCK_P=1;
  211.                 _nop_();
  212.                 SCK_P=0;
  213.                 _nop_();
  214.                
  215.                 addr=addr>>1;
  216.         }
  217.         
  218.         /* 寫入數(shù)據(jù):dat*/
  219.         for(i=0;i<8;i++)
  220.         {
  221.                 if(dat&0x01)
  222.                         SDA_P=1;
  223.                 else
  224.                         SDA_P=0;
  225.         
  226.                 SCK_P=1;
  227.                 _nop_();
  228.                 SCK_P=0;
  229.                 _nop_();
  230.                
  231.                 dat=dat>>1;
  232.         }
  233.         
  234.         RST_P=0;                                       
  235. }


  236. /*********************************************************/
  237. // 向DS1302寫入時間數(shù)據(jù)
  238. /*********************************************************/
  239. void DS1302_Write_Time()
  240. {
  241.   uchar i;
  242.         uchar temp1;
  243.         uchar temp2;
  244.         
  245.         for(i=0;i<7;i++)                        // 十進(jìn)制轉(zhuǎn)BCD碼
  246.         {
  247.                 temp1=(TimeBuff[i]/10)<<4;
  248.                 temp2=TimeBuff[i]%10;
  249.                 TimeBuff[i]=temp1+temp2;
  250.         }
  251.         
  252.         DS1302_Write_Byte(0x8E,0x00);                                                                // 關(guān)閉寫保護(hù)
  253.         DS1302_Write_Byte(0x80,0x80);                                                                // 暫停時鐘
  254.         DS1302_Write_Byte(0x8C,TimeBuff[0]);                                // 年
  255.         DS1302_Write_Byte(0x88,TimeBuff[1]);                                // 月
  256.         DS1302_Write_Byte(0x86,TimeBuff[2]);                                // 日
  257.         DS1302_Write_Byte(0x8A,TimeBuff[3]);                                // 星期
  258.         DS1302_Write_Byte(0x84,TimeBuff[4]);                                // 時
  259.         DS1302_Write_Byte(0x82,TimeBuff[5]);                                // 分
  260.         DS1302_Write_Byte(0x80,TimeBuff[6]);                                // 秒
  261.         DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F);                // 運(yùn)行時鐘
  262.         DS1302_Write_Byte(0x8E,0x80);                                                                // 打開寫保護(hù)  
  263. }



  264. /*********************************************************/
  265. // 從DS1302讀出時間數(shù)據(jù)
  266. /*********************************************************/
  267. void DS1302_Read_Time()  
  268. {
  269.         uchar i;

  270.         TimeBuff[0]=DS1302_Read_Byte(0x8D);                                                // 年
  271.         TimeBuff[1]=DS1302_Read_Byte(0x89);                                                // 月
  272.         TimeBuff[2]=DS1302_Read_Byte(0x87);                                                // 日
  273.         TimeBuff[3]=DS1302_Read_Byte(0x8B);                                                // 星期
  274.         TimeBuff[4]=DS1302_Read_Byte(0x85);                                                // 時
  275.         TimeBuff[5]=DS1302_Read_Byte(0x83);                                                // 分
  276.         TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F;                // 秒

  277.         for(i=0;i<7;i++)                // BCD轉(zhuǎn)十進(jìn)制
  278.         {           
  279.                 TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
  280.         }
  281. }


  282. /*********************************************************/
  283. // ADC0832的時鐘脈沖
  284. /*********************************************************/
  285. void WavePlus()
  286. {
  287.         _nop_();
  288.         ADC_CLK = 1;
  289.         _nop_();
  290.         ADC_CLK = 0;
  291. }


  292. /*********************************************************/
  293. // 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
  294. /*********************************************************/
  295. uchar Get_ADC0832()
  296. {
  297.         uchar i;
  298.         uchar dat1=0;
  299.         uchar dat2=0;
  300.         
  301.         ADC_CLK = 0;                                // 電平初始化
  302.         ADC_DAT = 1;
  303.         _nop_();
  304.         ADC_CS = 0;
  305.         WavePlus();                                        // 起始信號
  306.         ADC_DAT = 1;
  307.         WavePlus();                                        // 通道選擇的第一位
  308.         ADC_DAT = 0;      
  309.         WavePlus();                                        // 通道選擇的第二位
  310.         ADC_DAT = 1;
  311.         
  312.         for(i=0;i<8;i++)                // 第一次讀取
  313.         {
  314.                 dat1<<=1;
  315.                 WavePlus();
  316.                 if(ADC_DAT)
  317.                         dat1=dat1|0x01;
  318.                 else
  319.                         dat1=dat1|0x00;
  320.         }
  321.         
  322.         for(i=0;i<8;i++)                // 第二次讀取
  323.         {
  324.                 dat2>>= 1;
  325.                 if(ADC_DAT)
  326.                         dat2=dat2|0x80;
  327.                 else
  328.                         dat2=dat2|0x00;
  329.                 WavePlus();
  330.         }
  331.         
  332.         _nop_();                                                // 結(jié)束此次傳輸
  333.         ADC_DAT = 1;
  334.         ADC_CLK = 1;
  335.         ADC_CS  = 1;   

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


  341. /*********************************************************/
  342. // 按鍵掃描(設(shè)置當(dāng)前時間)
  343. /*********************************************************/
  344. void KeyScanf1()
  345. {
  346.         if(KeySet_P==0)
  347.         {
  348.                 LcdGotoXY(0,13);                                // 顯示秒鐘的冒號
  349.                 LcdWriteData(':');
  350.                 LcdWriteCmd(0x0f);                        // 啟動光標(biāo)閃爍
  351.                 LcdGotoXY(0,3);                                        // 定位光標(biāo)到年份閃爍
  352.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  353.                 while(!KeySet_P);                                // 等待按鍵釋放
  354.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  355.                
  356.                 /* 調(diào)整年份 */
  357.                 while(1)
  358.                 {
  359.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  360.                         {
  361.                                 if(TimeBuff[0]>0)                                                // 判斷年份是否大于0               
  362.                                         TimeBuff[0]--;                                                // 是的話就減去1
  363.                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  364.                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  365.                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  366.                                 DelayMs(300);                                                                // 延時0.3秒左右
  367.                         }
  368.                         
  369.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  370.                         {
  371.                                 if(TimeBuff[0]<99)                                        // 判斷年份是否小于99
  372.                                         TimeBuff[0]++;                                                // 是的話就加上1
  373.                                 LcdGotoXY(0,2);                                                        // 光標(biāo)定位到年份的位置
  374.                                 LcdPrintNum(TimeBuff[0]);                // 刷新顯示改變后的年份
  375.                                 LcdGotoXY(0,3);                                                        // 定位光標(biāo)到年份閃爍
  376.                                 DelayMs(300);                                                                // 延時0.3秒左右
  377.                         }
  378.                         
  379.                         if(KeySet_P==0)
  380.                         {
  381.                                 break;
  382.                         }
  383.                 }
  384.                
  385.                 LcdGotoXY(0,6);                                        // 定位光標(biāo)到月份閃爍
  386.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  387.                 while(!KeySet_P);                                // 等待按鍵釋放
  388.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  389.                         
  390.                 /* 調(diào)整月份 */
  391.                 while(1)
  392.                 {
  393.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  394.                         {
  395.                                 if(TimeBuff[1]>1)                                                // 判斷月份是否大于1               
  396.                                         TimeBuff[1]--;                                                // 是的話就減去1
  397.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  398.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  399.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  400.                                 DelayMs(300);                                                                // 延時0.3秒左右
  401.                         }
  402.                         
  403.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  404.                         {
  405.                                 if(TimeBuff[1]<12)                                        // 判斷月份是否小于12
  406.                                         TimeBuff[1]++;                                                // 是的話就加上1
  407.                                 LcdGotoXY(0,5);                                                        // 光標(biāo)定位到月份的位置
  408.                                 LcdPrintNum(TimeBuff[1]);                // 刷新顯示改變后的月份
  409.                                 LcdGotoXY(0,6);                                                        // 定位光標(biāo)到月份閃爍
  410.                                 DelayMs(300);                                                                // 延時0.3秒左右
  411.                         }
  412.                         
  413.                         if(KeySet_P==0)
  414.                         {
  415.                                 break;
  416.                         }
  417.                 }
  418.                
  419.                 LcdGotoXY(0,9);                                        // 定位光標(biāo)到日期閃爍
  420.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  421.                 while(!KeySet_P);                                // 等待按鍵釋放
  422.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  423.                
  424.                 /* 調(diào)整日期 */
  425.                 while(1)
  426.                 {
  427.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  428.                         {
  429.                                 if(TimeBuff[2]>1)                                                // 判斷日期是否大于1               
  430.                                         TimeBuff[2]--;                                                // 是的話就減去1
  431.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  432.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  433.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  434.                                 DelayMs(300);                                                                // 延時0.3秒左右
  435.                         }
  436.                         
  437.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  438.                         {
  439.                                 if(TimeBuff[2]<31)                                        // 判斷日期是否小于31
  440.                                         TimeBuff[2]++;                                                // 是的話就加上1
  441.                                 LcdGotoXY(0,8);                                                        // 光標(biāo)定位到日期的位置
  442.                                 LcdPrintNum(TimeBuff[2]);                // 刷新顯示改變后的日期
  443.                                 LcdGotoXY(0,9);                                                        // 定位光標(biāo)到日期閃爍
  444.                                 DelayMs(300);                                                                // 延時0.3秒左右
  445.                         }
  446.                         
  447.                         if(KeySet_P==0)
  448.                         {
  449.                                 break;
  450.                         }
  451.                 }
  452.                
  453.                 LcdGotoXY(0,12);                                // 定位光標(biāo)到小時閃爍
  454.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  455.                 while(!KeySet_P);                                // 等待按鍵釋放
  456.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  457.                
  458.                
  459.                 /* 調(diào)整小時 */
  460.                 while(1)
  461.                 {
  462.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  463.                         {
  464.                                 if(TimeBuff[4]>0)                                                // 判斷小時是否大于0
  465.                                         TimeBuff[4]--;                                                // 是的話就減去1
  466.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時的位置
  467.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時
  468.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時閃爍
  469.                                 DelayMs(300);                                                                // 延時0.3秒左右
  470.                         }
  471.                         
  472.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  473.                         {
  474.                                 if(TimeBuff[4]<23)                                        // 判斷小時是否小于23
  475.                                         TimeBuff[4]++;                                                // 是的話就加上1
  476.                                 LcdGotoXY(0,11);                                                // 光標(biāo)定位到小時的位置
  477.                                 LcdPrintNum(TimeBuff[4]);                // 刷新顯示改變后的小時
  478.                                 LcdGotoXY(0,12);                                                // 定位光標(biāo)到小時閃爍
  479.                                 DelayMs(300);                                                                // 延時0.3秒左右
  480.                         }
  481.                         
  482.                         if(KeySet_P==0)
  483.                         {
  484.                                 break;
  485.                         }
  486.                 }
  487.                
  488.                 LcdGotoXY(0,15);                                // 定位光標(biāo)到分鐘閃爍
  489.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  490.                 while(!KeySet_P);                                // 等待按鍵釋放
  491.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  492.                
  493.                 /* 調(diào)整分鐘 */
  494.                 while(1)
  495.                 {
  496.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  497.                         {
  498.                                 if(TimeBuff[5]>0)                                                // 判斷分鐘是否大于0
  499.                                         TimeBuff[5]--;                                                // 是的話就減去1
  500.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  501.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  502.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  503.                                 DelayMs(300);                                                                // 延時0.3秒左右
  504.                         }
  505.                         
  506.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  507.                         {
  508.                                 if(TimeBuff[5]<59)                                        // 判斷分鐘是否小于59
  509.                                         TimeBuff[5]++;                                                // 是的話就加上1
  510.                                 LcdGotoXY(0,14);                                                // 光標(biāo)定位到分鐘的位置
  511.                                 LcdPrintNum(TimeBuff[5]);                // 刷新顯示改變后的分鐘
  512.                                 LcdGotoXY(0,15);                                                // 定位光標(biāo)到分鐘閃爍
  513.                                 DelayMs(300);                                                                // 延時0.3秒左右
  514.                         }
  515.                         
  516.                         if(KeySet_P==0)
  517.                         {
  518.                                 break;
  519.                         }
  520.                 }
  521.                
  522.                 /* 退出前的設(shè)置 */
  523.                 LcdWriteCmd(0x0C);                        // 關(guān)閉光標(biāo)閃爍
  524.                 DS1302_Write_Time();                // 把新設(shè)置的時間值存入DS1302芯片
  525.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  526.                 while(!KeySet_P);                                // 等待按鍵釋放
  527.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  528.         }
  529. }


  530. /*********************************************************/
  531. // 按鍵掃描(設(shè)置窗簾的動作)
  532. /*********************************************************/
  533. void KeyScanf2()
  534. {
  535.         if(KeySet2_P==0)
  536.         {
  537.                 LcdGotoXY(0,0);                                                                                // 光標(biāo)定位
  538.                 LcdPrintStr(" OpenTime   :   ");        // 顯示第1行內(nèi)容
  539.                 LcdGotoXY(1,0);                                                                                // 光標(biāo)定位
  540.                 LcdPrintStr("CloseTime   :   ");        // 顯示第2行內(nèi)容
  541.                 LcdGotoXY(0,10);                                                                        // 光標(biāo)定位
  542.                 LcdPrintNum(OpenHour);                                                // 顯示開啟窗簾的小時
  543.                 LcdGotoXY(0,13);                                                                        // 光標(biāo)定位
  544.                 LcdPrintNum(OpenMinute);                                        // 顯示開啟窗簾的分鐘
  545.                 LcdGotoXY(1,10);                                                                        // 光標(biāo)定位
  546.                 LcdPrintNum(CloseHour);                                                // 顯示關(guān)閉窗簾的小時
  547.                 LcdGotoXY(1,13);                                                                        // 光標(biāo)定位
  548.                 LcdPrintNum(CloseMinute);                                        // 顯示關(guān)閉窗簾的分鐘               
  549.                
  550.                 LcdWriteCmd(0x0f);                                                        // 啟動光標(biāo)閃爍
  551.                 LcdGotoXY(0,11);                                                                // 定位光標(biāo)
  552.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  553.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  554.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  555.                
  556.                 /* 調(diào)整開啟的小時 */
  557.                 while(1)
  558.                 {
  559.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  560.                         {
  561.                                 if(OpenHour>0)                                                        // 判斷小時是否大于0               
  562.                                         OpenHour--;                                                                // 是的話就減去1
  563.                                 LcdGotoXY(0,10);                                                // 光標(biāo)定位
  564.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時
  565.                                 LcdGotoXY(0,11);                                                // 定位光標(biāo)
  566.                                 DelayMs(300);                                                                // 延時0.3秒左右
  567.                         }
  568.                         
  569.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  570.                         {
  571.                                 if(OpenHour<23)                                                        // 判斷小時是否小于23
  572.                                         OpenHour++;                                                                // 是的話就加上1
  573.                                 LcdGotoXY(0,10);                                                // 光標(biāo)定位
  574.                                 LcdPrintNum(OpenHour);                        // 刷新顯示改變后的小時
  575.                                 LcdGotoXY(0,11);                                                // 定位光標(biāo)
  576.                                 DelayMs(300);                                                                // 延時0.3秒左右
  577.                         }
  578.                         
  579.                         if(KeySet2_P==0)
  580.                         {
  581.                                 break;
  582.                         }
  583.                 }
  584.                
  585.                 LcdGotoXY(0,14);                                                                // 定位光標(biāo)
  586.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  587.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  588.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  589.                
  590.                 /* 調(diào)整開啟的分鐘 */
  591.                 while(1)
  592.                 {
  593.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  594.                         {
  595.                                 if(OpenMinute>0)                                                // 判斷分鐘是否大于0
  596.                                         OpenMinute--;                                                        // 是的話就減去1
  597.                                 LcdGotoXY(0,13);                                                // 光標(biāo)定位
  598.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  599.                                 LcdGotoXY(0,14);                                                // 定位光標(biāo)
  600.                                 DelayMs(300);                                                                // 延時0.3秒左右
  601.                         }
  602.                         
  603.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  604.                         {
  605.                                 if(OpenMinute<59)                                                // 判斷分鐘是否小于59
  606.                                         OpenMinute++;                                                        // 是的話就加上1
  607.                                 LcdGotoXY(0,13);                                                // 光標(biāo)定位
  608.                                 LcdPrintNum(OpenMinute);                // 刷新顯示改變后的分鐘
  609.                                 LcdGotoXY(0,14);                                                // 定位光標(biāo)
  610.                                 DelayMs(300);                                                                // 延時0.3秒左右
  611.                         }
  612.                         
  613.                         if(KeySet2_P==0)
  614.                         {
  615.                                 break;
  616.                         }
  617.                 }
  618.                
  619.                 LcdGotoXY(1,11);                                                                // 定位光標(biāo)
  620.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  621.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  622.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  623.                
  624.                 /* 調(diào)整關(guān)閉的小時 */
  625.                 while(1)
  626.                 {
  627.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  628.                         {
  629.                                 if(CloseHour>0)                                                        // 判斷小時是否大于0               
  630.                                         CloseHour--;                                                        // 是的話就減去1
  631.                                 LcdGotoXY(1,10);                                                // 光標(biāo)定位
  632.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時
  633.                                 LcdGotoXY(1,11);                                                // 定位光標(biāo)
  634.                                 DelayMs(300);                                                                // 延時0.3秒左右
  635.                         }
  636.                         
  637.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  638.                         {
  639.                                 if(CloseHour<23)                                                // 判斷小時是否小于23
  640.                                         CloseHour++;                                                        // 是的話就加上1
  641.                                 LcdGotoXY(1,10);                                                // 光標(biāo)定位
  642.                                 LcdPrintNum(CloseHour);                        // 刷新顯示改變后的小時
  643.                                 LcdGotoXY(1,11);                                                // 定位光標(biāo)
  644.                                 DelayMs(300);                                                                // 延時0.3秒左右
  645.                         }
  646.                         
  647.                         if(KeySet2_P==0)
  648.                         {
  649.                                 break;
  650.                         }
  651.                 }
  652.                
  653.                 LcdGotoXY(1,14);                                                                // 定位光標(biāo)
  654.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  655.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  656.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  657.                
  658.                 /* 調(diào)整關(guān)閉的分鐘 */
  659.                 while(1)
  660.                 {
  661.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  662.                         {
  663.                                 if(CloseMinute>0)                                                // 判斷分鐘是否大于0
  664.                                         CloseMinute--;                                                // 是的話就減去1
  665.                                 LcdGotoXY(1,13);                                                // 光標(biāo)定位
  666.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  667.                                 LcdGotoXY(1,14);                                                // 定位光標(biāo)
  668.                                 DelayMs(300);                                                                // 延時0.3秒左右
  669.                         }
  670.                         
  671.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  672.                         {
  673.                                 if(CloseMinute<59)                                        // 判斷分鐘是否小于59
  674.                                         CloseMinute++;                                                // 是的話就加上1
  675.                                 LcdGotoXY(1,13);                                                // 光標(biāo)定位
  676.                                 LcdPrintNum(CloseMinute);                // 刷新顯示改變后的分鐘
  677.                                 LcdGotoXY(1,14);                                                // 定位光標(biāo)
  678.                                 DelayMs(300);                                                                // 延時0.3秒左右
  679.                         }
  680.                         
  681.                         if(KeySet2_P==0)
  682.                         {
  683.                                 break;
  684.                         }
  685.                 }
  686.                
  687.                 DelayMs(10);                                                                                // 延時等待,消除按鍵按下的抖動
  688.                 while(!KeySet2_P);                                                        // 等待按鍵釋放
  689.                 DelayMs(10);                                                                                // 延時等待,消除按鍵松開的抖動
  690.                
  691.                 /* 光照強(qiáng)度的設(shè)置 */
  692.                 LcdWriteCmd(0x0C);                                                                // 關(guān)閉光標(biāo)閃爍
  693.                 LcdGotoXY(0,0);                                                                                // 光標(biāo)定位
  694.                 LcdPrintStr("   Light Set    ");        // 顯示第1行內(nèi)容
  695.                 LcdGotoXY(1,0);                                                                                // 光標(biāo)定位
  696.                 LcdPrintStr("                ");        // 顯示第2行內(nèi)容
  697.                 LcdGotoXY(1,7);                                                                                // 光標(biāo)定位
  698.                 LcdPrintNum(gLight);                                                        // 顯示窗簾的光線控制強(qiáng)度閾值
  699.                
  700.                 while(1)
  701.                 {
  702.                         if(KeyDown_P==0)                                                        // 如果減按鍵被下去
  703.                         {
  704.                                 if(gLight>0)                                                                // 判斷光線閾值是否大于0
  705.                                         gLight--;                                                                        // 是的話就減去1
  706.                                 LcdGotoXY(1,7);                                                        // 光標(biāo)定位
  707.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  708.                                 DelayMs(300);                                                                // 延時0.3秒左右
  709.                         }
  710.                         
  711.                         if(KeyUp_P==0)                                                                // 如果加按鍵被下去
  712.                         {
  713.                                 if(gLight<99)                                                                // 判斷光線閾值是否小于59
  714.                                         gLight++;                                                                        // 是的話就加上1
  715.                                 LcdGotoXY(1,7);                                                        // 光標(biāo)定位
  716.                                 LcdPrintNum(gLight);                                // 刷新顯示改變后的光線閾值
  717.                                 DelayMs(300);                                                                // 延時0.3秒左右
  718.                         }
  719.                         
  720.                         if(KeySet2_P==0)
  721.                         {
  722.                                 break;
  723.                         }
  724.                 }
  725.                
  726.                 /* 退出前的設(shè)置 */
  727.                 LcdShowInit();                                        // 液晶顯示內(nèi)容初始化
  728.                 DelayMs(10);                                                // 延時等待,消除按鍵按下的抖動
  729.                 while(!KeySet2_P);                        // 等待按鍵釋放
  730.                 DelayMs(10);                                                // 延時等待,消除按鍵松開的抖動
  731.         }
  732. }


  733. /*********************************************************/
  734. // 按鍵掃描(模式切換)
  735. /*********************************************************/
  736. void KeyScanf3()
  737. {
  738.         if(KeyMode_P==0)
  739.         {
  740.                 gMode++;                                                        // 切換到下一模式
  741.                 if(gMode==4)                                        // 如果到盡頭了
  742.                         gMode=1;                                                // 回到第一種模式
  743.                 LcdGotoXY(1,0);                                // 光標(biāo)定位
  744.                 LcdPrintMode(gMode);        // 顯示模式
  745.                 DelayMs(10);                                        // 去除按鍵按下的抖動
  746.                 while(!KeyMode_P);                // 等待按鍵是否
  747.                 DelayMs(10);                                        // 去除按鍵松開的抖動
  748.         }
  749. }


  750. /*********************************************************/
  751. // 開窗
  752. /*********************************************************/
  753. void Open()
  754. {
  755.         uint i,j;
  756.         for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)正轉(zhuǎn)
  757.         {
  758.                 for(i=0;i<4;i++)
  759.                 {
  760.                         P2=Clock[i];
  761.                         DelayMs(3);
  762.                 }
  763.         }
  764.         Led_P=0;
  765. }



  766. /*********************************************************/
  767. // 關(guān)窗
  768. /*********************************************************/
  769. void Close()
  770. {
  771.         uint i,j;
  772.         for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)反轉(zhuǎn)
  773.         {
  774.                 for(i=0;i<4;i++)
  775.                 {
  776.                         P2=AntiClock[i];
  777.                         DelayMs(3);
  778.                 }
  779.         }
  780.         Led_P=1;
  781. }



  782. /*********************************************************/
  783. // 主函數(shù)
  784. /*********************************************************/
  785. void main()
  786. {
  787.         uchar light;
  788.         
  789.         LcdInit();                        // 執(zhí)行液晶初始化        
  790.         DS1302_Init();        // 時鐘芯片的初始化
  791.         LcdShowInit();        // 液晶顯示內(nèi)容的初始化
  792.         io_inithw();
  793.         int_inithw();
  794.         if(DS1302_Read_Byte(0x81)>=128)                        // 判斷時鐘芯片是否正在運(yùn)行
  795.         {
  796.                 DS1302_Write_Time();                                                        // 如果沒有,則初始化一個時間
  797.         }
  798.         
  799.         while(1)
  800.         {
  801.                 DS1302_Read_Time();                                // 獲取當(dāng)前時鐘芯片的時間,存在數(shù)組time_buf中
  802.                 FlashTime();                                                        // 刷新時間顯示

  803.                 light=Get_ADC0832();                        // 讀取光照強(qiáng)度
  804.                 light=light/2.5;                                        // 縮小光照檢測結(jié)果(在0-99)
  805.                 if(light>99)                                                        // 如果大于99
  806.                         light=99;                                                                // 則依然保持99
  807.                 LcdGotoXY(1,14);                                        // 光標(biāo)定位
  808.                 LcdPrintNum(light);                                // 顯示光照強(qiáng)度
  809.                
  810.                 KeyScanf1();                                                        // 按鍵掃描(時間的設(shè)置)
  811.                 KeyScanf2();                                                        // 按鍵掃描(閾值的設(shè)置)
  812.                 KeyScanf3();                                                        // 按鍵掃描(模式切換)
  813.         
  814.                 /*手動控制模式*/
  815.                 if(gMode==1)
  816.                 {
  817.                         if(closeflag==1)
  818.                         {
  819.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  820.                                 {
  821.                                         closeflag=0;
  822.                                         Close();                                // 則光標(biāo)窗簾
  823.                                 }else
  824.                                 closeflag=0;
  825.                         }
  826.                         if(KeyDown_P==0)                // 如果關(guān)窗簾鍵按下了        
  827.                         {
  828.                                 if(Led_P==0)                        // 如果窗簾當(dāng)前是打開的
  829.                                 {
  830.                                         Close();                                // 則光標(biāo)窗簾
  831.                                 }
  832.                         }
  833.                         if(openflag==1)
  834.                         {
  835.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  836.                                 {
  837.                                         openflag=0;
  838.                                         Open();                                        // 則打開窗簾
  839.                                 }else{
  840.                                         openflag=0;
  841.                                 }
  842.                                 
  843.                         }
  844.                         if(KeyUp_P==0)                        // 如果開窗簾鍵按下了
  845.                         {
  846.                                 if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
  847. ……………………

  848. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
自動窗簾設(shè)計(jì).zip (981.85 KB, 下載次數(shù): 193)

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:311912 發(fā)表于 2020-12-8 15:27 | 只看該作者
原理圖

1.png (133.64 KB, 下載次數(shù): 61)

1.png
回復(fù)

使用道具 舉報

板凳
ID:328014 發(fā)表于 2020-12-8 16:05 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

地板
ID:827217 發(fā)表于 2021-3-22 01:05 | 只看該作者
求紅外線遙控部分
回復(fù)

使用道具 舉報

5#
ID:836118 發(fā)表于 2021-4-13 22:05 來自手機(jī) | 只看該作者
這個仿真不出來是什么問題呀,ADC0832報error
回復(fù)

使用道具 舉報

6#
ID:311912 發(fā)表于 2021-5-5 18:18 | 只看該作者
藍(lán)調(diào)_ 發(fā)表于 2021-4-13 22:05
這個仿真不出來是什么問題呀,ADC0832報error

應(yīng)該是可以仿真的,我當(dāng)時做出來了
回復(fù)

使用道具 舉報

7#
ID:328014 發(fā)表于 2021-5-5 23:04 | 只看該作者
藍(lán)調(diào)_ 發(fā)表于 2021-4-13 22:05
這個仿真不出來是什么問題呀,ADC0832報error

如果你是用的Proteus8.8的話你把這個文件復(fù)制到models目錄就不會ADC083X.DLL報錯了,我也是報錯External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.

這個文件我從Proteus7.5的目錄里面復(fù)制出來的
文件如下: ADC083X.7z (25.55 KB, 下載次數(shù): 29)
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄色在线观看网址 | 国产视频久| 国产欧美一区二区三区久久 | 可以在线观看av的网站 | 国产成人精品免费视频 | 日韩精品一区二区三区在线观看 | 国产女人第一次做爰毛片 | 盗摄精品av一区二区三区 | 欧美日韩一本 | 色久影院 | 欧美一区二区三区电影 | 男女网站免费 | 国产精品视频一区二区三区 | 中国一级特黄毛片大片 | 日韩在线中文字幕 | 一区二区三区日本 | 艹逼网| 精品综合久久 | 亚洲精品福利在线 | 伊人色综合久久天天五月婷 | 日韩免费视频一区二区 | 久久久久久综合 | 久久精品视频免费观看 | 国产亚洲精品精品国产亚洲综合 | 精品一区二区三区免费视频 | 日韩电影一区二区三区 | 狠狠干网| 九色91视频 | 亚洲一区二区精品视频 | 日韩欧美在线视频 | 成人精品免费视频 | 久久久久久久久国产成人免费 | 国产免费av在线 | 国产精品久久亚洲7777 | 国产不卡一 | 中文字幕一区二区三区四区五区 | 一级黄色毛片a | 日韩一区二区三区在线 | 羞羞视频网 | 亚洲国产成人精品女人久久久 | 欧美日韩精品一区二区天天拍 |