标题: 单片机同时用两个定时器控制蜂鸣器发声的问题请教 [打印本页]

作者: 灰小伙    时间: 2024-4-10 06:52
标题: 单片机同时用两个定时器控制蜂鸣器发声的问题请教
读到一段,同时用两个定时器控制蜂鸣器发声的单片机代码,有个细节没看懂,想请大佬解释一下,谢谢!if(tt==10)   //如果tt==10,也就是定时器0溢出10次。也就是定时器0计数10次。那为什么这里要判断tt==10呢?。后面不用再判断呢?
代码原文如下:

/*******************************************************************/
/*                                                         
同时用两个定时器控制蜂鸣器发声,
定时器0控制频率,定时器1控制同个
频率持续的时间,间隔2s依次输出
1,10,50,100,200,400,800,
1k(hz)的方波?
设晶振频率为12MHz。
*/
/*********************************************************/
#include<reg52.h>  //52单片机头文件
#include <intrins.h> //包含有左右循环移位子函数的库
#define uint unsigned int    //宏定义
#define uchar unsigned char  //宏定义
sbit beep=P2^3;
uchar tt;
uint fre,flag;

void main()                    //主函数
{
        fre=50000;
        beep=0;
        TMOD=0x11;//设置定时器0,定时器1为工作方式1
        TH0=(65536-fre)/256;
        TL0=(65536-fre)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        ET1=1;
        TR1=1;
        TR0=1;//启动定时器0
        while(1);//等待中断产生
        
}

void timer0() interrupt 1   //定时器0中断,控制切换频率
{
        TR0=0;    //进中断后先把定时器0中断关闭,防止内部程序过多而造成中断丢失
        TH0=(65536-fre)/256;
        TL0=(65536-fre)%256;
        tt++;//进入中断的次数。
        //以下几个if分别用来选取不同的频率
        //注意,以下if的条件,每次都是间隔40个flag,flag值由定时器1决定,也就是定时器1溢出的次数。
        if(flag<40)    //flag  小于40
                if(tt==10)   //如果tt==10,也就是定时器0溢出10次。也就是定时器0计数10次。那为什么这里要判断tt==10呢?。后面不用再判断呢?
                        {
                                tt=0;
                                fre=50000;
                                beep=~beep;
                        }
        if(flag>=40&&flag<80)  //flag  大于或等于40,同时flag小于80
                {
                        tt=0;
                        fre=50000;
                        beep=~beep;        
                }
        if(flag>=80&&flag<120) //flag  大于或等于80,同时flag小于120
                {
                        tt=0;
                        fre=10000;
                        beep=~beep;        
                }
        if(flag>=120&&flag<160) //flag  大于或等于120,同时flag小于160
                {
                        tt=0;
                        fre=5000;
                        beep=~beep;        
                }
        if(flag>=160&&flag<200) //flag  大于或等于160,同时flag小于200
                {
                        tt=0;
                        fre=2500;
                        beep=~beep;        
                }
        if(flag>=200&&flag<240) //flag  大于或等于200,同时flag小于240
                {
                        tt=0;
                        fre=1250;
                        beep=~beep;        
                }
        if(flag>=240&&flag<280) //flag  大于或等于240,同时flag小于280
                {
                        tt=0;
                        fre=625;
                        beep=~beep;        
                }
        if(flag>=280&&flag<320) //flag  大于或等于280,同时flag小于320
                {
                        tt=0;
                        fre=312;
                        beep=~beep;        
                }
        if(flag>=320&&flag<360) //flag  大于或等于320,同时flag小于360
                {
                        tt=0;
                        fre=156;
                        beep=~beep;        
                }
        TR0=1;
}
void timer1() interrupt 3  //定时器1中断用来产生2秒时间定时 控制每个频率工作的时间。
{
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        flag++;
        if(flag==360)
          {
            flag=0;
            fre=50000;
          }
}




作者: Graves    时间: 2024-4-10 10:48
因为第二次是第一次的10倍频率,fre没改前提下改tt来循环十次达到10倍延时的效果。后面就是改fre数值所以不用管tt变量
作者: 灰小伙    时间: 2024-4-10 11:17
qq475878026 发表于 2024-4-10 10:48
因为第二次是第一次的10倍频率,fre没改前提下改tt来循环十次达到10倍延时的效果。后面就是改fre数值所以不 ...

明白了,第一个频率是1HZ,那周期是1秒,那也就是500ms要翻转一下beep.但是定时器计50000次,只有50ms.所以额外加一个tt=10,也就是定时10个50ms之后,再来翻转beep.
谢谢大佬!
作者: joyb    时间: 2024-4-10 16:19
利用I/O 定时翻转电平来产生驱动波形的方式,必须利用定时器来做定时,通过定时翻转电平产生符合蜂鸣器要求的频率的波形,这个波形就可以用来驱动蜂鸣器了。比如为100Hz 的蜂鸣器的驱动,可以知道周期为10000μs,这样只需要驱动蜂鸣器的I/O 口每5000μs 翻转一次电平就可以产生一个频率为100Hz,占空比为1/2duty 的方波,再通过三极管放大就可以驱动蜂鸣器了。




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