标题: 蜂鸣器的程序看得不是很懂,麻烦大家说一下 [打印本页]

作者: xiaokevn    时间: 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 (42.87 KB, 下载次数: 109)

beep.png

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

好的,,谢谢了。。




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