牟曉東
本文以模擬題“電子測(cè)距儀”為例,進(jìn)行題目解析。
第三題“電子測(cè)距儀”(難度系數(shù)3,25個(gè)計(jì)分點(diǎn)):
在日常生活中,我們經(jīng)常會(huì)需要測(cè)量距離,電子測(cè)距儀作為一種測(cè)距設(shè)備,可以很方便地幫助我們測(cè)出距離,現(xiàn)制作一個(gè)簡(jiǎn)易的電子測(cè)距儀。
1個(gè)按鍵模塊【接入25#引腳】,1個(gè)數(shù)碼管【接入IIC接口】,1個(gè)超聲波傳感器【接入超聲波專用接口】,杜邦線若干。
編程實(shí)現(xiàn):
(1)程序開(kāi)始時(shí),數(shù)碼管沒(méi)有顯示;
(2)當(dāng)按鍵按下并且按住時(shí),數(shù)碼管顯示當(dāng)前設(shè)備測(cè)試的距離值(只顯示整數(shù)部分),測(cè)量顯示的距離范圍為2-400cm;
(3)當(dāng)測(cè)量到的距離大于400或者小于2cm時(shí),數(shù)碼管顯示4個(gè)0;
(4)當(dāng)按鍵松開(kāi)時(shí),數(shù)碼管不顯示;
(5)如此循環(huán)。
3分:實(shí)現(xiàn)“編程實(shí)現(xiàn)”中的(1);
5分:實(shí)現(xiàn)“編程實(shí)現(xiàn)”中的(2);
7分:實(shí)現(xiàn)“編程實(shí)現(xiàn)”中的(3);
5分:實(shí)現(xiàn)“編程實(shí)現(xiàn)”中的(4);
5分:完全符合題意。
“電子測(cè)距儀”的關(guān)鍵考點(diǎn)是使用分支選擇結(jié)構(gòu)的嵌套,將超聲波傳感器檢測(cè)到的不同范圍距離值在數(shù)碼管上進(jìn)行顯示;另外,還必須要特別注意數(shù)碼管的使用前設(shè)置(如先關(guān)閉再調(diào)節(jié)亮度等),以及如何單獨(dú)控制各個(gè)數(shù)字位的數(shù)據(jù)顯示。
(1)通常使用的HC-SR04超聲波傳感器的有效測(cè)距范圍為2-400cm,數(shù)碼管則最多可顯示四位數(shù)字;因此,題目中的要求(2)其實(shí)也只是使用了右側(cè)的1號(hào)、2號(hào)和3號(hào)低位數(shù)碼管,最左側(cè)的0號(hào)是處于“空閑”狀態(tài)。
(2)超聲波傳感器進(jìn)行測(cè)距的返回值為9位小數(shù),必須在輸出至數(shù)碼管顯示前進(jìn)行“取整”操作;還要將這個(gè)三位數(shù)進(jìn)行百位、十位和個(gè)位的逐一“分解”,分別輸出至數(shù)碼管的1號(hào)、2號(hào)、3號(hào),這步操作是該題的難點(diǎn),需要使用數(shù)學(xué)中的“除法”和“取余數(shù)”相結(jié)合的操作方法來(lái)實(shí)現(xiàn)。
(3)按鍵的編程控制部分需要使用“獲取25號(hào)按鈕檢測(cè)結(jié)果”語(yǔ)句,其返回結(jié)果為0和1,分別對(duì)應(yīng)“松開(kāi)”和“按下”兩種狀態(tài)。
按照題目要求,將按鍵模塊接入25號(hào)的三個(gè)引腳;超聲波傳感器有四個(gè)引腳,接入專用接口(擴(kuò)展板的20和21號(hào));將數(shù)碼管的四個(gè)引腳(VCC、GND、SCL和SDA)接入IIC接口(Up列);最后,給樹(shù)莓派接通電源,啟動(dòng)操作系統(tǒng)(如圖1)。
(1)進(jìn)入平臺(tái)編程環(huán)境
訪問(wèn)古德微機(jī)器人平臺(tái)(www.gdwrobot.cn)。
(2)數(shù)碼管的“預(yù)處理”
數(shù)碼管在調(diào)用前必須要先進(jìn)行“關(guān)閉”的操作,而且題目(4)也明確有“按鍵松開(kāi)時(shí)不顯示”的要求;由于數(shù)碼管的關(guān)閉需要逐個(gè)進(jìn)行,為減少代碼數(shù)量,此時(shí)應(yīng)該考慮建立函數(shù)“關(guān)閉數(shù)碼管”,順序關(guān)閉0-3號(hào)數(shù)碼管。同時(shí),在程序開(kāi)始調(diào)用該函數(shù)后,添加一條“設(shè)置0號(hào)數(shù)碼管的亮度為1”語(yǔ)句。
(3)構(gòu)建“外層”分支選擇結(jié)構(gòu)
建立變量“按鍵”,為其賦值為“獲取25號(hào)按鈕檢測(cè)結(jié)果”;接著建立“如果…執(zhí)行…否則…”分支選擇結(jié)構(gòu),對(duì)變量“按鍵”的值是否為1進(jìn)行判斷,是的話表示為“按下”狀態(tài),準(zhǔn)備實(shí)現(xiàn)題目中(2)和(3)的要求;否的話(值為0),關(guān)閉數(shù)碼管顯示,實(shí)現(xiàn)題目中(4)的要求。
(4)構(gòu)建“內(nèi)層”分支選擇結(jié)構(gòu)
如果判斷按鍵為“按下”的狀態(tài),則建立變量“距離”,賦值為“超聲波測(cè)距”,并且增加“獲取整數(shù)”處理后進(jìn)行調(diào)試信息的LOG區(qū)輸出;接著再構(gòu)建“如果…執(zhí)行…否則…”分支選擇結(jié)構(gòu),判斷超聲波測(cè)量的距離值是否在2-400cm的正常測(cè)量范圍內(nèi);否的話,使用“設(shè)置0/1/2/3號(hào)數(shù)碼管顯示0”四個(gè)語(yǔ)句,控制顯示4個(gè)0,實(shí)現(xiàn)題目(3)的要求;是的話,建立變量“百位”、“十位”和“個(gè)位”:
為變量“百位”賦值為“距離除以100”,取出該三位數(shù)的最高位;
為變量“十位”賦值為先“距離除以100”后取余數(shù)、再將余數(shù)“除以10”;
為變量“個(gè)位”賦值為先“距離除以10”、再將商“取余數(shù)”。
最后,分別使用三個(gè)“設(shè)置1/2/3號(hào)數(shù)碼管顯示百位/十位/個(gè)位”,其中的“并顯示點(diǎn)0”的意思是控制不顯示數(shù)碼管中的小數(shù)點(diǎn)。
(5)完善細(xì)節(jié)
將相關(guān)語(yǔ)句按照題目要求放置于“重復(fù)當(dāng)真”的循環(huán)結(jié)構(gòu)中,在循環(huán)體內(nèi)的兩層分支選擇結(jié)構(gòu)的最后均添加一條“等待0.1秒”語(yǔ)句,防止循環(huán)過(guò)快(如圖2)。
在平臺(tái)編程環(huán)境中點(diǎn)擊“連接設(shè)備”,正常的話再點(diǎn)擊“運(yùn)行”按鈕,對(duì)照題目中的各種情況進(jìn)行多次測(cè)試,包括程序開(kāi)始和按鍵松開(kāi)時(shí)“數(shù)碼管不顯示”、按鍵按下并且按住時(shí)的正常測(cè)距范圍(2-400cm)顯示實(shí)際測(cè)量值與超范圍時(shí)顯示4個(gè)0(如圖3),均實(shí)現(xiàn)了題目要求。
最后將程序按照要求保存為“03.txt”,下載并上傳至考試系統(tǒng)中即可。
程序代碼仍然可以進(jìn)行兩處改寫(xiě)“升級(jí)”:
一是不建立變量“按鍵”,直接在外層分支選擇結(jié)構(gòu)中將“獲取25號(hào)按鈕檢測(cè)結(jié)果”作為判斷條件,因?yàn)樵摲祷刂抵挥?和1,與按鍵的“松開(kāi)”與“按下”是對(duì)應(yīng)的——數(shù)值“1”在很多編程語(yǔ)言中都是表示邏輯真;二是將數(shù)碼管顯示0的四行語(yǔ)句從主程序中去除,將它們?cè)黾又列潞瘮?shù)“數(shù)碼管顯示0”中,雖然在主程序中只調(diào)用一次,但整體的簡(jiǎn)潔性會(huì)更好(如圖4)。
再次運(yùn)行程序,同樣也能夠?qū)崿F(xiàn)題目要求。