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

对at89c51编程,利用L298驱动,产生pwm波形控制直流电机调速,两个按钮分别控制加速、减速。求完整c程序。本人初学,不知道产生的脉冲如何输出,怎样定义脉冲输出端口... 对at89c51编程,利用L298驱动,产生pwm波形控制直流电机调速,两个按钮分别控制加速、减速。求完整c程序。本人初学,不知道产生的脉冲如何输出,怎样定义脉冲输出端口,哪位高手能帮忙解答,谢啦! 展开
 我来答
uclearzgh
推荐于2018-05-04 · TA获得超过103个赞
知道小有建树答主
回答量:103
采纳率:0%
帮助的人:101万
展开全部

#include<reg51.h>

#define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振

unsigned int duty[]={0,/*0*/

0xff9c/*100us*/,0xff38/*200us*/,0xfed4/*300us*/,\

0xfe70/*400us*/,0xfe0c/*500us*/,0xfda8/*600us*/,\

0xfd44/*700us*/,0xfce0/*800us*/,0xfc7c/*900us*/,\

0xfc18/*1000us*/};//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;

}

仅供参考。学单片机还需自己多多思考和练习

帐号已注销
2011-03-16 · 超过23用户采纳过TA的回答
知道答主
回答量:157
采纳率:0%
帮助的人:25.3万
展开全部
我不会哦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式