本帖最后由 taobaofarmer 于 2020-7-28 11:21 编辑
问题已经解决,115200bps嗖嗖的,贴上代码,直接用就行
void Make_HIRC_16p6MHz(void)
{
unsigned char hircmap0, hircmap1;
unsigned int trimvalue16bit; /* Since only power on will reload RCTRIM0 and RCTRIM1 value, check power on flag*/
//产生上电复位(冷复位),其它任何方式复位不会影响改位(POF)
if((PCON & SET_BIT4) == SET_BIT4)
{
hircmap0 = RCTRIM0;
hircmap1 = RCTRIM1;
trimvalue16bit = ((hircmap0<<1) + (hircmap1&0x01));
trimvalue16bit = trimvalue16bit - 15;
hircmap1 = trimvalue16bit & 0x01;
hircmap0 = trimvalue16bit >> 1;
TA = 0xaa;
TA = 0x55;
{
RCTRIM0 = hircmap0;
}
TA = 0xaa;
TA = 0x55;
RCTRIM1 = hircmap1;
//After modify HIRC value, clear power on flag
PCON &= CLR_BIT4;
}
}
//工作主频16.6M
void Uart0_MyInit_Base16p6MHz(void)
{
P06_Quasi_Mode;
P07_Quasi_Mode;
//SCON寄存器:模式1/接收总是有效不管停止位的逻辑电平/接收使能
SM0 = 0;
SM1 = 1;
SM2 = 0;
REN = 1;
P06_Quasi_Mode;
P07_Quasi_Mode;
SCON = 0x50; //UART0 Mode 1/SM1=1/REN=1
//模式1/接收总是有效不管停止位的逻辑电平/接收使能
set_SMOD; //UART0 Double Rate Enable
T3CON &= 0xF8; //T3PS:2/T3PS:11/T3PS:0 = 000(时钟分频 = 1/1)
set_BRCK; //串口0波特率时钟源为Timer3
switch(uBPS)
{
case 0x10: //1200
RH3 = 0xfc;
RL3 = 0xa0;
break;
case 0x11: //2400
RH3 = 0xfe;
RL3 = 0x50;
break;
case 0x12: //4800
RH3 = 0xff;
RL3 = 0x28;
break;
case 0x13: //9600
RH3 = 0xff;
RL3 = 0x94;
break;
case 0x14: //19200
RH3 = 0xff;
RL3 = 0xca;
break;
case 0x15: //38400
RH3 = 0xff;
RL3 = 0xe5;
break;
case 0x16: //57600
RH3 = 0xff;
RL3 = 0xee;
break;
case 0x17: //115200
RH3 = 0xff;
RL3 = 0xf7;
break;
default:
uBPS = 0x13;
RH3 = 0xff;
RL3 = 0x94;
break;
}
//Trigger Timer3
set_TR3;
ES = 1;
}
分别调用这两个函数就可以
|