基于PIC16F873的16路搶答器
1 系統(tǒng)硬件設(shè)計(jì)
美國Microchip Technology公司推出的PIC16F87X中檔系列單片機(jī),片內(nèi)含有A/D、PWM、EEPROM等豐富的接口模塊和FLASH程序存儲(chǔ)器。借助于PIC16F873片內(nèi)的ADC模塊,使用一條I/O引腳,可以實(shí)現(xiàn)多個(gè)按鈕開關(guān)的數(shù)字量輸入問題。以此原理制成的16路搶答器,電路設(shè)計(jì)有搶答按鈕開關(guān)、狀態(tài)指示燈、復(fù)位開關(guān)、一只蜂鳴器和兩只數(shù)碼管。
設(shè)計(jì)功能如下,通電后,狀態(tài)指示燈點(diǎn)亮,并且同時(shí)發(fā)出持續(xù)1s的類似電話振鈴的美妙聲音,表示為搶答作好準(zhǔn)備。每當(dāng)主持人口頭發(fā)出號(hào)令之后,哪個(gè)隊(duì)先按下座位上的按鈕開關(guān),數(shù)碼管就顯示該隊(duì)的編號(hào)。同時(shí)封鎖其他按鈕開關(guān)的活動(dòng),狀態(tài)指示燈熄滅,并且同時(shí)發(fā)出持續(xù)1s的類似電話振鈴的美妙聲音,以聲明此次搶答動(dòng)作已經(jīng)完成。在主持人確認(rèn)后,按下復(fù)位按鈕,狀態(tài)指示燈重新點(diǎn)亮,并且同時(shí)發(fā)出持續(xù)1s的類似電話振鈴的美妙聲音,為下一次搶答作好準(zhǔn)備。在理論上,利用PIC16F873片內(nèi)的10位A/D轉(zhuǎn)換器,去除一個(gè)無鍵按下的“空”狀態(tài),則最多可以區(qū)分1023個(gè)按鍵。正是由于利用了PIC16F873片內(nèi)10位A/D轉(zhuǎn)換器,才使本搶答器外圍電路比較簡單,實(shí)用性強(qiáng),而且本搶答器很容易擴(kuò)展成更多路搶答器。
如圖1,本搶答器主要由按鍵電路、PIC16F873單片機(jī)、三態(tài)輸出鎖存器74LS373及數(shù)碼管組成。R16、R17、K0組成單片機(jī)的復(fù)位電路,按鍵電路由R1-R15、K1-K16組成。PIC16F873單片機(jī)系統(tǒng)時(shí)鐘由4MHz的石英晶體經(jīng)其內(nèi)部振蕩器提供,內(nèi)部ADC的參考電壓分別為VDD和地,按鍵電路輸出的電壓由數(shù)據(jù)線AN0輸入,由于軟件可以完成譯碼,因此不需譯碼器。74LS373、數(shù)碼管組成顯示電路,R18-R33起到限流的作用。為了使各個(gè)電阻向標(biāo)稱值靠攏,R0-R17的取值如圖1標(biāo)注,能滿足表1中按鍵位置與輸出電壓的關(guān)系。開機(jī)后,RC0-RC7輸出“0”的七段碼,RA1輸出高電平,數(shù)碼管個(gè)位顯示0,接著,尺A1輸出低電平,RA2輸出高電平,數(shù)碼管十位顯示0,RA2再輸出低電平。RA5輸出高電平,狀態(tài)指示燈LED亮,RA3輸出500Hz、630Hz兩種音頻信號(hào),這兩種音頻信號(hào)以10Hz的頻率輪流切換,從而蜂鳴器就發(fā)出類似電話振鈴的美妙聲音,搶答器進(jìn)入準(zhǔn)備狀態(tài)。當(dāng)搶答時(shí),某個(gè)按鍵按下,假如是K12,其他按鍵的活動(dòng)被封鎖,PIC16F873單片機(jī)內(nèi)的A/D轉(zhuǎn)換器將輸入電壓轉(zhuǎn)化成10位二進(jìn)制數(shù),通過單片機(jī)處理,RA1輸出高電平,RC0-RC7輸出“2”的七段碼,然后,RA1輸出低電平,將74LS373(2)的輸出碼鎖存,RA2輸出高電平,RC0-RC7輸出“1”的七段碼,RA2再輸出低電平,將74LS373(1)的輸出碼鎖存,這樣數(shù)碼管就穩(wěn)定地顯示出“12”。同時(shí),RA3輸出持續(xù)1s的10Hz的頻率輪流切換的500Hz、630Hz兩種音頻信號(hào),蜂鳴器發(fā)出類似電話振鈴的美妙聲音,RA5再輸出低電平,LED熄滅,以聲明此次搶答動(dòng)作已完成。在主持人確認(rèn)后,按下復(fù)位按鍵,兩位數(shù)碼管顯示“00”,狀態(tài)指示燈LED亮,搶答器進(jìn)入準(zhǔn)備狀態(tài)。
按下的鍵 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
輸出電壓Vo | 0 | (1/16)VDD | (2/16)VDD | (3/16)VDD | (4/16)VDD | (5/16)VDD | (6/16)VDD | (7/16)VDD |
轉(zhuǎn)換結(jié)果 (取高8位) | 0 | 10H | 20H | 30H | 40H | 50H | 60H | 70H |
區(qū)分按鍵的 分水嶺判別值 | 08H | 18H | 28H | 38H | 48H | 58H | 68H |
按下的鍵 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 無鍵 |
輸出電壓 | (8/16)VDD | (9/16)VDD | (10/16)VDD | (11/16)VDD | (12/16)VDD | (13/16)VDD | (14/16)VDD | (15/16)VDD | VDD |
轉(zhuǎn)換結(jié)果 (取高8位) | 80H | 90H | A0H | B0H | C0H | D0H | E0H | F0H | FFH |
區(qū)分按鍵的 分水嶺判別值 | 78H | 88H | 98H | A8H | B8H | C8H | D8H | E8H | F8H |
2 軟件設(shè)計(jì)
取ADC轉(zhuǎn)換結(jié)果的高8位就已經(jīng)滿足本搶答器對(duì)分辨率的需要,將相鄰兩個(gè)狀態(tài)的轉(zhuǎn)換結(jié)果的平均值固定下來作為區(qū)分按鍵位置的判別值。例如,(FFH+F0H)/2=F8H,作為空閑狀態(tài)的判別值,只要轉(zhuǎn)換結(jié)果大于該值,即判為無鍵按下;又例如(10H+20H)/2=18H,作為K2的判別值,只要轉(zhuǎn)換結(jié)果大于該值,即判斷為K2按下。按鍵的掃描采用啟動(dòng)AD轉(zhuǎn)換的方法來實(shí)現(xiàn)。每次掃描過程是從高到低,用各鍵判別值去衡量AD轉(zhuǎn)化結(jié)果,以區(qū)分按下的是哪個(gè)鍵或無鍵按下,這樣便于程序的編寫。若無按鍵,繼續(xù)掃描,若有鍵按下,取出AD轉(zhuǎn)化結(jié)果,關(guān)閉AD轉(zhuǎn)換,判別哪個(gè)鍵按下,并送顯所按下鍵的編號(hào),RA5輸出低電平,熄滅狀態(tài)指示燈,RA3送出持續(xù)1s 500Hz和630Hz以10Hz輪流切換的音頻信號(hào)。500Hz的音頻產(chǎn)生的方法如下,該信號(hào)對(duì)應(yīng)的周期為2000us,該音頻信號(hào)一個(gè)的周期之內(nèi),保持在高電平和低電平的時(shí)間都是1000us。
利用定時(shí)器/計(jì)數(shù)器TMR0模塊產(chǎn)生該延時(shí)時(shí)間,分頻比和初始值分別是1:8和131。同理,產(chǎn)生630Hz音頻應(yīng)該采用的分頻比和初始值分別是1:8和157。這兩個(gè)音頻信號(hào)再以10Hz的頻率輪流切換,從單片機(jī)的RA3口線上送出,也就是每個(gè)音頻信號(hào)持續(xù)的時(shí)間是50ms。那么,對(duì)于500Hz來說,50ms之內(nèi)包含的周期個(gè)數(shù)為25個(gè),包含從低到高的電平切換次數(shù)為50次;對(duì)于630Hz來說,50ms之內(nèi)包含的周期個(gè)數(shù)為31.5個(gè),包含從低到高的電平切換次數(shù)為63次。發(fā)生1s需要輪流調(diào)用500Hz和630Hz產(chǎn)生的程序各10次。程序流程圖如圖2、圖3、圖4、圖5所示。
評(píng)論