程序是适应我的板子,一般要做少许改动才能用
#include<reg52.h>
#include"math.h"
#define uchar unsigned char
#define uint unsigned int
int buffer[3];
int speed=10;
int rec_flag=0;
sbit pwm1=P1^1;
sbit pwm2=P1^3;
sbit q1 =P1^0;
sbit q2 =P1^2;
sbit zd =P1^4;
sbit dd =P1^5;
sbit yd =P1^6;
sbit feng=P1^7;
/*-------------------------------------------------------------*/
//串口初始化
uchar t=0; /* 中断计数器 */
uchar m1=0; /* 电机1速度值 */
uchar m2=0; /* 电机2速度值 */
uchar tmp1,tmp2;
char detection_m1,detection_m2,sign=0,time=0; /* 电机当前速度值 */
void motor(uchar index, char speed) /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100-100) */
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
detection_m1=0;
}
else /* 不为负数则正转 */
{
detection_m1=1;
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed); /* 电机2的速度控制 */
if(speed<0) /* 电机2的方向控制 */
{
detection_m2=0;
}
else
{
detection_m2=1;
}
}
}
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j = 110;j>0;j--);
}
void pwm(char right_m,char left_m)
{
motor(1,right_m);
motor(2,left_m );
}
void UART_Init(void)
{
TMOD = 0x22;
PCON = 0x00;
SCON = 0x50;
TH0=0x9b;
TL0=0x9b;
TH1 = 0xFd; //设置波特率 9600
TL1 = 0xFd;
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
IT0=0;
EX0=1;
ET0=1;
TR0=1;
}
/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
}
}
void Communication_Decode(void)
{
if(buffer[0]==0x00)
{
switch(buffer[1])
{
case 0x01:pwm(speed,speed); return; //前
case 0x02:pwm(-speed,-speed); return; // 后
case 0x03:pwm(-speed,speed); return; //左
case 0x04:pwm(speed,-speed); return; //右
case 0x05:
{
zd=~zd;
dd=~dd;
yd=~yd;
return;
}
case 0x00:
{
pwm(0,0);
return;
}
case 0x06:feng=~feng;return;
case 0x09:speed++; return; //加速
case 0x0a:speed--; return; //减速
default: return;
}
}
}
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1)
{
if(detection_m1==1)
{
pwm1=0;
q1=0;
}
else
{
pwm1=0;
q1=1;
}
}
else
{
pwm1=1 ;
}
if(t<tmp2)
{
if(detection_m2==1)
{
pwm2=0;
q2=1;
}
else
{
pwm2=0;
q2=0;
}
}
else
{
pwm2=1;
}
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}
/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
static int i;
if(RI==1)
{
RI = 0;
if(rec_flag==0)
{
if(SBUF==0xff)
{
rec_flag=1;
i=0;
}
}
else
{
if(SBUF==0xff)
{
rec_flag=0;
if(i==3)
{
if(speed<0)
speed=0;
Communication_Decode();
}
i=0;
}
else
{
buffer[i]=SBUF;
i++;
}
}
}
else
{
TI = 0;
}
}
|