在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;
}
}
一晚上才发现,自己踩坑自己跳出来了,感觉还挺好