找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2376|回复: 1
收起左侧

单片机串口1中断收发

[复制链接]
ID:353233 发表于 2018-6-17 13:45 | 显示全部楼层 |阅读模式
  1. /*************        功能说明        **************

  2. 串口1全双工中断方式收发通讯程序。本例程使用22.1184MHZ时钟,如要改变,请修改下面的"定义主时钟"的值并重新编译。

  3. 串口设置为:115200,8,n,1.

  4. 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

  5. ******************************************/

  6. /*************        本地常量声明        **************/
  7. #define MAIN_Fosc                22118400L        //定义主时钟
  8. #define        RX1_Lenth                32                        //串口接收缓冲长度
  9. #define        BaudRate1                115200UL        //选择波特率


  10. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重装值, 对应300KHZ
  11. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 2 重装值, 对应300KHZ

  12. #include        "STC15Fxxxx.H"


  13. /*************        本地变量声明        **************/
  14. u8        idata RX1_Buffer[RX1_Lenth];        //接收缓冲
  15. u8        TX1_Cnt;        //发送计数
  16. u8        RX1_Cnt;        //接收计数
  17. bit        B_TX1_Busy;        //发送忙标志


  18. /*************        本地函数声明        **************/



  19. /**********************************************/
  20. void main(void)
  21. {
  22.         B_TX1_Busy = 0;
  23.         RX1_Cnt = 0;
  24.         TX1_Cnt = 0;

  25.         S1_8bit();                                //8位数据
  26.         S1_USE_P30P31();                //UART1 使用P30 P31口        默认
  27. //        S1_USE_P36P37();                //UART1 使用P36 P37口
  28. //        S1_USE_P16P17();                //UART1 使用P16 P17口

  29. /*
  30.         TR1 = 0;                        //波特率使用Timer1产生
  31.         AUXR &= ~0x01;                //S1 BRT Use Timer1;
  32.         AUXR |=  (1<<6);        //Timer1 set as 1T mode
  33.         TH1 = (u8)(Timer1_Reload >> 8);
  34.         TL1 = (u8)Timer1_Reload;
  35.         TR1  = 1;
  36. */

  37.         AUXR &= ~(1<<4);        //Timer stop                波特率使用Timer2产生
  38.         AUXR |= 0x01;                //S1 BRT Use Timer2;
  39.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  40.         TH2 = (u8)(Timer2_Reload >> 8);
  41.         TL2 = (u8)Timer2_Reload;
  42.         AUXR |=  (1<<4);        //Timer run enable

  43.         REN = 1;        //允许接收
  44.         ES  = 1;        //允许中断

  45.         EA = 1;                //允许全局中断
  46.         

  47.         while (1)
  48.         {
  49.                 if(TX1_Cnt != RX1_Cnt)                //收到过数据
  50.                 {
  51.                         if(!B_TX1_Busy)                //发送空闲
  52.                         {
  53.                                 B_TX1_Busy = 1;                //标志发送忙
  54.                                 SBUF = RX1_Buffer[TX1_Cnt];        //发一个字节
  55.                                 if(++TX1_Cnt >= RX1_Lenth)        TX1_Cnt = 0;        //避免溢出处理
  56.                         }
  57.                 }
  58.         }
  59. }

  60. /********************* UART1中断函数************************/
  61. void UART1_int (void) interrupt UART1_VECTOR
  62. {
  63.         if(RI)
  64.         {
  65.                 RI = 0;
  66.                 RX1_Buffer[RX1_Cnt] = SBUF;                //保存一个字节
  67.                 if(++RX1_Cnt >= RX1_Lenth)        RX1_Cnt = 0;        //避免溢出处理
  68.         }

  69.         if(TI)
  70.         {
  71.                 TI = 0;
  72.                 B_TX1_Busy = 0;                //清除发送忙标志
  73.         }
  74. }
复制代码
回复

使用道具 举报

ID:289013 发表于 2021-6-27 18:28 | 显示全部楼层
如何实验?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表