打印

51单片机在串口中断程序中调用子程序实现接收字符不成功

[复制链接]
2420|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lubaodong|  楼主 | 2013-5-18 20:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lubaodong 于 2013-5-18 22:02 编辑

//用“串口调试助手”来与单片机通信。上位机发送一个字符,单片机收到后,再发送给上位机。
//在串口中断服务程序用,使用调用子函数的方法接收字符。
//用receive_msg_1()无法接收数据,用receive_msg_2()可以接收数据。
//为什么receive_msg_1()无法接收数据,而receive_msg_2()可以,希望大家给讲解一下!

#include<reg52.h>
#define uchar unsigned char
uchar code i_get[]="i get ";
uchar code i_ready[]="i am ready!\n";
uchar cha,num,flag;    //flag用于主函数中查询是否产生了串行中断,以便接收数据。
void UART_init()
{
     TMOD=0x20; //确定定时器1工作方式为方式2,8位自动重装计数器
     TH1=0xfd; //装初值,确定波特率
     TL1=0xfd; //装初值,确定波特率
     TR1=1;  //定时器1运行
     SM0=0; //确定串行工作方式为方式1
     SM1=1;
     REN=1; //允许串行接收
     EA=1; //开总中断
     ES=1; //开串行中断
}
void send_msg(uchar ch)
{
      ES=0;
      SBUF=ch;
      while(!TI);
      TI=0;
      ES=1;
}
void response_msg(uchar ch)
{
      ES=0;
      flag=0;
      for(num=0;num<6;num++)
      {
            SBUF=i_get[num];
            while(!TI);
            TI=0;  
      }

      SBUF=ch;
      while(!TI);
      TI=0;
      SBUF='\n';
      while(!TI);
      TI=0;
      ES=1;
}
/*
void receive_msg_1(uchar ch)     //此函数无法接受数据
{
      RI=0;
      ch=SBUF;
      flag=1;
}
*/
uchar receive_msg_2()     //此函数可以接受数据
{
      uchar ch;
      RI=0;
      ch=SBUF;
      flag=1;
      return ch;
}
void main()
{
      uchar i;
      UART_init();
      for(i=0;i<12;i++)
      send_msg(i_ready);
      while(1)
         if(flag)
             response_msg(cha);
}
void uart_receive() interrupt 4
{
      cha=receive_msg_2();     //可以接收数据
//    receive_msg_1(cha);     //无法接收数据
/*   //直接用代码,不调用子函数,可以接收数据。
      RI=0;
      cha=SBUF;
      flag=1;
*/
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

106

帖子

0

粉丝