久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5093|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲午夜精品 | 日韩一区二区在线看 | 好姑娘影视在线观看高清 | 国产精品日女人 | 天天看逼| 国产一二区免费视频 | 国产精品视频久久久 | av中文字幕在线播放 | 中文字幕乱码一区二区三区 | 综合激情网 | 日批的视频 | 精品国产伦一区二区三区观看方式 | 日本一本在线 | 青青草这里只有精品 | 日本精品一区二区三区在线观看视频 | 日韩免费高清视频 | 欧美成人免费在线视频 | 久久草视频 | av网站免费在线观看 | 日韩欧美国产不卡 | 爱草在线 | 欧美激情综合色综合啪啪五月 | 国产精品永久免费视频 | 久久久久久久综合 | 九九久久国产 | 精品欧美乱码久久久久久 | 久久精品色欧美aⅴ一区二区 | 国产日韩一区二区 | 99精品视频免费观看 | 国产精品久久久久一区二区三区 | 午夜影院在线观看版 | 91精品国产综合久久久久 | 伊人久久一区二区 | 日本午夜精品一区二区三区 | h视频在线免费看 | 日韩成人免费av | 成人网av | 日本不卡高字幕在线2019 | 欧美一级在线观看 | 国产99久久精品一区二区永久免费 | 色综合视频 |