找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15F2K60S2单片机双串口(中继)实验源码-我的处女贴

[复制链接]
跳转到指定楼层
楼主

51单片机源程序:

  1. /*******************************************************************************************
  2. * 双串口试验(中继) *
  3. * CPU:STC15F2K60S2 115200,N,8,1 @11.0592M *
  4. * *
  5. *********************************************************************************************/
  6. #include <REG52.H>
  7. #include <STDIO.H>
  8. #include <INTRINS.H>


  9. #define U8 unsigned char
  10. #define U16 unsigned int
  11. #define U32 unsigned long


  12. sfr AUXR = 0x8e; //辅助寄存器
  13. sfr T2H = 0xd6; //定时器2高8位
  14. sfr T2L = 0xd7; //定时器2低8位
  15. sfr P5 = 0xC8;
  16. sfr S2BUF = 0x9B;
  17. sfr IE2 = 0xaf;
  18. sfr S2CON = 0x9a;
  19. sbit DIR = P3^2; //定义485使能引脚
  20. sbit DIR2 = P3^3;


  21. #define S2RI 0x01 //S2CON.0
  22. #define S2TI 0x02 //S2CON.1


  23. bit flagTxd = 0; //发送完标志
  24. bit flagTxd2 = 0;
  25. U8 cntRxd = 0; //接收计数器
  26. U8 cntRxd2 = 0;
  27. U8 flagRxd = 0;//收到数据标志
  28. U8 flagRxd2 = 0;
  29. U8 pdata bufRxd[64]; //接收缓冲区
  30. U8 pdata bufRxd2[64];


  31. /**************************************
  32. 延时程序
  33. **************************************/
  34. void Delay1ms()//@11.0592MHz
  35. {
  36. unsigned char i, j;
  37. _nop_();
  38. _nop_();
  39. _nop_();
  40. i = 11;
  41. j = 190;
  42. do
  43. {
  44. while (--j);
  45. } while (--i);
  46. }


  47. void Delay(unsigned int i)
  48. {
  49. do
  50. {
  51. Delay1ms();
  52. } while (--i);
  53. }


  54. /**************************************
  55. 串口初始化
  56. **************************************/
  57. void UartInit(void)//115200bps @11.0592MHz
  58. {
  59. SCON = 0x50;//COM1 8为数据可变波特率
  60. S2CON =0X50;//COM2 8为数据可变波特率
  61. AUXR |= 0x01;//选择定时器2位波特率发生器
  62. AUXR |= 0x04;//定时器2时钟为Fosc,即1T
  63. T2L = 0xE8;//设定定时初始值低位
  64. T2H = 0xFF;//设定定时初始值高位
  65. AUXR |= 0x10;//启动定时器2
  66. ES = 1; //使能串口1中断
  67. IE2 = 0x01; //使能串口2中断
  68. EA = 1;
  69. }




  70. /* 串口数据写入,即串口发送函数,buf为数据指针,len为数据长度*/
  71. void UartWrite(U8 *buf, U8 len)
  72. {
  73. DIR = 1; //RS485设置为发送
  74. while (len--) //循环发送所有字节
  75. {
  76. flagTxd = 0; //清发送标志
  77. SBUF = *buf++; //发送一个字节
  78. while (!flagTxd); //等待字节发送完成
  79. }
  80. Delay(1); //等待最后的停止位完成
  81. DIR = 0; //RS485设置为接收
  82. }




  83. void UartWrite2(U8 *buf, U8 len)
  84. {
  85. DIR2 = 1; //RS485设置为发送
  86. while (len--) //循环发送所有字节
  87. {
  88. flagTxd2 = 0; //清发送标志
  89. S2BUF = *buf++; //发送一个字节
  90. while (!flagTxd2); //等待字节发送完成
  91. }
  92. Delay(1); //等待最后的停止位完成
  93. DIR2 = 0; //RS485设置为接收

  94. }
  95. void main (void)
  96. {
  97. U8 pdata Data[64]; //接收字节缓冲区
  98. U8 pdata Data2[64];
  99. U8 i;

  100. UartInit();//串口初始化
  101. while(1)
  102. {
  103. DIR = 0;//设置串口1为接收状态
  104. if (flagRxd==1)//如果有数据
  105. {
  106. Delay(5);//等待接收
  107. for (i=0;i<cntRxd;i++)
  108. {
  109. Data[ i]=bufRxd[ i];//读取缓冲区
  110. }
  111. UartWrite2(Data,cntRxd);//从COM2发送出去
  112. cntRxd=0;//清空计数器及接收标志
  113. flagRxd=0;
  114. }
  115. DIR2 = 0;//设置串口2为接收状态
  116. if (flagRxd2==1)//如果有数据
  117. {
  118. Delay(5);//等待接收
  119. for (i=0;i<cntRxd2;i++)
  120. {
  121. Data2[ i]=bufRxd2[ i];//读取缓冲区
  122. }
  123. UartWrite(Data2,cntRxd2);//从COM2发送出去
  124. cntRxd2=0;//清空计数器及接收标志
  125. flagRxd2=0;
  126. }



  127. }
  128. }


  129. /* 串口中断服务 */
  130. void InterruptUART() interrupt 4
  131. {
  132. if (RI) //接收到新字符
  133. {
  134. RI = 0; //清零接收中断标志
  135. flagRxd=1;
  136. if (cntRxd < sizeof(bufRxd)) //接收缓冲区未用完时
  137. { //保存接收字节,并自加计数器
  138. bufRxd[cntRxd++] = SBUF;
  139. }
  140. }
  141. if (TI) //字节发送完毕
  142. {
  143. TI = 0; //清零发送中断标志
  144. flagTxd = 1; //设置字节发送完成标志
  145. }
  146. }


  147. /* 串口中断服务 */
  148. void InterruptUART2() interrupt 8
  149. {
  150. if (S2CON & S2RI) //接收到新字符
  151. {
  152. S2CON &= ~S2RI; //清零接收中断标志
  153. flagRxd2=1;
  154. if (cntRxd2 < sizeof(bufRxd2)) //接收缓冲区未用完时
  155. { //保存接收字节,并自加计数器
  156. bufRxd2[cntRxd2++] = S2BUF;
  157. }
  158. }
  159. if (S2CON & S2TI) //字节发送完毕
  160. {
  161. S2CON &= ~S2TI; //清零发送中断标志
  162. flagTxd2 = 1; //设置字节发送完成标志
  163. }
  164. }

复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:79544 发表于 2018-6-19 08:33 | 只看该作者
最小系统焊的很精简!!!谢谢分享
回复

使用道具 举报

板凳
ID:324319 发表于 2018-12-20 20:44 | 只看该作者
我用串口二发送指令给串口一的时候发现串口一接收不到指令
回复

使用道具 举报

地板
ID:450056 发表于 2018-12-20 23:50 来自手机 | 只看该作者
好厉害,楼主很棒
回复

使用道具 举报

5#
ID:872791 发表于 2021-1-3 21:21 | 只看该作者
你好,今天看到你发的贴子,我现在有一个问题,请教一下。我现在也用这款单片机的双串口,也是11.0592,波特率也是115200.我觉的有点高,我改成波特率12分频的,把这个配置去掉AUXR |= 0x04;波特率9600,串口2就不能接收数据了,不知道为什么,请指教。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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