我从论坛上把串口通信的移植过来的程序,电机部分跟这个不太一样,,可是点在论坛上下载的上位机软件就是动不了啊。。。求大神指点
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void motor_r_z(void);//右边电动机正转
void motor_l_z(void);//左边电动机正转
void motor_r_f(void);//右边电动机反转
void motor_l_f(void);//左边电动机反转
void back(void); //小车后退
void go(uchar,uchar);//小车前进
void stop(void);//小车停止
void left(void);//小车左转
void right(void);//小车右转
sbit PWM1=P2^5;
sbit PWM2=P2^4;
sbit PWM3=P2^1;
sbit PWM4=P2^2;
sbit EN1=P2^0;
sbit EN2=P2^3;
sbit sound=P2^7;
uchar Buffer =0; //从串口接收的数据
uint URTAReceivedCount=0,n=1;
uchar data Tempdatatable[5],CommandDatatable[5];//数据包
uchar data t_0;
uchar data motor_r;
uchar data motor_l;
uchar data Value;
uchar data mid;
void init()//初始化液晶、接收中断方式
{
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TH0=0xff;
TL0=0xf6;
SM0=0;
SM1=1;
REN=1;
TR0=1;//开T0中断
ET0=1;//T0允许中断
EA=1;
TR1=1;
P2=0;
sound=1;
}
/*void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}*/
void go(uchar left_motor,uchar right_motor)//直行
{
Value=right_motor;
motor_r_z();
Value=left_motor;
motor_l_z();
}
void motor_r_z(void)//右边电动机正转
{
motor_r=0x64+Value;
EN1=1;
}
void motor_l_z(void)//左边电动机正转
{
motor_l=0x64-Value;
EN2=1;
}
void stop(void)
{
EN2=0;
EN1=0;
}
void time0(void) interrupt 1 using 2
{
TR0=0;
TH0=0xff;
TL0=0xf6;
++t_0;
ACC=t_0;
CY=0;
ACC-=motor_r;
if(CY==1)
{
PWM1=1;
PWM2=0;
goto PWM_2;
}
PWM1=0;
PWM2=1;
PWM_2:
ACC=t_0;
CY=0;
ACC-=motor_l;
if(CY==1)
{
PWM3=1;
PWM4=0;
goto HIGHT;
}
PWM3=0;
PWM4=1;
HIGHT:
ACC=t_0;
if(ACC!=0xc9)
goto EXIT;
ACC=0;
t_0=ACC;
EXIT:
TR0=1;
}
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0; //关串口中断
RI=0; //软件清除接收中断
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]==0XFF; //包头
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}
if(URTAReceivedCount==2)//包尾
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0; //组包完毕
temp="";
// Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //发送组成的数据包回去
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];
ES=1;//开串口中断
}
void main()
{
init();
while(1)
{
if(CommandDatatable[0]==0XFF && CommandDatatable[4]==0XFF)
{
switch (CommandDatatable[1]) //根据键值不同,执行不同的内容
{
case 0X00: //类型位0X00,表明是控制数据包,进入控制数据case
switch(CommandDatatable[2]) //根据数据位的值来进行选择执行不同的动作
{
case 0X00:go(0x00,0x00);break;
case 0X01:go(0x35,0x35);break;
case 0X02:go(0x35,0x35);break;
case 0X03:go(0x35,0x00);break;
case 0X04:go(0x00,0x35);break;
default : break;
}
break;
}
}
}
}
|