标题: 求大佬改改程序,我不会用两个定时器 [打印本页]

作者: 勇士小子    时间: 2018-5-10 08:10
标题: 求大佬改改程序,我不会用两个定时器
时钟的程序,加上了无源蜂鸣器,就不跑时了,大佬帮忙看看吧。https://share.weiyun.com/5fI6iIr
作者: 东北许文强    时间: 2018-5-10 10:01
驱动PCB不对
作者: 东北许文强    时间: 2018-5-10 10:01
蜂鸣器驱动不对
作者: wulin    时间: 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)
                {
作者: devcang    时间: 2018-5-10 12:27
程序是使用时钟中断计时的,在播放音乐时计时就不准了。。。。。播放完音乐,重新开启定时器0
作者: 勇士小子    时间: 2018-5-10 15:14
devcang 发表于 2018-5-10 12:27
程序是使用时钟中断计时的,在播放音乐时计时就不准了。。。。。播放完音乐,重新开启定时器0

说得对,怎样让它响音乐的时候正常跑时?该怎么改呢?
作者: 勇士小子    时间: 2018-5-10 15:14
东北许文强 发表于 2018-5-10 10:01
驱动PCB不对

液晶显示吗?还是什么
作者: 勇士小子    时间: 2018-5-10 15:15
东北许文强 发表于 2018-5-10 10:01
蜂鸣器驱动不对

蜂鸣器驱动应该可以的,错误在哪?
作者: 勇士小子    时间: 2018-5-10 15:15
wulin 发表于 2018-5-10 10:35
对于不可位操作的寄存器可以用逻辑运算符&和|操作位。
void main()
{               

哥,我不大懂,该怎么改呢
作者: 勇士小子    时间: 2018-5-10 15:21
大佬,能不能把正确的程序评论给我,或者QQ发到1994975123上谢谢了。
作者: wulin    时间: 2018-5-10 17:01
勇士小子 发表于 2018-5-10 15:15
哥,我不大懂,该怎么改呢

定时器初始化设置就按如上示例,你程序中不要操作TMOD,开停定时器只要操作 TR0、TR1就行了。
作者: 勇士小子    时间: 2018-5-10 18:34
wulin 发表于 2018-5-10 17:01
定时器初始化设置就按如上示例,你程序中不要操作TMOD,开停定时器只要操作 TR0、TR1就行了。

哦哦,谢谢,t0要一直开着,响音乐的时候我要开t1,就怕和原来一样,t1一打开就把t0屏蔽了,我晚上回去测试测试。不行的话在找大佬帮忙。多谢了
作者: 勇士小子    时间: 2018-5-10 23:09
wulin 发表于 2018-5-10 10:35
对于不可位操作的寄存器可以用逻辑运算符&和|操作位。
void main()
{               

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

定时器0中断的优先级高于定时器1中断,在播放音乐时计时就不准了肯定是程序中定时器0被关闭了。 查查程序中有没有TR0=0;ET0=0;或除初始化以外对TMOD寄存器的操作。
作者: ahshmj    时间: 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 。你还是自己在琢磨琢磨吧。
作者: devcang    时间: 2018-5-12 10:24

记时添加时钟芯片,让单片机全力干活
作者: 勇士小子    时间: 2018-5-12 18:30
devcang 发表于 2018-5-12 10:24
记时添加时钟芯片,让单片机全力干活

我们不能时钟芯片
作者: 勇士小子    时间: 2018-5-12 22:04
wulin 发表于 2018-5-11 07:03
定时器0中断的优先级高于定时器1中断,在播放音乐时计时就不准了肯定是程序中定时器0被关闭了。 查查程序 ...

我查了一下,没有关的程序,响音乐时候只有对TH1和TL1的变化,感觉像是T1的工作时间太长了吧,无法及时跑到T0,响完一段音乐就执行一次T0,秒加1
作者: 勇士小子    时间: 2018-5-13 22:32
ahshmj 发表于 2018-5-11 08:32
主要是TMOD你没有弄明白,
“定时器/计数器”工作模式控制寄存器TMOD是一个逐位定义的寄存器,只能使用字 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1