舵机三根线的接法:黄线接信号线,红线接vcc,褐色线接GND
舵机控制原理:通过控制PWM来控制舵机转动的角度,关于PWM的知识可以去智能小车专栏进行学习,转动周期设置为20ms,控制高电平的时间来进行舵机转动的角度。
对于180°舵机
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180
这段代码中包含了定时器,中断,pwm的知识,都可以去51智能小车专栏中学习,其中定时器选择了定时器1,运用了两个字符型变量其中timer1决定了高电平的时间,count起到了计数器的功能,运用if语句进行判断两个字符型变量的大小来决定什么时候为高电平是么时候为低电平
// _nop_()延时一个机器周期
#include <reg52.h>
#include <Delay.h>
sbit PWM = P3^2; //设定PWM输出的I/O端口
unsigned char count = 0;
unsigned char timer1 ;
/*
对于180°舵机
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180
*//*延时程序*//*定时器T0初始化*/
void Timer0_Init()
{TMOD &= 0x00;TMOD |= 0x01; //定时器T0设置成方式1TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHzTL0 = 0xa4;ET0 = 1; TR0 = 1; EA=1; }/*T0中断初始化*/
void Time0_Init() interrupt 1
{TR0 = 0; TH0 = 0xff; // 0.1msTL0 = 0xa4;if(count <= timer1) //5==0° 15==90°{ PWM = 1; }else { PWM = 0; }count++;if (count >= 200) //T = 20ms清零{ count = 0; }TR0 = 1; //开启T0
}
void main()
{Timer0_Init();while(1){timer1 =5;//舵机恢复到0度的位置count=0;//让定时器重新计数Delay(3000);timer1 =10;//舵机旋转45度count=0;Delay(3000);timer1=15;//舵机转动90度count=0;Delay(3000);}
}
简单运用了一个延时函数方便代码以后的移植性
Delay.c//1ms级的延时函数
void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif