51串口中断和定时器0中断冲突

本文介绍了在8051单芯片中,定时器0和外部中断0共享硬件资源时可能出现的问题,提供了解决方案,包括在定时器0中断函数中禁用串口中断、调整定时器优先级和波特率设置。作者通过实际代码展示了如何避免资源冲突并分享了自己的学习过程。
摘要由CSDN通过智能技术生成

在8051单芯片的架构中,定时器0和外部中断0(ES = External Interrupt 0)共享一些硬件资源。如果你在程序中错误配置了这些资源,它们之间的冲突可能导致不可预知的行为。

共用一个计数器

网上查的解决办法:1.在定时器0的中断函数里暂时禁用串口中断ES=0( 我这么干的

2.修改定时器0的优先级,使其低于串口中断的优先级,这样可以使串口中断不被其打断(我是串口中断抢了定时器0,我把串口优先级设为高,定时器0设为低 PT0=1 PS=0 ,不冲突了。按道理定时器0的中断号更小的,我的反而是反过来,不明白有没有大神解惑?

3.修改波特率,使其低于定时器0的中断频率(没试)

调了

#include <REGX52.H>
#include <intrins.h>

sbit beep=P2^3;

void Timer0Init(){
	//PT0=1; //方法2的优先级
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0x4C;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	EA=1;
	ET0=1;
	TR0 = 1;				//定时器0开始计时
}


void ttl_init()
{
	//PS=0;    //方法2优先级
	PCON &= 0x7F;		//波特率不倍速
	SCON=0x50;
	TMOD &= 0x0F;
	TMOD |= 0X20;
	TH1=0xF4;
	TL1=0xF4;
	ET1 = 0;			//禁止定时器中断
	TR1=1;
	EA=1;
	ES=1; 
	/*串口中断和定时器0冲突 
	同时用定时器0就得注释掉,或者在定时器0中断函数
	里暂时把ES=0	*/
}

void ttl_send(unsigned char s)
{
	SBUF=s;
	while(!TI) ;
	TI=0;
}

void main(){

	ttl_init();
	//ES=0;
	Timer0Init();


	while(1)
	{

//		if(flag1==1)
//		{
//			flag=adval(); //A/D转换
//			shuma(flag/100,1);//数码管显示
//			shuma(flag/10%10,2);
//			shuma(flag%10,3);
//			ttl_send(flag);
//			ES=1;
			//flag1=0;

//		}
	}
}


void T0_timer() interrupt 1
{
	static unsigned char num;
	ES=0;
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0x4c;				//设置定时初始值
	++num;
	if(num==10)
	{
		num=0;
		beep=~beep;
	}
}

一晚上才发现,自己踩坑自己跳出来了,感觉还挺好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值