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)

  • 13
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值