用AT89S52 wifi控制 L298N驱动四个马达 加一个可以转动的SG90 9G舵机舵机 的程序
1个回答
展开全部
#include<reg52.h>
#include<intrins.h>
#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()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x21;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFa; //22.0592晶振设置波特率 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);
}
}
#include<intrins.h>
#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()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
TMOD = 0x21;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFa; //22.0592晶振设置波特率 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);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询