大家好,又见面了,我是你们的朋友全栈君。
舵机三根线的接法:黄线接信号线,红线接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设置成方式1
TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = 0xa4;
ET0 = 1;
TR0 = 1;
EA=1;
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
TR0 = 0;
TH0 = 0xff; // 0.1ms
TL0 = 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
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149403.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...