找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5493|回复: 3
收起左侧

STC12C5A60S2双串口通讯基础程序

  [复制链接]
ID:282419 发表于 2020-3-19 18:04 | 显示全部楼层 |阅读模式
  程序9600波特率 下 STC单片机双串口通讯发基础程序,程序内容,各自中断接收,中断转发接收到的数据。需要两个串口同时工作的可以用的上。

单片机源程序如下:

  1. /*-----------------------------------------------
  2.   名称:STC12C5A60S2双串口通信
  3.   编写:Nico
  4.   日期:2009.5
  5.   修改:无
  6.   内容:9600波特率 双串口收发
  7.         接线:串口1 发送P3.1,接收P3.0
  8.               串口2 发送P1.3,接收P1.2
  9. ------------------------------------------------*/

  10. #include"stc12c5a60s2.h"
  11. #include"delay.h"

  12. #define S2RI 0x01   //串口2接收中断中断请求标志位
  13. #define S2TI 0x02   //串口2发送中断请求标志位
  14. unsigned char flag1,flag2,temp1,temp2;
  15. unsigned char uart2Receive[100];
  16. unsigned char uart1Receive[100];
  17. unsigned int point1=0,point2=0;
  18. unsigned char i;
  19. /*------------------------------------------------
  20.                    函数声明
  21. ------------------------------------------------*/
  22. //void SendStr(unsigned char *s);
  23. void UART_1SendOneByte(unsigned char c);
  24. void UART_2SendOneByte(unsigned char c);
  25. void uart1SendStr(unsigned char *s);
  26. void uart2SendStr(unsigned char *s);
  27. /*------------------------------------------------
  28.                     串口初始化
  29. ------------------------------------------------*/
  30. void InitUART  (void)
  31. {

  32.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  33.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  34.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  35.     TR1   = 1;                  // TR1:  timer 1 打开                    
  36.    EA    = 1;                  //打开总中断
  37.     ES    = 1;                  //打开串口中断
  38.        
  39.         S2CON = 0x50;   //  
  40.     BRT = 0xFD;    //  9600
  41.     AUXR = 0x10;    //
  42.     IE2 =0x01;  //
  43. }                           
  44. /*------------------------------------------------
  45.                     主函数
  46. ------------------------------------------------*/
  47. void main (void)
  48. {

  49.   InitUART();
  50.         DelayMs(100);
  51.         uart1SendStr("串口1初始化成功");
  52.         DelayMs(100);
  53.   uart2SendStr("串口2初始化成功");


  54. while (1)                       
  55.     {
  56.                         if(flag1==1)  
  57.         {  
  58.             flag1=0;
  59.                                        
  60.            // uart2SendStr("串口1中断,串口2发送串口1接收的数据:");                               
  61.             uart1SendStr(uart1Receive);
  62.                                           for(i=0;i<=100;i++)
  63.                                                 {
  64.                                                         uart1Receive[i]=0;
  65.                                                         }
  66.         }  
  67.                         if(flag2==1)  
  68.         {  
  69.                                         flag2=0;   
  70.                                 //        uart1SendStr("串口2中断,串口1发送串口2接收的数据:");
  71.             uart2SendStr(uart2Receive);  
  72.                                          for(i=0;i<=100;i++)
  73.                                                 {
  74.                                                         uart2Receive[i]=0;
  75.                                                         }
  76.         }  
  77.     }
  78. }

  79. /*------------------------------------------------
  80.                     1发送字符串
  81. ------------------------------------------------*/
  82. void uart1SendStr(unsigned char *s)
  83. {
  84. while(*s!='\0')// \0 表示字符串结束标志,
  85.                 //通过检测是否字符串末尾
  86.   {
  87.   UART_1SendOneByte(*s);
  88.   s++;
  89.   }
  90. }
  91. /*------------------------------------------------
  92.                     2发送字符串
  93. ------------------------------------------------*/

  94. void uart2SendStr(unsigned char *s)
  95. {
  96. while(*s!='\0')// \0 表示字符串结束标志,
  97.                 //通过检测是否字符串末尾
  98.   {
  99.   UART_2SendOneByte(*s);
  100.   s++;
  101.   }
  102. }

  103. void UART_1SendOneByte(unsigned char c)  
  104. {  
  105.     SBUF = c;  
  106.     while(!TI);    //?TI=0,????  
  107.     TI = 0;   
  108. }


  109. /****************串口2发送一个字符****************/  
  110. void UART_2SendOneByte(unsigned char c)  
  111. {  
  112.     S2BUF = c;  
  113.     while(!(S2CON&S2TI));  //?S2TI=0,????  
  114.     S2CON&=~S2TI;     //S2TI=0  
  115. }  
  116. /************串口1中断函数*************/  
  117. void UART_1Interrupt(void) interrupt 4  
  118. {  
  119.     if(RI==1)  
  120.     {  
  121.         RI=0;  
  122.         flag1=1;  
  123.         temp1=SBUF;
  124.                                 uart1Receive[point1++]=temp1;
  125.                         if(temp1=='\n')
  126.                         {
  127.                                 flag1=1;
  128.                                 point1=0;
  129.                         }
  130.                         if(point1==100)
  131.                         {
  132.                                 point1=0;
  133.       }
  134.     }  
  135. }  
  136. /************串口2中断函数*************/  
  137. void UART_2Interrupt(void) interrupt 8  
  138. {  
  139.          EA    = 0;                  //打开总中断
  140.     if(S2CON&S2RI)  
  141.     {  
  142.         S2CON&=~S2RI;         
  143.         temp2=S2BUF;
  144.                         uart2Receive[point2++]=temp2;
  145.                         if(temp2=='\n')
  146.                         {
  147.                                 point2=0;
  148.                                 flag2=1;
  149.                         }
  150.                         if(point2==100)
  151.                         {
  152.                                 point2=0;
  153.       }
  154.     }
  155. EA    = 1;                  //打开总中断               
  156. }
复制代码

以上资料51hei提供下载:
12C5a60s2双串口通讯.rar (50.5 KB, 下载次数: 184)

评分

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

查看全部评分

回复

使用道具 举报

ID:312082 发表于 2020-8-16 23:50 | 显示全部楼层
96行,109行的S++,是什么目的?为什么要自加?而且上文中只有*S,没有出现S啊?
回复

使用道具 举报

ID:312082 发表于 2020-8-17 00:00 | 显示全部楼层
151,167行,是先开总中断,后关总中断,还是先关后开?
回复

使用道具 举报

ID:598743 发表于 2021-4-7 14:48 | 显示全部楼层
我测试了一下,用串口助手发送数据时候需要勾选“发送新行” 才可以 ,要不然就有一个接收不到另一个发送的。程序没什么问题, 就是151行注释错了 ,代码没问题。
EA    = 0;  //打开总中断
这里应该是
EA    = 0;  //关闭总中断。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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