
/*************功能说明**************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
#define MAIN_Fosc11059200L // 22118400L//定义主时钟
#include"STC15Fxxxx.H"
#defineBaudrate19600L
#defineUART1_BUF_LENGTH32
u8TX1_Cnt;//发送计数
u8RX1_Cnt;//接收计数
bitB_TX1_Busy;//发送忙标志
u8 idata RX1_Buffer[UART1_BUF_LENGTH];//接收缓冲
voidUART1_config(u8 brt);// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void PrintString1(u8 *puts);
void delay(int t)
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j //======================================================================== // 函数: void main(void) // 描述: 主函数。 // 参数: none. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void main(void) { P0M1 = 0;P0M0 = 0;//设置为准双向口 P1M1 = 0;P1M0 = 0;//设置为准双向口 P2M1 = 0;P2M0 = 0;//设置为准双向口 P3M1 = 0;P3M0 = 0;//设置为准双向口 P4M1 = 0;P4M0 = 0;//设置为准双向口 P5M1 = 0;P5M0 = 0;//设置为准双向口 P6M1 = 0;P6M0 = 0;//设置为准双向口 P7M1 = 0;P7M0 = 0;//设置为准双向口 UART1_config(1);// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1;//允许总中断 PrintString1("STC15F2K60S2 UART1 Test Prgramme!\ \ ");//SUART1发送一个字符串 while (1) { //PrintString1("STC15F2K60S2 UART1 Test Prgramme!\ \ ");//SUART1发送一个字符串 } } //======================================================================== // 函数: void PrintString1(u8 *puts) // 描述: 串口1发送字符串函数。 // 参数: puts: 字符串指针. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void PrintString1(u8 *puts)//发送一个字符串 { for (; *puts != 0;puts++) //遇到停止符0结束 { SBUF = *puts; while(!TI); TI=0; } } //======================================================================== // 函数: SetTimer2Baudraye(u16 dat) // 描述: 设置Timer2做波特率发生器。 // 参数: dat: Timer2的重装值. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== voidSetTimer2Baudraye(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 } //======================================================================== // 函数: voidUART1_config(u8 brt) // 描述: UART1初始化函数。 // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== voidUART1_config(u8 brt)// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. { /*********** 波特率使用定时器2 *****************/ if(brt == 2) { AUXR |= 0x01;//S1 BRT Use Timer2; SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1); } /*********** 波特率使用定时器1 *****************/ else { TR1 = 0; AUXR &= ~0x01;//S1 BRT Use Timer1; AUXR |= (1<<6);//Timer1 set as 1T mode TMOD &= ~(1<<6);//Timer1 set As Timer TMOD &= ~0x30;//Timer1_16bitAutoReload; TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256); TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256); ET1 = 0;//禁止中断 INT_CLKO &= ~0x02;//不输出时钟 TR1 = 1; } /*************************************************/ SCON = (SCON & 0x3f) | 0x40;//UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率 //PS = 1;//高优先级中断 ES = 1;//允许中断 REN = 1;//允许接收 P_SW1 &= 0x3f; P_SW1 |= 0x00;//UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟) //PCON2 |= (1<<4);//内部短路RXD与TXD, 做中继, ENABLE,DISABLE B_TX1_Busy = 0; TX1_Cnt = 0; RX1_Cnt = 0; RI=0; TI=0; } //======================================================================== // 函数: void UART1_int (void) interrupt UART1_VECTOR // 描述: UART1中断函数。 // 参数: nine. // 返回: none. // 版本: VER1.0 // 日期: 2014-11-28 // 备注: //======================================================================== void UART1_int (void) interrupt 4 { ES=0; if(RI) { RI = 0; RX1_Buffer[RX1_Cnt] = SBUF; //-------必须在这里对接收到的数据进行判断和响应--------------- if (RX1_Buffer[RX1_Cnt] == 'a') { PrintString1("bc\ \ "); PrintString1("AbcD\ \ "); } //--------------------- if(++RX1_Cnt >= UART1_BUF_LENGTH)RX1_Cnt = 0;//防溢出 } if(TI) { TI = 0; B_TX1_Busy = 0; } RI=0; TI=0; ES=1; }
