標題: 蜂鳴器的程序看得不是很懂,麻煩大家說一下 [打印本頁]
作者: 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)
下載附件
2017-7-25 17:31 上傳
作者: 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
好的,,謝謝了。。
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |