標(biāo)題: STC15F2K60S2單片機(jī)雙串口(中繼)實(shí)驗(yàn)源碼-我的處女貼 [打印本頁]

作者: 伈伈向榮    時(shí)間: 2018-2-8 22:34
標(biāo)題: STC15F2K60S2單片機(jī)雙串口(中繼)實(shí)驗(yàn)源碼-我的處女貼

51單片機(jī)源程序:

  1. /*******************************************************************************************
  2. * 雙串口試驗(yàn)(中繼) *
  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; //定時(shí)器2高8位
  14. sfr T2L = 0xd7; //定時(shí)器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; //發(fā)送完標(biāo)志
  24. bit flagTxd2 = 0;
  25. U8 cntRxd = 0; //接收計(jì)數(shù)器
  26. U8 cntRxd2 = 0;
  27. U8 flagRxd = 0;//收到數(shù)據(jù)標(biāo)志
  28. U8 flagRxd2 = 0;
  29. U8 pdata bufRxd[64]; //接收緩沖區(qū)
  30. U8 pdata bufRxd2[64];


  31. /**************************************
  32. 延時(shí)程序
  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為數(shù)據(jù)可變波特率
  60. S2CON =0X50;//COM2 8為數(shù)據(jù)可變波特率
  61. AUXR |= 0x01;//選擇定時(shí)器2位波特率發(fā)生器
  62. AUXR |= 0x04;//定時(shí)器2時(shí)鐘為Fosc,即1T
  63. T2L = 0xE8;//設(shè)定定時(shí)初始值低位
  64. T2H = 0xFF;//設(shè)定定時(shí)初始值高位
  65. AUXR |= 0x10;//啟動(dòng)定時(shí)器2
  66. ES = 1; //使能串口1中斷
  67. IE2 = 0x01; //使能串口2中斷
  68. EA = 1;
  69. }




  70. /* 串口數(shù)據(jù)寫入,即串口發(fā)送函數(shù),buf為數(shù)據(jù)指針,len為數(shù)據(jù)長度*/
  71. void UartWrite(U8 *buf, U8 len)
  72. {
  73. DIR = 1; //RS485設(shè)置為發(fā)送
  74. while (len--) //循環(huán)發(fā)送所有字節(jié)
  75. {
  76. flagTxd = 0; //清發(fā)送標(biāo)志
  77. SBUF = *buf++; //發(fā)送一個(gè)字節(jié)
  78. while (!flagTxd); //等待字節(jié)發(fā)送完成
  79. }
  80. Delay(1); //等待最后的停止位完成
  81. DIR = 0; //RS485設(shè)置為接收
  82. }




  83. void UartWrite2(U8 *buf, U8 len)
  84. {
  85. DIR2 = 1; //RS485設(shè)置為發(fā)送
  86. while (len--) //循環(huán)發(fā)送所有字節(jié)
  87. {
  88. flagTxd2 = 0; //清發(fā)送標(biāo)志
  89. S2BUF = *buf++; //發(fā)送一個(gè)字節(jié)
  90. while (!flagTxd2); //等待字節(jié)發(fā)送完成
  91. }
  92. Delay(1); //等待最后的停止位完成
  93. DIR2 = 0; //RS485設(shè)置為接收

  94. }
  95. void main (void)
  96. {
  97. U8 pdata Data[64]; //接收字節(jié)緩沖區(qū)
  98. U8 pdata Data2[64];
  99. U8 i;

  100. UartInit();//串口初始化
  101. while(1)
  102. {
  103. DIR = 0;//設(shè)置串口1為接收狀態(tài)
  104. if (flagRxd==1)//如果有數(shù)據(jù)
  105. {
  106. Delay(5);//等待接收
  107. for (i=0;i<cntRxd;i++)
  108. {
  109. Data[ i]=bufRxd[ i];//讀取緩沖區(qū)
  110. }
  111. UartWrite2(Data,cntRxd);//從COM2發(fā)送出去
  112. cntRxd=0;//清空計(jì)數(shù)器及接收標(biāo)志
  113. flagRxd=0;
  114. }
  115. DIR2 = 0;//設(shè)置串口2為接收狀態(tài)
  116. if (flagRxd2==1)//如果有數(shù)據(jù)
  117. {
  118. Delay(5);//等待接收
  119. for (i=0;i<cntRxd2;i++)
  120. {
  121. Data2[ i]=bufRxd2[ i];//讀取緩沖區(qū)
  122. }
  123. UartWrite(Data2,cntRxd2);//從COM2發(fā)送出去
  124. cntRxd2=0;//清空計(jì)數(shù)器及接收標(biāo)志
  125. flagRxd2=0;
  126. }



  127. }
  128. }


  129. /* 串口中斷服務(wù) */
  130. void InterruptUART() interrupt 4
  131. {
  132. if (RI) //接收到新字符
  133. {
  134. RI = 0; //清零接收中斷標(biāo)志
  135. flagRxd=1;
  136. if (cntRxd < sizeof(bufRxd)) //接收緩沖區(qū)未用完時(shí)
  137. { //保存接收字節(jié),并自加計(jì)數(shù)器
  138. bufRxd[cntRxd++] = SBUF;
  139. }
  140. }
  141. if (TI) //字節(jié)發(fā)送完畢
  142. {
  143. TI = 0; //清零發(fā)送中斷標(biāo)志
  144. flagTxd = 1; //設(shè)置字節(jié)發(fā)送完成標(biāo)志
  145. }
  146. }


  147. /* 串口中斷服務(wù) */
  148. void InterruptUART2() interrupt 8
  149. {
  150. if (S2CON & S2RI) //接收到新字符
  151. {
  152. S2CON &= ~S2RI; //清零接收中斷標(biāo)志
  153. flagRxd2=1;
  154. if (cntRxd2 < sizeof(bufRxd2)) //接收緩沖區(qū)未用完時(shí)
  155. { //保存接收字節(jié),并自加計(jì)數(shù)器
  156. bufRxd2[cntRxd2++] = S2BUF;
  157. }
  158. }
  159. if (S2CON & S2TI) //字節(jié)發(fā)送完畢
  160. {
  161. S2CON &= ~S2TI; //清零發(fā)送中斷標(biāo)志
  162. flagTxd2 = 1; //設(shè)置字節(jié)發(fā)送完成標(biāo)志
  163. }
  164. }

復(fù)制代碼



作者: 騰飛的龍    時(shí)間: 2018-6-19 08:33
最小系統(tǒng)焊的很精簡。。≈x謝分享
作者: 李是是是    時(shí)間: 2018-12-20 20:44
我用串口二發(fā)送指令給串口一的時(shí)候發(fā)現(xiàn)串口一接收不到指令
作者: 公寓3    時(shí)間: 2018-12-20 23:50
好厲害,樓主很棒
作者: zhouyue203    時(shí)間: 2021-1-3 21:21
你好,今天看到你發(fā)的貼子,我現(xiàn)在有一個(gè)問題,請(qǐng)教一下。我現(xiàn)在也用這款單片機(jī)的雙串口,也是11.0592,波特率也是115200.我覺的有點(diǎn)高,我改成波特率12分頻的,把這個(gè)配置去掉AUXR |= 0x04;波特率9600,串口2就不能接收數(shù)據(jù)了,不知道為什么,請(qǐng)指教。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1