内部晶振改为外部晶振,timer中断是好的,但是串口发出信息外边接收不到,高分求解
[复制链接]
void UART0Init(void)
{ unsigned char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = 0x00;
SSTA0 = 0x1a; // 禁止波特率2分频,CLOCK OF UART0 IS TIMER3
SCON0 = 0x50; // 8 bit UART ,Enable receive
SFRPAGE = 0x01;
TMR3CF = 0x08; // sysclk as clk of Timer 3 ,up count
TMR3CN = 0x00; // auto-reload
RCAP3 = -(int)(SYSCLK / BAUDRATE0 / 16);
TMR3 = RCAP3;
TR3 = 1; //enable Timer 3 ,
SFRPAGE = 0x00;
RI0 = 0;
TI0 = 0;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
void UART1Init(void)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;// Save Current SFR page
SFRPAGE = 0x01;
SCON1 = 0x10; // 8 bit UART, enable receive
SFRPAGE = 0x00;
TMOD &= 0x0F;
TMOD |= 0x20; // TMOD: timer 1, 8 bit auto-reload
TCON = 0x40; // enable Timer 1
TH1 = -(SYSCLK / BAUDRATE1 / 2);
CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
TL1 = TH1; // initialize Timer1
TR1 = 1; // start Timer1
SFRPAGE = 0x01;
RI1 = 0;
TI1 = 0;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
void SysclkInit(void)
{
unsigned int idata Sci_time_temp;
unsigned char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = 0x0F;
SysCalibrate(24500000);
//OSCICN = 0xC3; //Internal Oscillator Enabled,Internal Oscillator is divided by 1.
//CLKSEL = 0x30; //Output will be SYSCLK/8,
//SYSCLK derived from the Internal Oscillator, and scaled as per the IFCN bits in OSCICN.
//SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
Sci_time_temp=0x0FFFF;
/************************************************************************
OSCXCN:外部振荡器控制寄存器
* R R/W R/W R/W R/W R/W R/W R/W 复位值
* XTLVLD XOSCMD2 XOSCMD1 XOSCMD0 - XFCN2 XFCN1 XFCN0 00000000
*XTLVLD:晶体振荡器有效标志(只在XOSCMD=11x 时有效)
*0:晶体振荡器未用或未稳定。
*1:晶体振荡器正在运行并且工作稳定。
*XOSCMD2-0:外部振荡器方式位
*00x:关闭。XTAL1 引脚内部接地。
*010:系统时钟为来自XTAL1 引脚的外部CMOS 时钟。
*011:系统时钟为来自XTAL1 引脚的外部CMOS 时钟的二分频。
*10x:RC/C 振荡器方式二分频。
*110:晶体振荡器方式。
*111:晶体振荡器方式二分频。
*XFCN2-0:外部振荡器频率控制位
*111: f > 6.7MHz
************************************************************************/
OSCXCN=0x67;
while(Sci_time_temp--);
while(!(OSCXCN & 0x80));//等待XTLVLD为1
/************************************************************************
OSCICN:内部振荡器控制寄存器
R/W R/W R/W R/W R/W R/W R/W R/W 复位值
MSCLKE - - IFRDY CLKSL IOSCEN IFCN1 IFCN0 00010100
*MSCLKE:时钟丢失检测器使能位
*0:禁止时钟丢失检测器
*1:使能时钟丢失检测器;检测到时钟丢失时间大于100微秒将触发复位.
*IFRDY:内部振荡器频率准备好标志
*0:内部振荡器不是按IFCN位指定的速度运行
*1:内部振荡器按照IFCN位指定的速度运行
*CLKSL:系统时钟源选择位
*0: 选择内部振荡器作为系统时钟
*1: 选择外部振荡器作为系统时钟
*IOSCEN:内部振荡器使能位
*0:内部振荡器禁止。
*1:内部振荡器使能。
*IFCN1-0:内部振荡器频率控制位
*00:SYSCLK为内部振荡器2MHz。
*01:SYSCLK为内部振荡器4MHz。
*10:SYSCLK为内部振荡器8MHz。
*11:SYSCLK为内部振荡器16MHz。
***********************************************************************/
CLKSEL = 0x01;
OSCICN=0X03;//OSCICN=0X88;
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}