之前说到利用51单片机输出pwm,但是输出的pwm是固定占空比的,如果想要改变占空比,还得回过头来修改程序并重新烧写进单片机。这样做的话不但麻烦、效率低,还又把芯片的可烧写次数减少了一次,虽然51的芯片现在很便宜,但能省点就省点,能不浪费就不浪费,哈哈,开玩笑啦!最主要的还是为了灵活性,为此特地通过加入按键的功能来实现动态修改输出的pwm的占空比。这样在用pwm控制电机的时候就能使用按键来控制电机转速了。废话不多说,见下:
代码示例
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar time;
double count=26; //定义占空比,并初始占空比为26%
sbit PWM=P2^0; //P2^0口输出PWM
sbit key_add=P3^4; //电机加速的按键 的I/O口
sbit key_dec=P3^5; //电机减速的按键 的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(y=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>=32) //限定占空比上限
{
count=32;
}
}
while(!key_add);
}
}
void Motor_dec()//电机减速
{
if(key_dec==0)
{
delayxms(2);//此处时间不能太长,否者会的中断产生冲突
if(key_dec==0)
{
count-=0.5; //每按一次减速按键占空比减0.5
if(count<=25) //限定占空比下限
{
count=25;
}
}
while(!key_dec);
}
}
/***********定时器0初始化***********/
void timer0_init()
{
TMOD=0x01; //定时器0工作于方式1
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
ET0=1;
EA=1;
}
/**************定时0中断处理******************/
void timer0_int() interrupt 1
{
TR0=0; //设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
time++;
if(time<count) //count为占空比
{
PWM=1; //输出高电平
}
else
PWM=0;
if(time>=100)
{
time=0;
}
}
我特地标注了重要部分程序的注释。另外,可以在程序中修改按键每次增加或者减少的占空比,但有的时候发现在按键调节占空比时,不想占空比一直增加或者减少下去,还可以在程序里面修改限定占空比的上下限,当达到上限或下限时,相应的增加或减少占空比的按钮这时就不再增加或者减少占空比了。这样在电机控制时就可以防止不小心让电机速度增加到规定速度以上或以下了。这些在程序注释里面课看见在哪里改。除此之外,还可以加进来很多功能。这里就不举相应的子了。