单片机串口通信的问题 10
操作是:idriveistopisensor摁键都可以接受到数字。我从串口调试助手向单片机传入“aa”,用小灯指示接收是否成功。现象是:中断函数只能接收一次数据“aa”,...
操作是:idrive istop isensor 摁键都可以接受到数字。我从串口调试助手 向单片机 传入 “aa” , 用小灯指示接收是否成功 。现象是 :中断函数 只能接收一次 数据“aa”, 再传就不好使啦。而且 当我按 那三个按键中的任意一个, 没有发送成功的那个数据, 就自动发送成功, 在小灯上显示。问题是: 怎么会这样? 哪里出了问题? 求大侠们指点!谢谢啦!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit idrive = P0^0; //实验板 独立按键
sbit istop = P0^1; //实验板 独立按键
sbit isensor = P0^2 ; //实验板 独立按键
uchar i;
uchar reData, flag;
uchar a;
uchar code drive_code[]={
0x89,0x00,
0x32,0x80,0x00}; //发送串行指令 前进: 89 00 32 80 00
uchar code stop_code[]={
0x89,0x00,
0x00,0x00,0x00}; //发送串行指令 停止: 89 00 00 00 00
uchar code vel_sensor_code[]={
0x8E, 0x27}; // 发送串行指令 检测:8E 27
void init(); //初始函数声明:串口通信的初始化
void delay(uint z); //延时函数声明
void drive_forth();
void stop();
void request_sensor();
void main()
{
i=0;
init();
idrive = 1;
istop = 1;
isensor = 1;
while(1)
{
drive_forth();
stop();
request_sensor();
// receive_sensor();
}
}
/******************延时函数*******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************** 串口通信的初始化************************/
void init()//串口通信的初始化
{
TMOD=0x20; // 设置定时器1 工作方式2
TH1=0xfd; // 设定初值
TL1=0xfd; // 设定初值
TR1=1; // 启动T1 设置波特率
REN=1; // 允许串行口接受位
PCON=0x80; // 波特率增加一倍 baud rate:19200 fosc:11.0592MHz.
SM0=0;
SM1=1; // 设置串行口工作方式;工作方式1
EA=1; // 开启 CPU中断
ES=1; // 允许串行口中断
RI = 0;
TI =0;
}
/********************前进函数********************/
void drive_forth()
{
if(idrive==0)
{
delay(5);
if(idrive==0)
{
for(i=0;i<5;i++)
{
SBUF=drive_code[i];//发送串行指令 前进:89 00 64 80 00 */
while(!TI);
TI=0;
}
}
while(!idrive);
delay(5);
while(!idrive);
}
}
/********************停止函数********************/
void stop()
{
if(istop==0)
{
delay(5);
if(istop==0)
{
for(i=0;i<5;i++)
{
SBUF=stop_code[i];//发送串行指令 停止:89 00 00 00 00 */
while(!TI);
TI=0;
}
}
while(!istop);
delay(5);
while(!istop);
}
}
/*************申请传感器******************************/
void request_sensor()
{
if(isensor==0)
{
delay(5);
if(isensor==0)
{
for(i=0;i<2;i++)
{
SBUF = vel_sensor_code[i]; //发送串行指令 检测:8E 27 */
while(!TI);
TI = 0;
}
}
while(!isensor);
delay(5);
while(!isensor);
}
}
/***********************接收传感器****************/
void serial() interrupt 4
{
if(RI==1)
{
ES = 0;
a = SBUF;
P2 = a; // p2 接小灯
RI=0;
flag=1;
ES = 1;
}
} 展开
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit idrive = P0^0; //实验板 独立按键
sbit istop = P0^1; //实验板 独立按键
sbit isensor = P0^2 ; //实验板 独立按键
uchar i;
uchar reData, flag;
uchar a;
uchar code drive_code[]={
0x89,0x00,
0x32,0x80,0x00}; //发送串行指令 前进: 89 00 32 80 00
uchar code stop_code[]={
0x89,0x00,
0x00,0x00,0x00}; //发送串行指令 停止: 89 00 00 00 00
uchar code vel_sensor_code[]={
0x8E, 0x27}; // 发送串行指令 检测:8E 27
void init(); //初始函数声明:串口通信的初始化
void delay(uint z); //延时函数声明
void drive_forth();
void stop();
void request_sensor();
void main()
{
i=0;
init();
idrive = 1;
istop = 1;
isensor = 1;
while(1)
{
drive_forth();
stop();
request_sensor();
// receive_sensor();
}
}
/******************延时函数*******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************** 串口通信的初始化************************/
void init()//串口通信的初始化
{
TMOD=0x20; // 设置定时器1 工作方式2
TH1=0xfd; // 设定初值
TL1=0xfd; // 设定初值
TR1=1; // 启动T1 设置波特率
REN=1; // 允许串行口接受位
PCON=0x80; // 波特率增加一倍 baud rate:19200 fosc:11.0592MHz.
SM0=0;
SM1=1; // 设置串行口工作方式;工作方式1
EA=1; // 开启 CPU中断
ES=1; // 允许串行口中断
RI = 0;
TI =0;
}
/********************前进函数********************/
void drive_forth()
{
if(idrive==0)
{
delay(5);
if(idrive==0)
{
for(i=0;i<5;i++)
{
SBUF=drive_code[i];//发送串行指令 前进:89 00 64 80 00 */
while(!TI);
TI=0;
}
}
while(!idrive);
delay(5);
while(!idrive);
}
}
/********************停止函数********************/
void stop()
{
if(istop==0)
{
delay(5);
if(istop==0)
{
for(i=0;i<5;i++)
{
SBUF=stop_code[i];//发送串行指令 停止:89 00 00 00 00 */
while(!TI);
TI=0;
}
}
while(!istop);
delay(5);
while(!istop);
}
}
/*************申请传感器******************************/
void request_sensor()
{
if(isensor==0)
{
delay(5);
if(isensor==0)
{
for(i=0;i<2;i++)
{
SBUF = vel_sensor_code[i]; //发送串行指令 检测:8E 27 */
while(!TI);
TI = 0;
}
}
while(!isensor);
delay(5);
while(!isensor);
}
}
/***********************接收传感器****************/
void serial() interrupt 4
{
if(RI==1)
{
ES = 0;
a = SBUF;
P2 = a; // p2 接小灯
RI=0;
flag=1;
ES = 1;
}
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询