找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10458|回复: 11
打印 上一主题 下一主题
收起左侧

STC15单片机4串口中断收发数据源代码,亲测能用

  [复制链接]
跳转到指定楼层
楼主
ID:309307 发表于 2018-9-11 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC15W4K58s4单片机4路串口同时中断收发数据代码

单片机源程序如下:
  1. #include "uart.h"

  2. u8 Uart1_RecvBuf[11];  //串口数据缓存
  3. u8 point1 = 0;             //绶存指针
  4. u8 UART1_RecvFlag=0;

  5. u8 Uart2_RecvBuf[11];  //串口数据缓存
  6. u8 point2 = 0;             //绶存指针
  7. u8 UART2_RecvFlag=0;

  8. u8 Uart3_RecvBuf[11];  //串口数据缓存
  9. u8 point3 = 0;             //绶存指针
  10. u8 UART3_RecvFlag=0;          

  11. u8 Uart4_RecvBuf[11];  //串口数据缓存
  12. u8 point4 = 0;             //绶存指针
  13. u8 UART4_RecvFlag=0;


  14. void UartInit(void)                //9600bps@11.0592MHz
  15. {
  16.         P3M0 &= ~(1<<7);                //设置P3.7为准双向IO
  17.         P3M1 &= ~(1<<7);

  18.         S1_USE_P30P31();

  19.         SCON = 0x50;                //8位数据,可变波特率
  20.         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
  21.         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  22.         TMOD |= 0x00;                //设定定时器1为16位自动重装方式
  23.         TL1 = 0xE0;                //设定定时初值
  24.         TH1 = 0xFE;                //设定定时器重装值
  25.         ET1 = 0;                //禁止定时器1中断
  26.         TR1 = 1;                //启动定时器1

  27.         S2CON = 0x50;                //8位数据,可变波特率
  28.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  29.         T2L = 0xE0;                //设定定时初值
  30.         T2H = 0xFE;                //设定定时初值
  31.         AUXR |= 0x10;                //启动定时器2

  32.         S3CON = 0x10;                //8位数据,可变波特率
  33.         S3CON |= 0x40;                //串口3选择定时器3为波特率发生器
  34.         T4T3M |= 0x02;                //定时器3时钟为Fosc,即1T
  35.         T3L = 0xE0;                //设定定时初值
  36.         T3H = 0xFE;                //设定定时初值
  37.         T4T3M |= 0x08;                //启动定时器3

  38.         S4CON = 0x10;                //8位数据,可变波特率
  39.         S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
  40.         T4T3M |= 0x20;                //定时器4时钟为Fosc,即1T
  41.         T4L = 0xE0;                //设定定时初值
  42.         T4H = 0xFE;                //设定定时初值
  43.         T4T3M |= 0x80;                //启动定时器4

  44.         UART2_INT_ENABLE();
  45.         UART3_INT_ENABLE();
  46.         UART4_INT_ENABLE();
  47.         ES = 1;
  48.         EA = 1;
  49. }

  50. /*----------------------------
  51. 发送串口数据
  52. ----------------------------*/
  53. void Uart1_Sendbyte(unsigned char ch)
  54. {   
  55.         SBUF = ch;                 //写数据到UART数据寄存器
  56.   while (!TI);               //等待前面的数据发送完成               
  57.   TI = 0;
  58. }

  59. void Uart1_SendData()
  60. {
  61.         int i;
  62.         for(i=0;i<11;i++)
  63.         {
  64.                 Uart1_Sendbyte(Uart1_RecvBuf[i]);
  65.         }
  66. }

  67. void Usart() interrupt 4 using 1            // 串口中断函数
  68. {
  69.         ES = 0;
  70.         if (RI)
  71.         {
  72.                 RI = 0;                                //清除RI位
  73.                 Uart1_RecvBuf[point1] = SBUF;
  74.                 if (Uart1_RecvBuf[0] == 0x55)
  75.                 {               
  76.                         point1++;               
  77.                         if(point1>=11)         
  78.                         {
  79.                                 point1 = 0;
  80.                         }
  81.                 }       
  82.                 if(Uart1_RecvBuf[1] == 0x53)
  83.                 {
  84.                         UART1_RecvFlag=1;
  85.                 }               
  86.         }
  87.         ES =  1;
  88. }

  89. /*----------------------------
  90. 通过串口2发送串口数据
  91. ----------------------------*/
  92. void Uart2_Sendbyte(unsigned char ch)
  93. {
  94.         S2BUF = ch;   //写数据到UART数据寄存器
  95.         while(!TI2);        //不忙后发送数据                 
  96.         CLR_TI2();
  97. }

  98. void Uart2_SendData()
  99. {
  100.         int i;
  101.         for(i=0;i<11;i++)
  102.         {
  103.                 Uart2_Sendbyte(Uart2_RecvBuf[i]);
  104.         }
  105. }

  106. void Usart2() interrupt 8 using 1
  107. {
  108.         UART2_INT_DISABLE();       
  109.         if(RI2)
  110.         {
  111.                 CLR_RI2();                               //清除RI位
  112.                 Uart2_RecvBuf[point2] = S2BUF;
  113.                 if (Uart2_RecvBuf[0] == 0x55)
  114.                 {               
  115.                         point2++;               
  116.                         if(point2>=11)         
  117.                         {
  118.                                 point2 = 0;
  119.                         }
  120.                 }       
  121.                 if(Uart2_RecvBuf[1] == 0x53)
  122.                 {
  123.                         UART2_RecvFlag=1;
  124.                 }                        
  125.         }
  126.         UART2_INT_ENABLE();       
  127. }

  128. /*----------------------------
  129. 通过串口3发送串口数据
  130. ----------------------------*/
  131. void Uart3_Sendbyte(unsigned char ch)
  132. {       
  133.         S3BUF = ch;                 //写数据到UART数据寄存器
  134.   while(!TI3);        //不忙后发送数据
  135.         CLR_TI3();
  136. }

  137. void Uart3_SendData()
  138. {
  139.         int i;
  140.         for(i=0;i<11;i++)
  141.         {
  142.                 Uart3_Sendbyte(Uart3_RecvBuf[i]);
  143.         }
  144. }

  145. void Usart3() interrupt 17
  146. {
  147.         UART3_INT_DISABLE();       
  148.         if(RI3)
  149.   {
  150.                 CLR_RI3();                               //清除RI位
  151.                 Uart3_RecvBuf[point3] = S3BUF;
  152.                 if (Uart3_RecvBuf[0] == 0x55)
  153.                 {               
  154.                         point3++;               
  155.                         if(point3>=11)         
  156.                         {
  157.                                 point3 = 0;
  158.                         }           
  159.                 }
  160.                 if(Uart3_RecvBuf[1] == 0x53)
  161.                 {
  162.                         UART3_RecvFlag=1;
  163.                 }
  164.         }               
  165.         UART3_INT_ENABLE();       
  166. }

  167. /*----------------------------
  168. 通过串口4发送串口数据
  169. ----------------------------*/
  170. void Uart4_Sendbyte(unsigned char ch)
  171. {            
  172.         S4BUF = ch;                 //写数据到UART数据寄存器
  173.   while(!TI4);        //不忙后发送数据
  174.         CLR_TI4();
  175. }

  176. void Uart4_SendData()
  177. {
  178.         int i;
  179.         for(i=0;i<11;i++)
  180.         {
  181. ……………………

  182. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
4路串中断收发.rar (126.09 KB, 下载次数: 263)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:455729 发表于 2018-12-26 18:06 | 只看该作者
希望有用
回复

使用道具 举报

板凳
ID:485871 发表于 2019-3-17 22:04 | 只看该作者
希望有用
回复

使用道具 举报

地板
ID:90212 发表于 2019-6-2 21:55 | 只看该作者
整了个15w4k48S4回来做modbus从站用,正需要!
回复

使用道具 举报

5#
ID:47390 发表于 2019-7-10 09:08 | 只看该作者
不错,先下载来学习,学习
回复

使用道具 举报

6#
ID:234782 发表于 2019-7-18 15:46 | 只看该作者
不是我想要的答案
回复

使用道具 举报

7#
ID:85480 发表于 2019-8-2 15:04 | 只看该作者
希望能解决我的困惑,学习一下。
回复

使用道具 举报

8#
ID:59423 发表于 2019-10-18 10:23 | 只看该作者
参考下楼主的历程,写的很清晰
回复

使用道具 举报

9#
ID:616436 发表于 2020-3-5 17:26 | 只看该作者
参考下楼主的历程
回复

使用道具 举报

10#
ID:625276 发表于 2021-3-31 09:39 | 只看该作者
正在使用STC15w4k32s4写多串口同时通讯程序,参考一下
回复

使用道具 举报

11#
ID:366088 发表于 2021-9-8 11:04 | 只看该作者
没啥用  调试了一下没反应   白充了!!!!!
回复

使用道具 举报

12#
ID:899981 发表于 2022-6-28 10:42 | 只看该作者
直接发送没反应:delayms(200);
                Uart4_SendData1();
                        delayms(200);
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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