利用c51语言实现sg90舵机从0°转到90°再从90°到0°连续运行20次,要运用到定时器0和sg90舵机的信号线的PWM
时间: 2024-05-03 21:16:34 浏览: 107
以下是利用C51实现SG90舵机运转的代码,其中使用了定时器0和PWM信号线:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM = P1^0; // PWM信号线引脚
void delay(uint i) // 延时函数
{
uint j, k;
for(j = 0; j < i; j++)
for(k = 0; k < 125; k++);
}
void PWM_sg90(uchar angle) // 控制舵机角度函数
{
uint i;
for(i = 0; i < 500; i++) // 循环500次,每次延时10us,共5000us
{
if(i < angle) // 当i小于目标角度时,PWM信号为高电平
PWM = 1;
else // 否则PWM信号为低电平
PWM = 0;
delay(1); // 延时10us
}
}
void main()
{
uchar i, j;
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 2000) / 256; // 定时器初值
TL0 = (65536 - 2000) % 256;
TR0 = 1; // 启动定时器0
while(1)
{
for(j = 0; j < 20; j++) // 运行20次
{
for(i = 0; i < 90; i++) // 0°到90°
{
PWM_sg90(i); // 控制舵机角度
delay(10); // 延时100ms
}
for(i = 90; i > 0; i--) // 90°到0°
{
PWM_sg90(i); // 控制舵机角度
delay(10); // 延时100ms
}
}
}
}
```
在上述代码中,我们定义了一个控制舵机角度的函数PWM_sg90,这个函数根据目标角度控制PWM信号线的电平,从而控制舵机的角度。
在main函数中,我们先设置定时器0的工作模式为模式1,即16位定时器/计数器;然后计算出初值,使定时器每隔20ms中断一次,最后启动定时器0。在while循环中,我们运行20次舵机的运动,每次从0°转到90°,再从90°转到0°,同时使用PWM_sg90函数控制舵机的角度。函数delay用于延时控制舵机转动的时间。
阅读全文