刚开始学习51单片机,对定时器不是很明白, 有点云里雾里导致对以下这个程序不太理解,以下程序从网上搜到的,我拷贝到KEIL软件中运行,下载到单片机,连接舵机 可以运行,程序没有什么错误,想请教大虾:
就是这个程序中定时器0 定时器1 以及主程序中while函数他们都是怎样运行的
#include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit pwm=P0^3;//输出PWM信号
uint pwm_value=1500;//初值为1.5ms
uint value[]={1500,1000,1500,2000,1500};//
void delay_ms(uint x)
{
uint i;
while(x--)for(i=0;i<125;i++);
}
void InitTimer(void)
{
TMOD=0x11;//开定时器0,1
TH0=-20000/256;//定时20MS,20MS为一个周期
TL0=-20000%256;
TH1=-1500/256;//定时1.5MS,这时舵机处于0度
TL1=-1500%256;
EA=1;//开总断
TR0=1;//开定时器0
ET0=1;
TR1=1;//开定时器1
ET1=1;
}
void timer0(void) interrupt 1//定时器0中断函数
{
pwm=1;
TH0=-20000/256;
TL0=-20000%256;
TR1=1;
}
void timer1(void) interrupt 3//定时器1中断函数
{
pwm=0;
TH1=-pwm_value/256;
TL1=-pwm_value%256;
TR1=0;
}
void main(void)//主函数
{
uchar i;
InitTimer();
pwm_value=1500;
while(1)
{
for(i=0;i<5;i++)
{
pwm_value=value[i];//通过数组就可以改变舵机的转角度
delay_ms(1000);
}
}
}
以上程序实现:以51单片机89C52用定时器模拟PWM信号去控制舵机转角,舵机的控制是在控制线输入一个周期性的正向脉冲PWM信号,这个周期脉冲信号的高电平时通常在0.5ms~2.5ms之间,而舵机的控制频率在50HZ~200HZ之间。0.5ms为-90度,它是舵机右转极限位置、1.0ms为-45度、1.5ms为0度,这时舵机处于静止、2.0ms为+45度、2.5ms为+90度,它是舵机左转极限位置。我们只需改变正脉冲的时间,即可转变舵机转角。
打开定时器0,定时20毫秒,进入定时器0中断函数,执行pwm=1,输出高电平,同时打开定时器1,定时1.5毫秒,进入定时器1中断函数,执行pwm=0,输出低电平,执行定时器1计时到1.5ms后触发中断使得输出为0,在定时器1计时1.5毫秒的过程中,是高电平,在定时器0计时20毫秒的过程中,是低电平,这样一个周期就是20+1.5=21.5毫秒了,那为什么还说是20毫秒的周期呢
追答因为定时器0计时完进入中断后计时的寄存器被重新赋值:
TH0=-20000/256;
TL0=-20000%256;
然后打开定时器1,此时1和0是同时工作的,所以还是20ms以后,而不是定时器1工作完了0才工作
在整个函数中开定时器0 TR0=1;始终是开着的 也就是说定时器零一直在定时,一直在做0-20毫秒的周期定时 ,定时器1在这个周期的前1.5毫秒中是开着的,然后1.5毫秒后TR1=0;关闭定时器1
追答对!
本回答被提问者采纳