求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。

求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。,第1张

51单片机控制舵机程序

#include <reg52.h>

#define Stop 0 //宏定义,停止

#define Left 1 //宏定义,左转

#define Right 2 //宏定义,右转

sbit ControlPort = P2^0//舵机信号端口

sbit KeyLeft = P1^0//左转按键端口

sbit KeyRight = P1^1//右转按键端口

sbit KeyStop = P1^2//归位按键端口

unsigned char TimeOutCounter = 0,LeftOrRight = 0//TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志

void InitialTimer ( void )

{

TMOD=0x10//定时/计数器1工作于方式1

TH1 = ( 65535 - 500 ) / 256//0.25ms

TL1 = ( 65535 - 500 ) % 256

EA=1//开总中断

ET1=1//允许定时/计数器1 中断

TR1=1//启动定时/计数器1 中断

}

void ControlLeftOrRight ( void ) //控制舵机函数

{

if( KeyStop == 0 )

{

//while ( !KeyStop )//使标志等于Stop(0),在中断函数中将用到 LeftOrRight = Stop

}

if( KeyLeft == 0 )

{

//while ( !KeyLeft )//使标志等于Left(1),在中断函数中将用到 LeftOrRight = Left

}

if( KeyRight == 0 )

{

//while ( !KeyRight )//使标志等于Right(2),在中断函数中将用到 LeftOrRight = Right

}

#include<reg52.h>typedef unsigned int uinttypedef unsigned char ucharsbit pwm=P0^3//输出PWM信号uchar count=0uint pwm_value=1500//初值为1.5msuint value[]={1500,1000,1500,2000,1500}//void delay_ms(uint x){uint iwhile(x--)for(i=0i<125i++)}void InitTimer(void){TMOD=0x11//开定时器0,1TH0=-20000/256//定时20MS,20MS为一个周期TL0=-20000%256TH1=-1500/256//定时1.5MS,这时舵机处于0度TL1=-1500%256EA=1//开总断TR0=1//开定时器0ET0=1TR1=1//开定时器1ET1=1}void timer0(void) interrupt 1//定时器0中断函数{pwm=1TH0=-20000/256TL0=-20000%256TR1=1count++}void timer1(void) interrupt 3//定时器1中断函数{pwm=0TH1=-pwm_value/256TL1=-pwm_value%256TR1=0}void main(void)//主函数{uchar iInitTimer()pwm_value=1500while(1){for(i=0i<5i++){pwm_value=value[i]//通过数组就可以改变舵机的转角度delay_ms(1000)}}}

定时器0表示的是脉冲总周期20ms,定时器1表示的是正脉冲宽度(如pwm_value = 1500时表示正脉冲宽度为1.5ms), 而while循序只是为了改变正脉冲宽度。运行过程是:定时器0和定时器,1同时开启,此时pwm = 1,定时器1的时间到了之后pwm = 0,并关闭定时器1,等待脉冲总周期达到20ms即定时器0中断,在定时器0的中断服务中又将pwm赋值为1并开启定时器1……以这样的方式循环就可以控制舵机转动了!


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

原文地址: http://outofmemory.cn/yw/11111292.html

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

发表评论

登录后才能评论

评论列表(0条)

保存