修改定时器0模式时,TMOD&=0xF0; TMOD|=0x01; 修改定时器1模式时,TMOD&=0x0F; TMOD|=0x20; |
TOMD 只需要定义一次 你在两个初始化都有,你在开定时器0的时候关了1 你在开定时器1的时候关了0 ,所以会导致你一直都只是一个定时器工作。如果你关掉0就开1的话可以,关掉1就开0的话 也可以 两个同时打开的话就不行。都是TMOD的原因。 上次我犯了这个错误,师傅让我自赏两个大嘴巴子。 |
要不你把整个程序贴上来。这一点,确识没看出来可以不执行的错误 |
还没解决么?实在不行就把仿真图和程序发上来吧 |
YokeHickt 发表于 2020-7-3 18:58 楼上的坛友基本把问题都讲清楚了,楼主还没搞定可能与你把T0设置周期太短有关。进程调度得当串口与T0不会互扰。如实在搞不定可以设置两个定时器开关互斥。基本构架如下: void InitTimer(void) { TMOD = 0x22;//8位自动重装 PCON = 0x00; SCON = 0x50; TH0 = 0xA4;//定时100us TL0 = 0xA4; TH1 = 0xFD;//比特率9600 TL1 = 0xFD; TR0 = 0;//关T0 TR1 = 0;//关T1 EA = 1; ES = 1; ET0 = 1; ET1 = 0; } void main(void) { InitTimer(); while(1) { //相应任务中加二选一 if(TR1==1) TR0=0; else TR0=1; } } void Timer0Interrupt(void) interrupt 1 { //不需重装 //中断任务 } void UARTInterrupt(void) interrupt 4 { RI=0; x=SBUF; //中断任务 } |
已经过去蛮久了,之前一直给忘了,我把两个两个定时器同时开启,也就是像前面各位说的方法我都尝试过,而测试方法就是两个定时器各控制一个led灯的亮灭,各自执行的时候会使对应的led灯亮,使另一个定时器的led灭,而在这里会出现定时器0结束定时器1开启的过程都正常,而当定时器1语句结束后,定时器0就失去效用,对应的led不再亮起 |
既然不需要两个定时器同时工作,除了工作模式变动外。可以分别控制 TR0 和 TR1 吧 |
应该是初始化的问题,用之前在初始化一次呢? |
在timer0_init()中把timer1的中断和串口中断关掉试一下 |
TIME1的初始化把 Time0给关了。。。。 |
直接在开启定时器1初始化的时候TMOD|=0X20;你第二个初始化相当于给第一个给覆盖了也可以两个初始化放在一起写; |
wufeng391 发表于 2020-6-17 21:25 你这个不就是TMOD=0X21; |
应该是你修改定时器工作模式的方法有问题,你的这种操作方法,如果只是一个定时器的话决什么问题,如果是两个使用同一个模式寄存器的定时器就不好用了,可能在打开一个定时器的同时会关闭另一个定时器。这时候应用用与或方式操作修改TMOD寄存器。网上应该有相关的视频。 |
修改定时器0模式时,TMOD&=0xF0; TMOD|=0x01; 修改定时器1模式时,TMOD&=0x0F; TMOD|=0x20; 这样修改定时器模式时不会互相干扰。你可以试下。 |
你是证明它没有工作的呢? LED灯亮何时灭?何时亮?灭后何时又被明亮的呢? |
检查与定时器相关的驱动时钟是否符合要求,并查该时钟在定时器 开关的变化 |
经过检测TMOD已经被重新定义为0x01,可是定时器0依旧不工作 |
你把最后两行代码的顺序倒过来试一下。即: flag4=0; timer0_init(); |