基于單片機(jī)的簡(jiǎn)易超市收銀系統(tǒng)設(shè)計(jì)畢設(shè)論文_第1頁(yè)
基于單片機(jī)的簡(jiǎn)易超市收銀系統(tǒng)設(shè)計(jì)畢設(shè)論文_第2頁(yè)
基于單片機(jī)的簡(jiǎn)易超市收銀系統(tǒng)設(shè)計(jì)畢設(shè)論文_第3頁(yè)
基于單片機(jī)的簡(jiǎn)易超市收銀系統(tǒng)設(shè)計(jì)畢設(shè)論文_第4頁(yè)
基于單片機(jī)的簡(jiǎn)易超市收銀系統(tǒng)設(shè)計(jì)畢設(shè)論文_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

擴(kuò)展條形碼輸入設(shè)備,實(shí)現(xiàn)商品的條形碼輸入;(選作)擴(kuò)展鍵盤(pán)可實(shí)現(xiàn)全拼漢字、中英文和數(shù)字輸入;(選作)具有多功能銷(xiāo)售操作,實(shí)現(xiàn)單次銷(xiāo)售、多件批發(fā)、退貨銷(xiāo)售、單向折扣等銷(xiāo)售;(選作)漢字打印每筆交易的商品名、商品單價(jià)、銷(xiāo)售數(shù)量、銷(xiāo)售金額、小計(jì)金額、商店店名、單據(jù)流水號(hào)、交易日期和時(shí)間等等。(選作)系統(tǒng)方案核心控制芯片核心控制芯片STC89C52復(fù)位到初始狀態(tài)Eeprom擴(kuò)展內(nèi)存條形碼掃描槍LED燈指示電源是否供電獨(dú)立鍵盤(pán)模塊電源供電LCD顯示信息DS18B20溫度采集圖1.1系統(tǒng)的主要框圖如圖1.1所示,本系統(tǒng)采用單片機(jī)STC89C52為主控芯片,單片機(jī)可以控制使能,可以實(shí)現(xiàn)復(fù)位,條形碼掃描模塊可以實(shí)現(xiàn)商品的掃描,采集商品的單價(jià),產(chǎn)地,條形碼編碼以及數(shù)量等信息;Led燈用來(lái)顯示是否有中斷信號(hào)輸入,以便知道是否掃描到信息或者有按鍵;商品信息的輸入通過(guò)矩陣鍵盤(pán)來(lái)完成;復(fù)位模塊可以復(fù)位系統(tǒng)最初狀態(tài),電源模塊可以給系統(tǒng)供電,有穩(wěn)壓電路,從直流源處得到9伏電壓,經(jīng)過(guò)穩(wěn)壓電路得到5伏直流電;Eeprom模塊用來(lái)擴(kuò)展單片機(jī)模塊的內(nèi)存,可以實(shí)現(xiàn)存儲(chǔ)1000個(gè)商品信息,同時(shí)可以實(shí)現(xiàn)掉電保護(hù);用DS18B20模塊采集環(huán)境溫度,液晶LCD1602則顯示商品信息,進(jìn)行溫度采集時(shí)則切換顯示環(huán)境溫度。方案論證主控芯片選擇方案一:采用32位的ARM2138作為收銀機(jī)的控制核心。ARM2138是一款有著強(qiáng)大的存儲(chǔ)空間的芯片,轉(zhuǎn)換速度快,具有在系統(tǒng)可編程功能,內(nèi)部集成32K靜態(tài)RAM以及512Kflash存儲(chǔ)器,具有較為豐富的引腳資源,多達(dá)47個(gè)可以承受5V電壓的通用I/O口,同時(shí)還有多個(gè)串行接口,2個(gè)高速I(mǎi)2C借口,SPI和具有緩沖作用和數(shù)據(jù)長(zhǎng)度可變功能的SSP,這款芯片較為復(fù)雜,操作起來(lái)較為困難[1]。方案二:采用傳統(tǒng)的8位51系列單片機(jī)作為系統(tǒng)的控制器。STC89C51RC單片機(jī)是一款具有在系統(tǒng)可編程功能的單片機(jī),其內(nèi)部具有4K字節(jié)的Flash程序存儲(chǔ)器,2K字節(jié)的數(shù)據(jù)存儲(chǔ)器,3個(gè)16位定時(shí)/計(jì)數(shù)器,其中定時(shí)器0還可以當(dāng)成兩個(gè)8位定時(shí)器來(lái)使用,用戶(hù)程序不需要專(zhuān)用編程器即可實(shí)現(xiàn)串口直接下載,6個(gè)中斷、1個(gè)全雙工串行口和Eeprom等資源。51系列單片機(jī)的內(nèi)部構(gòu)造簡(jiǎn)單,編程方面相對(duì)方便,容易掌握和使用。但需要更大的flash程序存儲(chǔ)器來(lái)存儲(chǔ)各種數(shù)據(jù)[2]。方案三:STC89C52RC單片機(jī)雖然屬于51系列單片機(jī)的一種,但與STC89C51RC單片機(jī)相比它具有STC89C51RC單片機(jī)的功能外,還具有更大的存儲(chǔ)空間。而且本次設(shè)計(jì)STC89C52RC單片機(jī)能夠達(dá)到要求。STC89C52RC芯片可以滿(mǎn)足設(shè)計(jì)要求,它的內(nèi)部有8K字節(jié)的Flash,256字節(jié)的RAM,以及4組8位的I/O口線,可方便用戶(hù)開(kāi)發(fā)使用。三個(gè)16位定時(shí)器/計(jì)數(shù)器,具有一個(gè)2級(jí)中斷結(jié)構(gòu),全雙工串行口,芯片內(nèi)部具有晶振及時(shí)鐘電路。編程方便簡(jiǎn)單,可以為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、強(qiáng)有效的解決方案[3]。綜上考慮,由于STC89S52單片機(jī)的IO口足夠本次設(shè)計(jì)使用,并且STC89C52成本低、便于操作,也容易編程。因此本次設(shè)計(jì)采用STC89C52單片機(jī),它滿(mǎn)足本次設(shè)計(jì)的基本要求。鍵盤(pán)方案選擇方案一:采用標(biāo)準(zhǔn)鍵盤(pán)PS/2鍵盤(pán),PS/2標(biāo)準(zhǔn)鍵盤(pán)的價(jià)格低,而且它具有豐富的鍵盤(pán)資源,這款鍵盤(pán)可以實(shí)現(xiàn)中英文輸入、數(shù)字輸入,而考慮到PS/2鍵盤(pán)編碼困難,程序編寫(xiě)有一定的難度,所以設(shè)計(jì)中不予采用。方案二:采用4*5矩陣鍵盤(pán),矩陣鍵盤(pán)電路比較簡(jiǎn)單,單片機(jī)通過(guò)一組IO口即可實(shí)現(xiàn)矩陣鍵盤(pán)的控制,判斷按鍵是否按下以及按下那個(gè)鍵,然后返回那個(gè)鍵的ASCII碼,從而達(dá)到輸入數(shù)字和英文字母的功能,因?yàn)楸鞠到y(tǒng)只需實(shí)現(xiàn)商品的存儲(chǔ)和銷(xiāo)售,因而采用矩陣鍵盤(pán)可以滿(mǎn)足要求。綜合以上兩種方案,聯(lián)系實(shí)際情況,考慮困難程度,本次設(shè)計(jì)采用矩陣鍵盤(pán)實(shí)現(xiàn)商品條形碼信息的輸入。液晶模塊選擇方案一:采用LCD1602顯示LCD1602是一種工業(yè)字符型液晶,可以同時(shí)顯示32個(gè)字符,即2行16列字符。它可以用來(lái)顯示字母、數(shù)字、符號(hào)。LCD1602能夠同時(shí)顯示多個(gè)數(shù)據(jù),并且有8個(gè)數(shù)據(jù)引腳和3個(gè)控制引腳,占用的I/O口的資源較多[4]。方案二:采用OCM4X8C作為液晶顯示。OCM4X8C液晶顯示器是128×64點(diǎn)陣的漢字圖形型液晶顯示模塊,可以顯示數(shù)字、漢字及英文字母,提供兩種界面來(lái)連接微處理器,可以和CPU直接連接,有兩種連接方式,可以8位并行或者串行。而且具有多種功能:畫(huà)面移位、光標(biāo)顯示、睡眠模式等。但在本次設(shè)計(jì)中不需要很高的配置,因此不給予采用[5]。方案三:采用七段共陰數(shù)碼管來(lái)顯示,七段共陰數(shù)碼管是顯示數(shù)字的一類(lèi)顯示屏,對(duì)其管腳輸入不同電平可控制每段的亮滅。它可以顯示0-F的數(shù)字信息,價(jià)格便宜,使用簡(jiǎn)單,但是占用I/O的資源也相對(duì)較多[6]。此次設(shè)計(jì)需要顯示商品的數(shù)字或英文字母信息,包括字符串及數(shù)字信息,如果只是采用數(shù)碼管進(jìn)行顯示的話(huà)則無(wú)法顯示字符串,而且需要占用非常多的I/O口,如果采用LCD1602來(lái)顯示字符串及數(shù)據(jù),相對(duì)于數(shù)碼管,LCD1602使用起來(lái)非常方便,因此本次設(shè)計(jì)液晶顯示模塊選擇LCD1602。存儲(chǔ)模塊選擇方案一:采用SD卡擴(kuò)展單片機(jī)內(nèi)存,SD卡數(shù)據(jù)傳輸率較快,其中SD卡的SPI總線配置較復(fù)雜,不過(guò)具有較高的記憶容量,移動(dòng)靈活性較高并且安全性很高,SD卡讀寫(xiě)時(shí)編程上的頭文件非常復(fù)雜,而且SD卡很容易造成接觸不良。對(duì)于本次設(shè)計(jì)用不上。方案二:采用Eeprom擴(kuò)展單片機(jī)的內(nèi)存,Eeprom可以實(shí)現(xiàn)掉電保護(hù),利用它還能很方便的對(duì)單片機(jī)的內(nèi)存進(jìn)行擴(kuò)展,而且編程也簡(jiǎn)單。符合本次的設(shè)計(jì)要求??紤]到編程的難易程度,方案二更容易實(shí)現(xiàn)編程,所以選擇方案二作為本次的存儲(chǔ)模塊。溫度采集模塊方案一:采用PT100作為測(cè)溫電路的溫度傳感器,PT100傳感器還具有準(zhǔn)確度高,抗振動(dòng),穩(wěn)定性好,耐高壓等優(yōu)點(diǎn),PT100傳感器測(cè)溫的工作原理是鉑電阻的阻值隨溫度變化而變化,并且呈現(xiàn)一定函數(shù)關(guān)系。而PT100傳感器使用起來(lái)比較復(fù)雜,而且不常用PT100傳感器來(lái)實(shí)現(xiàn)溫度測(cè)量。因而本次設(shè)計(jì)中不予采用。方案二:采用DS18B20作為測(cè)溫電路的溫度傳感器。DS18B20的數(shù)字溫度輸出通過(guò)單總線;不同于其他的溫度傳感器的是,DS18B20使用起來(lái)比較方便,它使用單線接口方式,而且不需要其他外圍電路,測(cè)量結(jié)果是以串行方式傳送的9位數(shù)字量,與微處理器的雙向通信只需要一根接口線就可以實(shí)現(xiàn),還支持多個(gè)傳感器同時(shí)測(cè)量,當(dāng)多個(gè)DS18B20連接時(shí)可用一根總線與微機(jī)進(jìn)行通信,從而實(shí)現(xiàn)多點(diǎn)測(cè)溫功能。DS18B20測(cè)量溫度范圍為-55~+125oC,固有測(cè)溫分辨率為0.5oC[7]。通過(guò)比較發(fā)現(xiàn),DS18B20的測(cè)量方法比較簡(jiǎn)單,直接輸出數(shù)字的溫度值,不需要校正,所以采用方案二。綜上所述,本次設(shè)計(jì)采用以STC89C52作為本次設(shè)計(jì)的核心控制器,擴(kuò)展矩陣鍵盤(pán)實(shí)現(xiàn)數(shù)字和英文字母輸入,通過(guò)擴(kuò)展EEPROM來(lái)擴(kuò)展單片機(jī)的存儲(chǔ)內(nèi)存,用LCD1602液晶來(lái)顯示商品的詳細(xì)信息,擴(kuò)展串口實(shí)現(xiàn)掃描槍掃描條碼輸入,以及串口通信。詳細(xì)硬件電路設(shè)計(jì)主控芯片STC89C52資料介紹STC89C52單片機(jī)芯片如圖3.1所示。圖3.1單片機(jī)的模塊圖如圖3.1所示為STC89C52RC單片機(jī),這款單片機(jī)是增強(qiáng)型的8051單片機(jī),可以任意選擇6時(shí)鐘/機(jī)器周期和12時(shí)鐘/機(jī)器周期,它的指令代碼完全兼容傳統(tǒng)8051。其工作電壓:5.5V~3.3V(5V單片機(jī))/3.8V~2.0V(3V單片機(jī))

,工作頻率范圍:0~40MHz,用戶(hù)應(yīng)用程序空間為8K字節(jié)

,片上集成512字節(jié)RAM,其通用I/O口有32個(gè),復(fù)位后的情況是:4組IO口為準(zhǔn)雙向口,P1口是一個(gè)內(nèi)部直接帶有上拉電阻的8位雙向I/O口。對(duì)P1口寫(xiě)1時(shí),通過(guò)內(nèi)部的上拉電阻把端口拉到高電平,這樣則可以作為輸入口使用。P1口作輸入口使用時(shí),因?yàn)橛袃?nèi)部上拉電阻,那些被外部拉低的引腳會(huì)輸出一個(gè)電流。P0口的輸出是漏極開(kāi)路,當(dāng)P0口作為總線擴(kuò)展用時(shí),不需要接上拉電阻,當(dāng)P0口作為普通I/O口使用時(shí),需要接上拉電阻。P1口的輸出緩沖器可驅(qū)動(dòng)4個(gè)TTL電平的輸入[3]。液晶顯示模塊設(shè)計(jì)采用LCD1602英文點(diǎn)陣液晶顯示收銀機(jī)的工作情況,在商品存儲(chǔ)時(shí),可以顯示需要存儲(chǔ)的商品信息,例如名字、單價(jià)、產(chǎn)地等;在商品銷(xiāo)售時(shí)也可以顯示相關(guān)信息,LCD1602是一種專(zhuān)門(mén)用來(lái)顯示數(shù)字、英文字符的液晶模塊,它由32個(gè)5*8點(diǎn)陣字符為位組成,每一個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。LCD1602的顯示器的特點(diǎn)是它是很薄的顯示器件,而且驅(qū)動(dòng)電壓較低,工作電流極小,可以和場(chǎng)效應(yīng)管電路結(jié)合起來(lái)組成低功耗的系統(tǒng),其模塊內(nèi)部自帶有160個(gè)5*8的點(diǎn)陣字符型發(fā)生器。圖3.2LCD的電路連接圖如圖3.2是LCD1602與單片機(jī)的連接圖,液晶的3腳接精密電位器,接入電位器進(jìn)行調(diào)節(jié)液晶顯示器的偏壓,這樣可以調(diào)整液晶的顯示對(duì)比度,此引腳電壓為零時(shí)得到最強(qiáng)的對(duì)比度。4腳為RS數(shù)據(jù)命令選擇端,當(dāng)4腳為高電平時(shí),可以對(duì)液晶進(jìn)行數(shù)據(jù)字節(jié)的傳輸操作,當(dāng)為低電平時(shí),則是進(jìn)行命令字節(jié)的傳輸操作。命令字節(jié)則是對(duì)液晶LCD1602的工作方式作設(shè)置的字節(jié);數(shù)據(jù)字節(jié),是用來(lái)在LCD1602上顯示的字節(jié)。5腳R/W,讀寫(xiě)選擇端。當(dāng)這個(gè)腳為高電平時(shí),可以對(duì)LCD1602進(jìn)行讀數(shù)據(jù)操作,當(dāng)為低電平時(shí),可以對(duì)數(shù)據(jù)寫(xiě)操作。6腳E:使能信號(hào),是對(duì)LCD1602的數(shù)據(jù)控制時(shí)鐘信號(hào),利用該信號(hào)的上升沿實(shí)現(xiàn)對(duì)LCD1602的數(shù)據(jù)傳輸。7到14腳是8為并行口,是LCD1602進(jìn)行數(shù)據(jù)讀寫(xiě)的數(shù)據(jù)口[4]。LCD1602引腳連接如表3.1所示:表3.1LCD1602與單片機(jī)的連接引腳連接說(shuō)明引腳連接說(shuō)明1電源地9P2.2接(STC89C52)23腳2+5V10P2.3接(STC89C52)24腳310K電阻2腳(10K電位器的中間抽頭,1腳接+5V,3腳接地)11P2.4接(STC89C52)25腳4P1.7接(STC89C52)8腳12P2.5接(STC89C52)26腳5P1.6接(STC89C52)7腳13P2.6接(STC89C52)27腳6P1.5接(STC89C52)6腳14P2.7接(STC89C52)28腳7P2.0接(STC89C52)21腳1510歐姆電阻的1端,10歐姆電阻的另一端接+5V8P2.1接(STC89C52)22腳16接地如表3.1所示:1腳為VSS為電源地;2腳為VCC接5V電源正極;3腳為V0為液晶顯示器對(duì)比度調(diào)整端,接正電源時(shí)對(duì)比度最弱,接地電源時(shí)對(duì)比度最高(對(duì)比度過(guò)高時(shí)會(huì)產(chǎn)生“鬼影”,使用時(shí)可以通過(guò)一個(gè)10K的電位器調(diào)整對(duì)比度。4腳為RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器;5腳為RW為讀寫(xiě)信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫(xiě)操作;6腳為E端為使能端,高電平時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令;7~14腳為D0~D7為8位雙向數(shù)據(jù)端;15~16腳為空腳或背燈電源。15腳背光正極,16腳背光負(fù)極[4]。1602的讀寫(xiě)時(shí)序圖如下:圖3.3LCD1602的時(shí)序圖如圖3.3為L(zhǎng)CD1602的讀寫(xiě)時(shí)序圖,R/W為讀寫(xiě)信號(hào)線,高電平時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫(xiě)操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫(xiě)入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時(shí)可以讀忙信號(hào),當(dāng)RS為高電平R/W為低電平時(shí)可以寫(xiě)入數(shù)據(jù)[8]。存儲(chǔ)模塊電路設(shè)計(jì)本次采用EEPROM進(jìn)行對(duì)系統(tǒng)擴(kuò)展內(nèi)存,采用EEPROM24C02進(jìn)行對(duì)單片機(jī)進(jìn)行存儲(chǔ)空間進(jìn)行擴(kuò)展,因?yàn)榇鎯?chǔ)的商品只是存儲(chǔ)他的單價(jià),產(chǎn)地和條碼,所以存儲(chǔ)一個(gè)商品用不了多少空間,因此采用存儲(chǔ)器24C02可以擴(kuò)展512字節(jié)的數(shù)據(jù)存儲(chǔ)空間。圖3.4Eeprom電路連接圖如圖3.2是EEPROM的電路連接圖,AT24C02的內(nèi)部分成32頁(yè),存儲(chǔ)容量為2KB,每頁(yè)有8B,共有256頁(yè),操作時(shí)有兩種尋址方法,分別是芯片尋址和片內(nèi)地址尋址。其SDA引腳通常被外圍器件拉高,SDA引腳的數(shù)據(jù)應(yīng)在SCL為低時(shí)變化;當(dāng)數(shù)據(jù)在SCL為高時(shí)變化,將視為下文所述的一個(gè)起始或停止命令;當(dāng)SCL為高,SDA由高到低的變化被視為起始命令,必須以起始命令作為任何一次讀/寫(xiě)操作命令的開(kāi)始,當(dāng)SCL為高,SDA由低到高的變化被視為停止命令,在一個(gè)讀操作后,停止命令會(huì)使EEPROM進(jìn)入等待態(tài)低功耗模式[9]。EEPROM的時(shí)序圖如下所示:圖3.5EEPROM的時(shí)序圖如圖3.5為EEPROM的時(shí)序圖,從中可以看出有時(shí)鐘和數(shù)據(jù)傳輸?shù)姆绞剑瑫r(shí)鐘和數(shù)據(jù)傳輸:SDA引腳正常狀態(tài)下由外部器件拉高。SDA上的數(shù)據(jù)只有在SCL時(shí)鐘信號(hào)為低的時(shí)候才能進(jìn)行改變,在SCL為高時(shí)SDA上的數(shù)據(jù)表現(xiàn)為如下方式。開(kāi)始條件:SCL為高,SDA由高變?yōu)榈褪且粋€(gè)開(kāi)始條件,開(kāi)始命令優(yōu)先于所有的其他命令。結(jié)束條件:SCL為高,SDA由低變?yōu)楦呤且粋€(gè)結(jié)束條件,在一個(gè)讀序列之后結(jié)束命令,會(huì)將EEPROM置于一個(gè)待機(jī)電源模式,響應(yīng):所有的地址和數(shù)據(jù)都是以8比bit的的形式進(jìn)行存儲(chǔ)和讀取,也就是串行的傳入或者傳出EEPROM,在第九個(gè)時(shí)鐘周期,EEPROM發(fā)出一個(gè)0作為收到一個(gè)字的響應(yīng)信號(hào)[9]。串口通訊模塊設(shè)計(jì)圖3.6串口的電路連接圖如圖3.6是串口的設(shè)計(jì),此設(shè)計(jì)可以用條碼掃描器來(lái)掃描條碼進(jìn)行商品的存儲(chǔ)和銷(xiāo)售,掃描槍在對(duì)商品的標(biāo)簽上的條形碼進(jìn)行掃描時(shí),通過(guò)串口通信傳送到MCU的數(shù)值應(yīng)該是一串13位的長(zhǎng)度的數(shù)字串。MCU通過(guò)串口接收到掃描槍送出的數(shù)字串,然后對(duì)數(shù)字串進(jìn)行判斷,符合要求的進(jìn)行商品的存儲(chǔ)或者商品的銷(xiāo)售。此外這個(gè)串口可以用來(lái)單片機(jī)系統(tǒng)與計(jì)算機(jī)之間的串行通信,可以通過(guò)串口給計(jì)算機(jī)發(fā)送數(shù)據(jù),計(jì)算機(jī)在接收到數(shù)據(jù)后進(jìn)行處理,將處理的結(jié)果通過(guò)界面顯示在計(jì)算機(jī)屏幕上。此外圖中的MAX232串口芯片可以轉(zhuǎn)換電平,因?yàn)槿绻c計(jì)算機(jī)進(jìn)行通訊的話(huà),計(jì)算機(jī)和單片機(jī)之間的電平是不一致的,所以要加串口轉(zhuǎn)換芯片。單片機(jī)輸出的是TTL電平,+5V表示高電平,0V表示低電平;而計(jì)算機(jī)的串口+12V表示高電平,-12V表示低電平,采用MAX232芯片可以將計(jì)算機(jī)的串口電平轉(zhuǎn)換成合適單片機(jī)的電平[10]。鍵盤(pán)電路設(shè)計(jì)本次設(shè)計(jì)的鍵盤(pán)主是要實(shí)現(xiàn)從鍵盤(pán)能輸入數(shù)字和英文字母,這樣才能輸入商品信息的條形碼和英文名字以及單價(jià)。本次設(shè)計(jì)的鍵盤(pán)因?yàn)榘?6個(gè)字母和十個(gè)數(shù)字,所以對(duì)16個(gè)鍵盤(pán)有特殊的要求,一個(gè)按鍵控制4個(gè)字母,一個(gè)按鍵控制左移,一個(gè)按鍵控制右移,一個(gè)按鍵控制確定。當(dāng)在一個(gè)按鍵中需要選擇4個(gè)字母中的一個(gè)時(shí),通過(guò)左移右移鍵來(lái)確定位置,然后按下確認(rèn)鍵就可以確定需要的字母。當(dāng)然,也需要一個(gè)鍵來(lái)控制當(dāng)前是數(shù)字輸入狀態(tài),還是字母輸入狀態(tài),這樣就可以實(shí)現(xiàn)16個(gè)鍵來(lái)實(shí)現(xiàn)26個(gè)字母和10個(gè)數(shù)字輸入。圖3.7矩陣鍵盤(pán)如圖3.7矩陣鍵盤(pán)的編碼規(guī)則為:先讀取鍵盤(pán)的狀態(tài),從而得到按鍵的特征編碼。先從P1口的高四位輸出低電平,低四位輸出高電平,從P1口的低四位讀取鍵盤(pán)的狀態(tài)。再?gòu)腜1口低四位輸出低電平,再?gòu)腜1口的高四位輸出高電平,從P1口高四位讀取鍵盤(pán)狀態(tài),將兩次讀取結(jié)果組合起來(lái)就可以得到當(dāng)前按鍵的特征編碼。本次設(shè)計(jì)的超市收銀機(jī)中,只要對(duì)商品進(jìn)行存儲(chǔ)和銷(xiāo)售,可以采用獨(dú)立鍵盤(pán)的形式進(jìn)行設(shè)計(jì)。這樣的非編碼鍵盤(pán)的按鍵排列成行、列。按鍵的作用只是簡(jiǎn)單地接通或者斷開(kāi),不需要附加什么硬件電路,因此需要使用者進(jìn)行軟件編程,才能產(chǎn)生相應(yīng)的鍵碼。按鍵識(shí)別、防抖動(dòng)和產(chǎn)生鍵碼要通過(guò)軟件進(jìn)行處理。4×4的簡(jiǎn)易鍵盤(pán),可以通過(guò)行掃描來(lái)確定是否有按鍵按下,確定已按鍵的行列位置。行掃描,就是按一定的順序給每條行線置低電平,而其余各行線置高電平,并檢測(cè)掃描每行時(shí)是否產(chǎn)生了列信號(hào),此外,在此次設(shè)計(jì)中還多用兩個(gè)設(shè)計(jì)鍵來(lái)控制商品的存儲(chǔ)和銷(xiāo)售,當(dāng)按下S2鍵是對(duì)商品進(jìn)行存儲(chǔ),當(dāng)按下S3鍵時(shí),是對(duì)商品進(jìn)行銷(xiāo)售[11]。復(fù)位和晶振電路設(shè)計(jì)單片機(jī)最小系統(tǒng)工作時(shí),起振器起到關(guān)鍵的作用,若振蕩器不規(guī)律地運(yùn)行,那么得到的結(jié)果可能不是很正確。一般的晶振電路都是由一個(gè)晶振和兩個(gè)瓷片電容組成的,而且兩個(gè)瓷片電容的相連端要接地。晶振一般選11.0592M,這個(gè)頻率是1.8432M的20倍。圖3.8晶振電路連接如圖3.8是晶振電路和復(fù)位電路的設(shè)計(jì),復(fù)位電路是單片機(jī)最小系統(tǒng)不可缺少的一部分,當(dāng)給單片機(jī)一個(gè)復(fù)位信號(hào)時(shí),單片機(jī)會(huì)使程序從頭開(kāi)始執(zhí)行;單片機(jī)中一般有兩種復(fù)位方式:上電復(fù)位,在系統(tǒng)一上電時(shí)利用電容兩端的電壓不能突變的原理給系統(tǒng)一個(gè)短暫的低電平信號(hào);手動(dòng)復(fù)位,通過(guò)手動(dòng)按鈕給系統(tǒng)低電平,從而達(dá)到復(fù)位的效果,如果手一直按著復(fù)位鍵不放,系統(tǒng)將一直復(fù)位。溫度測(cè)量電路設(shè)計(jì)本次采用DS180B20溫度傳感器作為溫度測(cè)量的核心模塊,其引腳排列和模塊芯片圖如圖3.9所示:圖3.9DS18B20模塊圖如圖3.9引腳說(shuō)明:GND(接地),DQ(數(shù)據(jù)I/O),VDD(可選電源電壓),NC(無(wú)連接)。本次設(shè)計(jì)采用三極管型封裝的DS18B20,其原理圖連接如圖3.10所示:圖3.10DS18B20的連接圖如圖3.10采用DS18B20作為測(cè)溫電路的連接圖,DS18B20可達(dá)12位的數(shù)字值,分辨率為0.0625℃。DS18B20具有如下特點(diǎn):可以設(shè)置為兩種供電模式,即數(shù)據(jù)總線供電方式和外部供電方式。采用數(shù)據(jù)總線供電方式可以節(jié)省一根導(dǎo)線,但可能會(huì)導(dǎo)致測(cè)量溫度的時(shí)間會(huì)久一點(diǎn);而采取外部供電方式則多一根導(dǎo)線,但是測(cè)量速度會(huì)大大加快,所以采用一總線2路溫度測(cè)量使用外部供電的方式進(jìn)行測(cè)量。如下圖3.11所示為DS18B20的時(shí)序圖:DS18B20需要嚴(yán)格的單總線協(xié)議以確保數(shù)據(jù)的完整性。協(xié)議包括集中單總線信號(hào)類(lèi)型:復(fù)位脈沖、存在脈沖、寫(xiě)0、寫(xiě)1、讀0和讀1。所有這些信號(hào),除存在脈沖外,都是由總線控制器發(fā)出的。復(fù)位序列:復(fù)位和存在脈沖和DS18B20間的任何通訊都需要以初始化序列開(kāi)始,初始化序列如下圖所示。一個(gè)復(fù)位脈沖跟著一個(gè)存在脈沖表明DS18B20已經(jīng)準(zhǔn)備好發(fā)送和接收數(shù)據(jù)。在初始化序列期間,總線控制器拉低總線并保持480us以發(fā)出(TX)一個(gè)復(fù)位脈沖,然后釋放總線,進(jìn)入接收狀態(tài)(RX)。單總線由5K上拉電阻拉到高電平。當(dāng)DS18B20探測(cè)到I/O引腳上的上升沿后,在等待15-60us,然后發(fā)出一個(gè)由60-240us低電平信號(hào)構(gòu)成的存在脈沖[5]。圖3.11DS18B20的控制時(shí)序圖掃描器原理本次設(shè)計(jì)采用的是AS-8110條碼閱讀器,器件圖如圖3.8所示,AS-8110條碼閱讀器具有以下功能:內(nèi)部具有解碼器,手持近距虹光條碼閱讀器,各種一維條碼能被精確讀??;具有7種提示音和音量可調(diào)的蜂鳴器,可根據(jù)使用環(huán)境的調(diào)節(jié)蜂鳴器的音量;多個(gè)內(nèi)置接口,分別有RS-232、鍵盤(pán)接口、光筆及先進(jìn)的USB接口。圖3.8條碼掃描器圖3.8是AS-8110條形碼閱讀器,其有多種功能,有蜂鳴器提示采集到條碼信息,外形美觀,手握舒適,而已采用其作為掃描模塊。當(dāng)掃描器接觸到到條形碼后,能識(shí)別采集的話(huà),蜂鳴器會(huì)響一聲作為提示音,說(shuō)明掃到了條形碼。掃描器采用5伏供電,接到電路板上即可給掃描器供電。系統(tǒng)軟件設(shè)計(jì)系統(tǒng)主程序設(shè)計(jì)流程圖:開(kāi)始初始化開(kāi)始初始化打開(kāi)串口中斷調(diào)用商品存儲(chǔ)程序存儲(chǔ)完成跳出循環(huán)顯示DS18B20測(cè)量的環(huán)境溫度調(diào)用商品銷(xiāo)售程序顯示商品信息復(fù)位鍵復(fù)位是是是按key2?按key3?按key4?否否否圖4.1主程序流程圖圖4.1為商品存儲(chǔ)和銷(xiāo)售系統(tǒng)的整體流程,當(dāng)按下Key2鍵時(shí),則調(diào)用商品存儲(chǔ)程序,對(duì)商品的單價(jià)、編號(hào)、條碼、產(chǎn)地存儲(chǔ)好,再按下一次Key2鍵確認(rèn)存儲(chǔ)完成;當(dāng)按下Key4鍵時(shí),則調(diào)用商品銷(xiāo)售函數(shù),然后在LCD1602上顯示出商品的相關(guān)信息;按下Key3鍵則是對(duì)DS18B20測(cè)量周?chē)h(huán)境操作,按下復(fù)位鍵則是對(duì)單片機(jī)進(jìn)行復(fù)位。對(duì)于串口中斷程序,當(dāng)掃描器掃描到條碼時(shí),程序會(huì)跳到串口中斷函數(shù)那里,接下來(lái)就是判斷是否有按鍵,當(dāng)檢測(cè)到有按鍵時(shí),在判斷是哪個(gè)按鍵,從而進(jìn)行存儲(chǔ)還是銷(xiāo)售;當(dāng)然也可以通過(guò)獨(dú)立按鍵鍵盤(pán)來(lái)進(jìn)行商品的存儲(chǔ)和銷(xiāo)售,獨(dú)立鍵盤(pán)可以實(shí)現(xiàn)英文和數(shù)字輸入。溫度采集軟件設(shè)計(jì):DS18B20溫度傳感器內(nèi)部有一個(gè)高速暫存的RAM和一個(gè)非易失的可電擦除的EEPRAM,而這個(gè)EEPRAM可以存放高溫度和低溫度觸發(fā)器TH、T和結(jié)構(gòu)寄存器。而這個(gè)暫存存儲(chǔ)器包含了8個(gè)連續(xù)字節(jié),前兩個(gè)字節(jié)是測(cè)得的溫度信息,第一個(gè)字節(jié)的內(nèi)容是溫度的低八位,第二個(gè)字節(jié)是溫度的高八位。主要流程圖如圖4.2所示:開(kāi)始開(kāi)始定時(shí)器初始化和初始化DS18B20讀取實(shí)時(shí)溫度設(shè)定溫度范圍讀存儲(chǔ)器溫度值,將溫度存入緩沖區(qū)報(bào)警是否顯示溫度值溫度超限?圖4.2溫度測(cè)量的流程圖如圖4.2系統(tǒng)上電后,首先加載EEPROM的上下限的溫度值,顯示實(shí)時(shí)溫度值,然后根據(jù)設(shè)計(jì)需要的溫度進(jìn)行設(shè)定溫度范圍,然后判定環(huán)境溫度是否超過(guò)設(shè)定的溫度范圍,當(dāng)超過(guò)設(shè)定的溫度范圍時(shí)會(huì)啟動(dòng)報(bào)警,然后在次跳回到設(shè)定溫度范圍。只有當(dāng)環(huán)境溫度在設(shè)定的溫度范圍內(nèi),才不會(huì)啟動(dòng)報(bào)警。DS18B20的理論分析:溫度傳感器采集到的數(shù)據(jù)是以補(bǔ)碼的形式存到暫存器RAM的第0、1兩個(gè)字節(jié)中,單片機(jī)可以通過(guò)單線接口讀到數(shù)據(jù),讀取時(shí),一般都是低位在前,高位在后。而二進(jìn)制中的前面5位是符號(hào)位,當(dāng)測(cè)得的數(shù)據(jù)大于0,這5為數(shù)據(jù)為0,然后將測(cè)得數(shù)據(jù)乘以0.0625就可以得到實(shí)際的溫度值,當(dāng)測(cè)得溫度小于0,則這5位為1,測(cè)得的溫度取反后在加1然后乘以0.0625才可以得到實(shí)際的溫度值。在DS18B20中,溫度都是以1/2LSB(最低位是有效位)的形式(TEMP_READ),然后再?gòu)淖x計(jì)數(shù)器里面的值(COUNT_REMAIN),只需知道該溫度處每一個(gè)攝氏度的計(jì)數(shù)個(gè)數(shù)(COUNTER_PER_C),就可以用下列公式計(jì)算出實(shí)際的溫度值。TEMPRATURE(溫度)=TEMP-0.25+DS18B20測(cè)量溫度時(shí)采用特有的溫度測(cè)量技術(shù),將采集到的溫度值轉(zhuǎn)換成數(shù)值信號(hào),測(cè)量得到的結(jié)果存到溫度寄存器中,溫度值和數(shù)值關(guān)系如下表所示:表一:溫度值和數(shù)字量的關(guān)系溫度數(shù)字值輸出(2進(jìn)制)數(shù)字值輸出(16進(jìn)制)+0.5℃00000000000010000008h+10.125℃000000001010001000A2h+25.0625℃00000001100100010191h+85℃00000101010100000550h+125℃000001111101000007D0h+0℃00000000000000000000h-0.5℃1111111111111111FFFFh-25℃1111111111001110FFCEh-55℃1111111110010010FF92h-25.0625℃1111111001101111FE6Eh-10.125℃1111111101011110FF5Eh鍵盤(pán)軟件流程設(shè)計(jì):4*4矩陣鍵盤(pán)的設(shè)計(jì)步驟:開(kāi)始對(duì)第一列進(jìn)行掃描,判斷有無(wú)按鍵,如果沒(méi)有按鍵,在依次對(duì)第二列、第三列、第四列進(jìn)行掃描,如果掃描后沒(méi)有返回到開(kāi)始的狀態(tài),當(dāng)一列有按鍵,那么接下來(lái)對(duì)第一行、第二行、第三行、第四行分別掃描,如果有按鍵按下就分別顯示0、1、2、3;第二列、第三列、第四列依次這樣類(lèi)似的掃描得到相應(yīng)數(shù)值,數(shù)值應(yīng)該是0到9,字母是a到z共26個(gè)值。判斷有無(wú)按鍵按下的方法是:首先是讓置列線P1.4到P1.7為輸入狀態(tài),然后從行線P1.0到P1.3輸出低電平,接著讀入列線數(shù)據(jù),如果某一列線為低電平的話(huà),則該列線有鍵閉合。第二步,行線依次輪流輸出低電平,然后從列線P1.4到P1.7讀入數(shù)據(jù),如果有某一列是低電平,則對(duì)應(yīng)行線上有按鍵按下。結(jié)合以上兩步就可以確定按鍵的編號(hào),但是按鍵閉合一次只能進(jìn)行鍵功能操作,所以必須等到按鍵釋放后,在進(jìn)行鍵功能操作,否則按鍵一次,可能會(huì)進(jìn)行同樣操作多次。0XF0讀端口0XF0讀端口是否0XF0是否延時(shí)消抖是否0XF0是否寄存當(dāng)前值X10X0F讀端口寄存當(dāng)前值X2X1位或X2得到按鍵值圖4.3獨(dú)立按鍵流圖如圖4.3為獨(dú)立鍵盤(pán)的按鍵掃描流程圖,根據(jù)有無(wú)按鍵按下來(lái)卻定對(duì)應(yīng)鍵的鍵值。如上程序是判斷有無(wú)按鍵按下的部分程序,當(dāng)PKey為真時(shí)表示有按鍵按下,為假時(shí)表示無(wú)按鍵按下。當(dāng)有按鍵按下時(shí),如果是行線就去對(duì)應(yīng)行值,如果是列線,就取對(duì)應(yīng)列值,然后返回按鍵的碼值,接著等待按鍵釋放。Eeprom通信流程設(shè)計(jì)應(yīng)應(yīng)答開(kāi)始初始化總線起始信號(hào)否是發(fā)送數(shù)據(jù)發(fā)送數(shù)據(jù)應(yīng)答是發(fā)送數(shù)據(jù)讀數(shù)據(jù)否應(yīng)答是發(fā)送數(shù)據(jù)結(jié)束是否否否否否否圖4.4Eeprom讀寫(xiě)流程圖如圖4.4所示EEPROM的讀取開(kāi)始為順序讀取,順序讀取由立即地址或者隨機(jī)地址讀取,在讀數(shù)據(jù)器件收到一數(shù)據(jù)之后,通過(guò)確認(rèn)應(yīng)答來(lái)判斷接下來(lái)的步驟,只要EEPROM在收到之后,便會(huì)繼續(xù)增加數(shù)據(jù)碼地址和串行輸出數(shù)據(jù)碼。如果達(dá)到存儲(chǔ)器的極限時(shí),數(shù)據(jù)碼地址將會(huì)重復(fù)滾動(dòng),順序讀取也將繼續(xù)下去,當(dāng)讀數(shù)據(jù)的器件不通過(guò)確認(rèn)應(yīng)答時(shí),而通過(guò)產(chǎn)生一個(gè)停止應(yīng)答時(shí),順序讀取操作將會(huì)被終止。上位機(jī)顯示設(shè)計(jì)圖4.5上位機(jī)程序框圖如圖4.5所示,這是通過(guò)LABVIEW來(lái)設(shè)計(jì)商品在電腦上顯示商品的各種信息,比如商品的單價(jià),商品的編號(hào),商品的產(chǎn)地,及生產(chǎn)日期。首先現(xiàn)在LABVIEW中存好商品的相關(guān)信息,當(dāng)掃描槍掃描到條碼時(shí),通過(guò)串口傳來(lái)13位數(shù)據(jù),通過(guò)比較是否與存好的商品的條碼一致,一致的話(huà)就顯示商品的相關(guān)信息在顯示界面上,不一致的話(huà)就顯示商品不存在。圖中包括有選擇是進(jìn)行存儲(chǔ)還是銷(xiāo)售的按鈕,進(jìn)行相關(guān)按鈕就可以進(jìn)行商品的存儲(chǔ)和銷(xiāo)售。圖4.6顯示商品信息界面如圖4.6所示,這是在LABVIEW上顯示銷(xiāo)售時(shí)商品的相關(guān)信息界面,在圖上可以可能到商品的單價(jià),編號(hào),生產(chǎn)日期和產(chǎn)地等信息。系統(tǒng)調(diào)試調(diào)試使用的儀器調(diào)試過(guò)程中,主要使用了下列的儀器:數(shù)字萬(wàn)用板 1臺(tái)計(jì)算機(jī) 1臺(tái)單片機(jī)開(kāi)發(fā)板 1臺(tái)掃描儀 1個(gè)獨(dú)立鍵盤(pán)一個(gè)1個(gè)直流電源1臺(tái)調(diào)試過(guò)程及誤差分析對(duì)于所設(shè)計(jì)的系統(tǒng)的調(diào)試過(guò)程具體如下:首先先對(duì)制作好的硬件進(jìn)行測(cè)試,再確保硬件各部分線路接觸良好之后,在對(duì)系統(tǒng)電路板進(jìn)行簡(jiǎn)單粗略的系統(tǒng)整合調(diào)試,據(jù)此來(lái)判斷硬件與軟件是否可以同步正常工作。在確保正常工作后,轉(zhuǎn)而對(duì)系統(tǒng)軟件進(jìn)行編譯調(diào)試,確認(rèn)程序能實(shí)現(xiàn)軟件要求的功能的前提下,連接硬件進(jìn)行精確調(diào)試,直到完整的實(shí)現(xiàn)題目要求的功能,之后可以進(jìn)一步修改軟件程序,使之具有更完善的功能。硬件調(diào)試這一部分是對(duì)制作好的電路板進(jìn)行詳細(xì)的檢查,包括硬件焊接、裝配,還有對(duì)焊接好的電路板進(jìn)行檢測(cè),測(cè)試電路連接是否良好,導(dǎo)線之間應(yīng)該導(dǎo)通的是否導(dǎo)通。銅線與銅線之間是否存在短路的情況,這是很重要的檢查,也是確保在接上元件后不會(huì)燒壞元件。具體步驟為:首先對(duì)腐蝕好的板子進(jìn)行元件的安裝,安裝有一個(gè)原則,一般都是從矮的開(kāi)始,這樣方便焊;此外一邊焊元件的同時(shí)要用萬(wàn)用表測(cè)試元件是否與原理圖上的值一樣,而且也要用萬(wàn)用表測(cè)試線路通不通,如果線路不通,對(duì)照著PCB板進(jìn)行更改,直到正確為止。當(dāng)焊好板子后,不要急于給系統(tǒng)板子上電,先對(duì)整個(gè)主控板進(jìn)行上電,依照各芯片引腳資料,先對(duì)各個(gè)芯片的引腳電壓進(jìn)行測(cè)量,當(dāng)發(fā)現(xiàn)測(cè)試結(jié)果與芯片資料的輸出電壓不同時(shí),檢查芯片是否接穩(wěn),從而進(jìn)行加固焊接,在重復(fù)此步驟,倘若芯片電壓依舊不正確,就要查閱相關(guān)芯片相關(guān)資料,或者檢查原理圖,或者更換芯片,直到芯片工作正常才可以進(jìn)行軟件硬件結(jié)合調(diào)試。測(cè)試過(guò)程中遇到的困難具體調(diào)試模塊主要分為以下幾個(gè)模塊:LCD1602顯示模塊、主控模塊、獨(dú)立鍵盤(pán)模塊、測(cè)溫模塊、掃描器模塊。各模塊開(kāi)始測(cè)試時(shí)存在以下問(wèn)題。主控芯片模塊,剛開(kāi)始給板子上電是,給系統(tǒng)供電的指示電源燈不亮,經(jīng)過(guò)仔細(xì)檢查發(fā)現(xiàn)焊接芯片底座有松動(dòng)的現(xiàn)象,經(jīng)過(guò)對(duì)芯片底座進(jìn)行重新加固焊接后,上電后指示燈正常亮,至此,主控芯片電源供電正常。LCD1602顯示模塊:在下載液晶測(cè)試程序后,液晶無(wú)顯示,轉(zhuǎn)而進(jìn)行電路連接是否正確進(jìn)行檢查。經(jīng)過(guò)查閱資料資料后發(fā)現(xiàn)電路連接正常,就是沒(méi)有顯示,接著在軟件中對(duì)所有單片機(jī)的I/O口置0,結(jié)果測(cè)試單片機(jī)的I/O輸出電壓是高電平,就像加了非門(mén)一樣,經(jīng)仔細(xì)檢查也沒(méi)發(fā)現(xiàn)那哪里出現(xiàn)問(wèn)題,接著進(jìn)行整個(gè)電路板的電路檢查,結(jié)果依然沒(méi)有發(fā)現(xiàn)那里有問(wèn)題,就是線路太密,布局太緊,在考慮是不是導(dǎo)線之間的影響,結(jié)果在重做這個(gè)模塊后下載程序后可以正確顯示,所以應(yīng)該是硬件電路存在一些問(wèn)題,但是檢查不出來(lái);不過(guò)最后經(jīng)過(guò)重新硬件的制作后可以正確顯示了。獨(dú)立鍵盤(pán)的檢查:在連接硬件后下載程序,當(dāng)按下按鍵時(shí),液晶無(wú)法顯示按鍵的碼值,進(jìn)而進(jìn)行軟件部分的程序檢查,發(fā)現(xiàn)置的初值不正確,而且不小心把液晶的使能端程序給屏蔽了,經(jīng)過(guò)在三修改程序,最終實(shí)現(xiàn)獨(dú)立鍵盤(pán)輸入英文和數(shù)字。各模塊連接檢查:在連接好各模塊進(jìn)行整個(gè)系統(tǒng)調(diào)試時(shí),發(fā)現(xiàn)不能按照最初理論進(jìn)行功能顯示,首先當(dāng)按鍵時(shí)就不能用條碼掃描器進(jìn)行掃描,而且也不可以進(jìn)行按鍵切換進(jìn)行溫度顯示,可能是程序還不夠完善,正在修改中。(5)剛開(kāi)始往Eeprom寫(xiě)數(shù)據(jù)的時(shí)候,在液晶上沒(méi)有顯示,只是簡(jiǎn)單地往地址里寫(xiě)數(shù)據(jù)都無(wú)法顯示,對(duì)比資料也沒(méi)發(fā)現(xiàn)程序哪里出現(xiàn)錯(cuò)誤,然后就將程序從頭到尾檢查一遍,發(fā)現(xiàn)些如數(shù)據(jù)的地址不對(duì),在更改好地址后,可以將商品信息成功存入Eeprom中。(6)串口設(shè)計(jì)接口剛開(kāi)始連接掃描器時(shí),掃描器無(wú)法掃描到條碼,經(jīng)過(guò)仔細(xì)檢查發(fā)現(xiàn)原來(lái)是串口的2腳跟3腳接反了,經(jīng)過(guò)改正之后,可以實(shí)現(xiàn)通過(guò)掃描器掃描條碼進(jìn)單片機(jī)中。參數(shù)測(cè)試商品的存儲(chǔ)對(duì)商品存儲(chǔ)有兩個(gè)途徑,可以通過(guò)條形碼對(duì)條碼進(jìn)行掃描而后進(jìn)行存儲(chǔ),也可以通過(guò)獨(dú)立鍵盤(pán)對(duì)商品的相關(guān)信息進(jìn)行存儲(chǔ)。由于本次設(shè)計(jì)的鍵盤(pán)是4*4獨(dú)立鍵盤(pán),可以實(shí)現(xiàn)英文字符和數(shù)字輸入,所以商品的相關(guān)信息是以英文或是數(shù)字方式存儲(chǔ),信息如表2表2:商品存儲(chǔ)的相關(guān)信息:商品編號(hào)商品名稱(chēng)商品單價(jià)商品條碼1029Beizi1069316883250431037qianbi269316883250511039gangbi1569316883250531043shiyanzhi369316883250571036bijiben469316883250501027tuoxie869316883250411041xaingpicha169316883250551044lunwenzhi569316883250581049shupian46931688325063如表2所示,商品的信息存儲(chǔ)到Eeprom中,有商品的編號(hào)、商品名稱(chēng)、單價(jià)、還有條碼編號(hào);存儲(chǔ)好之后,當(dāng)需要要銷(xiāo)售時(shí),通過(guò)按鍵中斷進(jìn)行銷(xiāo)售,也可以通過(guò)串口的掃描器來(lái)掃描進(jìn)條碼,當(dāng)掃進(jìn)來(lái)的條與存儲(chǔ)好的條碼一致時(shí),就讓該商品的編號(hào)、名稱(chēng)、單價(jià)、條碼在液晶屏上顯示,實(shí)現(xiàn)銷(xiāo)售操作。溫度測(cè)量如下圖所示,當(dāng)切換按鍵測(cè)量周?chē)h(huán)境溫度時(shí)可以顯示當(dāng)前的環(huán)境溫度。圖5.1溫度顯示如圖5.1所示,當(dāng)要進(jìn)行周?chē)h(huán)境溫度測(cè)試時(shí),通過(guò)按鍵可以進(jìn)入到測(cè)溫程序,通過(guò)溫度傳感器既可以測(cè)出周?chē)臏囟?,溫度以十進(jìn)制的數(shù)字方式顯示在LCD1602上。當(dāng)然,當(dāng)通過(guò)外界條件改變周?chē)沫h(huán)境溫度時(shí),也可以測(cè)出周?chē)沫h(huán)境溫度。按鍵測(cè)試測(cè)試獨(dú)立按鍵能否實(shí)現(xiàn)數(shù)字和英文的輸入,如下圖:圖5.2鍵盤(pán)輸入顯示通過(guò)圖5.2可以看到獨(dú)立按鍵可以輸入數(shù)字和英文字母,證明獨(dú)立鍵盤(pán)可以實(shí)現(xiàn)0到9的數(shù)字輸入,以及26個(gè)字母的輸入。而液晶所顯示的是條碼的13位數(shù)字,也可以說(shuō)明商品的條碼可以存到單片機(jī)的內(nèi)存中。條碼槍測(cè)試商品銷(xiāo)售通過(guò)使用條形碼掃描器掃描條形碼,當(dāng)掃描槍掃到已經(jīng)存過(guò)的商品條碼時(shí),液晶就會(huì)顯示商品的信息,下圖為商品的單價(jià)顯示。圖5.3商品價(jià)格顯示有圖5.3所示,當(dāng)進(jìn)行銷(xiāo)售時(shí),掃描器掃描商品的條碼時(shí),液晶上會(huì)顯示商品的價(jià)格,由于只能顯示兩行,所以商品的名字、產(chǎn)地未在液晶上顯示出來(lái),可以實(shí)現(xiàn)讓對(duì)應(yīng)商品的信息顯示出來(lái),但只能顯示其中一個(gè)。從能實(shí)現(xiàn)在液晶上顯示商品的單價(jià),也可以證明可以實(shí)現(xiàn)在單片機(jī)的內(nèi)存中存儲(chǔ)商品的相關(guān)信息。當(dāng)然,是進(jìn)行商品的存儲(chǔ)時(shí),是通過(guò)獨(dú)立鍵盤(pán)輸入還是通過(guò)掃描器的掃描輸入,下圖為選擇的顯示界面。圖5.4按鍵輸入或掃描輸入如圖5.4所示,當(dāng)進(jìn)行商品的存儲(chǔ)時(shí),可以通過(guò)按鍵進(jìn)行商品信息的輸入,也可以通過(guò)掃描器掃描條形碼進(jìn)行條碼的存儲(chǔ)。LABVIEW上銷(xiāo)售測(cè)試當(dāng)進(jìn)行銷(xiāo)售時(shí),先在LABVIEW上把控件打到銷(xiāo)售模式,然后利用掃描器掃描商品的條碼,當(dāng)掃描到存在的商品時(shí),掃描到的13位數(shù)據(jù)就會(huì)從單片機(jī)上發(fā)送13位數(shù)據(jù)過(guò)來(lái),LABVIEW在收到13為數(shù)據(jù)后,進(jìn)行與存好的條碼進(jìn)行對(duì)比,存在的商品就會(huì)可在LABVIEW上顯示商品的相關(guān)信息。結(jié)果如下圖所示:圖5.5顯示商品信息界面如圖5.5所示,是在掃描器掃描到條碼后,在LABVIEW上顯示商品的信息,如圖可以看到商品的單價(jià),產(chǎn)地,編號(hào)還有生產(chǎn)日期。結(jié)論本次設(shè)計(jì)簡(jiǎn)易超市收銀系統(tǒng),可以實(shí)現(xiàn)對(duì)商品的相關(guān)信息進(jìn)行存儲(chǔ),可以實(shí)現(xiàn)從條碼器掃描進(jìn)商品的條碼而進(jìn)行存儲(chǔ),商品的相關(guān)信息可在LCD1602上顯示,同時(shí)實(shí)現(xiàn)了通過(guò)按鍵中斷來(lái)判斷是進(jìn)行商品的存儲(chǔ)還是進(jìn)行商品的銷(xiāo)售。此外,還實(shí)現(xiàn)了從獨(dú)立鍵盤(pán)上進(jìn)行對(duì)商品信息的存儲(chǔ),實(shí)現(xiàn)了通過(guò)按鍵切換來(lái)顯示當(dāng)前的環(huán)境溫度,實(shí)現(xiàn)了通過(guò)掃描器來(lái)進(jìn)行商品的銷(xiāo)售和存儲(chǔ),實(shí)現(xiàn)在EEPROM中存儲(chǔ)100個(gè)商品信息。本次設(shè)計(jì)較為成功。但是本次設(shè)計(jì)也有很多不足,比如沒(méi)能拓展實(shí)現(xiàn)1000個(gè)商品信息的存儲(chǔ),以及沒(méi)能從獨(dú)立鍵盤(pán)上輸入漢字字符;在者,溫度傳感器那部分未能實(shí)現(xiàn)溫度超限報(bào)警,而且溫度測(cè)試精度不夠;此外在液晶上顯示的字符數(shù)據(jù)不是很清晰,讓人看起來(lái)不是很舒服;執(zhí)行銷(xiāo)售操作時(shí),未能顯示商品的銷(xiāo)售額,存儲(chǔ)數(shù)量還有幾個(gè);沒(méi)能實(shí)現(xiàn)從打印機(jī)打印銷(xiāo)售清單,而且液晶上看不到當(dāng)前的實(shí)時(shí)時(shí)鐘,無(wú)法清楚知道當(dāng)前的時(shí)間。在本次設(shè)計(jì)中應(yīng)該增加實(shí)時(shí)時(shí)鐘模塊,便于顧客和超市管理員了解消費(fèi)和收入的詳情。以及應(yīng)該在程序中能實(shí)現(xiàn)每銷(xiāo)售一件商品后,對(duì)應(yīng)得到存儲(chǔ)商品數(shù)量應(yīng)該減一,每種商品的數(shù)量可以進(jìn)行實(shí)時(shí)更新。同時(shí)可以擴(kuò)展鍵盤(pán)能實(shí)現(xiàn)全拼漢字、中英文輸入和數(shù)字輸入就更為完善了。當(dāng)然,如果可以增加語(yǔ)音播報(bào)功能,讀出商品的單價(jià),總價(jià)以便找錢(qián)給顧客,讓顧客清晰了解所消費(fèi)的商品的單價(jià)以及單次消費(fèi)的總金額那就更完美了,這些是需要去完善的模塊。在本次設(shè)計(jì)中,我深刻體會(huì)到制作一個(gè)相對(duì)好一點(diǎn)的PCB板是有點(diǎn)困難的,不過(guò)在本次設(shè)計(jì)中,我了解了簡(jiǎn)易超市收銀系統(tǒng)的整個(gè)工作原理和具體每一步的操作步驟,學(xué)會(huì)了設(shè)計(jì)一個(gè)獨(dú)立鍵盤(pán)來(lái)設(shè)計(jì)一個(gè)能進(jìn)行數(shù)字和字母輸入的鍵盤(pán),學(xué)會(huì)通過(guò)用掃描器來(lái)進(jìn)行條形碼的輸入,而且學(xué)會(huì)了用溫度傳感器來(lái)進(jìn)行環(huán)境溫度的測(cè)量,并且可以在液晶上顯示,同時(shí)可以通過(guò)EEPROM來(lái)進(jìn)行擴(kuò)展單品機(jī)的內(nèi)存,而且通過(guò)本次的設(shè)計(jì),對(duì)DXP、KEIL4、VC等編程畫(huà)圖軟件更進(jìn)一步掌握和運(yùn)用。當(dāng)然,在設(shè)計(jì)中,我感覺(jué)到自己的動(dòng)手能力有點(diǎn)欠缺,要么對(duì)芯片引腳的焊接不好,要么就是弄斷元件的引腳,而且對(duì)電路板的布局也不是很美觀,不過(guò)通過(guò)此次設(shè)計(jì)讓我加強(qiáng)了自己的動(dòng)手能力和制作PCB板子的能力。

謝辭在本次的設(shè)計(jì)中,我之所以可以完成我的設(shè)計(jì)作品,完成大學(xué)最后的一步,順利畢業(yè),離不開(kāi)老師和同學(xué)們的幫助,支持和關(guān)心,在本次設(shè)計(jì)完成的最后,我對(duì)他們表示由衷的感謝。在本次的設(shè)計(jì)中,剛開(kāi)始時(shí)我覺(jué)得我自己的動(dòng)手能力非常不足,但是經(jīng)過(guò)這次設(shè)計(jì)之后,我覺(jué)得我的動(dòng)手能力有了很大的提升,這對(duì)我以后的工作有很大的幫助,就算自己畢業(yè)了,以后仍舊會(huì)努力學(xué)習(xí),多動(dòng)手爭(zhēng)取有較大的提升。感謝此次對(duì)我的畢業(yè)設(shè)計(jì)有啟發(fā)的李莉老師,她不僅給了我設(shè)計(jì)上的啟發(fā),而且耐心指導(dǎo)我們,細(xì)心講解我們?cè)O(shè)計(jì)過(guò)程中遇到的問(wèn)題,老師用她豐富的教學(xué)經(jīng)驗(yàn)和多年來(lái)的硬件知識(shí)解決了我在設(shè)計(jì)中遇到的許多問(wèn)題,謝謝老師的耐心指導(dǎo)和講解。經(jīng)過(guò)這次的設(shè)計(jì)后,我相信我以后遇到相似的問(wèn)題,自己應(yīng)該可以自己分析問(wèn)題的原因并且解決問(wèn)題。同時(shí)我要感謝我們班同學(xué)的幫助,剛開(kāi)始時(shí)我的電路布局一塌糊涂,元件封裝也不對(duì),不過(guò)由于我們班同學(xué)的熱心幫助,幫我解決了電路布局不好問(wèn)題,以及元件封裝不對(duì)的問(wèn)題,因?yàn)槲覀儼嗤瑢W(xué)的幫助,我可以順利完成設(shè)計(jì)硬件電路。當(dāng)然我的軟件程序部分,遇到問(wèn)題的時(shí)候,我們自己的同學(xué)也會(huì)給我一些建議和幫助,非常感謝他們的熱心幫助。另外,我要感謝周?chē)耐瑢W(xué),由于他們的監(jiān)督下,大家都努力的完成設(shè)計(jì),不敢偷懶,因?yàn)榇蠹业幕突ブ?,才能使自己順利完成此次設(shè)計(jì),非常感謝他們。最后感謝母校對(duì)我四年來(lái)的培育,感謝老師同學(xué)們現(xiàn)出的關(guān)心和指導(dǎo),感謝各位老師對(duì)我學(xué)習(xí)上的幫助,謝謝你們大家。參考文獻(xiàn)周立功,張華.深入淺出ARM7(上冊(cè))[M].北京:北京航空航天大學(xué)出版社,2001.朱宇光.單片機(jī)應(yīng)用新技術(shù)[M].北京:電子工業(yè)出版社.2000.白駒珩,雷曉平.單片計(jì)算機(jī)及其應(yīng)用[M].北京:高等教育出版社.2004:1~100.朱華光.淺議LCD1602的編程技巧[J].電腦知識(shí)與技術(shù).2010,9(18):4980~4982.gu20072034.基于MS32OF2812的液晶顯示模塊SO12864設(shè)計(jì)[OL]-/,2011.08.27/2015.06.05閻石.數(shù)字電路技術(shù)基礎(chǔ)[M].北京:高等教育出版社,2006:179~180.[7]張金,張鋒,盧勝.電子系統(tǒng)設(shè)計(jì)基礎(chǔ)[M].北京:電子工業(yè)出版社,2011:176~191.[8]825621895.lcd1602時(shí)序圖[OL]-/view/41a2324769eae009581becaa.html?re=view,2010.10.09/2015.06.05[9]王典洪,李東峰,劉兵.EEPROM與DSP的接口技術(shù)[J].

微處理機(jī).

2008,4(2):30~31.[10]黃亮.基于AT89C51單片機(jī)的串口通信程序的設(shè)計(jì)[J].電子制作.2006(07):20~32.[11]merry_song.關(guān)于4*4矩陣鍵盤(pán)工作原理[EB/OL]./a/2015/04-30/341997.html,2015-04-30.[12]RashaShaheen,ArneWinterhof.Permutationsoffinitefieldsforcheckdigitsystems[J].Designs,CodesandCryptography,2010,57(3):23~45.[13]TakeshiOhbuchi,FujihikoMatsumoto.

Anewdesignofalinearlocal-feedbackMOStransconductorforlowfrequencyapplications[J].

AnalogIntegratedCircuitsandSignalProcessing,2013,75(2).

附錄附錄A電路原理圖

附錄BPCB板

附錄CLABVIEW程序/********************************************************************** ***********************************************************************/#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar/****LCD1602命令/*顯示模式指令#defineLCD_Display_mode0X38//設(shè)置16x2顯示5x7點(diǎn)陣8位數(shù)據(jù)接口//*顯示開(kāi)/關(guān)及光標(biāo)設(shè)置#defineLCD_shows00X0C//開(kāi)顯示不顯示光標(biāo)光標(biāo)不閃爍#defineLCD_shows20X0E//開(kāi)顯示顯示光標(biāo)光標(biāo)不閃爍#defineLCD_shows10X0F//開(kāi)顯示顯示光標(biāo)光標(biāo)閃爍#defineLCD_shows30X08//關(guān)顯示不顯示光標(biāo)光標(biāo)不閃爍//*指針設(shè)置#defineLCD_cursor10X04//寫(xiě)一個(gè)字符地址指針減1#defineLCD_cursor20X05//寫(xiě)一個(gè)字符地址指針減1并屏幕右移#defineLCD_cursor30X06//寫(xiě)一個(gè)字符地址指針加1#defineLCD_cursor40X07//寫(xiě)一個(gè)字符地址指針加1并屏幕左移//*清屏指令#defineLCD_clear0x01//清屏指令數(shù)據(jù)指針清零所有顯示清零///*忙狀態(tài)字#defineLCD_WAY0x80//狀態(tài)字///*宏定義顯示起始地址#defineLCD_ADDH0X80//第一行地址0x80-0xA7#defineLCD_ADDL0XC0//第二行地址0xC0-0xE7*/#definejump_ROM0xCC //18B20#definestartv0x44#defineread_EEROM0xBE//連接1602引腳定義sbitE=P3^7; //1602使能sbitRW=P3^6; //1602讀/寫(xiě)控制sbitRS=P3^5; //1602數(shù)據(jù)/指令控制sbitDQ=P3^4;//DS18B20數(shù)據(jù)口sbitscl=P1^1;//24c02SCLsbitsda=P1^2;//24c02SDAsbitwp=P1^0;//24c02WPuchartable[14]; //條碼數(shù)組uchartable_t[14];ucharpd_bit=0; //條碼數(shù)組下標(biāo)ucharpd_num=0; //24c02中存儲(chǔ)的商品數(shù)量ucharnum=0; //購(gòu)物車(chē)商品數(shù)量uintmoney_pd=0; //購(gòu)物價(jià)格ucharNew_rec=0; //條碼中斷標(biāo)記ucharUART_buff; //條碼槍串口數(shù)據(jù)寄存ucharbreak_flag=0; //退出標(biāo)記位ucharcountt=0; //中斷次數(shù)ucharcodetest[21]={1,10,147,176,127,7,157,'w','h','e','a','t','\0','\0','\0','\0','\0',48,0,0,0} ;ucharKeyscan(void);voidL1602_GB(ucharhang,ucharlie);voidL1602_string(ucharhang,ucharlie,uchar*p);voidL1602_char(ucharhang,ucharlie,charsign);voidL1602_init(void);voidwdata(uchardel);voidwcmd(uchardel);bitBusy(void);voidx24c02_write(ucharaddress,ucharinfo);ucharx24c02_read(ucharaddress);voidack(void);ucharreadx(void);voidwritex(ucharj);voidstop();voidstart(void);voidx24c02_init(void);voidflash(void);voiddelay();voidDelay_1ms(uinti);voiduart_init();voidwrite_byte(ucharval);ucharread_byte(void);voidwrite_bit(ucharbitval);ucharread_bit(void);ucharReset(void);//定義商品信息類(lèi)型數(shù)據(jù)structpd_info{ unsignedcharname; unsignedcharprice;};structpd_infoinfo_pd[5]; //購(gòu)物車(chē)//voidinput_pd()//{// structpd_infocodepd[5]={{88325015,"cooky",4},{88325027,"shoes",5},{88325024,"mungbean",4},{88325034,"banana",7}};////}/********************************************************************函數(shù)名:get_key()功能:按鍵判斷與消抖輸入:無(wú)輸出:鍵值1 2 3 ?abc defghi4 5 6 ?jkl mno pqr7 8 9 確定stuvwxyz左移 0 右移 退出 空格********************************************************************/ucharget_key(){ ucharkey_buf; P2=0xf0; if(P2!=0xf0) { Delay_1ms(20); //???? if(P2!=0xf0) { key_buf=Keyscan(); P2=0XF0; while(P2!=0XF0); returnkey_buf; } else return0; } else return0; }/*********************************************************************名稱(chēng):fin_pd(uchartable_t[14])*功能:查找條碼 一個(gè)13位的條碼分為低7位和高6位處理先對(duì)低七位進(jìn)行比較,如果匹配再比較高6位,否則退出*輸入:要查找的條碼*輸出:無(wú)***********************************************************************/ucharfin_pd(uchartable_t[14]){ ucharii=0,jj=0; ucharpd_code=1; //24c02地址寄存從1開(kāi)始是因?yàn)榈?位為已商品數(shù)量位 unsignedlonginthh=1000000; //數(shù)組數(shù)轉(zhuǎn)換為長(zhǎng)整型用到 unsignedlongintbarcode_t=0,barcode_h=0; //掃到的條碼和內(nèi)存中的條碼寄存 for(ii=6;ii<13;ii++) //掃描條碼數(shù)組低七位整合為一個(gè)長(zhǎng)整型數(shù)字 { barcode_h+=(table_t[ii]-48)*hh; hh=hh/10; } pd_num=x24c02_read(0); //讀取已存入的數(shù)量 24C02第一個(gè)存儲(chǔ)地址永遠(yuǎn)保存的是內(nèi)部存入的商品數(shù)量 for(ii=0;ii<pd_num;ii++) //根據(jù)商品數(shù)量決定要循環(huán)比較的次數(shù) { for(jj=3;jj<6;jj++) //先獲取低3字節(jié)進(jìn)行判斷 3個(gè)字節(jié)總共24位二進(jìn)制數(shù),可以表示一個(gè)最大為16777216的數(shù)足以表示低7位條碼 { //存入規(guī)則為前6字節(jié)為條碼,緊接著是10字節(jié)的名字,最后為1字節(jié)的價(jià)格為了方便運(yùn)算一個(gè)商品占20字節(jié),空閑為保留位 barcode_t=barcode_t|x24c02_read(pd_code+jj); Delay_1ms(1); if(jj!=5) barcode_t<<=8; //一個(gè)字節(jié)一個(gè)字節(jié)的提取 }// while(1)//查看兩個(gè)比對(duì)數(shù)據(jù)調(diào)試用// { // wcmd(0x01); //// L1602_char(1,1,barcode_t/1000000+48);// L1602_char(1,2,barcode_t/100000%10+48);// L1602_char(1,3,barcode_t/10000%10+48);// L1602_char(1,4,barcode_t/1000%10+48);// L1602_char(1,5,barcode_t/100%10+48);// L1602_char(1,6,barcode_t/10%10+48);// L1602_char(1,7,barcode_t%10+48);//// L1602_char(2,1,barcode_h/1000000+48);// L1602_char(2,2,barcode_h/100000%10+48);// L1602_char(2,3,barcode_h/10000%10+48);// L1602_char(2,4,barcode_h/1000%10+48);// L1602_char(2,5,barcode_h/100%10+48);// L1602_char(2,6,barcode_h/10%10+48);// L1602_char(2,7,barcode_h%10+48);//// Delay_1ms(3000);// wcmd(0x01);// Delay_1ms(5000);// } if(barcode_t==barcode_h) //如果低7位條碼匹配上了,讀取剩下高六位來(lái)匹配 { // barcode_h 加入高位比較程序 info_pd[num].name=pd_code+6; //保存商品名在24C04中的存儲(chǔ)地址 info_pd[num].price=pd_code+16; //保存價(jià)格存儲(chǔ)地址 num++; //購(gòu)物車(chē)商品數(shù)量加一 return1; //條碼匹配返回1不匹配返回0 // break; } else { pd_code+=20; //跳到下一個(gè)商品開(kāi)始地址繼續(xù)比對(duì) if(pd_code>=(pd_num*20)) //全部篩查完成,沒(méi)有發(fā)現(xiàn)條碼 { wcmd(0x01); L1602_string(1,1,"NOHAVE!"); L1602_string(2,1,"Nowreturn!"); Delay_1ms(3500); return0; // break; } } }}/*********************************************************************名稱(chēng):voidpd_car()*功能:購(gòu)物車(chē)顯示*輸入:無(wú)*輸出:無(wú)***********************************************************************/voidpd_car(){ ucharii,jj,break_flag=0,num_t;// wcmd(0x01); money_pd=money_pd+x24c02_read(info_pd[ii].price);//總的商品價(jià)格等于所有商品價(jià)格之和 ii=0; num_t=ii; while(1) { switch(get_key()) { case1:break_flag=1;break; case2:++ii;if(ii>=num){ii-=1;num_t=0;}break; //下一個(gè)商品 case4:if(ii>0){ii--;num_t=0;}break; //上一個(gè)商品 default:break; } if(break_flag==1) { break; } if(num_t==0) //當(dāng)商品發(fā)生變化時(shí)才掃描顯示,避免閃爍 { num_t++; wcmd(0x01); //清屏 L1602_GB(2,1); L1602_string(2,1,"good:"); L1602_string(1,1,"num:price:."); L1602_GB(1,5); L1602_char(1,5,num+48); L1602_char(1,13,money_pd/100%10+48); L1602_char(1,14,money_pd/10%10+48); L1602_char(1,16,money_pd%10+48); for(jj=0;(jj<10)&&(x24c02_read(info_pd[ii].name+jj)!='\0');jj++) //輪流顯示商品名字 { L1602_char(2,jj+1+5,x24c02_read(info_pd[ii].name+jj)); //讀取商品名顯示 } } //Delay_1ms(1); }}/*********************************************************************名稱(chēng):do_key_abc(uchara)*功能:根據(jù)鍵值執(zhí)行相應(yīng)操作*輸入:鍵值*輸出:無(wú)***********************************************************************uchardo_key_abc(uchara){ switch(a) { case0:break; case1:break_flag=1;break case2:if(state) //有字符輸入標(biāo)記位為1時(shí)才執(zhí)行操作//按下后右移一位選擇; { ++lie_abc; //輸入字符選擇右移 if(lie_abc>3) //右移限定 lie_abc=3; wcmd(0x80+lie_abc-1); //執(zhí)行右移 }break; case3:if(state==0) //沒(méi)字符輸入狀態(tài)下執(zhí)行 //空格 { ++lie_in; //產(chǎn)品名右移,相當(dāng)于一個(gè)空格 wcmd(0xc0+lie_in-1); //執(zhí)行右移 pd_buff.pd_name[i]=0; //寫(xiě)入產(chǎn)品名緩存 i++; //跳到下一位 }break; case4:if(state) //有字符輸入標(biāo)記位為1時(shí)才執(zhí)行操作 //按下后左移一位選擇; { ++lie_abc; //輸入字符選擇左移 if(lie_abc<1) //左移限定 lie_abc=1; wcmd(0x80+lie_abc-1); //執(zhí)行左移 }break; //確定鍵按下 case5:if(state) { pd_buff.pd_name[i]=state+lie_abc; //寫(xiě)入產(chǎn)品名緩存 L1602_char(2,lie_in,state+lie_abc); // 顯示選擇的字符 i++; //跳到下一位 state=0; //字符按下標(biāo)記清零 }break; case16:L1602_string(1,1,"abc"); //顯示將要選擇的字符ABC //abc L1602_GB(1,1); //開(kāi)光標(biāo)指示將要選擇的位 lie_abc=1; //光標(biāo)位置1 state=97; //標(biāo)記有輸入字符可供左右移動(dòng)ascll碼+偏移位lie_abc可得到準(zhǔn)確字符 break; } if(break_flag==1) return0; else return1;}/*********************************************************************名稱(chēng):do_key_123(uchara)*功能:根據(jù)鍵值執(zhí)行相應(yīng)操作*輸入:鍵值*輸出:無(wú)***********************************************************************/voiddo_key_123(uchara){ uintbb; if((pd_bit==13)&&(a!=1)&&(a!=5)&&(a!=13)) //限定13位輸入 a=0; else switch(a) { case1:break_flag=1;a=0;break; //退出鍵按下 case2: a=0;break; case3:table[pd_bit]='0';++pd_bit;a=0;break; //0 case4: a=0;break; case5:a=3; if(pd_bit==13) //檢查輸入條碼是否達(dá)到13位 { while(a--)//這是啟動(dòng)電源時(shí),液晶顯示:start(并閃爍3次) { L1602_string(1,1,"compare"); Delay_1ms(500); wcmd(0x01); Delay_1ms(500); } if(fin_pd(table)) //判斷是否找到對(duì)應(yīng)的條碼 { pd_car(); //購(gòu)買(mǎi)商品處理 pd_bit=0; wcmd(0x01); for(bb=0;bb<14;bb++) //清除條碼緩沖區(qū) { table[bb]='\0'; table_t[bb]=0; } } } else { L1602_string(1,1,"codesshouldbe"); L1602_string(2,1,"13bits"); Delay_1ms(2000); } a=0; break; case6:table[pd_bit]='9';++pd_bit;a=0;break; //9 case7:table[pd_bit]='8';++pd_bit;a=0;break; //8 case8:table[pd_bit]='7';++pd_bit;a=0;break; //7 case10:table[pd_bit]='6';++pd_bit;a=0;break; //6 case11:table[pd_bit]='5';++pd_bit;a=0;break; //5 case12:table[pd_bit]='4';++pd_bit;a=0;break; //4 case14:table[pd_bit]='3';++pd_bit;a=0;break; //3 case15:table[pd_bit]='2';++pd_bit;a=0;break; //2 case16:table[pd_bit]='1';++pd_bit;a=0;break; //1 default:a=0;break; } L1602_GB(2,2); L1602_string(2,2,table); L1602_string(1,1,"THEBARCODEIS:"); //顯示將要輸入的條碼}/*********************************************************************名稱(chēng):Main()*功能:主函數(shù) 主函數(shù)*輸入:無(wú)*輸出:無(wú)***************************************************************************************************************************/voidMain(void){ ucharKey_Value=0;//鍵值 ucharfuntion=0; uchari; unsignedcharTMPH,TMPL; uinttemp; L1602_init(); L1602_string(1,1,"CashRegister"); L1602_string(2,1,"Inputafuntion!"); x24c02_init(); //初始化24C02 wp=0; //使能24c02芯片讀寫(xiě) for(i=0;i<21;i++) { x24c02_write(i,test[i]); Delay_1ms(1);} uart_init(); while(1) { //加入另外四個(gè)功能按鍵判斷給funtion Key_Value=get_key(); //掃描按鍵功能選擇1購(gòu)買(mǎi)商品2存入商品信息3溫度顯示 switch(Key_Value) { case1:funtion=1;TR1=1;ES=1;Key_Value=0;break; //開(kāi)中斷. case2:funtion=2;Key_Value=0;break; default:Key_Value=0;break; } if(funtion==1)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論