永发信息网

基于Proteus的直流电机调速c程序

答案:2  悬赏:30  手机版
解决时间 2021-11-21 17:59
  • 提问者网友:棒棒糖
  • 2021-11-21 01:24
基于Proteus的直流电机调速c程序
最佳答案
  • 五星知识达人网友:酒者煙囻
  • 2021-11-21 02:07
#include
#define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振
unsigned int duty[]={0,
0xff9c,0xff38,0xfed4,
0xfe70,0xfe0c,0xfda8,
0xfd44,0xfce0,0xfc7c,
0xfc18};//PWM高电平时间 
unsigned char i=0;
sbit P32 = P3^2;
sbit P33 = P3^3;
sbit PWMOUT = P2^0;
sbit PWMIN1 = P2^1;
sbit PWMIN2 = P2^2;
bit flag = 1;//PWM输出电平状态,1为输出高电平时间,0为输出低电平时间    
void delay10ms(int n); 
void  main(void)
{
  PWMOUT = 0;//初始化L293D ,停止电机
  PWMIN1 = 0;
  PWMIN2 = 1;
  EA = 1;  //开总中断
  IT0 = 1;  //中断方式为跳变
  IT1 = 1;
  EX0 = 1;  //打开外部中断0  
  EX1 = 1;  //打开外部中断1 
  ET0 = 1;  //开定时器0中断允许
  TMOD = 0x01; //设置定时方式
  while(1)  //等待中断
  {
  
  }
}
//10ms延时函数
void delay10ms(int n)
{
    int i=0,j;
  while(n--)
  { 
     for(i=0;i<10;i++)
     {
          for(j = 0; j < 125; j++);
      }
  }
}
void keySpeeddownISR() interrupt 0 //按键中断服务程序
{
  EA = 0;   //关中断
  delay10ms(2);  //延时消抖
  if (!P32)    //确认按键按下,滤除键盘抖动干扰
  {//减少PWM高电平时间 
   if(i>0)
    i--;  
   if((TR0=1) && (i == 0))
   {   
    TR0 = 0;   
    PWMOUT = 0;
   }
  }
  EA = 1;
}
void keySpeedupISR() interrupt 2 //按键中断服务程序
{
  EA = 0;   //关中断
  delay10ms(2);  //延时消抖
  if (!P33)    //确认按键按下,滤除键盘抖动干扰
  {//增加PWM高电平时间 
   if(i<=10)
    i++;
   if((TR0 == 0) && (i > 0))   
   {//启动PWM,电机顺时针旋转
    PWMIN1 = 0;
    PWMIN2 = 1;
    PWMOUT = 1;
    TH0 = duty[i]>>8;
    TL0 = duty[i]&0xff;
    TR0 = 1;
    flag = 1;   
   }
  }
  EA = 1;
}
void T0ISR() interrupt 1 //定时器0中断服务程序
{
  EA = 0;   //关中断
  if(flag)
  {//高电平时间结束,输出低电平补齐PWM周期
   PWMOUT = 0;
   TH0 = (65535-(duty[i]-Tpwm))>>8;
   TL0 = (65535-(duty[i]-Tpwm))&0xff;
   flag = 0;  
  }else
  {//周期结束
   PWMOUT = 1;
   TH0 = duty[i]>>8;
   TL0 = duty[i]&0xff;
   flag = 1;
  } 
  EA = 1;
}
仅供参考。学单片机还需自己多多思考和练习

全部回答
  • 1楼网友:我住北渡口
  • 2021-11-21 02:42
我不会哦
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯