五线舵机驱动程序_51单片机舵机控制系统 驱动设计完整版 带仿真和程序

该博客详细介绍了使用STC80C51单片机实现五线舵机驱动的完整程序设计,包括定时器0初始化、毫秒延时函数、按键扫描、LED显示以及主函数。通过按键控制舵机的角度,并通过LED灯显示当前角度状态。提供完整的代码实现,适合电子爱好者和初学者参考。
摘要由CSDN通过智能技术生成

/*******************************************************

*****************************************************

StC80C51 控制舵机驱动程序

******************************************************/

#include //STC80C51 单片机头文件

sbit LED_0=P2^0; //0度指示灯

sbit LED_45=P2^1; //45度指示灯

sbit LED_90=P2^2; //90度指示灯

sbit LED_135=P2^3; //135度指示灯

sbit LED_180=P2^4; //180度指示灯

sbit PWM_JIA=P3^6; //角度加按键

sbit PWM_JIAN=P3^7; //角度减按键

sbit MOTOR_IN=P1^7; //舵机信号输入角

unsigned char count; //定时器中断次数

unsigned char jiaodu;//角度参数

/************************************

*********毫秒延时函数************

************************************/

void Delay(unsigned char xms)

{

unsigned char i,j;

for(i=xms;i>0;i--)

for(j=125;j>0;j--);

}

/************************************

*********定时器0初始化函数***********

************************************/

void Time0_init()

{

TMOD=0X01; //定时器工作在方式1

IE=0X82;

TH0=0XFE;

TL0=0X33; //定时0.5毫秒中断一次

TR0=1;  //打开定时器

}

/************************************

*********按键扫描函数***********

************************************/

void KeyScan()

{

if(PWM_JIA==0)  //角度增加按键是否按下

{

Delay(10);  //延时10毫秒消抖

if(PWM_JIA==0) //确定按键按下

{

jiaodu++;

count=0;

if(jiaodu ==6) //如果角度参数为6

jiaodu =5; //如果角度参数复位为5

while(PWM_JIA==0); //等待按键松开

}

}

if(PWM_JIAN==0)//角度减少按键是否按下

{

Delay(10); //延时10毫秒消抖

if(PWM_JIAN==0)//确定按键按下

{

jiaodu--;

count=0;

if(jiaodu ==0)//如果角度参数为0

jiaodu =1;//如果角度参数复位为1

while(PWM_JIAN==0);//等待按键松开

}

}

}

/************************************

*********LED显示函数***********

************************************/

void Display()

{

switch(jiaodu)

{

case 1:            //如果角度参数为1,LED1亮

P2=0XFF;

LED_0=0;

break;

case 2:           //如果角度参数为2,LED2亮

P2=0XFF;

LED_45=0;

break;

case 3:           //如果角度参数为3,LED3亮

P2=0XFF;

LED_90=0;

break;

case 4:           //如果角度参数为4,LED4亮

P2=0XFF;

LED_135=0;

break;

case 5:           //如果角度参数为5,LED5亮

P2=0XFF;

LED_180=0;

break;

}

}

/************************************

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

************************************/

void main()

{

jiaodu=1;  //初始化角度参数为1

count=0; //初始化定时器中断次数为0

Time0_init(); //调用定时器0初始化函数

while(1)

{

KeyScan(); //调用按键扫描函数

Display(); //调用LED显示函数

}

}

/************************************

*********定时器0中断服务函数***********

************************************/

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

在上一期的项目:最简单DIY的51蓝牙遥控小车设计方案 访问地址是:https://www.cirmall.com/circuit/20328源码里面有舵机控制部分的程序,但是被我注释掉了,由于舵机控制还是比较复杂,这里还是开一个专题来讲解51单片机如何控制180度舵机。接线请看详细的程序注解吧,学过51肯定啃得动的。 #include "reg52.h" unsigned char count; //0.5ms 次数标识 sbit pwm =P2^7 ; //PWM信号输出,接舵机的数据线 sbit jia =P3^7; //角度增加按钮 sbit jan =P3^6; //角度减少按钮,低电平触发 unsigned char jd; //角度标识 1.0ms->45 1.5->90 2.0->135 2.5->180 void delay(unsigned char i)//普通延时函数 { unsigned char j,k; for(j=i;j>0;j--) for(k=125;k>0;k--); } void Time0_Init() //定时器0初始化 { TMOD = 0x01; //定时器0工作在方式1,16位增计数定时器,16位全是1,最大计数值是65535,就溢出了 IE = 0x82;//EA=1全局中断允许,ET0=1,定时器中断允许 TH0 = 0xfe;//(65536-N)/256=0xef=254推出N=512,N就是需要计数的个数,机器周期是1.09us,所以 //512*1.09us=0.5ms,这时候舵机为0度,1ms是45度,2.5ms是180度,其他的类推 TL0 = 0x33; //11.0592MHz晶振的单片机,导致0.5ms计数器溢出一次,产生定时器中断 TR0=1; //开启定时器 } void Time0_Int() interrupt 1 //定时器0中断服务程序 { TH0 = 0xfe; //重新装载初值 TL0 = 0x33; if(count< jd) //判断计数次数是否小于标识 pwm=1; //输出高电平PWM else pwm=0; //低电平PWM count=(count+1); //计数次数继续增加 count=count@; //计数次数必须小于40,因为0.5ms*40=20ms,这是舵机PWM的固定周期 } void keyscan() //按键扫描 { if(jia==0) //按下增加按钮 { delay(10); //消除抖动 if(jia==0) //按下增加按钮 { jd++; //标识增加,一共有5档,jd=1对应0度,jd=2对应0,45度,jd=3对应90,4对应135,5对应180度 count=0; //计数清0,当count加到2的时候,溢出两次,时间是0.5*2=1ms,对应舵机转到45度 if(jd==6) jd=5; //标识清0 while(jia==0); //等待按键释放 } } if(jan==0) //按下减少按钮 { delay(10); if(jan==0) { jd--; //同理 count=0; if(jd==0) jd=1; //复位 while(jan==0); } } } void main() { jd=1; count=0; Time0_Init(); while(1) { keyscan(); //死循环,按键检测 } } 程序分析结束了。 总结: 根据工作原理,舵机的具体控制方法就是需要一个20ms左右的时基脉冲, 该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。 脉冲宽度从0.5ms~2.5ms,相对应舵盘的位置为0~180度,呈线性变化。 ***************一般舵机脉冲宽度20ms,高电平宽度与角度对应关系*********** 0.5ms————0度; 1.0ms————45度; 1.5ms————90度; 2.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值