串口助手发送一个数据,观察到串口助手不停的接收数据,请大神帮帮忙修改一下,急死了!

#include"main.h"#include"LCD1602.h"unsignedcharkeyval;/******************************... #include"main.h"
#include "LCD1602.h"
unsigned char keyval;
/**************************************************************

函数功能:进行键盘扫描,判断键位
**************************************************************/
void display(unsigned char keyval)
{

LCD1602_write_com(0x80+0x40+6);
LCD1602_write_data(keyval+0x30);
}

/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
Init_LCD1602(); //初始化LCD1602
LCD1602_write_com(0x80); //指针设置
LCD1602_write_word("Welcome to use! "); //开机画面第一行
Delay_ms(2000); //延时2s

TMOD=0x20; //定时器T1 工作于方式2
SCON=0x50; //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
PCON=0x00; //PCON=0000 0000B,波特率9600
TH1=0xfd; //根据规定给定时器T1 赋初值
TL1=0xfd; //根据规定给定时器T1 赋初值
TR1=1; //启动定时器T1
EA=1;
ES=1;
SBUF=0;
while(1)
{
display(keyval);
}
}

//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//****************************************************
//串口中断
//****************************************************
void ser_int (void) interrupt 4 using 3

{

if(RI==1) //RI接收标志位
{
RI = 0; //清除RI接受标志位
keyval= SBUF; //SUBF接收缓冲

}
if(TI==1)
{
TI=0;
SBUF=keyval;

}

}

串口助手发送一个数据,但是单片机却一直不停的接收数据,SBUF为何一定要赋初值才能触发中断?赋初值了就会一直不停触发中断,这样发送一个数据就不停的接收到数据,但是没有SBUF赋初值的语句,中断就无法触发,该怎么修改?请大神帮帮我…
展开
 我来答
休闲居大伟
推荐于2016-08-28 · TA获得超过5419个赞
知道大有可为答主
回答量:6865
采纳率:91%
帮助的人:1.1亿
展开全部
//****************************************************
//串口中断
//****************************************************
void ser_int (void) interrupt 4
{

keyval=SBUF;//接收一个字符数据
while(!RI);//等待接收完成
RI=0;//置位接收标志位

SBUF=keyval;//发送刚刚接收到的数据

while(!TI);//等待发送完成
TI=0;//置位发送申请标志位
}

注:在串口中断内,不需要用if语句判断RI或TI

只有不适用中断方式,选用查询方式的时候,才会这么做

查询方式,是在主函数或其它函数中进行接收数据的操作

而中断方式,不管单片机原先在忙什么任务,一旦有数据到来,则立即执行接收等任务

等待部分不能省略,虽然省略不影响编译,但数据在接收或发送的时候,容易出错

甚至会导致整个程序假死
追问

修改好了…碰到了另一个问题,就是发送端能发送0-f的值,接收(如上)不能很稳定的将0-f的值显示出来,可以帮忙看看吗?会闪烁,而且显示的不是0-f,乱跳到别的字符,非常不稳定

追答
恩,好好研究研究,其实这个一点不难的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式