找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2733|回复: 2
收起左侧

蜂鸣器的程序看得不是很懂,麻烦大家说一下

[复制链接]
ID:214997 发表于 2017-7-25 17:38 | 显示全部楼层 |阅读模式
在论坛的教学那里学习到了蜂鸣器那里,程序有点不太理解。第一个就是主函数里的for循环那里, while (1)
    {
        OpenBuzz(4000); //4KHz的频率启动蜂鸣器
        for (i=0; i<40000; i++);
        StopBuzz();
        for (i=0; i<40000; i++);
        OpenBuzz(1000); //1KHz的频率启动蜂鸣器
        for (i=0; i<40000; i++);
        StopBuzz();
        for (i=0; i<40000; i++);
    }i为啥小于40000,还有他这么写,最后一个for循环的执行语句是哪一个啊?还有就是OpenBuzz函数中
void OpenBuzz(unsigned int frequ)
{
    unsigned int reload;
   
    reload = 65536 - (11059200/12) / (frequ*2);  //由给定频率值计算定时器重载值
    T0LoadH = reload >> 8;  //16位重载值分解为高低两个字节
    T0LoadL = reload;
    TH0 = 0xFF;   //设定一个接近溢出的初值,以使定时器马上投入工作
    TL0 = 0xFE;
    ET0 = 1;   //使能T0中断
    TR0 = 1;   //启动T0
}算reload为什么是(11059200/12)/(frequ*2)主要是这个除(frequ*2)这个怎么来的?完整的程序图片上也有。


beep.png
回复

使用道具 举报

ID:123289 发表于 2017-7-26 07:51 | 显示全部楼层
1、“i为啥小于40000”?
如果你愿意的话可以改成其它数字,它只是消耗CPU的时间,让CPU在此循环40000次,造成一个延时。
2、“最后一个for循环的执行语句是哪一个啊?”
当然是在:最后一个FOR开始的地方了。
你以为FOR下面一定要写点什么吗?它就是不写!为什么呢?因为它就是想消耗CPU的时间,而不想做任何别的事。
3、"除(frequ*2)这个怎么来的?"
frequ是频率,你想不除以它,除以什么呢?至于“2”:一个周期分正负两个部分,在T0中断后,你只做了一次反转,即做正(或负),下次再做负(或正),才能完成一个完整的周期。即T0中断两次,才能合成一个完整的“frequ”的周期。
回复

使用道具 举报

ID:214997 发表于 2017-7-26 13:38 | 显示全部楼层
yzwzfyz 发表于 2017-7-26 07:51
1、“i为啥小于40000”?
如果你愿意的话可以改成其它数字,它只是消耗CPU的时间,让CPU在此循环40000次, ...

好的,,谢谢了。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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