找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3816|回复: 6
收起左侧

单片机自动窗帘控制程序(两个电机)Proteus仿真原理图

  [复制链接]
ID:311912 发表于 2020-12-8 15:23 | 显示全部楼层 |阅读模式
自动窗帘仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png 51hei.png 51hei.png

单片机源程序如下:
  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. // 毫秒级的延时函数,time是要延时的毫秒数
  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液晶写命令函数,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液晶写数据函数,dat就是要写入的数据
  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液晶初始化函数
  57. /*********************************************************/
  58. void LcdInit()
  59. {
  60.         LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
  61.         LcdWriteCmd(0x0C);        // 开显示,不显示光标
  62.         LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
  63.         LcdWriteCmd(0x01);        // 清屏
  64. }


  65. /*********************************************************/
  66. // 液晶光标定位函数
  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. // 液晶输出字符串函数
  79. /*********************************************************/
  80. void LcdPrintStr(uchar *str)
  81. {
  82.         while(*str!='\0')
  83.                         LcdWriteData(*str++);
  84. }


  85. /*********************************************************/
  86. // 液晶输出数字(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. // 液晶显示内容的初始化
  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)                                                        // 秒钟是偶数显示冒号
  135.                 LcdWriteData(':');
  136.         else                                                                                                                        // 秒钟是奇数显示空格
  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读出一字节数据
  150. /*********************************************************/
  151. uchar DS1302_Read_Byte(uchar addr)
  152. {
  153.         uchar i;
  154.         uchar temp;
  155.         
  156.         RST_P=1;                                                               
  157.         
  158.         /* 写入目标地址: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.         /* 读出该地址的数据 */
  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写入一字节数据
  196. /*********************************************************/
  197. void DS1302_Write_Byte(uchar addr, uchar dat)
  198. {
  199.         uchar i;
  200.         
  201.         RST_P = 1;
  202.         
  203.         /* 写入目标地址: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.         /* 写入数据: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写入时间数据
  238. /*********************************************************/
  239. void DS1302_Write_Time()
  240. {
  241.   uchar i;
  242.         uchar temp1;
  243.         uchar temp2;
  244.         
  245.         for(i=0;i<7;i++)                        // 十进制转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);                                                                // 关闭写保护
  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);                // 运行时钟
  262.         DS1302_Write_Byte(0x8E,0x80);                                                                // 打开写保护  
  263. }



  264. /*********************************************************/
  265. // 从DS1302读出时间数据
  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转十进制
  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转换结果
  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_();                                                // 结束此次传输
  333.         ADC_DAT = 1;
  334.         ADC_CLK = 1;
  335.         ADC_CS  = 1;   

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


  341. /*********************************************************/
  342. // 按键扫描(设置当前时间)
  343. /*********************************************************/
  344. void KeyScanf1()
  345. {
  346.         if(KeySet_P==0)
  347.         {
  348.                 LcdGotoXY(0,13);                                // 显示秒钟的冒号
  349.                 LcdWriteData(':');
  350.                 LcdWriteCmd(0x0f);                        // 启动光标闪烁
  351.                 LcdGotoXY(0,3);                                        // 定位光标到年份闪烁
  352.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  353.                 while(!KeySet_P);                                // 等待按键释放
  354.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  355.                
  356.                 /* 调整年份 */
  357.                 while(1)
  358.                 {
  359.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  360.                         {
  361.                                 if(TimeBuff[0]>0)                                                // 判断年份是否大于0               
  362.                                         TimeBuff[0]--;                                                // 是的话就减去1
  363.                                 LcdGotoXY(0,2);                                                        // 光标定位到年份的位置
  364.                                 LcdPrintNum(TimeBuff[0]);                // 刷新显示改变后的年份
  365.                                 LcdGotoXY(0,3);                                                        // 定位光标到年份闪烁
  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);                                                        // 光标定位到年份的位置
  374.                                 LcdPrintNum(TimeBuff[0]);                // 刷新显示改变后的年份
  375.                                 LcdGotoXY(0,3);                                                        // 定位光标到年份闪烁
  376.                                 DelayMs(300);                                                                // 延时0.3秒左右
  377.                         }
  378.                         
  379.                         if(KeySet_P==0)
  380.                         {
  381.                                 break;
  382.                         }
  383.                 }
  384.                
  385.                 LcdGotoXY(0,6);                                        // 定位光标到月份闪烁
  386.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  387.                 while(!KeySet_P);                                // 等待按键释放
  388.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  389.                         
  390.                 /* 调整月份 */
  391.                 while(1)
  392.                 {
  393.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  394.                         {
  395.                                 if(TimeBuff[1]>1)                                                // 判断月份是否大于1               
  396.                                         TimeBuff[1]--;                                                // 是的话就减去1
  397.                                 LcdGotoXY(0,5);                                                        // 光标定位到月份的位置
  398.                                 LcdPrintNum(TimeBuff[1]);                // 刷新显示改变后的月份
  399.                                 LcdGotoXY(0,6);                                                        // 定位光标到月份闪烁
  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);                                                        // 光标定位到月份的位置
  408.                                 LcdPrintNum(TimeBuff[1]);                // 刷新显示改变后的月份
  409.                                 LcdGotoXY(0,6);                                                        // 定位光标到月份闪烁
  410.                                 DelayMs(300);                                                                // 延时0.3秒左右
  411.                         }
  412.                         
  413.                         if(KeySet_P==0)
  414.                         {
  415.                                 break;
  416.                         }
  417.                 }
  418.                
  419.                 LcdGotoXY(0,9);                                        // 定位光标到日期闪烁
  420.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  421.                 while(!KeySet_P);                                // 等待按键释放
  422.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  423.                
  424.                 /* 调整日期 */
  425.                 while(1)
  426.                 {
  427.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  428.                         {
  429.                                 if(TimeBuff[2]>1)                                                // 判断日期是否大于1               
  430.                                         TimeBuff[2]--;                                                // 是的话就减去1
  431.                                 LcdGotoXY(0,8);                                                        // 光标定位到日期的位置
  432.                                 LcdPrintNum(TimeBuff[2]);                // 刷新显示改变后的日期
  433.                                 LcdGotoXY(0,9);                                                        // 定位光标到日期闪烁
  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);                                                        // 光标定位到日期的位置
  442.                                 LcdPrintNum(TimeBuff[2]);                // 刷新显示改变后的日期
  443.                                 LcdGotoXY(0,9);                                                        // 定位光标到日期闪烁
  444.                                 DelayMs(300);                                                                // 延时0.3秒左右
  445.                         }
  446.                         
  447.                         if(KeySet_P==0)
  448.                         {
  449.                                 break;
  450.                         }
  451.                 }
  452.                
  453.                 LcdGotoXY(0,12);                                // 定位光标到小时闪烁
  454.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  455.                 while(!KeySet_P);                                // 等待按键释放
  456.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  457.                
  458.                
  459.                 /* 调整小时 */
  460.                 while(1)
  461.                 {
  462.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  463.                         {
  464.                                 if(TimeBuff[4]>0)                                                // 判断小时是否大于0
  465.                                         TimeBuff[4]--;                                                // 是的话就减去1
  466.                                 LcdGotoXY(0,11);                                                // 光标定位到小时的位置
  467.                                 LcdPrintNum(TimeBuff[4]);                // 刷新显示改变后的小时
  468.                                 LcdGotoXY(0,12);                                                // 定位光标到小时闪烁
  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);                                                // 光标定位到小时的位置
  477.                                 LcdPrintNum(TimeBuff[4]);                // 刷新显示改变后的小时
  478.                                 LcdGotoXY(0,12);                                                // 定位光标到小时闪烁
  479.                                 DelayMs(300);                                                                // 延时0.3秒左右
  480.                         }
  481.                         
  482.                         if(KeySet_P==0)
  483.                         {
  484.                                 break;
  485.                         }
  486.                 }
  487.                
  488.                 LcdGotoXY(0,15);                                // 定位光标到分钟闪烁
  489.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  490.                 while(!KeySet_P);                                // 等待按键释放
  491.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  492.                
  493.                 /* 调整分钟 */
  494.                 while(1)
  495.                 {
  496.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  497.                         {
  498.                                 if(TimeBuff[5]>0)                                                // 判断分钟是否大于0
  499.                                         TimeBuff[5]--;                                                // 是的话就减去1
  500.                                 LcdGotoXY(0,14);                                                // 光标定位到分钟的位置
  501.                                 LcdPrintNum(TimeBuff[5]);                // 刷新显示改变后的分钟
  502.                                 LcdGotoXY(0,15);                                                // 定位光标到分钟闪烁
  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);                                                // 光标定位到分钟的位置
  511.                                 LcdPrintNum(TimeBuff[5]);                // 刷新显示改变后的分钟
  512.                                 LcdGotoXY(0,15);                                                // 定位光标到分钟闪烁
  513.                                 DelayMs(300);                                                                // 延时0.3秒左右
  514.                         }
  515.                         
  516.                         if(KeySet_P==0)
  517.                         {
  518.                                 break;
  519.                         }
  520.                 }
  521.                
  522.                 /* 退出前的设置 */
  523.                 LcdWriteCmd(0x0C);                        // 关闭光标闪烁
  524.                 DS1302_Write_Time();                // 把新设置的时间值存入DS1302芯片
  525.                 DelayMs(10);                                                // 延时等待,消除按键按下的抖动
  526.                 while(!KeySet_P);                                // 等待按键释放
  527.                 DelayMs(10);                                                // 延时等待,消除按键松开的抖动
  528.         }
  529. }


  530. /*********************************************************/
  531. // 按键扫描(设置窗帘的动作)
  532. /*********************************************************/
  533. void KeyScanf2()
  534. {
  535.         if(KeySet2_P==0)
  536.         {
  537.                 LcdGotoXY(0,0);                                                                                // 光标定位
  538.                 LcdPrintStr(" OpenTime   :   ");        // 显示第1行内容
  539.                 LcdGotoXY(1,0);                                                                                // 光标定位
  540.                 LcdPrintStr("CloseTime   :   ");        // 显示第2行内容
  541.                 LcdGotoXY(0,10);                                                                        // 光标定位
  542.                 LcdPrintNum(OpenHour);                                                // 显示开启窗帘的小时
  543.                 LcdGotoXY(0,13);                                                                        // 光标定位
  544.                 LcdPrintNum(OpenMinute);                                        // 显示开启窗帘的分钟
  545.                 LcdGotoXY(1,10);                                                                        // 光标定位
  546.                 LcdPrintNum(CloseHour);                                                // 显示关闭窗帘的小时
  547.                 LcdGotoXY(1,13);                                                                        // 光标定位
  548.                 LcdPrintNum(CloseMinute);                                        // 显示关闭窗帘的分钟               
  549.                
  550.                 LcdWriteCmd(0x0f);                                                        // 启动光标闪烁
  551.                 LcdGotoXY(0,11);                                                                // 定位光标
  552.                 DelayMs(10);                                                                                // 延时等待,消除按键按下的抖动
  553.                 while(!KeySet2_P);                                                        // 等待按键释放
  554.                 DelayMs(10);                                                                                // 延时等待,消除按键松开的抖动
  555.                
  556.                 /* 调整开启的小时 */
  557.                 while(1)
  558.                 {
  559.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  560.                         {
  561.                                 if(OpenHour>0)                                                        // 判断小时是否大于0               
  562.                                         OpenHour--;                                                                // 是的话就减去1
  563.                                 LcdGotoXY(0,10);                                                // 光标定位
  564.                                 LcdPrintNum(OpenHour);                        // 刷新显示改变后的小时
  565.                                 LcdGotoXY(0,11);                                                // 定位光标
  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);                                                // 光标定位
  574.                                 LcdPrintNum(OpenHour);                        // 刷新显示改变后的小时
  575.                                 LcdGotoXY(0,11);                                                // 定位光标
  576.                                 DelayMs(300);                                                                // 延时0.3秒左右
  577.                         }
  578.                         
  579.                         if(KeySet2_P==0)
  580.                         {
  581.                                 break;
  582.                         }
  583.                 }
  584.                
  585.                 LcdGotoXY(0,14);                                                                // 定位光标
  586.                 DelayMs(10);                                                                                // 延时等待,消除按键按下的抖动
  587.                 while(!KeySet2_P);                                                        // 等待按键释放
  588.                 DelayMs(10);                                                                                // 延时等待,消除按键松开的抖动
  589.                
  590.                 /* 调整开启的分钟 */
  591.                 while(1)
  592.                 {
  593.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  594.                         {
  595.                                 if(OpenMinute>0)                                                // 判断分钟是否大于0
  596.                                         OpenMinute--;                                                        // 是的话就减去1
  597.                                 LcdGotoXY(0,13);                                                // 光标定位
  598.                                 LcdPrintNum(OpenMinute);                // 刷新显示改变后的分钟
  599.                                 LcdGotoXY(0,14);                                                // 定位光标
  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);                                                // 光标定位
  608.                                 LcdPrintNum(OpenMinute);                // 刷新显示改变后的分钟
  609.                                 LcdGotoXY(0,14);                                                // 定位光标
  610.                                 DelayMs(300);                                                                // 延时0.3秒左右
  611.                         }
  612.                         
  613.                         if(KeySet2_P==0)
  614.                         {
  615.                                 break;
  616.                         }
  617.                 }
  618.                
  619.                 LcdGotoXY(1,11);                                                                // 定位光标
  620.                 DelayMs(10);                                                                                // 延时等待,消除按键按下的抖动
  621.                 while(!KeySet2_P);                                                        // 等待按键释放
  622.                 DelayMs(10);                                                                                // 延时等待,消除按键松开的抖动
  623.                
  624.                 /* 调整关闭的小时 */
  625.                 while(1)
  626.                 {
  627.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  628.                         {
  629.                                 if(CloseHour>0)                                                        // 判断小时是否大于0               
  630.                                         CloseHour--;                                                        // 是的话就减去1
  631.                                 LcdGotoXY(1,10);                                                // 光标定位
  632.                                 LcdPrintNum(CloseHour);                        // 刷新显示改变后的小时
  633.                                 LcdGotoXY(1,11);                                                // 定位光标
  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);                                                // 光标定位
  642.                                 LcdPrintNum(CloseHour);                        // 刷新显示改变后的小时
  643.                                 LcdGotoXY(1,11);                                                // 定位光标
  644.                                 DelayMs(300);                                                                // 延时0.3秒左右
  645.                         }
  646.                         
  647.                         if(KeySet2_P==0)
  648.                         {
  649.                                 break;
  650.                         }
  651.                 }
  652.                
  653.                 LcdGotoXY(1,14);                                                                // 定位光标
  654.                 DelayMs(10);                                                                                // 延时等待,消除按键按下的抖动
  655.                 while(!KeySet2_P);                                                        // 等待按键释放
  656.                 DelayMs(10);                                                                                // 延时等待,消除按键松开的抖动
  657.                
  658.                 /* 调整关闭的分钟 */
  659.                 while(1)
  660.                 {
  661.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  662.                         {
  663.                                 if(CloseMinute>0)                                                // 判断分钟是否大于0
  664.                                         CloseMinute--;                                                // 是的话就减去1
  665.                                 LcdGotoXY(1,13);                                                // 光标定位
  666.                                 LcdPrintNum(CloseMinute);                // 刷新显示改变后的分钟
  667.                                 LcdGotoXY(1,14);                                                // 定位光标
  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);                                                // 光标定位
  676.                                 LcdPrintNum(CloseMinute);                // 刷新显示改变后的分钟
  677.                                 LcdGotoXY(1,14);                                                // 定位光标
  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.                 /* 光照强度的设置 */
  692.                 LcdWriteCmd(0x0C);                                                                // 关闭光标闪烁
  693.                 LcdGotoXY(0,0);                                                                                // 光标定位
  694.                 LcdPrintStr("   Light Set    ");        // 显示第1行内容
  695.                 LcdGotoXY(1,0);                                                                                // 光标定位
  696.                 LcdPrintStr("                ");        // 显示第2行内容
  697.                 LcdGotoXY(1,7);                                                                                // 光标定位
  698.                 LcdPrintNum(gLight);                                                        // 显示窗帘的光线控制强度阈值
  699.                
  700.                 while(1)
  701.                 {
  702.                         if(KeyDown_P==0)                                                        // 如果减按键被下去
  703.                         {
  704.                                 if(gLight>0)                                                                // 判断光线阈值是否大于0
  705.                                         gLight--;                                                                        // 是的话就减去1
  706.                                 LcdGotoXY(1,7);                                                        // 光标定位
  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);                                                        // 光标定位
  716.                                 LcdPrintNum(gLight);                                // 刷新显示改变后的光线阈值
  717.                                 DelayMs(300);                                                                // 延时0.3秒左右
  718.                         }
  719.                         
  720.                         if(KeySet2_P==0)
  721.                         {
  722.                                 break;
  723.                         }
  724.                 }
  725.                
  726.                 /* 退出前的设置 */
  727.                 LcdShowInit();                                        // 液晶显示内容初始化
  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);                                // 光标定位
  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++)                // 控制步进电机正转
  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. // 关窗
  768. /*********************************************************/
  769. void Close()
  770. {
  771.         uint i,j;
  772.         for(j=0;j<255;j++)                // 控制步进电机反转
  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. // 主函数
  784. /*********************************************************/
  785. void main()
  786. {
  787.         uchar light;
  788.         
  789.         LcdInit();                        // 执行液晶初始化        
  790.         DS1302_Init();        // 时钟芯片的初始化
  791.         LcdShowInit();        // 液晶显示内容的初始化
  792.         io_inithw();
  793.         int_inithw();
  794.         if(DS1302_Read_Byte(0x81)>=128)                        // 判断时钟芯片是否正在运行
  795.         {
  796.                 DS1302_Write_Time();                                                        // 如果没有,则初始化一个时间
  797.         }
  798.         
  799.         while(1)
  800.         {
  801.                 DS1302_Read_Time();                                // 获取当前时钟芯片的时间,存在数组time_buf中
  802.                 FlashTime();                                                        // 刷新时间显示

  803.                 light=Get_ADC0832();                        // 读取光照强度
  804.                 light=light/2.5;                                        // 缩小光照检测结果(在0-99)
  805.                 if(light>99)                                                        // 如果大于99
  806.                         light=99;                                                                // 则依然保持99
  807.                 LcdGotoXY(1,14);                                        // 光标定位
  808.                 LcdPrintNum(light);                                // 显示光照强度
  809.                
  810.                 KeyScanf1();                                                        // 按键扫描(时间的设置)
  811.                 KeyScanf2();                                                        // 按键扫描(阈值的设置)
  812.                 KeyScanf3();                                                        // 按键扫描(模式切换)
  813.         
  814.                 /*手动控制模式*/
  815.                 if(gMode==1)
  816.                 {
  817.                         if(closeflag==1)
  818.                         {
  819.                                 if(Led_P==0)                        // 如果窗帘当前是打开的
  820.                                 {
  821.                                         closeflag=0;
  822.                                         Close();                                // 则光标窗帘
  823.                                 }else
  824.                                 closeflag=0;
  825.                         }
  826.                         if(KeyDown_P==0)                // 如果关窗帘键按下了        
  827.                         {
  828.                                 if(Led_P==0)                        // 如果窗帘当前是打开的
  829.                                 {
  830.                                         Close();                                // 则光标窗帘
  831.                                 }
  832.                         }
  833.                         if(openflag==1)
  834.                         {
  835.                                 if(Led_P==1)                        // 如果窗帘当前是关闭的
  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)                        // 如果窗帘当前是关闭的
  847. ……………………

  848. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
所有资料51hei提供下载:
自动窗帘设计.zip (981.85 KB, 下载次数: 187)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:311912 发表于 2020-12-8 15:27 | 显示全部楼层
原理图
1.png
回复

使用道具 举报

ID:328014 发表于 2020-12-8 16:05 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:827217 发表于 2021-3-22 01:05 | 显示全部楼层
求红外线遥控部分
回复

使用道具 举报

ID:836118 发表于 2021-4-13 22:05 来自手机 | 显示全部楼层
这个仿真不出来是什么问题呀,ADC0832报error
回复

使用道具 举报

ID:311912 发表于 2021-5-5 18:18 | 显示全部楼层
蓝调_ 发表于 2021-4-13 22:05
这个仿真不出来是什么问题呀,ADC0832报error

应该是可以仿真的,我当时做出来了
回复

使用道具 举报

ID:328014 发表于 2021-5-5 23:04 | 显示全部楼层
蓝调_ 发表于 2021-4-13 22:05
这个仿真不出来是什么问题呀,ADC0832报error

如果你是用的Proteus8.8的话你把这个文件复制到models目录就不会ADC083X.DLL报错了,我也是报错External model DLL "ADC083X.DLL" not found. GLE=0x000036B1.

这个文件我从Proteus7.5的目录里面复制出来的
文件如下: ADC083X.7z (25.55 KB, 下载次数: 27)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表