
程序如下:
#include
#include
#include
#define uchar unsigned char
#define led P2
sbit deng=P0^5;
sbit EN1A=P1^5; //右前使能A
sbit IN11=P1^4;
sbit IN12=P1^3;
sbit IN13=P1^2;
sbit IN14=P1^1;
sbit EN1B=P1^0; //右后使能B
sbit EN2A=P3^7; //左前使能A
sbit IN21=P3^6;
sbit IN22=P3^5;
sbit IN23=P3^2;
sbit IN24=P1^7;
sbit EN2B=P1^6; //左后使能B
uchar shuju[4]={0}; //从串口接收的数据
uchar flat_t; //中断标志位
/******T1串口初始化,T0定时器初始化,晶振11.0592,波特率9600******/
void init_T1()
{
TMOD=0x20; // 定时器0,1采用工作方式2
PCON=0x00; //T1
SCON=0x50; //T1
TR1=1; //T1 启动定时器1
TH1=0xfd; //T1 设置波特率 9600
TL1=0xfd; //T1
ES=1; //开串口中断
EA=1; //开总中断
}
/********电机处理********/
void motor(int num, int speed) //motor(电机号,pwm速度值)
{
if(speed>=-100 && speed<=100)
{
if(num==1) //电机1的处理
{
EN1A=1;
if(speed<0) //速度值为负则反转
{
IN11=0;
IN12=1;
}
else //不为负数则正转
{
IN11=1;
IN12=0;
}
}
if(num==2)
{
EN1B=1;
if(speed<0)
{
IN13=0;
IN14=1;
}
else
{
IN13=1;
IN14=0;
}
}
if(num==3)
{
EN2A=1;
if(speed<0)
{
IN21=0;
IN22=1;
}
else
{
IN21=1;
IN22=0;
}
}
if(num==4)
{
EN2B=1;
if(speed<0)
{
IN23=0;
IN24=1;
}
else
{
IN23=1;
IN24=0;
}
}
}
}
/*******T1()串口中断服务程序************/
void timer1() interrupt 4
{
ES=0;
if(RI==1) //当硬件接收到一个数据时,RI会置位
{
shuju[0]=SBUF; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
flat_t=1;
RI=0;
}
ES = 1;
}
/******电机方向控制*******/
void qianjin() //前进
{
deng=1;
led=0x07; //前灯
motor(1,100);
motor(2,100);
motor(3,100);
motor(4,100);
}
void youzhuan() //右转
{
deng=1;
led=0xc1; //右三灯
motor(1,-100);
motor(2,-100);
motor(3,100);
motor(4,100);
}
void zuozhuan() //左转
{
deng=1;
led=0x1c; //左三灯
motor(1,100);
motor(2,100);
motor(3,-100);
motor(4,-100);
}
void houtui()//后退
{
deng=1;
led=0x70;//后三灯
motor(1,-100);
motor(2,-100);
motor(3,-100);
motor(4,-100);
}
void zhidong() //制动
{
deng=1;
led=0x00;//全灭
EN1A=0;
EN1B=0;
EN2A=0;
EN2B=0;
}
void main()
{
init_T1();
while(1)
{
if(flat_t==1)
{
flat_t=0;
ES=0;
TI=1; //串口发送完成检测
switch(shuju[0])
{
case 49:
deng=1;
led=0xff;
break;
case 51:
deng=1;
led=0x00;
break;
case 65:
zuozhuan();
break;
case 66:
youzhuan();
break;
case 67:
qianjin();
break;
case 68:
houtui();
break;
case 70:
zhidong();
break;
default:
break;
}
while(!TI);
TI=0;
ES=1;
}
}
}