找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2636|回复: 11
收起左侧

单片机C语言无源蜂鸣器使用定时器驱动程序求分析

[复制链接]
ID:232366 发表于 2021-2-10 16:14 来自手机 | 显示全部楼层 |阅读模式
这次一个无源蜂鸣器驱动算是遇到问题了
此程序并非本人所写也是借鉴于论坛大神帖子的!
程序如下:
定时器为八位自动重装模式
定时250us;

void  timer()  interrupt   1
{

static uint16  count=0;
uint16   count;
if(num>0)
{
count++;
if(count<400)
{
beep=~beep;
if(count>=400)
beep=1;
if(count>=800)
{
count=0;
num--;
}

}


}

}
求问:三个if里面的的数值都决定了蜂鸣器的什么状态?
回复

使用道具 举报

ID:235200 发表于 2021-2-10 17:47 | 显示全部楼层
void  timer()  interrupt   1
{

static uint16  count=0;
uint16   count;
if(num>0)
{
count++;
if(count<400)       //决定鸣叫
{
beep=~beep;
if(count>=400)      //决定不叫
beep=1;
if(count>=800)    //决定鸣叫和不叫的周期
{
count=0;
num--;                //决定鸣叫的次数
}
回复

使用道具 举报

ID:702386 发表于 2021-2-10 18:04 | 显示全部楼层
我来分析一下,如果说错了多包涵。
这个程序运行起来的效果是,蜂鸣器会发出2000Hz的声音(类似有源蜂鸣器的频率),交替响100mS停100mS,响的次数由num决定。
第一个if(num>0),就是num还没有自减到0时,才会执行里面的代码。if(count<400),是指在前面400次中断里(每次中断250uS),蜂鸣器交替发声,这就确定了发声的声音频率是1s/500us=2000Hz。if(count>=400) beep=1是指,执行完前面400次中断(100mS)后,在接下来的400次中断(100mS)不发声,直到if(count>=800)把count清零,才会回到发声的代码中,当然前提是num--后num还没到0。
回复

使用道具 举报

ID:236982 发表于 2021-2-10 18:33 | 显示全部楼层
蜂鸣器的鸣响由变量NUM决定:
当变量num》时,蜂鸣器以占空比为50%、4KHZ的频率间歇鸣响
NUM=0,蜂鸣器停止鸣响
第一个IF:蜂鸣器鸣响的先决条件
第二个IF:蜂鸣器开始鸣响1秒
第三个IF:蜂鸣器停止鸣响1秒
回复

使用道具 举报

ID:390416 发表于 2021-2-10 19:04 | 显示全部楼层
人人学会单片机 就是用的无源蜂鸣器,课程第25课和第26课
回复

使用道具 举报

ID:213173 发表于 2021-2-10 21:09 | 显示全部楼层
楼主抄作业也抄错了吧。你这程序只能短暂响一下就没声音了。给你改一下并详细注释。
void  timer()  interrupt   1
{//功能:急促响铃声,适用于报警
        static uint16  count=0;//静态局部计数变量
//        uint16   count;//错误:重复定义同名变量
        if(num>0)//num响铃次数变量
        {
                count++;
                if(count<=1000)//<0.25秒
                        beep=~beep;//蜂鸣器响铃,频率2KHz
                if(count>1000) //>0.25秒
                        beep=1;           //蜂鸣器复位
                if(count>=2000)//0.5秒周期
                {
                        count=0;   //计数变量清0
                        num--;           //响铃次数减1,直减到为0结束
                }
        }
}
回复

使用道具 举报

ID:232366 发表于 2021-2-11 11:15 | 显示全部楼层
wulin 发表于 2021-2-10 21:09
楼主抄作业也抄错了吧。你这程序只能短暂响一下就没声音了。给你改一下并详细注释。
void  timer()  inter ...

新年好!!   非常感谢回复解答此程序正式出自您,我也照葫芦画瓢抄了一个 对其中运行原理弄不明白调试过程中配合逻辑分析仪调试硬是没调通!!
回复

使用道具 举报

ID:213173 发表于 2021-2-11 15:19 | 显示全部楼层
SHANWAZI 发表于 2021-2-11 11:15
新年好!!   非常感谢回复解答此程序正式出自您,我也照葫芦画瓢抄了一个 对其中运行原理弄不明白调试过 ...

给你一个驱动无源蜂鸣器演示程序参考
示例 仿真.zip (155.53 KB, 下载次数: 35)
回复

使用道具 举报

ID:232366 发表于 2021-2-11 16:54 | 显示全部楼层
给坛友送个祝福:今天‬就是大年三十了,在此祝愿您新年好!新‬春快乐!祝愿您在2021年事事顺心‬!天天开心!身健体‬康!阖家欢乐!恭发喜‬财!事事‬顺心!万事如意[庆祝][庆祝][庆祝][烟花][烟花][烟花][烟花][合十][合十][合十]2021发发发
回复

使用道具 举报

ID:232366 发表于 2021-2-11 16:54 | 显示全部楼层
wulin 发表于 2021-2-11 15:19
给你一个驱动无源蜂鸣器演示程序参考

非常感谢
回复

使用道具 举报

ID:232366 发表于 2021-2-11 17:40 | 显示全部楼层
wulin 发表于 2021-2-11 15:19
给你一个驱动无源蜂鸣器演示程序参考

里面元器件非常齐全很感谢
回复

使用道具 举报

ID:420836 发表于 2021-2-15 02:00 | 显示全部楼层
感谢大家的解释,非常有帮助
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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