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定时方式1TL0 = 0xA4; //设置定时寄存器低八位初值TH0 = 0xFF; //设置定时寄存器高八位初值ET0=1; //打开定时器0的中断TR0=1; //打开定时器0EA=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、关于中断
-
定时器定时长度可通过工具算出: