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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3515|回復: 10
收起左側

STC15w4K單片機可以把串口改成自己可以通過按鍵設置波特率嗎

  [復制鏈接]
回帖獎勵 20 黑幣 回復本帖可獲得 20 黑幣獎勵! 每人限 10 次
ID:211960 發表于 2018-12-18 01:02 | 顯示全部樓層 |閱讀模式
  1. /*********************************************************/
  2. #define MAIN_Fosc                22118400L        //定義主時鐘
  3. //#define MAIN_Fosc                11059200L        //定義主時鐘

  4. #include        "STC15Fxxxx.H"
  5. sbit K1 = P5^0;


  6. /*************        功能說明        **************

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

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

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


  16. ******************************************/

  17. /*************        本地常量聲明        **************/
  18. #define        RX1_Length        128                /* 接收緩沖長度 */
  19. #define        RX2_Length        128                /* 接收緩沖長度 */
  20. #define        RX3_Length        128                /* 接收緩沖長度 */
  21. #define        RX4_Length        128                /* 接收緩沖長度 */

  22. #define        UART_BaudRate1        9600UL         /* 波特率 */
  23. #define        UART_BaudRate2         57600UL         /* 波特率 */
  24. #define        UART_BaudRate3         38400UL         /* 波特率 */
  25. #define        UART_BaudRate4         19200UL         /* 波特率 */


  26. /*************        本地變量聲明        **************/
  27. u8        xdata        RX1_Buffer[RX1_Length];        //接收緩沖
  28. u8        xdata        RX2_Buffer[RX2_Length];        //接收緩沖
  29. u8        xdata        RX3_Buffer[RX3_Length];        //接收緩沖
  30. u8        xdata        RX4_Buffer[RX4_Length];        //接收緩沖

  31. u8        TX1_read,RX1_write;        //讀寫索引(指針).
  32. u8        TX2_read,RX2_write;        //讀寫索引(指針).
  33. u8        TX3_read,RX3_write;        //讀寫索引(指針).
  34. u8        TX4_read,RX4_write;        //讀寫索引(指針).

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


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




  45. /**********************************************/
  46. void main(void)
  47. {

  48.         P0n_standard(0xff);        //設置為準雙向口
  49.         P1n_standard(0xff);        //設置為準雙向口
  50.         P2n_standard(0xff);        //設置為準雙向口
  51.         P3n_standard(0xff);        //設置為準雙向口
  52.         P4n_standard(0xff);        //設置為準雙向口
  53.         P5n_standard(0xff);        //設置為準雙向口
  54.         
  55.         UART1_config(1);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  56.         UART2_config(2);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
  57.         UART3_config(3);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
  58.         UART4_config(4);        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  59.         
  60.         EA = 1;

  61.         PrintString1("STC15F4K60S4 USART1 Test Prgramme!\r\n");
  62.         PrintString2("STC15F4K60S4 USART2 Test Prgramme!\r\n");
  63.         PrintString3("STC15F4K60S4 USART3 Test Prgramme!\r\n");
  64.         PrintString4("STC15F4K60S4 USART4 Test Prgramme!\r\n");

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

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

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

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


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


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

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

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

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


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

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

  181.         for(i=0; i<RX2_Length; i++)                RX2_Buffer[i] = 0;
  182.         B_TX2_Busy  = 0;
  183.         TX2_read    = 0;
  184.         RX2_write   = 0;
  185. }

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

  224.         for(i=0; i<RX3_Length; i++)                RX3_Buffer[i] = 0;
  225.         B_TX3_Busy  = 0;
  226.         TX3_read    = 0;
  227.         RX3_write   = 0;
  228. }

  229. //========================================================================
  230. // 函數: void        UART4_config(u8 brt)
  231. // 描述: UART4初始化函數。
  232. // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  233. // 返回: none.
  234. // 版本: VER1.0
  235. // 日期: 2014-11-28
  236. // 備注:
  237. //========================================================================
  238. void        UART4_config(u8 brt)        // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
  239. {
  240.         u8        i;
  241.         /*********** 波特率固定使用定時器2 *****************/
  242.         if(brt == 2)
  243.         {
  244.                 S4CON &= ~(1<<6);        //BRT select Timer2
  245.                 SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate4);
  246.         }
  247.         /*********** 波特率使用定時器3 *****************/
  248.         else
  249.         {
  250.                 S4CON |= (1<<6);        //BRT select Timer4
  251.                 T4T3M &= 0x0f;                //停止計數, 清除控制位
  252.                 IE2   &= ~(1<<6);        //禁止中斷
  253.                 T4T3M |=  (1<<5);        //1T
  254.                 T4T3M &= ~(1<<6);        //定時
  255.                 T4T3M &= ~(1<<4);        //不輸出時鐘
  256.                 TH4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) / 256;
  257.                 TL4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) % 256;
  258.                 T4T3M |=  (1<<7);        //開始運行
  259.         }
  260.         
  261.         S4CON &= ~(1<<5);        //禁止多機通訊方式
  262.         S4CON &= ~(1<<7);        // 8位數據, 1位起始位, 1位停止位, 無校驗
  263.         IE2   |=  (1<<4);        //允許中斷
  264.         S4CON |=  (1<<4);        //允許接收
  265.         P_SW2 &= ~4;                //切換到 P0.2 P0.3
  266. //        P_SW2 |= 4;                        //切換到 P5.2 P5.3

  267.         for(i=0; i<RX4_Length; i++)                RX4_Buffer[i] = 0;
  268.         B_TX4_Busy  = 0;
  269.         TX4_read    = 0;
  270.         RX4_write   = 0;
  271. }


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

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

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

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



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

  317.         if(TI)
  318.         {
  319.                 TI = 0;
  320.                 B_TX1_Busy = 0;
  321.         }
  322. }

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

  332.         if(TI2)
  333.         {
  334.                 CLR_TI2();
  335.                 B_TX2_Busy = 0;
  336.         }

  337. }

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

  347.         if(TI3)
  348.         {
  349.                 CLR_TI3();
  350.                 B_TX3_Busy = 0;
  351.         }

  352. }

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

  362.         if(TI4)
  363.         {
  364.                 CLR_TI4();
  365.                 B_TX4_Busy = 0;
  366.         }

  367. }
復制代碼
回復

使用道具 舉報

ID:448400 發表于 2018-12-18 07:34 | 顯示全部樓層
似乎不行,具體還沒試過

評分

參與人數 1黑幣 +6 收起 理由
qa490739173 + 6 STC10F系列BRT 就可以設置波特率

查看全部評分

回復

使用道具 舉報

ID:65956 發表于 2018-12-18 11:51 | 顯示全部樓層
說的問題聽不太明白意思
如果想用一個按鍵來作切換串口波特率是完全可以的,也很容易,如果想讓單片機自適應波特率這個就非常的復雜了,也不是那么簡單,軟硬件也很不好寫,通訊起來速度也非常慢,有興趣是可以試試,但這不適用大多場合。

評分

參與人數 1黑幣 +6 收起 理由
qa490739173 + 6 就是按鍵設置波特率

查看全部評分

回復

使用道具 舉報

ID:320306 發表于 2018-12-18 21:30 | 顯示全部樓層
按鍵控制串口重新初始化,比較麻煩  但是是可以實現的!!!!!
回復

使用道具 舉報

ID:211960 發表于 2018-12-18 22:45 | 顯示全部樓層
像這種的 這個單片機型號不一樣
TIM截圖20181218224405.png
回復

使用道具 舉報

ID:450546 發表于 2018-12-20 11:00 | 顯示全部樓層
檢測按鍵 根據按鍵值使用對應的預設值重新初始化想改波特率的串口就好了

評分

參與人數 1黑幣 +6 收起 理由
qa490739173 + 6 不會

查看全部評分

回復

使用道具 舉報

ID:250700 發表于 2018-12-21 13:49 | 顯示全部樓層
改變串口波特率很簡單,方法很多如按鍵改變(最好要有個指示,不然不知道當前狀態)重置串口波特率計數器就可以了,也可以定時改變串口波特率。
回復

使用道具 舉報

ID:85480 發表于 2019-8-2 15:51 | 顯示全部樓層
菜鳥問一下   U8  這個貌似沒看到宏定義啊
回復

使用道具 舉報

ID:594300 發表于 2019-8-2 19:29 | 顯示全部樓層
完全可以的,檢測按鍵按下了,重新設置波特率,初始化串口就好了。 若要自適應波特率,可以輪詢切換波特率,發送查詢外設的命令,檢查直到收到預期回復
回復

使用道具 舉報

ID:433102 發表于 2019-8-5 16:46 | 顯示全部樓層
檢測按鍵,根據按鍵值使用對應的預設值重新初始化想改波特率的串口就好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产91久久久久久最新 | 日本男人天堂 | 欧美成人一区二区 | 日韩在线91 | 亚洲精选一区二区 | 久久久久久91香蕉国产 | 国产欧美精品区一区二区三区 | 色姑娘综合网 | 雨宫琴音一区二区在线 | 自拍偷拍在线视频 | 欧美精品乱码99久久影院 | 成人在线黄色 | 亚洲国产一区二区视频 | 91精品国产乱码久久蜜臀 | 日韩精品区 | 在线欧美视频 | 久久天天综合 | 久久久久久免费毛片精品 | 天天操欧美 | 大吊一区二区 | 在线观看三级av | 国产欧美精品一区二区色综合朱莉 | 久久精品欧美一区二区三区不卡 | 国产激情视频在线观看 | 日韩视频在线一区 | 一级片视频免费观看 | 日本精品一区二区三区视频 | 久久99久久 | 九七午夜剧场福利写真 | 91传媒在线观看 | 国产精品一区二区三区四区 | 欧美日韩国产在线 | 欧美精品成人一区二区三区四区 | 亚洲视频三 | 干干天天 | 亚洲精品视频一区二区三区 | 色就干 | 91免费视频| 成人在线免费电影 | 三级黄色片在线播放 | 99亚洲 |