正学串口,这个程序不难,但是不知道错哪了,请帮着看一下,谢谢

2019-07-15 11:29发布

要求:实现用串口调试助手向串口发送一个字符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();
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
275849752
2019-07-16 07:23
人中狼 发表于 2017-4-3 19:13
刚没看到a的定义,你试试在单片机接收到数据存入a后,马上再把a发给计算机,然后再发完i get 后面,发完a后,再随便发一个数据,看看接收到什么

在发i get之前发  SBUF=a;的话a 和 i get都能发回电脑。但是在发完第一个 i get之后,再在它后面不管是发SBUF=a,还是发i get 都没用了。。。这是为什么呢?怎么改呢

一周热门 更多>