要求:实现用串口调试助手向串口发送一个字符X,串口将发回“I get X”
我用keil的串口助手发送X ,
单片机只发回 I get ,不发回X,是哪里错了呢?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//全局变量
uchar flag,a,i;
//定义数组
uchar code table[]="I get";
//函数原型
void init(void);//串口设定初始化函数
void ser();
/*串口中断函数*/
void ser()interrupt 4
{
RI=0; //现在单片机是由读数据进入中断(RI=1),要将RI清零,才能在下一次进入中断。
a=SBUF; //将外界(电脑)给单片机的数据赋值给a
flag=1; //这是方便查询是否已经收到数据的变量 flag=1说明已经收到数据
}
/*串口设置(初始化)函数*/
void init(void)
{
TMOD=0x20;//16进制一位对应2进制 4位:0010 0000 方式2:设定时器1为8位初值自动重装的 8位 定时器
TH1=0xfd; //设定波特率 1111 1101
TL1=0xfd; //设定波特率
SCON=0x50;//0101 0000 没有定义的则设为0即可。
EA=1;//开总中断
ES=1;//开串口中断
TR1=1;//启动定时器1
}
/*接受字符并反馈函数*/
void f(void)
{
if(flag==1) // 若已经收到数据
{
ES=0; //关闭串口中断。使单片机在进行对这次电脑发来的数据的处理的过程中,SBUF等的值不改变。
for(i=0;i<6;i++) //"I get " :4个字母 加2个空格 一共6个字符 ,所以要循环6次。
{
SBUF=table[i]; // 把table[]中的字符发回电脑
while(!
ti);//没发送完时TI=0
TI=0; //发送完时TI被硬件置为1,必须用软件清零,才能进行下一次发送(SBUF=XXX)
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
/*主函数*/
void main(void)
{
init();//对串口进行初始化
while(1)
{
f();
}
}
在发i get之前发 SBUF=a;的话a 和 i get都能发回电脑。但是在发完第一个 i get之后,再在它后面不管是发SBUF=a,还是发i get 都没用了。。。这是为什么呢?怎么改呢
一周热门 更多>