1.初學(xué)者的坑
上一講的代碼單片機一上電無源蜂鳴器就不停鳴叫比較吵,那么我們有沒有辦法讓它規(guī)定響多久就可以停止不叫了呢。首先我們知道要想讓無源蜂鳴器持續(xù)響,那么P1.6就要以一定的時間間隔(也可叫一定頻率)不停的高低電平切換。
復(fù)習(xí)了前兩講的內(nèi)容之后,我們動手自己寫一個讓無源蜂鳴器響一小段時間然后又不響一段時間,接著又響一小段時間的循環(huán)。這就類似于點亮一盞燈一段時間,熄滅一盞燈一段時間的循環(huán)。
這時初學(xué)者開始得意自己學(xué)過LED閃爍,于是就自己給自己出了道題目,讓蜂鳴器響一下之后,保持不響的狀態(tài)1秒鐘,之后又響一下,又保持1秒不響這樣循環(huán)下去,于是他們在while(1)里面這樣寫
代碼下進去發(fā)現(xiàn)蜂鳴器沒響,只是聽到隔1秒就“咔”的聲音。初學(xué)者犯這樣的錯誤是因為還沒認真思考過代碼控制IO端口輸出的狀態(tài)。
2.圖解
我們上一講代碼的while(1)里波形的實現(xiàn)是這樣的
而本講上圖的代碼中的while(1)里卻是這樣的波形
這樣就達不到人家無源蜂鳴器驅(qū)動的條件了,初學(xué)者犯這樣的錯誤是因為還沒能很細致的去一條條代碼分析,我們要做到看一條代碼記住此時的IO端口輸出的狀態(tài),然后再分析下一條代碼,這樣才能系統(tǒng)的去了解程序和硬件執(zhí)行的關(guān)系。
3.題目分析
上一講無源蜂鳴器能發(fā)聲是因為在死循環(huán)里這些方波持續(xù)的時間無限長,所以無源蜂鳴器就會一直響。那我們要讓它響一段時間,就讓這個方波持續(xù)著這段時間;然后把IO端口電平固定住不發(fā)生改變,無源蜂鳴器沒有脈沖信號所以就不響了。這時我們再延時1秒,在這一秒里無源蜂鳴器不會響,過了這一秒之后再讓IO端口持續(xù)輸出一段方波時間,這時就可以再次弄響無源蜂鳴器,就這樣死循環(huán)下去也就達到自己想的那個題目的要求了。
4.代碼
#include <reg52.h> sbit BEEP = P1^6; void delay_ms(unsigned int x) { unsigned int i,j; if(x==1000) { for(i=0;i<19601;i++)//延時1s { for(j=5;j>0;j--); } } else while(x--)for(j=115;j>0;j--); } void main() { unsigned int i,time; while(1) { for(time=0;time<800;time++)//800決定鳴叫的時長 { BEEP=!BEEP; for(i=0;i<30;i++);//這里改為30延時長一點把鳴叫音調(diào)調(diào)低一些 } delay_ms(1000);//延時1s } }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程