51单片机配置SG90舵机,精准控制角度代码
时间: 2024-01-25 20:02:25 浏览: 135
以下是51单片机控制SG90舵机精准控制角度的代码:
```C
#include <reg52.h>
#include <intrins.h>
sbit servo_pin = P1^0; // 连接舵机的IO口
void delay_us(unsigned int t) // 微秒级延时函数
{
while(t--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void servo_control(unsigned char angle) // 控制舵机转动到指定角度
{
unsigned int i;
for(i = 0; i < 50; i++) // 50Hz的PWM信号
{
servo_pin = 1;
delay_us(500 + angle * 11); // 0度对应500us,每增加1度,增加11us
servo_pin = 0;
delay_us(19500 - 500 - angle * 11); // 一个PWM周期20ms,减去高电平持续时间
}
}
void main()
{
unsigned char i;
TMOD = 0x01; // 定时器0工作在模式1,16位定时器
TH0 = 0xFC; // 定时器初值,10ms
TL0 = 0x66;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 开启总中断
while(1) // 循环控制舵机转动
{
for(i = 0; i <= 180; i++) // 0度~180度
{
servo_control(i);
delay_ms(10); // 10ms延时
}
for(i = 180; i > 0; i--) // 180度~0度
{
servo_control(i);
delay_ms(10);
}
}
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC; // 重新赋初值
TL0 = 0x66;
servo_pin = 0; // 每个PWM周期结束,将舵机IO口拉低
}
```
该代码通过计算每个PWM周期中高电平持续时间的微秒数,从而实现对舵机精准控制角度。其中,定时器0每隔10ms产生一次中断,用于分时控制舵机的转动。在主函数中,通过循环控制舵机从0度转动到180度,再从180度转动回0度,实现舵机的周期性摆动。
阅读全文