串口助手发送一个数据,观察到串口助手不停的接收数据,请大神帮帮忙修改一下,急死了!
#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赋初值的语句,中断就无法触发,该怎么修改?请大神帮帮我… 展开
#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赋初值的语句,中断就无法触发,该怎么修改?请大神帮帮我… 展开
1个回答
展开全部
//****************************************************
//串口中断
//****************************************************
void ser_int (void) interrupt 4
{
keyval=SBUF;//接收一个字符数据
while(!RI);//等待接收完成
RI=0;//置位接收标志位
SBUF=keyval;//发送刚刚接收到的数据
while(!TI);//等待发送完成
TI=0;//置位发送申请标志位
}
注:在串口中断内,不需要用if语句判断RI或TI
只有不适用中断方式,选用查询方式的时候,才会这么做
查询方式,是在主函数或其它函数中进行接收数据的操作
而中断方式,不管单片机原先在忙什么任务,一旦有数据到来,则立即执行接收等任务
等待部分不能省略,虽然省略不影响编译,但数据在接收或发送的时候,容易出错
甚至会导致整个程序假死
//串口中断
//****************************************************
void ser_int (void) interrupt 4
{
keyval=SBUF;//接收一个字符数据
while(!RI);//等待接收完成
RI=0;//置位接收标志位
SBUF=keyval;//发送刚刚接收到的数据
while(!TI);//等待发送完成
TI=0;//置位发送申请标志位
}
注:在串口中断内,不需要用if语句判断RI或TI
只有不适用中断方式,选用查询方式的时候,才会这么做
查询方式,是在主函数或其它函数中进行接收数据的操作
而中断方式,不管单片机原先在忙什么任务,一旦有数据到来,则立即执行接收等任务
等待部分不能省略,虽然省略不影响编译,但数据在接收或发送的时候,容易出错
甚至会导致整个程序假死
追答
恩,好好研究研究,其实这个一点不难的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询