51单片机使用串口时和定时器T0冲突的解决办法

现象

在同时使用串口和定时器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)


版权声明:本文为qq_42882607原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。