#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit a1=P0^0; //电机A
sbit a2=P0^1;
sbit b1=P0^2; //电机B
sbit b2=P0^3;
sbit ENA=P2^0; //电机A使能端
sbit ENB=P2^1; //电机B使能端
uchar Count=0; //收到0xff个数
uchar n=1;
uchar dat[5]; //接收数据
uint pwm=16,num=0; //PWM调速
void delay(uint i) //延时函数
{
while(i--);
}
void motor_init() //电机使能
{
ENA=1;
ENB=1;
}
void Com_init() //串口初始化
{
TMOD|=0x20;
SCON=0x50; //串口工作在模式1
TH1=0xFD; //产生9600的波特率
TL1=0xFD;
EA=1;
ES=1;
TR1=1;
}
void t0_init() //定时器0初始化
{
TMOD|=0x01;//定时器T0工作在方式1
TH0 =0xFE;
TL0 =0x0C;
EA =1;
ET0 =1;
TR0 =1;
}
void motor_forward() //前进
{
P0=0X09;
}
void motor_backward()
{
P0=0x06;
}
void motor_turnleft()
{
P0=0x0a;
}
void motor_turnright()
{
P0=0x05;
}
void motor_stop()
{
P0=0x00;
}
void motor_acc(uchar x) //PWM加速
{
if(0x05==x)
{
if(pwm<32)
{
pwm++;
}
}
}
void motor_dec(uchar y) //PWM减速
{
if(0x06==y)
{
if(pwm>1)
{
pwm--;
}
}
}
void command_sig(uchar x)
{
switch(x)
{
case 0x00: motor_stop();return;
case 0x01: motor_forward();return;
case 0x02: motor_backward();return;
case 0x03: motor_turnleft();return;
case 0x04: motor_turnright();return;
default : return;
}
}
void main()
{
P0=0;
motor_init();
Com_init();
t0_init();
while(1)
{
motor_acc(dat[2]);
motor_dec(dat[2]);
}
}
void uart() interrupt 4 //串口中断,完成数据解析
{
uchar temp=0;
if(RI)
{
RI=0;
ES=0;
temp=SBUF; //接收数据(每次接收一个字节,直到接收完为止)
// 1个字节占2个16进制位,一个16进制位占0.5个字节
if(0xff==temp&&Count<2)
{
dat[0]=0xff;
Count++;//接到0xff的次数
}
else
{
dat[n]=temp;
n++;
}
if(2==Count)
{
Count=0;
n=1;
temp=0;
dat[4]=0xff;
delay(10000);
}
else
{
TI=0;
}
ES=1;
}
}
void t0() interrupt 1 //PWM调速实现
{
TR0=0;
TH0=0xFE;
TL0=0x0C;
num++;
if(num<pwm)
{
command_sig(dat[2]);
}
if(num>=pwm)
{
P0=0;
}
if(32==num)
{
num=0;
}
}
|