- /*********************************************************/
- #define MAIN_Fosc 22118400L //定義主時鐘
- //#define MAIN_Fosc 11059200L //定義主時鐘
- #include "STC15Fxxxx.H"
- sbit K1 = P5^0;
- /************* 功能說明 **************
- 4串口全雙工中斷方式收發通訊程序。
- 通過PC向MCU發送數據, MCU收到后通過串口把收到的數據原樣返回.
- 默認參數:
- 所有設置均為 1位起始位, 8位數據位, 1位停止位, 無校驗.
- 每個串口可以使用不同的波特率.
- 串口1(P3.0 P3.1): 115200bps.
- 串口2(P1.0 P1.1): 57600bps.
- 串口3(P0.0 P0.1): 38400bps.
- 串口4(P0.2 P0.3): 19200bps.
- ******************************************/
- /************* 本地常量聲明 **************/
- #define RX1_Length 128 /* 接收緩沖長度 */
- #define RX2_Length 128 /* 接收緩沖長度 */
- #define RX3_Length 128 /* 接收緩沖長度 */
- #define RX4_Length 128 /* 接收緩沖長度 */
- #define UART_BaudRate1 9600UL /* 波特率 */
- #define UART_BaudRate2 57600UL /* 波特率 */
- #define UART_BaudRate3 38400UL /* 波特率 */
- #define UART_BaudRate4 19200UL /* 波特率 */
- /************* 本地變量聲明 **************/
- u8 xdata RX1_Buffer[RX1_Length]; //接收緩沖
- u8 xdata RX2_Buffer[RX2_Length]; //接收緩沖
- u8 xdata RX3_Buffer[RX3_Length]; //接收緩沖
- u8 xdata RX4_Buffer[RX4_Length]; //接收緩沖
- u8 TX1_read,RX1_write; //讀寫索引(指針).
- u8 TX2_read,RX2_write; //讀寫索引(指針).
- u8 TX3_read,RX3_write; //讀寫索引(指針).
- u8 TX4_read,RX4_write; //讀寫索引(指針).
- bit B_TX1_Busy,B_TX2_Busy,B_TX3_Busy,B_TX4_Busy; // 發送忙標志
- /************* 本地函數聲明 **************/
- void UART1_config(u8 brt); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- void UART2_config(u8 brt); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
- void UART3_config(u8 brt); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
- void UART4_config(u8 brt); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
- void PrintString1(u8 *puts);
- void PrintString2(u8 *puts);
- void PrintString3(u8 *puts);
- void PrintString4(u8 *puts);
- /**********************************************/
- void main(void)
- {
- P0n_standard(0xff); //設置為準雙向口
- P1n_standard(0xff); //設置為準雙向口
- P2n_standard(0xff); //設置為準雙向口
- P3n_standard(0xff); //設置為準雙向口
- P4n_standard(0xff); //設置為準雙向口
- P5n_standard(0xff); //設置為準雙向口
-
- UART1_config(1); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- UART2_config(2); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
- UART3_config(3); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
- UART4_config(4); // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
-
- EA = 1;
- PrintString1("STC15F4K60S4 USART1 Test Prgramme!\r\n");
- PrintString2("STC15F4K60S4 USART2 Test Prgramme!\r\n");
- PrintString3("STC15F4K60S4 USART3 Test Prgramme!\r\n");
- PrintString4("STC15F4K60S4 USART4 Test Prgramme!\r\n");
- while (1)
- {
-
-
- UART_BaudRate1=1159200;
-
-
- if((TX1_read != RX1_write) && !B_TX1_Busy) //收到過數據, 并且發送空閑
- {
- B_TX1_Busy = 1; //標志發送忙
- SBUF = RX1_Buffer[TX1_read]; //發一個字節
- if(++TX1_read >= RX1_Length) TX1_read = 0; //避免溢出處理
- }
- if((TX2_read != RX2_write) && !B_TX2_Busy) //收到過數據, 并且發送空閑
- {
- B_TX2_Busy = 1; //標志發送忙
- S2BUF = RX2_Buffer[TX2_read]; //發一個字節
- if(++TX2_read >= RX2_Length) TX2_read = 0; //避免溢出處理
- }
- if((TX3_read != RX3_write) && !B_TX3_Busy) //收到過數據, 并且發送空閑
- {
- B_TX3_Busy = 1; //標志發送忙
- S3BUF = RX3_Buffer[TX3_read]; //發一個字節
- if(++TX3_read >= RX3_Length) TX3_read = 0; //避免溢出處理
- }
- if((TX4_read != RX4_write) && !B_TX4_Busy) //收到過數據, 并且發送空閑
- {
- B_TX4_Busy = 1; //標志發送忙
- S4BUF = RX4_Buffer[TX4_read]; //發一個字節
- if(++TX4_read >= RX4_Length) TX4_read = 0; //避免溢出處理
- }
- }
- }
- //========================================================================
- // 函數: SetTimer2Baudraye(u16 dat)
- // 描述: 設置Timer2做波特率發生器。
- // 參數: dat: Timer2的重裝值.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 備注:
- //========================================================================
- void SetTimer2Baudraye(u16 dat) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- {
- AUXR &= ~(1<<4); //Timer stop
- AUXR &= ~(1<<3); //Timer2 set As Timer
- AUXR |= (1<<2); //Timer2 set as 1T mode
- TH2 = dat / 256;
- TL2 = dat % 256;
- IE2 &= ~(1<<2); //禁止中斷
- AUXR |= (1<<4); //Timer run enable
- }
- //========================================================================
- // 函數: void UART1_config(u8 brt)
- // 描述: UART1初始化函數。
- // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 備注:
- //========================================================================
- void UART1_config(u8 brt) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- {
- u8 i;
- /*********** 波特率使用定時器2 *****************/
- if(brt == 2)
- {
- AUXR |= 0x01; //S1 BRT Use Timer2;
- SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate1);
- }
- /*********** 波特率使用定時器1 *****************/
- else
- {
- TR1 = 0;
- AUXR &= ~0x01; //S1 BRT Use Timer1; S1 BRT使用Timer1;
- AUXR |= (1<<6); //Timer1 set as 1T mode
- TMOD &= ~(1<<6); //Timer1 set As Timer
- TMOD &= ~0x30; //Timer1_16bitAutoReload;
- TH1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) / 256;
- TL1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) % 256;
- ET1 = 0; //禁止中斷
- INT_CLKO &= ~0x02; //不輸出時鐘
- TR1 = 1;
- }
- /*************************************************/
- SCON = (SCON & 0x3f) | (1<<6); // 8位數據, 1位起始位, 1位停止位, 無校驗
- // PS = 1; //高優先級中斷
- ES = 1; //允許中斷
- REN = 1; //允許接收
- P_SW1 = P_SW1 & 0x3f; //切換到 P3.0 P3.1
- // P_SW1 = (P_SW1 & 0x3f) | (1<<6); //切換到P3.6 P3.7
- // P_SW1 = (P_SW1 & 0x3f) | (2<<6); //切換到P1.6 P1.7 (必須使用內部時鐘)
- for(i=0; i<RX1_Length; i++) RX1_Buffer[i] = 0;
- B_TX1_Busy = 0;
- TX1_read = 0;
- RX1_write = 0;
- }
- //========================================================================
- // 函數: void UART2_config(u8 brt)
- // 描述: UART2初始化函數。
- // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 備注:
- //========================================================================
- void UART2_config(u8 brt) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無效.
- {
- u8 i;
- /*********** 波特率固定使用定時器2 *****************/
- if(brt == 2) SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate2);
- S2CON &= ~(1<<7); // 8位數據, 1位起始位, 1位停止位, 無校驗
- IE2 |= 1; //允許中斷
- S2CON |= (1<<4); //允許接收
- P_SW2 &= ~1; //切換到 P1.0 P1.1
- // P_SW2 |= 1; //切換到 P4.6 P4.7
- for(i=0; i<RX2_Length; i++) RX2_Buffer[i] = 0;
- B_TX2_Busy = 0;
- TX2_read = 0;
- RX2_write = 0;
- }
- //========================================================================
- // 函數: void UART3_config(u8 brt)
- // 描述: UART3初始化函數。
- // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 備注:
- //========================================================================
- void UART3_config(u8 brt) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer3做波特率.
- {
- u8 i;
- /*********** 波特率固定使用定時器2 *****************/
- if(brt == 2)
- {
- S3CON &= ~(1<<6); //BRT select Timer2
- SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate3);
- }
- /*********** 波特率使用定時器3 *****************/
- else
- {
- S3CON |= (1<<6); //BRT select Timer3
- T4T3M &= 0xf0; //停止計數, 清除控制位
- IE2 &= ~(1<<5); //禁止中斷
- T4T3M |= (1<<1); //1T
- T4T3M &= ~(1<<2); //定時
- T4T3M &= ~1; //不輸出時鐘
- TH3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) / 256;
- TL3 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate3) % 256;
- T4T3M |= (1<<3); //開始運行
- }
-
- S3CON &= ~(1<<5); //禁止多機通訊方式
- S3CON &= ~(1<<7); // 8位數據, 1位起始位, 1位停止位, 無校驗
- IE2 |= (1<<3); //允許中斷
- S3CON |= (1<<4); //允許接收
- P_SW2 &= ~2; //切換到 P0.0 P0.1
- // P_SW2 |= 2; //切換到 P5.0 P5.1
- for(i=0; i<RX3_Length; i++) RX3_Buffer[i] = 0;
- B_TX3_Busy = 0;
- TX3_read = 0;
- RX3_write = 0;
- }
- //========================================================================
- // 函數: void UART4_config(u8 brt)
- // 描述: UART4初始化函數。
- // 參數: brt: 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 備注:
- //========================================================================
- void UART4_config(u8 brt) // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
- {
- u8 i;
- /*********** 波特率固定使用定時器2 *****************/
- if(brt == 2)
- {
- S4CON &= ~(1<<6); //BRT select Timer2
- SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / UART_BaudRate4);
- }
- /*********** 波特率使用定時器3 *****************/
- else
- {
- S4CON |= (1<<6); //BRT select Timer4
- T4T3M &= 0x0f; //停止計數, 清除控制位
- IE2 &= ~(1<<6); //禁止中斷
- T4T3M |= (1<<5); //1T
- T4T3M &= ~(1<<6); //定時
- T4T3M &= ~(1<<4); //不輸出時鐘
- TH4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) / 256;
- TL4 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate4) % 256;
- T4T3M |= (1<<7); //開始運行
- }
-
- S4CON &= ~(1<<5); //禁止多機通訊方式
- S4CON &= ~(1<<7); // 8位數據, 1位起始位, 1位停止位, 無校驗
- IE2 |= (1<<4); //允許中斷
- S4CON |= (1<<4); //允許接收
- P_SW2 &= ~4; //切換到 P0.2 P0.3
- // P_SW2 |= 4; //切換到 P5.2 P5.3
- for(i=0; i<RX4_Length; i++) RX4_Buffer[i] = 0;
- B_TX4_Busy = 0;
- TX4_read = 0;
- RX4_write = 0;
- }
- void PrintString1(u8 *puts)
- {
- for (; *puts != 0; puts++)
- {
- B_TX1_Busy = 1; //標志發送忙
- SBUF = *puts; //發一個字節
- while(B_TX1_Busy); //等待發送完成
- }
- }
- void PrintString2(u8 *puts)
- {
- for (; *puts != 0; puts++)
- {
- B_TX2_Busy = 1; //標志發送忙
- S2BUF = *puts; //發一個字節
- while(B_TX2_Busy); //等待發送完成
- }
- }
- void PrintString3(u8 *puts)
- {
- for (; *puts != 0; puts++)
- {
- B_TX3_Busy = 1; //標志發送忙
- S3BUF = *puts; //發一個字節
- while(B_TX3_Busy); //等待發送完成
- }
- }
- void PrintString4(u8 *puts)
- {
- for (; *puts != 0; puts++)
- {
- B_TX4_Busy = 1; //標志發送忙
- S4BUF = *puts; //發一個字節
- while(B_TX4_Busy); //等待發送完成
- }
- }
- /********************* UART1中斷函數************************/
- void UART1_int (void) interrupt UART1_VECTOR
- {
- if(RI)
- {
- RI = 0;
- RX1_Buffer[RX1_write] = SBUF;
- if(++RX1_write >= RX1_Length) RX1_write = 0;
- }
- if(TI)
- {
- TI = 0;
- B_TX1_Busy = 0;
- }
- }
- /********************* UART2中斷函數************************/
- void UART2_int (void) interrupt UART2_VECTOR
- {
- if(RI2)
- {
- CLR_RI2();
- RX2_Buffer[RX2_write] = S2BUF;
- if(++RX2_write >= RX2_Length) RX2_write = 0;
- }
- if(TI2)
- {
- CLR_TI2();
- B_TX2_Busy = 0;
- }
- }
- /********************* UART3中斷函數************************/
- void UART3_int (void) interrupt UART3_VECTOR
- {
- if(RI3)
- {
- CLR_RI3();
- RX3_Buffer[RX3_write] = S3BUF;
- if(++RX3_write >= RX3_Length) RX3_write = 0;
- }
- if(TI3)
- {
- CLR_TI3();
- B_TX3_Busy = 0;
- }
- }
- /********************* UART4中斷函數************************/
- void UART4_int (void) interrupt UART4_VECTOR
- {
- if(RI4)
- {
- CLR_RI4();
- RX4_Buffer[RX4_write] = S4BUF;
- if(++RX4_write >= RX4_Length) RX4_write = 0;
- }
- if(TI4)
- {
- CLR_TI4();
- B_TX4_Busy = 0;
- }
- }
復制代碼 |