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

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

51单片机控制舵机程序

#include <reg52h>

#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; //025ms

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<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit P3_2=P3^2; //保留

sbit P3_4=P3^4; //led控制

sbit P3_6=P3^6; //舵机控制

sbit P3_7=P3^7;

sbit P2_0=P2^0; //电机速度控制 (没用)

sbit P2_1=P2^1;

uchar io1=20,io2=20,sdd1=1,sdd2=1; //舵机及电机初始状态变量

uchar temp[1],cmd1[4],cmd2[4],cmd3[4],cmd4[4],cmd5[4]; //存放WIFI串口发下来的数据

uchar IRCOM[7];

void chaoshengbo_conv(void);

/

名称 : Delay_1ms()

功能 : 延时子程序,延时时间为 1ms x

输入 : x (延时一毫秒的个数)

输出 : 无

/

void Delay_1ms(uint i)//1ms延时

{

uint x,j;

for(j=0;j<i;j++)

for(x=0;x<=300;x++);

}

void delay_ms(uint z)//延时函数

{

uint x,y;

for(x=2000;x>0;x--)

for(y=z;y>0;y--);

}

void delay1_us(uint z)//延时函数

{

uint x,y;

for(x=200;x>0;x--)

for(y=z;y>0;y--);

}

void forward(void)

{

P1=0xaa;

}

void right(void)//右转

{

P1=0xa5;

}

void left(void)//左右

{

P1=0x5a;

}

void back(void)//后退

{

P1=0x55;

}

void stop(void)//停止

{

P1=0xff;

}

/

名称 : Com_Int()

功能 : 串口中断子函数

输入 : 无

输出 : 无

/

uchar cont=0;

void UART() interrupt 4//串口

{

RI=0;

temp[cont]=SBUF;

if(SBUF!=0xff)

{

if(temp[0]==0x01)

{

cmd1[cont]= temp[cont];

}

else if(temp[0]==0x02)

{

cmd2[cont]= temp[cont];

}

else if(temp[0]==0x03)

{

cmd3[cont]= temp[cont];

}

else if(temp[0]==0x04)

{

cmd4[cont]= temp[cont];

}

else if(temp[0]==0x05)

{

cmd5[cont]= temp[cont];

}

cont++;

}

else

{

cont=0;

}

}

/

名称 : Com_Init()

功能 : 串口初始化,晶振110592,波特率9600,使能了串口中断

输入 : 无

输出 : 无

/

void Com_Init(void)

{

TMOD = 0x21;

PCON = 0x00;

SCON = 0x50;

TH1 = 0xFa; //220592晶振设置波特率 9600

TL1 = 0xFa;

TR1 = 1; //启动定时器1

RCAP2H=0xff;

RCAP2L=0x54;

TR2=1;

ET2=1;

EA=1; //开总中断

// EX1=1; //外部中断1 允许

// IT1=1; //中断由下降沿 触发

PCON=0;

IP=0X10; //中断优先顺序为PX1、PS

ES = 1; //开串口中断

EA = 1; //开总中断

cmd5[2]=15; //舵机初始位置

}

uchar t1=0,t2=0;

void timer2() interrupt 5 //舵机频率50hz 100us一次

{

RCAP2H=0xff;

RCAP2L=0x54;

TF2=0;

t1++;

t2++;

if(t1==io1) //io 为串口接收到的速度数据十进制 从10到30

{

P3_6=0; //舵机控制端1

}

else if(t1==200)

{

P3_6=1;

t1=0;

}

if(t2==io2) //io 为串口接收到的速度数据十进制 从10到30

{

P3_7=0; //舵机控制端(2)

}

else if(t2==200)

{

P3_7=1;

t2=0;

}

}

uchar sd1=0,sd2=0;

void timer0() interrupt 1 //电机频率100HZ

{

TH0=0xfe;

TL0=0x0b;

sd1++;

sd2++;

if(sd1==sdd1) //sdd 为串口接收到的速度数据十进制 从0到30

{

P2_0=0;

}

else if(sd1==31)

{

P2_0=1;

sd1=0;

}

if(sd2==sdd2) //sdd 为串口接收到的速度数据十进制 从0到30

{

P2_1=0;

}

else if(sd2==31)

{

P2_1=1;

sd2=0;

}

}

/

名称 : Main()

功能 : 主函数

输入 : 无

输出 : 无

/

void main()

{

Delay_1ms(100);

P1=0xff;

P2=0xff;

P3=0xff;

Com_Init();

while(1) // 为WIFI *** 控

{

if(cmd1[1]==0x01)

{

forward();

}

else if(cmd1[1]==0x02)

{

left();

}

else if(cmd1[1]==0x03)

{

right();

}

else if(cmd1[1]==0x04)

{

back();

}

else if(cmd1[1]==0x00)

{

stop();

}

if(cmd3[1]==0x01)//cmd3[1]==0x01 为WIFI *** 控灯

{

P3_4=1;// 灯亮

}

else if(cmd3[1]==0xfe)

{

P3_4=0;// 灯灭

}

else if(cmd3[1]==0x02)//cmd3[1]==0x02 为WIFI *** 控蜂鸣器

{

P3_5=0; // 蜂鸣器鸣叫

}

else if(cmd3[1]==0x03)//cmd3[1]==0x02 为WIFI *** 控蜂鸣器

{

P3_5=1; // 蜂鸣器停止

}

if(temp[0]==0x04) //cmd3[1]==0x01 为WIFI *** 控电机速度

{

if(cmd4[1]==0x01)//控制小车行驶速度

{

sdd1=cmd4[2]; //cmd4[1] 为串口接收到的速度数据十进制 从10到30

}

else if(cmd4[1]==0x02)

{

sdd2=cmd4[2]; //cmd4[1] 为串口接收到的速度数据十进制 从10到30

}

}

if(temp[0]==0x05)

{

if(cmd5[1]==0x01)//cmd5[0]==0x05 为WIFI *** 控摄像头舵机

{

io1=cmd5[2]; //cmd5[2] 为串口接收到的速度数据十进制 从10到30

}

else if(cmd5[1]==0x02)

{

io2=cmd5[2]; //cmd5[2] 为串口接收到的速度数据十进制 从10到30

}

}

Delay_1ms(1);

}

}

先要知道舵机控制的原理,控制波形PWM的占空比决定了舵机的控制角度,你需要每个角度它所对应的占空比是多少,从1个角度转到另1个角度是占空比慢慢转变的过程,而波形的周期是不变的。接下来就是单片机控制PWM波形占空比的实现,这个比较简单,可以用定时器也可以不用,具体程序思路就不说了,每个人思路都不一样,能保证输出波形正确就OK了

以上就是关于求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。全部的内容,包括:求一段简单的51单片机的程序,通电后舵机顺时针旋转180度,2秒后恢复。、用AT89S52 wifi控制 L298N驱动四个马达 加一个可以转动的SG90 9G舵机舵机 的程序、我想用AVR的一个定时器中断来控制舵机的左右45度转动,请问中断程序怎么写呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10639586.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存