标题: 定时器设置频率和间隔的难题 [打印本页]

作者: 陆小贱    时间: 2016-7-19 13:51
标题: 定时器设置频率和间隔的难题
3、同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,j;
sbit beep=P3^6;
uint code PL[]={500,625,1250,2500,5000,10000};//1,10,50,100,200,400,800,1k(hz)方波
//我取他们定时的一半来对他们取反,但800HZ 和1khz太大我无法取半一次性放上去
void main()
{        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;        //定时器0赋初值
        while(1)
        {
        if(num==10)                 //300MS到了后开始输出
        {
        num=0;                        //300ms重新计数
        TH1=(65536-PL[j]);       
        TL1=(65536-PL[j]);
        j++;                        //读取数组值得变量         
        if(j==6)
                {
        j=0;                                 //         j清零
                }
        }
        }
}

void T0_time()interrupt 1
{
        num++;                                         //计10次的300ms
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;         

}
void T1_time() interrupt 1
{        TH1=(65536-PL[j]);
        TL1=(65536-PL[j]);                 //重装初值
        beep=~beep;                                 //取反

}
希望能告诉我哪里错了,那部分理解的不对。谢谢大神了


作者: ssli    时间: 2016-7-20 17:09
定时器0和1不设置默认为方式0,最大计数位8191,应改为方式1
作者: ssli    时间: 2016-7-20 17:10
定时器1也没有启动
作者: ssli    时间: 2016-7-20 17:12
定时器1的中断序列号应改为3
作者: jwjjwj123    时间: 2016-7-20 18:37
定时器的初值高
作者: 陆小贱    时间: 2016-7-21 16:08
答案如下
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,j,bp;
sbit beep=P3^6;
uint code PL[]={50000,10000,5000,2500,1250,625,500} ;//1,10,50,100,200,400,800,1k(hz)方波
//我取他们定时的一半来对他们取反,但800HZ 和1khz太大我无法取半一次性放上去
void main()
{        TMOD=0x11;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        TR1=1;
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;        //定时器0赋初值
        TH1=(65536-PL[j])/256;       
        TL1=(65536-PL[j])%256;
        bp=0;num=0;j=0;beep=1;
        while(1)
        {
                if(bp>0)
                {
                        TR0=0;                 //防止混乱
                        bp=0;
                        beep=~beep;         //取反
                        if(num>5)        //300毫秒间隔
                        {
                                num=0;
                                j++;
                        }
                        if(j>6)                 //j清零
                        {
                        j=0;
                        }
                TR0=1;                        //开启定时器1
                }
        }

       
}

void T0_time()interrupt 1
{
        TH0=(65536-30000)/256;
        TL0=(65536-30000)%256;       
        num++;         

}
void T1_time() interrupt 3
{        TH1=(65536-PL[j])/256;
        TL1=(65536-PL[j])%256;                 //重装初值
        bp++;                                 
}
作者: majianya    时间: 2016-7-22 14:55
学习学习
作者: 诗和远方1515    时间: 2016-10-31 22:08
学习中,谢谢
作者: zl2168    时间: 2016-11-1 18:25
本帖最后由 zl2168 于 2016-11-1 18:38 编辑

你这个问题属于双音频输出。


实例13 频输出
内有电话铃声、救护车报警声

电路设计   
电路与上例基本相同,如图3-21所示。P1.7接发声器,P1.0、P1.2分别接按键开关K0、K1,要求按一次K0、K1,发声器分别发出电话铃声、救护车报警声。
程序设计   

Keil调试   

Proteus仿真   


Proteus仿真一下,确认有效。
实例13 双音频输出.rar (26.73 KB, 下载次数: 7)



以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解


作者: zl2168    时间: 2016-11-1 18:43
本帖最后由 zl2168 于 2016-11-1 18:47 编辑

还有一个程序,能输出双音频警车声,也在上述给你介绍的书中。
实例78  电子密码锁
先Proteus仿真一下,确认有效。
电子密码锁1.rar (1.13 MB, 下载次数: 9)





以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1
书中电路和程序设计有详细说明,程序语句条条有注解。




作者: zl2168    时间: 2016-11-1 18:49
本帖最后由 zl2168 于 2016-11-1 18:51 编辑

以上3种双音频声均用程序写成,即2种不同频率发声,再控制2种频率持续的时间,不是语音。




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