51单片机定时器0和定时器1使用冲突

我目前做毕业设计,需要用到ADC0804芯片采集信号,这个过程不必细说,我说一下我这里出现的问题, 因为AD采完信号之后就通过串口发给电脑,串口比特率设置用的是T1定时器溢出率,然后使用AD芯片,因为AD芯片的控制过程比较复杂,需要脉冲信号之间有延时,所以要用的定时器中断,这个时候我就用的是T0定时器,然后程序写差不多了,调试的时候发现定时器0中断里的变量不动,定时器0中断貌似是不管用了,但我把设置串口比特率的T1关掉,变量就会走了,不明白51上T1和T0为什么会冲突,望高手帮忙解决一下

void timer0() interrupt 1 //定时器0中断
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
flag++;
if(flag==28)
{
flag=0;
}
}

void chuankou()
{

TH1=0xfd; //定时器1高位赋初值
TL1=0xfd; //定时器1低位赋初值
TR1=1; //开定时器1
REN=1; //开串口控制
SM0=0;
SM1=1; //设置串口工作方式1
}
while(1)
{
if(flag==2)
{
WR=1;
ser_light=0;
}
if(flag==4)
{
WR=0;
}
if(flag==6)
{
WR=1;
}
if(flag==20)
{
P2=0xff;
RD=1;
}
if(flag==22)
{
RD=0;
}
if(flag==24)
{
SBUF=P2;
}
if(flag==26)
{
RD=1;
ser_light=1;
}

}

这是程序的主体部分 初学者 呵

你看看自己的这三条语句
REN=1; //开串口控制
SM0=0;
SM1=1;
当 REN=1; 执行完后,单片机完全符合串口方式0,同步移位方式,如果你这时板子接在电脑串口上,不管你电脑有没有发串口数据,单片机RXD脚已经在接收了,而且你没写串口中断,RI不清0,那就在串口中断里出不来了,下面的程序都做不到,所以你定时器0不动,关了T1就等于关了串口,也就正常了。追问

谢谢 非常感谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-02
1: TMOD初始化是不是有冲突?
2:T1是不是也开了中断?不能开中断。
3:t0和t1是不是中断冲突?优先级?

建议:
ADC0804采集用延时,不用中断定时方式。追问

TMOD 初始化应该是没问题
TMOD=0x21; //设置定时器0工作方式为1 定时器1的工作方式为2
TH0=(65536-5000)/256; //定时器0高8位赋初值50000
TL0=(65536-5000)%256; //定时器0低8位赋初值50000

T1中断没开 这个我知道
我知道采用延时不一定要用中断 只是我想用中断的方式 对以后的单片机学习比较好一点 呵

追答

一般不会有冲突的,为什么开串口接收?
发个完整程序看看

追问

串口接收是为了AD采集信号之后的值有个显示的地方
TMOD=0x21; //设置定时器0工作方式为1 定时器1的工作方式为2
TH0=(65536-5000)/256; //定时器0高8位赋初值50000
TL0=(65536-5000)%256; //定时器0低8位赋初值50000
TR0=1; //开启定时器0
EA=1; //开总中断
ES=1; //开串口中断
ET0=1; //开定时器0中断
chuankou(); //串口控制函数

追答

这个不是t0和t1的冲突,而是串口中断的冲突。你开了串口中断 ES=1; 开串口中断
所以发数据也会产生中断的,这个中断会影响到你定时的中断

追问

开都不行啊~~~~ 那关掉就没问题了?
我仅仅是使用电脑接收AD采集的信号 没有从电脑上读数据给51 这样也不行么

追答

建议串口发数据的时候关掉中断,发完了再开

追问

本身串口发数据给电脑的时候 是不是不需要开中断的呢?>?
不需要开我就不开串口中断 那个定义是我做别的程序的时候写的 我那板子一点点焊的时候都是用其他的小程序一点点调试的 如果真是串口中断的问题 那我就把那句删掉

第2个回答  2011-04-02
估计是串口初始化时候TMOD装值和定时中断时TMOD装值冲突。。追问

TMOD 我是一次性装值的 没冲突吧~~~~

追答

“调试的时候发现定时器0中断里的变量不动,定时器0中断貌似是不管用了,但我把设置串口比特率的T1关掉,变量就会走了”。说明你的程序在串行中断开的情况下没有进入定时中断,会不会是IP设置使中断冲突?还有就是也许不经意间变量定义嵌套不合适使然。。。

追问

因为只是使用串口接收数据 所以并没有使用串口中断, 初始定义的时候开了串口中断但是没有用. IP设置会是什么问题 不太懂 能解释一下么

追答

串口接收数据的时候RI位会由硬件自动置1,产生串口中断。必须用软件置RI为0.不知道这个注意到没?

追问

那我把串口中断关闭了 可不可以呢

追答

可以。但是RI必须由软件置0!!接收数据的时候是一幁一幁的接收的,每次接收完数据RI都会由硬件自动置为1,把它清0即可。while(!RI);RI=0;即可。

追问

那这个地方究竟对定时器中断会产生怎样的影响呢

追答

假如你的RI没有清掉的话,当一帧数据接收完毕之后,RI置为1,因为你的串口是处于打开状态,此时MCU会申请串口中断,但是你没有写串口中断服务程序啊,所以这个时候程序应该停住了,一直在申请串口中断,只要你的RI不清除,程序就不会再继续下去,当然对T0就有影响了。应该是这样的。

本回答被提问者采纳