微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 为什么我的51单片机没有进入接收中断,而是不断的发送数据

为什么我的51单片机没有进入接收中断,而是不断的发送数据

时间:10-02 整理:3721RD 点击:



  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. typedef unsigned int u16;          //对数据类型进行声明定义
  3. typedef unsigned char u8;

  4. //#define TXX        P3^0//模块的TXD
  5. //#define RXX P3^1
  6. //sbit busyIO=P3^2;       

  7. void Uart_Send_String(u8 *string);


  8. /*******************************************************************************
  9. * 函数名         :UsartInit()
  10. * 函数功能                   :设置串口
  11. * 输入           : 无
  12. * 输出                  : 无
  13. *******************************************************************************/
  14. void UsartInit()
  15. {
  16.         SCON=0X50;                        //设置为工作方式1
  17.         TMOD=0X20;                        //设置计数器工作方式2
  18.         PCON=0X80;                        //波特率加倍
  19.         TH1=0XF4;                                //计数器初始值设置,注意波特率是4800的
  20.         TL1=0XF4;
  21.         ES=1;                                                //打开接收中断
  22.         EA=1;                                                //打开总中断
  23.         TR1=1;                                        //打开计数器
  24. }
  25. void Delay_Us(u8 us)
  26. {
  27. while(us--);
  28. }

  29. void delay1ms(void)   //误差 0us
  30. {
  31.     unsigned char a,b,c;
  32.     for(c=1;c>0;c--)
  33.         for(b=142;b>0;b--)
  34.             for(a=2;a>0;a--);
  35. }

  36. /*******************************************************************************
  37. * 函 数 名       : main
  38. * 函数功能                 : 主函数
  39. * 输    入       : 无
  40. * 输    出             : 无
  41. *******************************************************************************/
  42. void main()
  43. {       
  44.         EA = 1;
  45.         ES = 1;
  46.         UsartInit();
  47.         while(1)
  48.         {

  49.         delay1ms();
  50.         Uart_Send_String("    \n");
  51.         Uart_Send_String("play,0001,$");
  52.         Uart_Send_String("    \n");
  53.         delay1ms();       
  54.         delay1ms();
  55.         }
  56.        
  57.         delay1ms();       


  58.         }  //        串口初始化
  59.                


  60. /*******************************************************************************
  61. * 函数名         : Usart() interrupt 4
  62. * 函数功能                  : 串口通信中断函数
  63. * 输入           : 无
  64. * 输出                  : 无
  65. *******************************************************************************/
  66. void Usart() interrupt 4  //这里有问题
  67. {
  68.         u8 a;
  69.         if(RI)
  70.         {
  71.                 a = SBUF;
  72.                 delay1ms();
  73.         }               
  74.         else
  75.         {while(!TI);
  76.         TI = 0;        }
  77. }

  78. void sendtouart(u8 dat)
  79. {
  80.          ES = 0;
  81.          TI = 0;
  82.          SBUF = dat;  
  83.          while(!TI);  //这里没有执行
  84.          TI = 0;
  85.          ES = 1;
  86. }

  87. void Uart_Send_String(u8 *string)
  88. {
  89.         while(*string)
  90.         {
  91.                 sendtouart(*string++);
  92.                 Delay_Us(5);
  93.         }
  94. }

复制代码


改了一下你试试

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
//#define TXX        P3^0//模块的TXD
//#define RXX P3^1
//sbit busyIO=P3^2;        
u8 a;
bit flag=0;
void Uart_Send_String(u8 *string);

/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF4;                         //计数器初始值设置,注意波特率是4800的
        TL1=0XF4;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
        REN=1;        //允许串行接收
}
void Delay_Us(u8 us)
{
        while(us--);
}
void delay1ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{        
//        EA = 1;串口初始化已打开
//        ES = 1;
        UsartInit();                 //串口初始化
        while(1)
        {       
                delay1ms();
                Uart_Send_String("    \n");
                Uart_Send_String("play,0001,$");
                Uart_Send_String("    \n");
                delay1ms();        
                delay1ms();
        }       
        delay1ms();        
}
               

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4  //这里有问题
{
/*        u8 a; //改为全局变量否则其他程序无法使用接收到的数据
        if(RI)//这里无需判断RI是否1,能发生中断RI肯定是1
        {
                a = SBUF;
                delay1ms();
        }               
        else
        {
                while(!TI);
                TI = 0;        
        }*/
        RI=0;        //接收中断请求标志位清0
        a=SBUF;//获取SBUF接收到的数据
        flag=1;//建议添加接收完成标志置1
}
void sendtouart(u8 dat)
{
        if(flag==1)                //接收完成标志为1
        {
                ES = 0;
                flag=0;
//                TI = 0;
                SBUF = dat;  
                while(!TI);  //这里没有执行
                TI = 0;
                ES = 1;
        }
}
void Uart_Send_String(u8 *string)
{
        while(*string)
        {
                sendtouart(*string++);
                Delay_Us(5);
        }
}

不行啊,波特率不管是9600(乱码)还是4800(丢失)都不行

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top