打印
[51单片机]

串口接收数据问题

[复制链接]
713|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
damoyeren|  楼主 | 2015-3-5 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我串口接收来自PC的命令
FF 01 00 02 1E 00 21 FF 01 00 00 00 00 01

单片机收到数据后,把这些数据保存在数组里。然后逐一对比收到数据的准确性,如果准确,让电机旋转。
问题:下载到单片机程序没有任何反应,请问各位大神,我的程序思路正确吗

<P># include <reg52.h>

typedef unsigned int uint16;
typedef unsigned char uchar8;
typedef unsigned long int uint32;

uchar8 rec_dat[]={0};
uchar8 i = 0;
//uchar8 num;//接收字节个数计数器
uint32 pulse;

code uchar8 up_data[8] ={0xFe,0xFc,0xFd,0xF9,0xFb,0xF3,0xF7,0xF6};//反转数组
code uchar8 down_data[8]={0XF6,0XF7,0XF3,0XFB,0XF9,0XFD,0XFC,0XFE};//正转数组

/*延时函数*/
void delay_ms(uchar8 z)
{
uchar8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

/*将旋转角度转换为脉冲数量,实参传递的是圈数*/
void motor_pulse(uint32 angle)
{
EA = 0;//</P>
<P>pulse = (angle*4096)/360;
EA = 1;
}

/*串口配置函数: 串口工作方式设置 定时器T1设置波特率*/
void config (uint16 BAUD)
{
SCON = 0X50;//SM0=0 SM1=1 SM2=0 REN=1串口工作在波特率可变模式 允许接收
TMOD = 0X20;//TO工作在方式1,定时模式;T1工作在方式2,自动重装模式
TH1 = 256 - (11059200/12/32)/BAUD;
TL1 = TH1;//定时器T1工作在方式2自动重装模式:TL0计数器溢出后又TH0自动填数
TR1 = 1;//启动定时器T1
EA = 1;//启动总中断
ES = 1;//启动串口中断
}

/*电机旋转函数:旋转实参传递的是电机旋转角度*/
void motor_up()
{
static uchar8 index = 0;
while (pulse!=0)
{
P1 = up_data[index];
delay_ms(10);
index++;
index = index&0x07;//此句等效如果index>=8,index=0
pulse--;
}
}


/*主函数*/
void main ()
{
config(2400);//配置波特率为9600
while(1)
{
if ((rec_dat[0]==0xff) && (rec_dat[1]==0x01) && (rec_dat[2]==0x00) && (rec_dat[3]==0x02) && (rec_dat[4]==0x1e) && (rec_dat[5]==0x00) && (rec_dat[6]==0x21) && (rec_dat[7]==0xff) && (rec_dat[8]==0x01) && (rec_dat[9]==0x00) && (rec_dat[10]==0x00) && (rec_dat[11]==0x00) && (rec_dat[12]==0x00) && (rec_dat[13]==0x01) )
//if (rec_dat[5] == 0x21)
{
motor_pulse(180);//如果收到的命令正确,给电机发送旋转圈数1
motor_up();//电机正转
}
}
}


void InterruptUART() interrupt 4
{
static uchar8 num = 0;//接收字节个数计数器
if(RI)
{
RI = 0;
rec_dat[num] = SBUF;
if((num==0) &&(rec_dat[num]==0XFF))
{
rec_dat[num] = SBUF;
num = 1;
}
else if((num == 1) &&(rec_dat[num] = 0X01) )
{
rec_dat[num] = SBUF;
num = 2;
}
else if((num == 2) &&(rec_dat[num] = 0X00) )
{
rec_dat[num] = SBUF;
num = 3;
}
else if((num == 3) &&(rec_dat[num] = 0X02) )
{
rec_dat[num] = SBUF;
num = 4;
}
else if((num == 4) &&(rec_dat[num] = 0X1e) )
{
rec_dat[num] = SBUF;
num = 5;
}
else if((num==5) &&(rec_dat[num]==0X00))
{
rec_dat[num] = SBUF;
num = 6;
}
else if((num == 6) &&(rec_dat[num] = 0X21) )
{
rec_dat[num] = SBUF;
num = 7;
}
else if((num == 7) &&(rec_dat[num] = 0Xff) )
{
rec_dat[num] = SBUF;
num = 8;
}
else if((num == 8) &&(rec_dat[num] = 0X01) )
{
rec_dat[num] = SBUF;
num = 9;
}
else if((num == 9) &&(rec_dat[num] = 0X00) )
{
rec_dat[num] = SBUF;
num = 10 ;
}
else if((num == 10) &&(rec_dat[num] = 0X00) )
{
rec_dat[num] = SBUF;
num = 11 ;
}
else if((num == 11) &&(rec_dat[num] = 0X00) )
{
rec_dat[num] = SBUF;
num = 12 ;
}
else if((num == 12) &&(rec_dat[num] = 0X00) )
{
rec_dat[num] = SBUF;
num = 13;
}
else if((num == 13) &&(rec_dat[num] = 0X01) )
{
rec_dat[num] = SBUF;
num = 0;
}
else
num = 0;
}
if (TI)
TI = 0;
}</P>


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

126

主题

393

帖子

2

粉丝