條碼掃描器與單片機(jī)的接口設(shè)計(jì)
基于對(duì)PS/2接口協(xié)議和條碼掃描器輸出數(shù)據(jù)格式的認(rèn)識(shí),從觸發(fā)方式和接收方式兩個(gè)方面詳細(xì)分析了單片機(jī)讀取條碼數(shù)據(jù)的原理與實(shí)現(xiàn)方法,同時(shí)給出了掃描碼與ASCII碼的轉(zhuǎn)換程序設(shè)計(jì)。在應(yīng)用中,給出了條碼掃描器與MCU的接口電路及通行方案,并介紹了單片機(jī)對(duì)條碼數(shù)據(jù)識(shí)別系統(tǒng)一種典型應(yīng)用方法。
條碼掃描器是計(jì)算機(jī)系統(tǒng)的標(biāo)準(zhǔn)輸入設(shè)備之一,它將掃描到的圖像信息轉(zhuǎn)換為數(shù)字信號(hào),繼而轉(zhuǎn)化為與計(jì)算機(jī)兼容的數(shù)據(jù),而且它與計(jì)算機(jī)的接口可以直接識(shí)別,無(wú)需做額外的接口設(shè)計(jì)。盡管可與PC機(jī)簡(jiǎn)單直接相連,但在一些較小系統(tǒng)中這樣設(shè)計(jì)也是不經(jīng)濟(jì)的。舉例說(shuō)明,像自動(dòng)存包柜系統(tǒng)中設(shè)置條碼掃描器,如果在每一個(gè)存包柜配一臺(tái)PC機(jī)來(lái)完成條碼數(shù)據(jù)的讀取和柜子的開(kāi)關(guān)的話,那由于PC機(jī)價(jià)格高、體積大,這樣組成的系統(tǒng)一方面成本高,另一方面要設(shè)計(jì)PC機(jī)的安放位置。在這種情況下,選用價(jià)格低、可靠性好的單片機(jī)來(lái)完成這臺(tái)PC機(jī)的功能就具有較大的優(yōu)越性。但是對(duì)于單片機(jī)系統(tǒng)而言,由于沒(méi)有現(xiàn)成的接口處理器,尤其是對(duì)PS/2口,8位單片機(jī)沒(méi)有鍵盤口的IP核,因此就必須自己設(shè)計(jì)接口,利用單片機(jī)現(xiàn)有的資源,模擬接口處理,實(shí)現(xiàn)通信。系統(tǒng)的設(shè)計(jì)包括兩個(gè)主要部分——硬件連接的設(shè)計(jì)和軟件協(xié)議的仿真。其中軟件協(xié)議的實(shí)現(xiàn)是核心,其本質(zhì)是在硬件接口設(shè)計(jì)好的情況下,實(shí)現(xiàn)單片機(jī)系統(tǒng)與條碼閱讀器的一個(gè)廣義上的通信。
鍵盤接口和PS/2協(xié)議
連接器的電氣特性
條碼掃描器的插頭為鍵盤圓形插針,見(jiàn)圖2。其中只有四個(gè)腳有意義,它們分別是Clock(時(shí)鐘腳)、Data(數(shù)據(jù)腳)、+5V(電源腳)和Ground(電源地),見(jiàn)表1。在PS/2鍵盤與PC機(jī)的物理連接上只要保證這四根線一一對(duì)應(yīng)就可以。PS/2設(shè)備靠PC的PS/2端口提供+5V電源,另外兩個(gè)腳Clock(時(shí)鐘腳)和Data(數(shù)據(jù)腳)都是集電極開(kāi)路的,所以必須接大阻值的上拉電阻。它們平時(shí)保持高電平,有輸出時(shí)才被拉到低電平,之后自動(dòng)上浮到高電平。
PS/2協(xié)議分析
軟件設(shè)計(jì)的關(guān)鍵是模擬PS/2協(xié)議,PS/2協(xié)議是鍵盤與PC連接的雙向異步串行通信協(xié)議,它選用鍵碼掃描集作為按鍵識(shí)別體系。掃描碼和ASCII碼完全不相同,所以接口設(shè)計(jì)的一個(gè)重要任務(wù)是在掃描碼和ASCII之間建立一種映射關(guān)系,將讀取的掃描碼轉(zhuǎn)換為ASCII碼。對(duì)于大多數(shù)鍵碼而言,在鍵盤被打開(kāi)的情況下,只要一個(gè)鍵被按下,就一定會(huì)產(chǎn)生一個(gè)通碼;只要一個(gè)鍵被釋放,就一定會(huì)產(chǎn)生一個(gè)斷碼。于是,對(duì)于一個(gè)鍵值而言,它的組成就是通碼+斷碼。在第二套通碼中,對(duì)于絕大多數(shù)鍵而言,通碼為單字節(jié),斷碼為雙字節(jié)的。其規(guī)則為:斷碼的第一個(gè)字節(jié)是F0h,第二個(gè)字節(jié)是這個(gè)鍵的通碼。比如:按鍵“a”的通碼為1CH,而其斷碼則為F0H,1CH,整個(gè)代碼1CH,F0h,1CH就表示按鍵小寫字母“a”的一個(gè)動(dòng)作。若在PS/2鍵盤中整個(gè)擊鍵的過(guò)程,先按下左SHIFT鍵,再按下a鍵,釋放a鍵,釋放左SHIFT鍵,這些時(shí)間段內(nèi)分別產(chǎn)生了左SHIFT的通碼(12H),A的通碼(1CH),A的斷碼(F0H,1CH),SHIFT斷碼(F0H,12H),查表后可以得出產(chǎn)生了12H,1CH,F0H,1CH,F0H,12H這一連串表示大寫字母“A”的掃描碼。
如果將條碼掃描器設(shè)置為鍵盤接口,它輸出的信號(hào)就完全按照PS/2的數(shù)據(jù)格式編碼。在鍵盤口接口系統(tǒng)中,由Data線和Clock線來(lái)控制對(duì)掃描碼的檢索和傳遞。如果Data線和Clock線都處于高電平狀態(tài),則掃描器每次檢索到一個(gè)掃描碼,就會(huì)立即將其發(fā)送。每位發(fā)送的數(shù)據(jù)在時(shí)鐘信號(hào)的下降沿(當(dāng)時(shí)鐘從高變到低的時(shí)候)被單片機(jī)讀取。需要指出的是,條碼掃描器在一行條碼數(shù)據(jù)輸入完成后,會(huì)在結(jié)尾自動(dòng)加上一個(gè)“回車”符,這一點(diǎn)在單片機(jī)條碼數(shù)據(jù)接口設(shè)計(jì)中很有必要,利用它可以在軟件程序設(shè)計(jì)中判斷一行條碼數(shù)據(jù)的讀取結(jié)束。
當(dāng)條碼掃描器掃描到有效條碼時(shí),會(huì)自動(dòng)產(chǎn)生時(shí)鐘信號(hào),同時(shí)通過(guò)數(shù)據(jù)線按位將掃描碼送到單片機(jī)。因此,可利用單片機(jī)內(nèi)部串行口來(lái)接收掃描碼。因?yàn)閱纹瑱C(jī)本身集成了串口通信的IP核,串口的控制是相當(dāng)成熟和簡(jiǎn)單的,只需做軟件上的設(shè)計(jì)。但當(dāng)單片機(jī)的串行口被用來(lái)與其他設(shè)備通訊時(shí),就必須從新設(shè)計(jì)硬件接口來(lái)將掃描碼信號(hào)做必要的轉(zhuǎn)換,然后在軟件的配合下完成掃描碼的接收。
基于對(duì)PS/2協(xié)議的分析,整個(gè)系統(tǒng)軟件設(shè)計(jì)主要包括兩個(gè)部分:第一是模擬I/O接口時(shí)序,接收原始數(shù)據(jù);第二是解讀原始數(shù)據(jù),識(shí)別所收到的條碼數(shù)據(jù)。簡(jiǎn)單的數(shù)據(jù)接收方式是直接串行接收,此外還可以將條碼輸入設(shè)備的串行輸出掃描碼轉(zhuǎn)換成并行數(shù)據(jù) ,然后利用單片機(jī)的并口讀取。
直接讀取串行數(shù)據(jù)
在接口設(shè)計(jì)中條碼掃描器的輸出接口選用鍵盤口搭配PS/2協(xié)議,采用串行方式進(jìn)行數(shù)據(jù)傳輸時(shí),連線較為簡(jiǎn)單,主要將Clock線和Data線與單片機(jī)相連,為了讀取數(shù)據(jù)時(shí)可以采用中斷觸發(fā)方式,將Clock線接到單片機(jī)外部中斷0請(qǐng)求入口端P3.2上,見(jiàn)圖4。為保證在每一個(gè)時(shí)鐘信號(hào)的下降沿單片機(jī)能準(zhǔn)確讀取Data線的狀態(tài)(一位數(shù)據(jù)),觸發(fā)形式有兩種方案:中斷方式和查詢方式。
在中斷方式中,在主程序?qū)⒅袛嗫诔跏蓟癁橄陆笛赜|發(fā)方式,并將PS/2接口的Data線和Clock線都初始化為空閑狀態(tài),即高電平狀態(tài),使程序在每個(gè)時(shí)鐘下降沿時(shí)自動(dòng)進(jìn)入到中斷服務(wù)程序讀取數(shù)據(jù)。當(dāng)中斷進(jìn)行11次后說(shuō)明一幀數(shù)據(jù)接收完畢,安排一個(gè)標(biāo)志BF為后續(xù)程序表明,然后關(guān)閉中斷,轉(zhuǎn)向掃描碼的判斷和ASCII碼的轉(zhuǎn)換程序。
如果設(shè)計(jì)中其他應(yīng)用程序占用了中斷口,就必須采用查詢方式來(lái)接收條碼數(shù)據(jù)。設(shè)計(jì)中要保持CPU一直檢測(cè)Clock線上的電平,一旦出現(xiàn)拉低,開(kāi)始檢測(cè)Data線的電平狀態(tài),得到一位數(shù)據(jù),同時(shí)記錄Clock線跳變次數(shù),滿11次記錄一個(gè)8位的字符數(shù)據(jù)。這兩種方式各有優(yōu)缺點(diǎn):中斷觸發(fā)減輕了CPU負(fù)擔(dān),處理速度更快,查詢方式為系統(tǒng)設(shè)計(jì)節(jié)省中斷口,供應(yīng)用程序使用,在實(shí)際應(yīng)用中,可根據(jù)設(shè)計(jì)需要采用不同的觸發(fā)方式。
數(shù)據(jù)的并行傳輸方式
設(shè)計(jì)的核心是采用串入并出芯片如74HC164,條碼輸入設(shè)備輸出的串行數(shù)據(jù)脈沖和時(shí)鐘脈沖分別接到74HC164的數(shù)據(jù)端A,B端及時(shí)鐘輸入CLK端,由Clock脈沖的下降沿控制74HC164的位移操作,條碼輸入設(shè)備每輸出一個(gè)字符的掃描碼,由CLK控制在74HC164的輸出腳Q0-Q7上分別輸出掃描碼的D7-D0位,這部分轉(zhuǎn)換完成后接口通知MCU將轉(zhuǎn)換完畢的掃描碼讀入。由于Q0-Q7不能直接和P0口相連,因此,為了保證單片機(jī)準(zhǔn)確讀取74HC1164的Q0-Q7腳上的掃描碼,設(shè)計(jì)一片74HC245將他們隔開(kāi),74HC245是八位雙向3態(tài)緩沖電路,在ENABLE與DIR同時(shí)為低電平的時(shí)候,74HC245將B1-B8上的數(shù)據(jù)傳送至A1-A8上,為使單片機(jī)準(zhǔn)確地發(fā)出讀數(shù)命令,接口電路要完成74HC164轉(zhuǎn)換完一個(gè)掃描碼之后通知單片機(jī)接收74HC164的Q0-Q7數(shù)據(jù)。設(shè)計(jì)中采用對(duì)Clock脈沖的下降沿記數(shù)來(lái)實(shí)現(xiàn),輸入至74HC164的CLK脈沖同時(shí)又輸入至單片機(jī)的T1腳,見(jiàn)圖5。利用T1對(duì)CLK脈沖記數(shù),因?yàn)闂l碼掃描器輸出數(shù)據(jù)中每9個(gè)負(fù)脈沖對(duì)應(yīng)一幀掃描碼,因此T1每記數(shù)9次向CPU發(fā)出中斷請(qǐng)求,從而保證CPU準(zhǔn)確地讀取數(shù)據(jù)。
鍵盤掃描碼轉(zhuǎn)換程序設(shè)計(jì)
由于鍵盤掃描碼無(wú)規(guī)律可循,因此由鍵盤掃描碼獲得相應(yīng)按鍵的鍵值(字符鍵為其ASCII值)只能通過(guò)查表的方式獲得。用單片機(jī)解碼時(shí),在程序中可以根據(jù)每個(gè)斷碼前一字節(jié)為F0H去判斷當(dāng)前的鍵是否釋放,同樣在條碼掃描器向單片機(jī)發(fā)送SHIFT、CTRL等功能鍵都可以在程序中用標(biāo)志位去進(jìn)行處理,轉(zhuǎn)換的方式是先去掉斷碼,保留通碼,用通碼去查表,設(shè)計(jì)中將常用鍵的通碼以及與之相對(duì)應(yīng)的ASCII碼定義在scancodes.h文件,從中查表得到相對(duì)應(yīng)的ASCII碼值,將之順序記錄到數(shù)組中。
基于上面單個(gè)字符的接收程序,解讀原始數(shù)據(jù),識(shí)別所收到的條碼數(shù)據(jù),判斷是否為回車符,回車符作為一串條碼接收完成標(biāo)志,如果為回車符,則轉(zhuǎn)入對(duì)這一串條碼數(shù)據(jù)的處理程序,調(diào)用相應(yīng)程序,如存儲(chǔ)、顯示、驅(qū)動(dòng)電磁鎖等應(yīng)用子程序。就構(gòu)成了一個(gè)完整的條碼閱讀器的應(yīng)用體系。
整個(gè)設(shè)計(jì)中沒(méi)有使用單片機(jī)的內(nèi)部串行口,給系統(tǒng)節(jié)省了端口,根據(jù)不同的需要還可以擴(kuò)展其他功能模塊接口。通過(guò)這個(gè)研究,單片機(jī)本身優(yōu)越的編程和控制性能,加上簡(jiǎn)單的接口電路便能實(shí)現(xiàn)對(duì)條碼設(shè)備的數(shù)據(jù)讀取,這種方法可以推廣至其它兼容PC機(jī)鍵盤接口的數(shù)據(jù)設(shè)備,如磁卡刷卡器。應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域,用單片機(jī)來(lái)代替PC機(jī)的工作,可以大大減少生產(chǎn)成本,而且可靠性較高。