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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3073|回復: 0
打印 上一主題 下一主題
收起左側

1T單片機STC15的4個串口通訊驅動程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:842875 發表于 2020-11-12 23:14 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、串口通訊
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/


  7. /*********************************************************/
  8. #define MAIN_Fosc                22118400L        //定義主時鐘
  9. //#define MAIN_Fosc                11059200L        //定義主時鐘

  10. #include        "STC15Fxxxx.H"


  11. /*************        功能說明        **************

  12. 4串口全雙工中斷方式收發通訊程序。

  13. 通過PC向MCU發送數據, MCU收到后通過串口把收到的數據原樣返回.

  14. 默認參數:
  15. 所有設置均為 1位起始位, 8位數據位, 1位停止位, 無校驗.
  16. 每個串口可以使用不同的波特率.
  17. 串口1(P3.0 P3.1): 115200bps.
  18. 串口2(P1.0 P1.1):  57600bps.
  19. 串口3(P0.0 P0.1):  38400bps.
  20. 串口4(P0.2 P0.3):  19200bps.


  21. ******************************************/

  22. /*************        本地常量聲明        **************/
  23. #define        RX1_Length        128                /* 接收緩沖長度 */
  24. #define        RX2_Length        128                /* 接收緩沖長度 */
  25. #define        RX3_Length        128                /* 接收緩沖長度 */
  26. #define        RX4_Length        128                /* 接收緩沖長度 */

  27. #define        UART_BaudRate1        115200UL         /* 波特率 */
  28. #define        UART_BaudRate2         57600UL         /* 波特率 */
  29. #define        UART_BaudRate3         38400UL         /* 波特率 */
  30. #define        UART_BaudRate4         19200UL         /* 波特率 */


  31. /*************        本地變量聲明        **************/
  32. u8        xdata        RX1_Buffer[RX1_Length];        //接收緩沖
  33. u8        xdata        RX2_Buffer[RX2_Length];        //接收緩沖
  34. u8        xdata        RX3_Buffer[RX3_Length];        //接收緩沖
  35. u8        xdata        RX4_Buffer[RX4_Length];        //接收緩沖

  36. u8        TX1_read,RX1_write;        //讀寫索引(指針).
  37. u8        TX2_read,RX2_write;        //讀寫索引(指針).
  38. u8        TX3_read,RX3_write;        //讀寫索引(指針).
  39. u8        TX4_read,RX4_write;        //讀寫索引(指針).

  40. bit        B_TX1_Busy,B_TX2_Busy,B_TX3_Busy,B_TX4_Busy;        // 發送忙標志


  41. /*************        本地函數聲明        **************/
  42. void        UART1_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  43. void        UART2_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  44. void        UART3_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
  45. void        UART4_config(u8 brt);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  46. void         PrintString1(u8 *puts);
  47. void         PrintString2(u8 *puts);
  48. void         PrintString3(u8 *puts);
  49. void         PrintString4(u8 *puts);




  50. /**********************************************/
  51. void main(void)
  52. {

  53.         P0n_standard(0xff);        //設置為準雙向口
  54.         P1n_standard(0xff);        //設置為準雙向口
  55.         P2n_standard(0xff);        //設置為準雙向口
  56.         P3n_standard(0xff);        //設置為準雙向口
  57.         P4n_standard(0xff);        //設置為準雙向口
  58.         P5n_standard(0xff);        //設置為準雙向口

  59.         UART1_config(1);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  60.         UART2_config(2);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  61.         UART3_config(3);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
  62.         UART4_config(4);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.

  63.         EA = 1;

  64.         PrintString1("STC15F4K60S4 USART1 Test Prgramme!\r\n");
  65.         PrintString2("STC15F4K60S4 USART2 Test Prgramme!\r\n");
  66.         PrintString3("STC15F4K60S4 USART3 Test Prgramme!\r\n");
  67.         PrintString4("STC15F4K60S4 USART4 Test Prgramme!\r\n");

  68.         while (1)
  69.         {
  70.                 if((TX1_read != RX1_write) && !B_TX1_Busy)        //收到過數據, 并且發送空閑
  71.                 {
  72.                         B_TX1_Busy = 1;                //標志發送忙
  73.                         SBUF = RX1_Buffer[TX1_read];        //發一個字節
  74.                         if(++TX1_read >= RX1_Length)        TX1_read = 0;        //避免溢出處理
  75.                 }

  76.                 if((TX2_read != RX2_write) && !B_TX2_Busy)        //收到過數據, 并且發送空閑
  77.                 {
  78.                         B_TX2_Busy = 1;                //標志發送忙
  79.                         S2BUF = RX2_Buffer[TX2_read];        //發一個字節
  80.                         if(++TX2_read >= RX2_Length)        TX2_read = 0;        //避免溢出處理
  81.                 }

  82.                 if((TX3_read != RX3_write) && !B_TX3_Busy)        //收到過數據, 并且發送空閑
  83.                 {
  84.                         B_TX3_Busy = 1;                //標志發送忙
  85.                         S3BUF = RX3_Buffer[TX3_read];        //發一個字節
  86.                         if(++TX3_read >= RX3_Length)        TX3_read = 0;        //避免溢出處理
  87.                 }

  88.                 if((TX4_read != RX4_write) && !B_TX4_Busy)        //收到過數據, 并且發送空閑
  89.                 {
  90.                         B_TX4_Busy = 1;                //標志發送忙
  91.                         S4BUF = RX4_Buffer[TX4_read];        //發一個字節
  92.                         if(++TX4_read >= RX4_Length)        TX4_read = 0;        //避免溢出處理
  93.                 }
  94.         }
  95. }


  96. //========================================================================
  97. // 函數: SetTimer2Baudraye(u16 dat)
  98. // 描述: 設置Timer2做波特率發生器。
  99. // 參數: dat: Timer2的重裝值.
  100. // 返回: none.
  101. // 版本: VER1.0
  102. // 日期: 2014-11-28
  103. // 備注:
  104. //========================================================================
  105. void        SetTimer2Baudraye(u16 dat)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  106. {
  107.         AUXR &= ~(1<<4);        //Timer stop
  108.         AUXR &= ~(1<<3);        //Timer2 set As Timer
  109.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  110.         TH2 = dat / 256;
  111.         TL2 = dat % 256;
  112.         IE2  &= ~(1<<2);        //禁止中斷
  113.         AUXR |=  (1<<4);        //Timer run enable
  114. }


  115. //========================================================================
  116. // 函數: void        UART1_config(u8 brt)
  117. // 描述: UART1初始化函數。
  118. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  119. // 返回: none.
  120. // 版本: VER1.0
  121. // 日期: 2014-11-28
  122. // 備注:
  123. //========================================================================
  124. void        UART1_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  125. {
  126.         u8        i;
  127.         /*********** 波特率使用定時器2 *****************/
  128.         if(brt == 2)
  129.         {
  130.                 AUXR |= 0x01;                //S1 BRT Use Timer2;
  131.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate1);
  132.         }

  133.         /*********** 波特率使用定時器1 *****************/
  134.         else
  135.         {
  136.                 TR1 = 0;
  137.                 AUXR &= ~0x01;                //S1 BRT Use Timer1;
  138.                 AUXR |=  (1<<6);        //Timer1 set as 1T mode
  139.                 TMOD &= ~(1<<6);        //Timer1 set As Timer
  140.                 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  141.                 TH1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) / 256;
  142.                 TL1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) % 256;
  143.                 ET1 = 0;        //禁止中斷
  144.                 INT_CLKO &= ~0x02;        //不輸出時鐘
  145.                 TR1  = 1;
  146.         }
  147.         /*************************************************/

  148.         SCON = (SCON & 0x3f) | (1<<6);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  149. //        PS  = 1;        //高優先級中斷
  150.         ES  = 1;        //允許中斷
  151.         REN = 1;        //允許接收
  152.         P_SW1 = P_SW1 & 0x3f;        //切換到 P3.0 P3.1
  153. //        P_SW1 = (P_SW1 & 0x3f) | (1<<6);        //切換到P3.6 P3.7
  154. //        P_SW1 = (P_SW1 & 0x3f) | (2<<6);        //切換到P1.6 P1.7 (必須使用內部時鐘)

  155.         for(i=0; i<RX1_Length; i++)                RX1_Buffer[ i] = 0;
  156.         B_TX1_Busy  = 0;
  157.         TX1_read    = 0;
  158.         RX1_write   = 0;
  159. }


  160. //========================================================================
  161. // 函數: void        UART2_config(u8 brt)
  162. // 描述: UART2初始化函數。
  163. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  164. // 返回: none.
  165. // 版本: VER1.0
  166. // 日期: 2014-11-28
  167. // 備注:
  168. //========================================================================
  169. void        UART2_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  170. {
  171.         u8        i;
  172.         /*********** 波特率固定使用定時器2 *****************/
  173.         if(brt == 2)        SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate2);

  174.         S2CON &= ~(1<<7);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  175.         IE2   |= 1;                        //允許中斷
  176.         S2CON |= (1<<4);        //允許接收
  177.         P_SW2 &= ~1;                //切換到 P1.0 P1.1
  178. //        P_SW2 |= 1;                        //切換到 P4.6 P4.7

  179.         for(i=0; i<RX2_Length; i++)                RX2_Buffer[ i] = 0;
  180.         B_TX2_Busy  = 0;
  181.         TX2_read    = 0;
  182.         RX2_write   = 0;
  183. }
  184. //========================================================================
  185. // 函數: void        UART3_config(u8 brt)
  186. // 描述: UART3初始化函數。
  187. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
  188. // 返回: none.
  189. // 版本: VER1.0
  190. // 日期: 2014-11-28
  191. // 備注:
  192. //========================================================================
  193. void        UART3_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
  194. {
  195.         u8        i;
  196.         /*********** 波特率固定使用定時器2 *****************/
  197.         if(brt == 2)
  198.         {
  199.                 S3CON &= ~(1<<6);        //BRT select Timer2
  200.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate3);
  201.         }
  202.         /*********** 波特率使用定時器3 *****************/
  203.         else
  204.         {
  205.                 S3CON |= (1<<6);        //BRT select Timer3
  206.                 T4T3M &= 0xf0;                //停止計數, 清除控制位
  207.                 IE2  &= ~(1<<5);        //禁止中斷
  208.                 T4T3M |=  (1<<1);        //1T
  209.                 T4T3M &= ~(1<<2);        //定時
  210.                 T4T3M &= ~1;                //不輸出時鐘
  211.                 TH3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) / 256;
  212.                 TL3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) % 256;
  213.                 T4T3M |=  (1<<3);        //開始運行
  214.         }
  215.         S3CON &= ~(1<<5);        //禁止多機通訊方式
  216.         S3CON &= ~(1<<7);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  217.         IE2   |=  (1<<3);        //允許中斷
  218.         S3CON |=  (1<<4);        //允許接收
  219.         P_SW2 &= ~2;                //切換到 P0.0 P0.1
  220. //        P_SW2 |= 2;                        //切換到 P5.0 P5.1
  221.         for(i=0; i<RX3_Length; i++)                RX3_Buffer[ i] = 0;
  222.         B_TX3_Busy  = 0;
  223.         TX3_read    = 0;
  224.         RX3_write   = 0;
  225. }

  226. //========================================================================
  227. // 函數: void        UART4_config(u8 brt)
  228. // 描述: UART4初始化函數。
  229. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  230. // 返回: none.
  231. // 版本: VER1.0
  232. // 日期: 2014-11-28
  233. // 備注:
  234. //========================================================================
  235. void        UART4_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  236. {
  237.         u8        i;
  238.         /*********** 波特率固定使用定時器2 *****************/
  239.         if(brt == 2)
  240.         {
  241.                 S4CON &= ~(1<<6);        //BRT select Timer2
  242.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate4);
  243.         }
  244.         /*********** 波特率使用定時器3 *****************/
  245.         else
  246.         {
  247.                 S4CON |= (1<<6);        //BRT select Timer4
  248.                 T4T3M &= 0x0f;                //停止計數, 清除控制位
  249.                 IE2   &= ~(1<<6);        //禁止中斷
  250.                 T4T3M |=  (1<<5);        //1T
  251.                 T4T3M &= ~(1<<6);        //定時
  252.                 T4T3M &= ~(1<<4);        //不輸出時鐘
  253.                 TH4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) / 256;
  254.                 TL4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) % 256;
  255.                 T4T3M |=  (1<<7);        //開始運行
  256.         }

  257.         S4CON &= ~(1<<5);        //禁止多機通訊方式
  258.         S4CON &= ~(1<<7);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  259.         IE2   |=  (1<<4);        //允許中斷
  260.         S4CON |=  (1<<4);        //允許接收
  261.         P_SW2 &= ~4;                //切換到 P0.2 P0.3
  262. //        P_SW2 |= 4;                        //切換到 P5.2 P5.3

  263.         for(i=0; i<RX4_Length; i++)                RX4_Buffer[ i] = 0;
  264.         B_TX4_Busy  = 0;
  265.         TX4_read    = 0;
  266.         RX4_write   = 0;
  267. }


  268. void PrintString1(u8 *puts)
  269. {
  270.     for (; *puts != 0;        puts++)
  271.         {
  272.                 B_TX1_Busy = 1;                //標志發送忙
  273.                 SBUF = *puts;                //發一個字節
  274.                 while(B_TX1_Busy);        //等待發送完成
  275.         }
  276. }

  277. void PrintString2(u8 *puts)
  278. {
  279.     for (; *puts != 0;        puts++)
  280.         {
  281.                 B_TX2_Busy = 1;                //標志發送忙
  282.                 S2BUF = *puts;                //發一個字節
  283.                 while(B_TX2_Busy);        //等待發送完成
  284.         }
  285. }

  286. void PrintString3(u8 *puts)
  287. {
  288.     for (; *puts != 0;        puts++)
  289.         {
  290.                 B_TX3_Busy = 1;                //標志發送忙
  291.                 S3BUF = *puts;                //發一個字節
  292.                 while(B_TX3_Busy);        //等待發送完成
  293.         }
  294. }

  295. void PrintString4(u8 *puts)
  296. {
  297.     for (; *puts != 0;        puts++)
  298.         {
  299.                 B_TX4_Busy = 1;                //標志發送忙
  300.                 S4BUF = *puts;                //發一個字節
  301.                 while(B_TX4_Busy);        //等待發送完成
  302.         }
  303. }



  304. /********************* UART1中斷函數************************/
  305. void UART1_int (void) interrupt UART1_VECTOR
  306. {
  307.         if(RI)
  308.         {
  309.                 RI = 0;
  310.                 RX1_Buffer[RX1_write] = SBUF;
  311.                 if(++RX1_write >= RX1_Length)        RX1_write = 0;
  312.         }

  313.         if(TI)
  314.         {
  315.                 TI = 0;
  316.                 B_TX1_Busy = 0;
  317.         }
  318. }

  319. /********************* UART2中斷函數************************/
  320. void UART2_int (void) interrupt UART2_VECTOR
  321. {
  322.         if(RI2)
  323.         {
  324.                 CLR_RI2();
  325.                 RX2_Buffer[RX2_write] = S2BUF;
  326.                 if(++RX2_write >= RX2_Length)        RX2_write = 0;
  327.         }

  328.         if(TI2)
  329.         {
  330.                 CLR_TI2();
  331.                 B_TX2_Busy = 0;
  332.         }

  333. }

  334. /********************* UART3中斷函數************************/
  335. void UART3_int (void) interrupt UART3_VECTOR
  336. {
  337.         if(RI3)
  338.         {
  339.                 CLR_RI3();
  340.                 RX3_Buffer[RX3_write] = S3BUF;
  341.                 if(++RX3_write >= RX3_Length)        RX3_write = 0;
  342.         }

  343.         if(TI3)
  344.         {
  345.                 CLR_TI3();
  346.                 B_TX3_Busy = 0;
  347.         }

  348. }

  349. /********************* UART4中斷函數************************/
  350. void UART4_int (void) interrupt UART4_VECTOR
  351. {
  352.         if(RI4)
  353.         {
  354.                 CLR_RI4();
  355.                 RX4_Buffer[RX4_write] = S4BUF;
  356.                 if(++RX4_write >= RX4_Length)        RX4_write = 0;
  357.         }

  358.         if(TI4)
  359.         {
  360.                 CLR_TI4();
  361.                 B_TX4_Busy = 0;
  362.         }

  363. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂在线免费视频 | 亚洲女优在线播放 | 91精品一区| 欧美亚洲另类在线 | 中文字幕一区二区三区乱码在线 | 国产欧美精品一区二区色综合 | 欧美一区二区三区在线免费观看 | 国产精品亚洲精品日韩已方 | 黄色小视频大全 | 久久久久久亚洲精品 | 成人精品一区二区三区中文字幕 | 精品久久久久久亚洲精品 | 日韩亚洲视频 | 亚洲国产精品久久久久秋霞不卡 | 337p日本欧洲亚洲大胆精蜜臀 | 欧美一区二区成人 | 成人在线中文字幕 | 国产一级在线观看 | 亚洲一区二区三区在线 | 日韩欧美精品在线 | 亚洲成年在线 | 爱操影视| 91在线中文字幕 | 国产免费一级一级 | 免费国产视频 | 国产美女在线看 | 日韩久久综合网 | 91一区二区三区 | 国产精品久久久久久久毛片 | 国产综合欧美 | 精品美女久久久 | 欧美激情综合五月色丁香小说 | av网站在线免费观看 | 久久综合久久久 | 91免费在线| japan21xxxxhd美女| 99re视频在线观看 | 中文字幕欧美日韩 | 亚洲免费视频一区 | 日韩精品1区2区3区 爱爱综合网 | 亚洲色欧美另类 |