找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4162|回复: 18
打印 上一主题 下一主题
收起左侧

新人求救,51单片机定时器0关闭再开启以后不工作

  [复制链接]
跳转到指定楼层
楼主
300黑币


如题,子函数中因为要执行串口发送就先关闭了定时器0开启定时器1(两个同时开启总出问题),发送完毕后关闭定时器1再开启定时器0,可是接下来定时器0都不再工作,主函数工作正常(出了有关定时器0的)。P2是控制LED灯亮灭的端口,定时器不工作的话P2默认全灭。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:773924 发表于 2020-6-15 17:08 | 只看该作者
你把最后两行代码的顺序倒过来试一下。即:
flag4=0;
timer0_init();
回复

使用道具 举报

板凳
ID:638390 发表于 2020-6-15 17:49 | 只看该作者
经过检测TMOD已经被重新定义为0x01,可是定时器0依旧不工作
回复

使用道具 举报

地板
ID:764088 发表于 2020-6-16 10:13 | 只看该作者
检查与定时器相关的驱动时钟是否符合要求,并查该时钟在定时器 开关的变化
回复

使用道具 举报

5#
ID:123289 发表于 2020-6-16 15:36 | 只看该作者
你是证明它没有工作的呢?
LED灯亮何时灭?何时亮?灭后何时又被明亮的呢?
回复

使用道具 举报

6#
ID:782419 发表于 2020-6-17 21:25 | 只看该作者
修改定时器0模式时,TMOD&=0xF0; TMOD|=0x01;
修改定时器1模式时,TMOD&=0x0F; TMOD|=0x20;
这样修改定时器模式时不会互相干扰。你可以试下。
回复

使用道具 举报

7#
ID:782419 发表于 2020-6-17 21:29 | 只看该作者
应该是你修改定时器工作模式的方法有问题,你的这种操作方法,如果只是一个定时器的话决什么问题,如果是两个使用同一个模式寄存器的定时器就不好用了,可能在打开一个定时器的同时会关闭另一个定时器。这时候应用用与或方式操作修改TMOD寄存器。网上应该有相关的视频。
回复

使用道具 举报

8#
ID:636538 发表于 2020-6-18 15:15 | 只看该作者
wufeng391 发表于 2020-6-17 21:25
修改定时器0模式时,TMOD&=0xF0; TMOD|=0x01;
修改定时器1模式时,TMOD&=0x0F; TMOD|=0x20;
这样修改定时 ...

你这个不就是TMOD=0X21;
回复

使用道具 举报

9#
ID:636538 发表于 2020-6-18 15:26 | 只看该作者
直接在开启定时器1初始化的时候TMOD|=0X20;你第二个初始化相当于给第一个给覆盖了也可以两个初始化放在一起写;
回复

使用道具 举报

10#
ID:519089 发表于 2020-6-30 13:55 | 只看该作者
TIME1的初始化把    Time0给关了。。。。
回复

使用道具 举报

11#
ID:789121 发表于 2020-6-30 14:30 | 只看该作者
在timer0_init()中把timer1的中断和串口中断关掉试一下
回复

使用道具 举报

12#
ID:360812 发表于 2020-6-30 15:24 | 只看该作者
应该是初始化的问题,用之前在初始化一次呢?
回复

使用道具 举报

13#
ID:280512 发表于 2020-6-30 17:48 | 只看该作者
既然不需要两个定时器同时工作,除了工作模式变动外。可以分别控制 TR0 和 TR1 吧
回复

使用道具 举报

14#
ID:638390 发表于 2020-7-3 18:58 | 只看该作者
已经过去蛮久了,之前一直给忘了,我把两个两个定时器同时开启,也就是像前面各位说的方法我都尝试过,而测试方法就是两个定时器各控制一个led灯的亮灭,各自执行的时候会使对应的led灯亮,使另一个定时器的led灭,而在这里会出现定时器0结束定时器1开启的过程都正常,而当定时器1语句结束后,定时器0就失去效用,对应的led不再亮起
回复

使用道具 举报

15#
ID:213173 发表于 2020-7-3 20:48 | 只看该作者
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;
        //中断任务
}
回复

使用道具 举报

16#
ID:789121 发表于 2020-7-4 11:22 | 只看该作者
还没解决么?实在不行就把仿真图和程序发上来吧
回复

使用道具 举报

17#
ID:735148 发表于 2020-7-4 17:03 | 只看该作者
要不你把整个程序贴上来。这一点,确识没看出来可以不执行的错误
回复

使用道具 举报

18#
ID:633896 发表于 2020-7-7 11:13 | 只看该作者
TOMD 只需要定义一次  你在两个初始化都有,你在开定时器0的时候关了1 你在开定时器1的时候关了0 ,所以会导致你一直都只是一个定时器工作。如果你关掉0就开1的话可以,关掉1就开0的话 也可以 两个同时打开的话就不行。都是TMOD的原因。

上次我犯了这个错误,师傅让我自赏两个大嘴巴子。
回复

使用道具 举报

19#
ID:801878 发表于 2020-7-28 10:15 | 只看该作者
修改定时器0模式时,TMOD&=0xF0; TMOD|=0x01; 修改定时器1模式时,TMOD&=0x0F; TMOD|=0x20;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表