
#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
}
首先要保证协议是正确的! 可以先把舵机控制板接到电脑上!用电脑端的串口调试助手!发送协议数据!看看舵机控制板有动作没有! 然后,再将单片机连接到电脑的串口上,同样单片机向电脑发送串口数据,看看是否是正确的协议数据!都没有问题了!再把舵机控制板与单片机通过串口连接!在测试是否正确! 按照上面的方法!都可以解决问题! 有问题请留言!欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)