现象
在同时使用串口和定时器T0时,只有串口能正常使用,定时器T0无法使用,初始化如下
void Uart_Init(void)
{
PCON &= 0x7F;// SMOD=0:波特率不加倍
SCON = 0x50;// UART方式1:8位UART; REN=1:允许接收
TMOD |= 0x20;//T1方式2,八位自动重载,用于UART波特率
TL1 = 0xFD;
TH1 = 0xFD;// UART波特率设置:FDFD,9600;FFFF,57600
TR1 = 1; //启T1计数
EA = 1;
}
void Timer0_Init()
{
TMOD |= 0x01;//T0方式1,16位定时
TH0 = (65534 - 100) / 255; //定时常数,取高四位
TL0 = (65534 - 100) % 255; //取低四位
ET0 = 1;//允许中断
TR0 = 1;//启T0计数
EA = 1;
}
原因
在使用串口时,T1使用了8位自动重载模式产生波特率,所以和定时器T0产生了冲突;
解决办法
由于是串口影响了定时器,便把串口中断关闭,即ES=0;修改如下
void Uart_Init(void)
{
PCON &= 0x7F;// SMOD=0:波特率不加倍
SCON = 0x50;// UART方式1:8位UART; REN=1:允许接收
TMOD |= 0x20;//T1方式2,用于UART波特率
TL1 = 0xFD;
TH1 = 0xFD;// UART波特率设置:FDFD,9600;FFFF,57600
TR1 = 1;
ES = 0;
EA = 1;
}
注意
当ES=0时串口中断不可用,只能直接调用串口接收数据的函数,只有ES=1才能使用中断(interrupt 4)