51单片机自动窗帘电机控制程序与Proteus仿真图

[复制链接]
查看2 | 回复0 | 2021-6-13 03:27:08 | 显示全部楼层 |阅读模式
单片机控制电机转速运用PWM
仿真原理图如下(proteus仿真工程文件和单片机程序完整源码可到本帖附件中下载)
1.png
部分源码:
  1. /*********************************************************/
  2. // 向DS1302写入时间数据
  3. /*********************************************************/
  4. void DS1302_Write_Time()
  5. {
  6.   uchar i;
  7.     uchar temp1;
  8.     uchar temp2;
  9.    
  10.     for(i=0;i<7;i++)            // 十进制转BCD码
  11.     {
  12.         temp1=(TimeBuff[i]/10)<<4;
  13.         temp2=TimeBuff[i]%10;
  14.         TimeBuff[i]=temp1+temp2;
  15.     }
  16.    
  17.     DS1302_Write_Byte(0x8E,0x00);                                // 关闭写保护
  18.     DS1302_Write_Byte(0x80,0x80);                                // 暂停时钟
  19.     DS1302_Write_Byte(0x8C,TimeBuff[0]);                // 年
  20.     DS1302_Write_Byte(0x88,TimeBuff[1]);                // 月
  21.     DS1302_Write_Byte(0x86,TimeBuff[2]);                // 日
  22.     DS1302_Write_Byte(0x8A,TimeBuff[3]);                // 星期
  23.     DS1302_Write_Byte(0x84,TimeBuff[4]);                // 时
  24.     DS1302_Write_Byte(0x82,TimeBuff[5]);                // 分
  25.     DS1302_Write_Byte(0x80,TimeBuff[6]);                // 秒
  26.     DS1302_Write_Byte(0x80,TimeBuff[6]&0x7F);        // 运行时钟
  27.     DS1302_Write_Byte(0x8E,0x80);                                // 打开写保护  
  28. }



  29. /*********************************************************/
  30. // 从DS1302读出时间数据
  31. /*********************************************************/
  32. void DS1302_Read_Time()  
  33. {
  34.     uchar i;

  35.     TimeBuff[0]=DS1302_Read_Byte(0x8D);                        // 年
  36.     TimeBuff[1]=DS1302_Read_Byte(0x89);                        // 月
  37.     TimeBuff[2]=DS1302_Read_Byte(0x87);                        // 日
  38.     TimeBuff[3]=DS1302_Read_Byte(0x8B);                        // 星期
  39.     TimeBuff[4]=DS1302_Read_Byte(0x85);                        // 时
  40.     TimeBuff[5]=DS1302_Read_Byte(0x83);                        // 分
  41.     TimeBuff[6]=(DS1302_Read_Byte(0x81))&0x7F;        // 秒

  42.     for(i=0;i<7;i++)        // BCD转十进制
  43.     {           
  44.         TimeBuff[i]=(TimeBuff[i]/16)*10+TimeBuff[i]%16;
  45.     }
  46. }


  47. /*********************************************************/
  48. // ADC0832的时钟脉冲
  49. /*********************************************************/
  50. void WavePlus()
  51. {
  52.     _nop_();
  53.     ADC_CLK = 1;
  54.     _nop_();
  55.     ADC_CLK = 0;
  56. }


  57. /*********************************************************/
  58. // 获取指定通道的A/D转换结果
  59. /*********************************************************/
  60. uchar Get_ADC0832()
  61. {
  62.     uchar i;
  63.     uchar dat1=0;
  64.     uchar dat2=0;
  65.    
  66.     ADC_CLK = 0;                // 电平初始化
  67.     ADC_DAT = 1;
  68.     _nop_();
  69.     ADC_CS = 0;
  70.     WavePlus();                    // 起始信号
  71.     ADC_DAT = 1;
  72.     WavePlus();                    // 通道选择的第一位
  73.     ADC_DAT = 0;      
  74.     WavePlus();                    // 通道选择的第二位
  75.     ADC_DAT = 1;
  76.    
  77.     for(i=0;i<8;i++)        // 第一次读取
  78.     {
  79.         dat1<<=1;
  80.         WavePlus();
  81.         if(ADC_DAT)
  82.             dat1=dat1|0x01;
  83.         else
  84.             dat1=dat1|0x00;
  85.     }
  86.    
  87.     for(i=0;i<8;i++)        // 第二次读取
  88.     {
  89.         dat2>>= 1;
  90.         if(ADC_DAT)
  91.             dat2=dat2|0x80;
  92.         else
  93.             dat2=dat2|0x00;
  94.         WavePlus();
  95.     }
  96.    
  97.     _nop_();                        // 结束此次传输
  98.     ADC_DAT = 1;
  99.     ADC_CLK = 1;
  100.     ADC_CS  = 1;   

  101.     if(dat1==dat2)            // 返回采集结果
  102.         return dat1;
  103.     else
  104.         return 0;
  105. }


  106. /*********************************************************/
  107. // 按键扫描(设置当前时间)
  108. /*********************************************************/
  109. void KeyScanf1()
  110. {
  111.     if(KeySet_P==0)
  112.     {
  113.         LcdGotoXY(0,13);                // 显示秒钟的冒号
  114.         LcdWriteData(':');
  115.         LcdWriteCmd(0x0f);            // 启动光标闪烁
  116.         LcdGotoXY(0,3);                    // 定位光标到年份闪烁
  117.         DelayMs(10);                        // 延时等待,消除按键按下的抖动
  118.         while(!KeySet_P);                // 等待按键释放
  119.         DelayMs(10);                        // 延时等待,消除按键松开的抖动
  120.         
  121.         /* 调整年份 */
  122.         while(1)
  123.         {
  124.             if(KeyDown_P==0)                            // 如果减按键被下去
  125.             {
  126.                 if(TimeBuff[0]>0)                        // 判断年份是否大于0        
  127.                     TimeBuff[0]--;                        // 是的话就减去1
  128.                 LcdGotoXY(0,2);                            // 光标定位到年份的位置
  129.                 LcdPrintNum(TimeBuff[0]);        // 刷新显示改变后的年份
  130.                 LcdGotoXY(0,3);                            // 定位光标到年份闪烁
  131.                 DelayMs(300);                                // 延时0.3秒左右
  132.             }
  133.             
  134.             if(KeyUp_P==0)                                // 如果加按键被下去
  135.             {
  136.                 if(TimeBuff[0]<99)                    // 判断年份是否小于99
  137.                     TimeBuff[0]++;                        // 是的话就加上1
  138.                 LcdGotoXY(0,2);                            // 光标定位到年份的位置
  139.                 LcdPrintNum(TimeBuff[0]);        // 刷新显示改变后的年份
  140.                 LcdGotoXY(0,3);                            // 定位光标到年份闪烁
  141.                 DelayMs(300);                                // 延时0.3秒左右
  142.             }
  143.             
  144.             if(KeySet_P==0)
  145.             {
  146.                 break;
  147.             }
  148.         }
  149.         
  150.         LcdGotoXY(0,6);                    // 定位光标到月份闪烁
  151.         DelayMs(10);                        // 延时等待,消除按键按下的抖动
  152.         while(!KeySet_P);                // 等待按键释放
  153.         DelayMs(10);                        // 延时等待,消除按键松开的抖动
  154.             
  155.         /* 调整月份 */
  156.         while(1)
  157.         {
  158.             if(KeyDown_P==0)                            // 如果减按键被下去
  159.             {
  160.                 if(TimeBuff[1]>1)                        // 判断月份是否大于1        
  161.                     TimeBuff[1]--;                        // 是的话就减去1
  162.                 LcdGotoXY(0,5);                            // 光标定位到月份的位置
  163.                 LcdPrintNum(TimeBuff[1]);        // 刷新显示改变后的月份
  164.                 LcdGotoXY(0,6);                            // 定位光标到月份闪烁
  165.                 DelayMs(300);                                // 延时0.3秒左右
  166.             }
  167.             
  168.             if(KeyUp_P==0)                                // 如果加按键被下去
  169.             {
  170.                 if(TimeBuff[1]<12)                    // 判断月份是否小于12
  171.                     TimeBuff[1]++;                        // 是的话就加上1
  172.                 LcdGotoXY(0,5);                            // 光标定位到月份的位置
  173.                 LcdPrintNum(TimeBuff[1]);        // 刷新显示改变后的月份
  174.                 LcdGotoXY(0,6);                            // 定位光标到月份闪烁
  175.                 DelayMs(300);                                // 延时0.3秒左右
  176.             }
  177.             
  178.             if(KeySet_P==0)
  179.             {
  180.                 break;
  181.             }
  182.         }
  183.         
  184.         LcdGotoXY(0,9);                    // 定位光标到日期闪烁
  185.         DelayMs(10);                        // 延时等待,消除按键按下的抖动
  186.         while(!KeySet_P);                // 等待按键释放
  187.         DelayMs(10);                        // 延时等待,消除按键松开的抖动
  188.         
  189. --------------完整程序见附件-----------------
复制代码
完整C源码和proteus仿真.zip (134.86 KB, 售价: 3 工控币)
回复

使用道具 举报

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

本版积分规则