51单片机按键控制舵机旋转
一、舵机工作原理
1、这里介绍的sg90的可旋转角度为 0~180°
2、sg90有三条线,橙色(PWM)红色(5V)棕色(GND)
3、PMW的范围为0.5ms2.5ms,相应的旋转角度为0180°
二、控制代码
1、接线图如下(这里用到的PWM引脚为at89c52中的 P2.1):
2、实现的功能介绍:按下k2旋转角度为0°(复位),按下k3旋转角度递增,按下k4旋转角度递减,按下k5旋转角度最大(180°)
3、代码如下:
#include<reg52.h>
#include<intrins.h>
int count = 0; //全局变量,监控pwm周期
int jd=5; //初始化旋转角度,5是通过定时器定时长度和sg90高电平持续时间计算出来的(以下会说明)
sbit sg90=P2^1;
sbit key1 = P3^4;
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
//延时函数
void delay(unsigned char i){
unsigned int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
//定时器初始化函数
void Time0_init(){
TMOD=0X01; //T0定时方式1
TL0 = 0xA4; //设置定时寄存器低八位初值
TH0 = 0xFF; //设置定时寄存器高八位初值
ET0=1; //打开定时器0的中断
TR0=1; //打开定时器0
EA=1; //开总中断
}
void main(){
delay(300);
Time0_init();
while(1){
//复位键
if(key1 == 0){
delay(50);
if(key1 == 0){
jd = 5;
count = 0;
}
}
//角度递增
if(key2 == 0){
delay(50);
if(key2 == 0){
if(jd>=5 && jd<=24){
jd++;
}
count = 0;
}
}
//角度递减
if(key3 == 0){
delay(50);
if(key3 == 0){
if(jd>=6 && jd<=25){
jd--;
}
count = 0;
}
}
//最大角度
if(key4 == 0){
delay(50);
if(key4 == 0){
jd = 25;
count = 0;
}
}
}
}
void Time_server() interrupt 1{
TL0 = 0xA4; //设置定时寄存器低八位初值
TH0 = 0xFF; //设置定时寄存器高八位初值
if(count<=jd){
sg90 = 1;
}else{
sg90 = 0;
}
count++;
if(count >= 200){
sg90 = 0;
count = 0;
}
}
4、关于中断
-
定时器定时长度可通过工具算出: