51单片机控制舵机转角的C语言程序

刚开始学习51单片机,对定时器不是很明白,有点云里雾里导致对以下这个程序不太理解,以下程序从网上搜到的,我拷贝到KEIL软件中运行,下载到单片机,连接舵机可以运行,程序没... 刚开始学习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度,它是舵机左转极限位置。我们只需改变正脉冲的时间,即可转变舵机转角。
展开
 我来答
意法半导体(中国)投资有限公司 2020-01-15
展开全部
单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
断桥阳
2014-04-06
知道答主
回答量:14
采纳率:0%
帮助的人:6.8万
展开全部
定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正脉冲宽度为1.5ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了!
德晟智能
2024-09-04 广告
舵机在机器人上的应用非常广泛,它通常作为机器人的关键驱动执行部件,用于实现精确的角度控制和位置定位。以下是舵机在机器人上的一些具体应用:1、关节驱动:在仿人型机器人、机械臂或多足机器人中,舵机被用于驱动各个关节的运动。通过控制舵机的旋转角度... 点击进入详情页
本回答由德晟智能提供
夏侯珈蓝德0Ijb04
2014-04-07 · TA获得超过283个赞
知道小有建树答主
回答量:185
采纳率:83%
帮助的人:92.4万
展开全部
舵机频率50hz就是说一周期是20ms,占空比在百分之2.5到12.5可以从-90转到90度
单片机内部有工作的晶振频率,定时器就是基于这个频率计时,根据程序可以知道,20ms计时20000,所以计时器每加一的时间为1us,这个程序的意思就是先工作定时器0,20ms后输出置为1并打开定时器1,定时器1计时到1.5ms后触发中断使得输出为0,即占空比为1.5/20=百分之7.5,中间位置
定时器的寄存器加到0会触发中断,所以寄存器都写负数,如想要20ms就写-20000,这样往上加到0需要的计数的次数就为20000,一次计数为1us,所以为20ms,而寄存器是由两个八位寄存器组成的,所以20000要分开写
建议有时间可以去看一下郭天祥老师的51单片机视频,能搜到而且不多,貌似第三集是讲的定时器
更多追问追答
追问
打开定时器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才工作
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式