登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看8001|回4|收藏
楼主 ID:331603 只看他
2018-9-28 16:43
直流电机调速仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:

代码:

  1. #include <reg51.h>

  2. #define uint unsigned int
  3. #define uchar unsigned char
  4.        
  5. void keycan();   //按键
  6. void delayms(x); //延时

  7. sbit  K1 = P1^6;
  8. sbit  K2 = P1^7;

  9. sbit  M1 = P0^0;
  10. sbit  M2 = P0^2;
  11. sbit  M11 = P0^1;
  12. sbit  M22 = P0^3;

  13. uint AUXR;

  14. uint temp1=0,temp2=0;

  15. void Timer0Init(void)                //10微秒@12.000MHz
  16. {
  17.         AUXR &= 0x7F;                //定时器时钟12T模式
  18.         TMOD &= 0xF0;                //设置定时器模式
  19.         TMOD |= 0x01;                //设置定时器模式
  20.         TL0 = 0xF6;                //设置定时初值
  21.         TH0 = 0xFF;                //设置定时初值
  22.         TF0 = 0;                //清除TF0标志
  23.         TR0 = 1;                //定时器0开始计时
  24. }

  25. uint c=0,sudu=0;

  26. void time_0 () interrupt 1
  27. {
  28.         TL0 = 0xF6;                //设置定时初值
  29.         TH0 = 0xFF;                //设置定时初值
  30.         c++;
  31. }

  32. void main()
  33. {
  34.         uint i=0;
  35.         P1=0XFF;
  36.         P0=0X00;
  37.         Timer0Init();
  38.         ET0=1;
  39.         EA=1;
  40.         while(1)
  41.         {
  42.                 keycan();//按键       
  43.                 M11=0;
  44.                 M22=0;
  45.                 if(temp1==0)
  46.                 {
  47.                         M1=0;
  48.                 }
  49.                 if(temp1==1)
  50.                 {
  51.                         if(c<=30) M1=1;
  52.                         else      M1=0;
  53.                     if(c>114)  c=0;
  54.                 }                       
  55.                 if(temp1==2)
  56.                 {                       
  57.                         if(c<=80) M1=1;
  58.                         else      M1=0;  
  59.                         if(c>114)  c=0;
  60.                 }       
  61.                 if(sudu==1)
  62.                 {
  63.                    M2=1;
  64.                 }
  65.         }       
  66. }


  67. void keycan()//按键
  68. {
  69.         if(K1==0)
  70.         {
  71.                 delayms(10);
  72.                 if(K1==0)
  73.                 {
  74.                         temp1++;
  75.                         if(temp1>=3) temp1=0;                       
  76.                 }
  77.                 while(!K1);
  78.         }
  79.         if(K2==0)
  80.         {
  81.                 delayms(10);
  82.                 if(K2==0)
  83.                 {
  84.                         sudu=1;
  85.                 }
  86.                 while(!K2);
  87.         }       
  88. }
  89. void delayms(x)//延时
  90. {
  91.         uint i=0,j=0;
  92.         for(i=x;i>0;i--)
  93.                 for(j=110;j>0;j--);
  94. }

所有资料51hei提供下载:
单片机作业.zip (109.3 KB)
(下载次数: 132, 2018-9-28 16:42 上传)

下载积分: 黑币 -5




沙发 ID:89286 只看他
2018-9-28 20:12
thanks for sharing
板凳 ID:282457 只看他
2018-11-25 10:17
本帖最后由 qqhrchen 于 2018-11-25 10:47 编辑

这个程序肯定不能PWM调速的。
51单片机没有PWM功能,只能用定时器模拟PWM的实现。
必须用到定时器的中断,即PWM的实现是在定时中断里完成的。

地板 ID:282457 只看他
2018-11-25 10:29
本帖最后由 qqhrchen 于 2018-12-1 10:43 编辑

void T0 (void ) interrupt 0
{static unsigned char i;
   i++;
  if(i>PWMH)   //PWMH为高电平周期
    {
     PWMout=0;//1时电机转动   
     }
  else if(i>PWM) //PWM为PWM周期
   {
      PWMout=1;
      i=0;
   }
}
5# ID:750834 只看他
2020-5-13 15:13
为什么打不开啊

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版