两个中断到来的时间是不一样的。
1、虽然你让两个计时器计数时间相同。但由于你开计数器的时间不可能同一个时刻,只能是开一个,接着开一个,所以这两个计数器开始工作的时间是有差别的。
2、每个计数器中断里面执行的内容(代码)长度不一样汪烂,花的时间也不一样。因此,两个计数器申请中断的时刻,也不可能是同时的。换句话说,即使有可能是同一时刻申请中断,根据同一优先级中断的优先原则,先处理T0中断。当然,同一时刻两个计数器申请中断,这种概率……即使出现,对整个程序也不会造成很大的影响。因为,这次由于冲突,丢失了一次中断,那么下次出现冲突,都不知道要等到什么时候了!从宏观来说,对数码管显示的影响,甚至可以忽略了。
3、这两个中断,对主函数里面的display函数,也不会造成致命影响困猛漏。因为两个中断中的代知森码都很短,占用的时间也很少(相对于数码管扫描来说)。因此不会造成人眼看数码管会闪烁等问题。
程序需要做些修裤誉侍改,修改如下:
void timer_init(){
TMOD=0x22//最好用模式2,10个机器周期就中断,最好减少服务时间
SCON=0X50
TH1=0xfd
TL1=0xfd
//ET1=1这是不允许的
TR1=1
TH0=0xF6
TL0=0xF6
ET0=1
TR0=1
ES=1
EA=1
}
void timer0_int() interrupt 1
{
time++
if(time<50) //count为占空比
{
PWM=1 //输出高电平
}
else
PWM=0
if(time>=100)
{
time=0
}
}
void ser() interrupt 4
{
if (RI)
{
RI=0
Re_buf[counter]=SBUF
if(counter==0&&Re_buf[0]!=0x55) return //第0号数据不是帧头
counter++
if(counter==11) //接收到11个胡吵数据
{
counter=0 //重新赋值,虚衫准备下一帧数据的接收
switch(Re_buf [1])
{
case 0x53:
ucStrAngle[0]=Re_buf[2]
ucStrAngle[1]=Re_buf[3]
ucStrAngle[2]=Re_buf[4]
ucStrAngle[3]=Re_buf[5]
ucStrAngle[4]=Re_buf[6]
ucStrAngle[5]=Re_buf[7]
break
}
}
}
Vax = ((short)(ucStrAngle[1]<<8| ucStrAngle[0]))/32768.0*180
if(Vax>0)
{
x=1
xx=0
}
else if(Vax<=0)
{
x=0
xx=1
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)