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