单片机STC89C52 如何控制舵机

单片机STC89C52 如何控制舵机,第1张

#include<reg52.h>//51单片机头文件

#define uint unsigned int //宏定义

#define uchar unsigned char //宏定义

void delay(uint)//延时子函数声明

void enable1(void)

void enable2(void)

sbit P1_0=P1^0//PWM信号输出端

sbit K1=P1^1

sbit K2=P1^2

sbit K3=P1^3

/****************************主函数***********************************/

void main()

{

P1_0=1//置PWM初始输出为高电平

while(1)

{

if(K1==0)

{

delay(20)

if(K1==0)

{

while(!K1)

enable1()

//while(!s2)

}

}

if(K2==0)

{

delay(20)

if(K2==0)

{

while(!K2)

enable2()

}

}

/* if(K3==0)

{

delay(20)

if(K3==0)

{

Init3

}

}

*/

}

}

void delay(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void enable1(void)

{

TMOD=0x01//设置定时器0工作方式1后面运行TR位启动

TH0=(65536-1500)/256

TL0=(65536-1500)%256//1.5ms 的高电平

EA=1//开总中断

ET0=1//开定时器0中断

TR0=1//启动定时器0

}

void enable2(void)

{

TMOD=0x10//设置定时器1工作方式1后面运行TR位启动

TH1=(65536-900)/256

TL1=(65536-900)%256//1.5ms 的高电平

EA=1//开总中断

ET1=1//开定时器1中断

TR1=1//启动定时器1

}

//设置第三种PWM方式的初始化

/*

void Init3()

{

TMOD=0x01//设置定时器0工作方式1后面运行TR位启动

TH0=(65536-1500)/256

TL0=(65536-1500)%256//1.5ms 的高电平

}

*/

/******************************中断服务程序**********************************/

void PWM1() interrupt 1 //定时器0 中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为18.5ms

{

TH0=(65536-18500)/256

TL0=(65536-18500)%256

}

else //如果上个电平为0,则下个高电平为1.5ms

{

TH0=(65535-1500)/256

TL0=(65535-1500)%256

}

P1_0=~P1_0

}

void PWM2() interrupt 3 //定时器1中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为18.5ms

{

TH0=(65536-19000)/256

TL0=(65536-19000)%256

}

else //如果上个电平为0,则下个高电平为1.5ms

{

TH0=(65535-900)/256

TL0=(65535-900)%256

}

P1_0=~P1_0

}

//定时器2设置第三种PWM波

/* void PWM3() interrupt 5 //定时器2 中断,产生方波

{

if(P1_0==1) //如果上个电平为1,则下个低电平的时间为18.5ms

{

TH0=(65536-18500)/256

TL0=(65536-18500)%256

}

else //如果上个电平为0,则下个高电平为1.5ms

{

TH0=(65535-1500)/256

TL0=(65535-1500)%256

}

P1_0=~P1_0

}

*/

辛苦之作,如果能够回答你的问题,别忘了给分哦~~喵喵

首先开明白你的舵机控制原理,它要求输入的脉冲期是20ms,其中高电平在1.5ms时舵臂在0位

在2..0ms时舵臂在右90度位 在1.5ms时舵臂在左90度位 舵机有3根线,一根线是电源正,另一根电源负,还有一根(一般为白线)是控制线,就是输入的脉冲信号的

程序中可以用两个定时器,一个定时20ms,另外一个定时1到2ms可变,就可以让舵机动作

下面程序供参考,先不考虑按键问题,能让舵机动作就 成功一大半

/双定时器产生PWM波,控制舵机

//定时器0负责置高电平和控制定时器1的开停,定时器1负责置低电平

#include<STC12C5A.H>

#define uchar unsigned char

#define uint unsigned int

sbit PWM=P3^7//经试验,此引脚信号可以直接送舵机不用放大

uchar b=1500//定时1.5ms的初值

void Delay1ms(uint i) //1ms延时程序

{

uint j

for(i>0i--)

{

for(j=0j<125j++)

{}

}

}

void main()

{

b=1500

TMOD=0X11

TH0=(65536-20000)/256

TL0=(65536-20000)%256

TH1=(65536-b)/256

TL1=(65536-b)%256

ET0=1

EA=1

TR0=1

PWM=1

P1M0=0X0F//低4位配置为推挽输出 ,普通51单片机无此寄存器

P1M1=0X00

while(1)

{

P1=0x0a//这是让行走电机正向转动的,用的是L298N模块

b=1500Delay1ms(2000)//直行

b=1000Delay1ms(1000)//左转

b=1500Delay1ms(2000)//直行

b=2000Delay1ms(1000)//右转

b=1500Delay1ms(2000)//直行

P1=0x05//这是让行走电机反向转动的

b=1500Delay1ms(2000)//后退

b=1000Delay1ms(1000)//后左转

b=1500Delay1ms(2000)//后退

b=2000Delay1ms(1000)//后右转

b=1500Delay1ms(2000)//后退

}

}

void timer0()interrupt 1//定时器0中断

{

TH0=(65536-20000)/256

TL0=(65536-20000)%256

PWM=1

TR1=1

ET1=1

}

void timer1()interrupt 3//定时器1中断

{

TH1=(65536-b)/256//改变b的值就可转向

TL1=(65536-b)%256

PWM=0

TR1=0

ET1=0

}

首先要保证协议是正确的! 可以先把舵机控制板接到电脑上!用电脑端的串口调试助手!发送协议数据!看看舵机控制板有动作没有! 然后,再将单片机连接到电脑的串口上,同样单片机向电脑发送串口数据,看看是否是正确的协议数据!都没有问题了!再把舵机控制板与单片机通过串口连接!在测试是否正确! 按照上面的方法!都可以解决问题! 有问题请留言!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11306365.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存