单片机串口通信的问题 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;
}
}
展开
 我来答
猴峙材0
2014-06-21 · 超过63用户采纳过TA的回答
知道答主
回答量:129
采纳率:85%
帮助的人:53.4万
展开全部
问题可能出在波特率上,波特率不对。下载程序时,内部时钟频率的选择是否正确?T1定时器的时间常数计算与定时工作在1T或12T的模式有关,用STC最新的下载软件V6.58的,里面可以自动生成串口通信的代码。很方便的。
希望对你能有所帮助。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式