找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大佬改改程序,我不会用两个定时器

[复制链接]
跳转到指定楼层
楼主
ID:318304 发表于 2018-5-10 08:10 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时钟的程序,加上了无源蜂鸣器,就不跑时了,大佬帮忙看看吧。https://share.weiyun.com/5fI6iIr
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:326568 发表于 2018-5-10 10:01 | 只看该作者
驱动PCB不对
回复

使用道具 举报

板凳
ID:326568 发表于 2018-5-10 10:01 | 只看该作者
蜂鸣器驱动不对
回复

使用道具 举报

地板
ID:213173 发表于 2018-5-10 10:35 | 只看该作者
对于不可位操作的寄存器可以用逻辑运算符&和|操作位。
void main()
{               
//        TMOD = 0x11;        //同时设置T0和T1为模式1
        TMOD |= 0x01;        //设置T0为模式1
        TH0  = 0xFC;  //为T0赋初值0xFC67,定时1ms
        TL0  = 0x67;
        TMOD |= 0x10;        //设置T1为模式1
        TH1 = T0RH;
        TL1 = T0RL;

        TR0  = 1;     //开T0
//        TR1  = 1;     //需要时在程序中开T1
        EA=1;        //开总中断
        ET0  = 1;     //开T0中断
        ET1 = 1;     //开T1中断

        InitLcd1602();
        while (1)
        {  
//                TMOD = 0x01;
                if(biaozhi==1)
                {
回复

使用道具 举报

5#
ID:277550 发表于 2018-5-10 12:27 | 只看该作者
程序是使用时钟中断计时的,在播放音乐时计时就不准了。。。。。播放完音乐,重新开启定时器0
回复

使用道具 举报

6#
ID:318304 发表于 2018-5-10 15:14 来自手机 | 只看该作者
devcang 发表于 2018-5-10 12:27
程序是使用时钟中断计时的,在播放音乐时计时就不准了。。。。。播放完音乐,重新开启定时器0

说得对,怎样让它响音乐的时候正常跑时?该怎么改呢?
回复

使用道具 举报

7#
ID:318304 发表于 2018-5-10 15:14 来自手机 | 只看该作者
东北许文强 发表于 2018-5-10 10:01
驱动PCB不对

液晶显示吗?还是什么
回复

使用道具 举报

8#
ID:318304 发表于 2018-5-10 15:15 来自手机 | 只看该作者
东北许文强 发表于 2018-5-10 10:01
蜂鸣器驱动不对

蜂鸣器驱动应该可以的,错误在哪?
回复

使用道具 举报

9#
ID:318304 发表于 2018-5-10 15:15 来自手机 | 只看该作者
wulin 发表于 2018-5-10 10:35
对于不可位操作的寄存器可以用逻辑运算符&和|操作位。
void main()
{               

哥,我不大懂,该怎么改呢
回复

使用道具 举报

10#
ID:318304 发表于 2018-5-10 15:21 来自手机 | 只看该作者
大佬,能不能把正确的程序评论给我,或者QQ发到1994975123上谢谢了。
回复

使用道具 举报

11#
ID:213173 发表于 2018-5-10 17:01 | 只看该作者
勇士小子 发表于 2018-5-10 15:15
哥,我不大懂,该怎么改呢

定时器初始化设置就按如上示例,你程序中不要操作TMOD,开停定时器只要操作 TR0、TR1就行了。
回复

使用道具 举报

12#
ID:318304 发表于 2018-5-10 18:34 来自手机 | 只看该作者
wulin 发表于 2018-5-10 17:01
定时器初始化设置就按如上示例,你程序中不要操作TMOD,开停定时器只要操作 TR0、TR1就行了。

哦哦,谢谢,t0要一直开着,响音乐的时候我要开t1,就怕和原来一样,t1一打开就把t0屏蔽了,我晚上回去测试测试。不行的话在找大佬帮忙。多谢了
回复

使用道具 举报

13#
ID:318304 发表于 2018-5-10 23:09 | 只看该作者
wulin 发表于 2018-5-10 10:35
对于不可位操作的寄存器可以用逻辑运算符&和|操作位。
void main()
{               

根据你这个改了,还是蜂鸣器响完才加1,定时器不能同步。
回复

使用道具 举报

14#
ID:213173 发表于 2018-5-11 07:03 | 只看该作者
勇士小子 发表于 2018-5-10 23:09
根据你这个改了,还是蜂鸣器响完才加1,定时器不能同步。

定时器0中断的优先级高于定时器1中断,在播放音乐时计时就不准了肯定是程序中定时器0被关闭了。 查查程序中有没有TR0=0;ET0=0;或除初始化以外对TMOD寄存器的操作。
回复

使用道具 举报

15#
ID:7485 发表于 2018-5-11 08:32 | 只看该作者
主要是TMOD你没有弄明白,
“定时器/计数器”工作模式控制寄存器TMOD是一个逐位定义的寄存器,只能使用字节寻址,不可以位寻址。
低四位用来定义定时器/计数器T0,高四位用来定义定时器/计数器T1。
由于“只能使用字节寻址,不可以位寻址”,所以你需要先把“需要启动其功能的位”设置成“1”,不需要的设置成“0”,然后将这8位的二进制值转换成16进制,写入程序。例如:TMOD = 0x11 就是TMOD = 00010001,写成16进制就是TMOD = 0x11   如果想设置成T1为16位计数器,T0设置成16位定时器,就是TMOD = 01010001,写成16进制就是 TMOD = 0x51 。你还是自己在琢磨琢磨吧。
回复

使用道具 举报

16#
ID:277550 发表于 2018-5-12 10:24 | 只看该作者

记时添加时钟芯片,让单片机全力干活
回复

使用道具 举报

17#
ID:318304 发表于 2018-5-12 18:30 来自手机 | 只看该作者
devcang 发表于 2018-5-12 10:24
记时添加时钟芯片,让单片机全力干活

我们不能时钟芯片
回复

使用道具 举报

18#
ID:318304 发表于 2018-5-12 22:04 来自手机 | 只看该作者
wulin 发表于 2018-5-11 07:03
定时器0中断的优先级高于定时器1中断,在播放音乐时计时就不准了肯定是程序中定时器0被关闭了。 查查程序 ...

我查了一下,没有关的程序,响音乐时候只有对TH1和TL1的变化,感觉像是T1的工作时间太长了吧,无法及时跑到T0,响完一段音乐就执行一次T0,秒加1
回复

使用道具 举报

19#
ID:318304 发表于 2018-5-13 22:32 来自手机 | 只看该作者
ahshmj 发表于 2018-5-11 08:32
主要是TMOD你没有弄明白,
“定时器/计数器”工作模式控制寄存器TMOD是一个逐位定义的寄存器,只能使用字 ...

是不是这个问题啊,可以同时工作,但不能同时中断。一个定时器中断结束后另一个才能进入。当设定工作模式(有TMOD寄存器设置)后当TRx=1时就开始工作了,当ETx=1时,溢出时就申请中断。如果EA=1,那么就可以进入中断了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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