m0_74919493 2023-06-10 20:51 采纳率: 0%
浏览 113
已结题

51单片机输出pwm时无法调节频率,如何解决?

通过以下代码用51单片机输出pwm时可以调节占空比 但无法设定频率 帮忙看下是代码的问题还是什么问题 用keil5 用普中烧录


#include<reg51.h>
 
#define uint unsigned int 
#define uchar unsigned char        
 
uchar time; 
double count=55; //定义占空比,并初始占空比为55%
sbit PWM=P2^0;      //P2^0口输出PWM 
sbit key_add=P3^1;   //电机加速的按键 的I/O口
sbit key_dec=P3^0;   //电机减速的按键 的I/O口
 
 
/************函数声明**************/
void delayxms(uint z); //延时
void Motor_add();   //电机加速,即增加占空比
void Motor_dec();    //电机减速,即减少占空比
void timer0_init();  //定时器0初始化
 
/*********主函数********************/
void main()
{  
 timer0_init();
 delayxms(5);
 while(1)
 {
  Motor_add();
  Motor_dec();
 }
}
 
/****************延时处理**********************/
void delayxms(uint z) //延时xms程序
{
    uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
 
 
void Motor_add()  //电机加速
{
  if(key_add==0)
  {
   delayxms(2); //此处时间不能太长,否者会的中断产生冲突
  if(key_add==0)
  {
   count+=0.5; //每按一次加速按键占空比加0.5
   if(count>=70)     //限定占空比上限
 {
  count=70;
 }
  }
 while(!key_add);
  }
}
 
void Motor_dec()//电机减速
{
 if(key_dec==0)
 {
  delayxms(2);//此处时间不能太长,否者会的中断产生冲突
  if(key_dec==0)
  {
   count-=0.5;   //每按一次减速按键占空比减0.5
   if(count<=30)    //限定占空比下限
   {
 count=30;
   }
  }
 while(!key_dec);
   }
}
 
/***********定时器0初始化***********/
void timer0_init()
{
  TMOD=0x01; //定时器0工作于方式1
  TH0=(65536-20)/256;
  TL0=(65536-20)%256;
  TR0=1;
  ET0=1;
  EA=1;
}
 
/**************定时0中断处理******************/
void timer0_int() interrupt 1 
{
 
  TR0=0;    //设置定时器初值期间,关闭定时器
  TH0=(65536-20)/256;
  TL0=(65536-20)%256;
  TR0=1;
  
  time++;
  if(time<count)   //count为占空比
  {
 PWM=1;    //输出高电平
  }
  else 
 PWM=0; 
  if(time>=100)
  {
 time=0;
  }
 }

  • 写回答

10条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 6月18日
  • 创建了问题 6月10日