論文題目:基于51單片機(jī)的電子秤的設(shè)計(jì)
第一章 功能說(shuō)明
本設(shè)計(jì)系統(tǒng)以單片機(jī)AT89S52為控制核心,實(shí)現(xiàn)電子秤的基本控制功能。在設(shè)計(jì)系統(tǒng)時(shí),為了更好地采用模塊化設(shè)計(jì)法,分步設(shè)計(jì)了各個(gè)單元功能模塊。 系統(tǒng)的硬件部分包括最小系統(tǒng)部分、數(shù)據(jù)采集部分、人機(jī)交互界面和系統(tǒng)電源四大部分。最小系統(tǒng)部分主要包括AT89S52和擴(kuò)展的外部數(shù)據(jù)存儲(chǔ)器;數(shù)據(jù)采集部分由稱重傳感器,信號(hào)的前期處理和A/D轉(zhuǎn)換部分組成,包括運(yùn)算放大器AD620和A/D轉(zhuǎn)換器ICL7135;人機(jī)界面部分為鍵盤(pán)輸入,四位LED數(shù)碼顯示器,可以直觀的顯示重量的具體數(shù)字以及方便的輸入數(shù)據(jù),使用方便;系統(tǒng)電源以LM317和LM337為核心設(shè)計(jì)電路以提供系統(tǒng)正常工作電源。 系統(tǒng)的軟件部分應(yīng)用單片機(jī)C語(yǔ)言進(jìn)行編程,實(shí)現(xiàn)了該設(shè)計(jì)的全部控制功能。該電子秤可以實(shí)現(xiàn)基本的稱重功能(稱重范圍為0~9.999Kg,重量誤差不大于±0.005Kg),并發(fā)揮部分的顯示購(gòu)物清單的功能,可以設(shè)置日期和設(shè)定十種商品的單價(jià), 還具有超量程和欠量程的報(bào)警功能。 本系統(tǒng)設(shè)計(jì)結(jié)構(gòu)簡(jiǎn)單,使用方便,功能齊全,精度高,具有一定的開(kāi)發(fā)價(jià)值。 稱重傳感器原理即由非電量(質(zhì)量或重量)轉(zhuǎn)換成電量的轉(zhuǎn)換元件,它是把支承力變換成電的或其它形式的適合于計(jì)量求值的信號(hào)所用的一種輔助手段。 按照稱重傳感器的結(jié)構(gòu)型式不同,可以分直接位移傳感器(電容式、電感式、電位計(jì)式、振弦式、空腔諧振器式等)和應(yīng)變傳感器(電阻應(yīng)變式、聲表面諧振式)或是利用磁彈性、壓電和壓阻等物理效應(yīng)的傳感器。 對(duì)稱重傳感器的基本要求是:輸出電量與輸入重量保持單值對(duì)應(yīng),并有良好的線性關(guān)系;有較高的靈敏度;對(duì)被稱物體的狀態(tài)的影響要小;能在較差的工作條件下工作;有較好的頻響特性;穩(wěn)定可靠。 傳感器下的定義是:“能感受規(guī)定的被測(cè)量并按照一定的規(guī)律轉(zhuǎn)換成可用信號(hào)的器件或裝置,通常由敏感元件和轉(zhuǎn)換元件組成”。其中敏感元件指?jìng)鞲衅髦心苤苯痈惺鼙粶y(cè)量的部分,轉(zhuǎn)換元件指?jìng)鞲衅髦心軐⒚舾性敵隽哭D(zhuǎn)換為適于傳輸和測(cè)量的電信號(hào)部分。此外傳感器是一種檢測(cè)裝置,能感受到被測(cè)量的信息,并能將檢測(cè)感受到的信息,按一定規(guī)律變換成為電信號(hào)或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲(chǔ)、顯示、記錄和控制等要求。它是實(shí)現(xiàn)自動(dòng)檢測(cè)和自動(dòng)控制的首要環(huán)節(jié)。 稱重傳感器在電子秤中占有十分重要的位置,被喻為電子秤的心臟部件,它的性能好壞很大程度上決定了電子秤的精確度和穩(wěn)定性。通常稱重傳感器產(chǎn)生的誤差約占電子秤整機(jī)誤差的50%~70%。若在環(huán)境惡劣的條件下(如高低溫、濕熱),傳感器所占的誤差比例就更大,因此,在人們?cè)O(shè)計(jì)電子秤時(shí),正確地選用稱重傳感器非常重要。 稱重傳感器的種類(lèi)很多,根據(jù)工作原理來(lái)分常用的有以下幾種: 電阻應(yīng)變式、電容式、壓磁式、壓電式、諧振式等。(本設(shè)計(jì)采用的是電阻應(yīng)變式) 電阻應(yīng)變式稱重傳感器包括兩個(gè)主要部分,一個(gè)是彈性敏感元件:利用它將被測(cè)的重量轉(zhuǎn)換為彈性體的應(yīng)變值;另一個(gè)是電阻應(yīng)變計(jì):它作為傳感元件將彈性體的應(yīng)變,同步地轉(zhuǎn)換為電阻值的變化。電阻應(yīng)變片所感受的機(jī)械應(yīng)變量一般為10 - 6~10 - 2,隨之而產(chǎn)生的電阻變化率也大約在10 - 6~10 - 2數(shù)量級(jí)之間。這樣小的電阻變化用一般測(cè)量電阻的儀表很難測(cè)出,必須采用一定形式的測(cè)量電路將微小的電阻變化率轉(zhuǎn)變成電壓或電流的變化,才能用二次儀表顯示出來(lái)。在電阻應(yīng)變式稱重傳感器中通過(guò)橋式電路將電阻的變化轉(zhuǎn)換為電壓變化。電阻應(yīng)變式稱重傳感器工作原理框圖如圖2-1所示: 如圖2-2電阻應(yīng)變式稱重傳感器工作原理框圖 
當(dāng)傳感器不受載荷時(shí),彈性敏感元件不產(chǎn)生應(yīng)變,粘貼在其上的應(yīng)變片不發(fā)生變形,阻值不變,電橋平衡,輸出電壓為零;當(dāng)傳感器受力時(shí),即彈性敏感元件受載荷P時(shí),應(yīng)變片就會(huì)發(fā)生變形,阻值發(fā)生變化,電橋失去平衡,有輸出電壓。 如圖2-3 橋式測(cè)量電路 R1、R2、R3、R4為4個(gè)應(yīng)變片電阻,組成了橋式測(cè)量電路,Rm為溫度補(bǔ)償電阻,e為激勵(lì)電壓,V為輸出電壓。 若不考慮Rm,在應(yīng)變片電阻變化以前,電橋的輸出電壓為: V= 由于橋臂的起始電阻全等,即R1 = R2 = R3 = R4 = R,所以V=0 。 當(dāng)應(yīng)變片的電阻R1、R2、R3、R4變成R+△R1、R+△R2、R+△R3、R+△R4時(shí),電橋的輸出電壓變?yōu)椋?/font> V= 通過(guò)化簡(jiǎn),上式則變?yōu)椋?/font> V=  也就是說(shuō),電橋輸出電壓的變化與各臂電阻變化率的代數(shù)和成正比。 如果四個(gè)橋臂應(yīng)變片的靈敏系數(shù)相同,且 = Kε,則上式又可寫(xiě)成: V= ε1 - ε2 + ε3 - ε4 ) 式中K為應(yīng)變片靈敏系數(shù),ε為應(yīng)變量。 上式表明,電橋的輸出電壓和四個(gè)轎臂的應(yīng)變片所感受的應(yīng)變量的代數(shù)和成正比。在電阻應(yīng)變式稱重傳感器中,4個(gè)應(yīng)變片分別貼在彈性梁的4個(gè)敏感部位,傳感器受力作用后發(fā)生變形。在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被壓縮,阻值減小,△R2、△R4為負(fù)值。再加之應(yīng)變片阻值變化的絕對(duì)值相同,即 △R1 = △R3 = + △R或ε1 = ε3 = +ε △R2 = △R4= - △R或ε2 = ε4 = - ε 因此,V= ×4ε = e Kε。若考慮 Rm,則電橋的輸出電壓變成: V=  = = K εe 令SU = ,則SU = K ε SU稱為傳感器系數(shù)或傳感器輸出靈敏度。 對(duì)于一個(gè)高精度的應(yīng)變傳感器來(lái)說(shuō),僅僅靠4個(gè)應(yīng)變片組成橋式測(cè)量電路還是遠(yuǎn)遠(yuǎn)不夠的。由于彈性梁材料金相組織的不均勻性及熱處理工藝、應(yīng)變片性能及粘貼工藝、溫度變化等因素的影響,傳感器勢(shì)必產(chǎn)生一定的誤差。為了減少傳感器隨溫度變化產(chǎn)生的誤差,提高其精度和穩(wěn)定性,需要在橋路兩端和橋臂中串入一些補(bǔ)償元件。如:初始不平衡值的補(bǔ)償、零載輸出溫度補(bǔ)償、輸出靈敏度溫度補(bǔ)償?shù)取?/font> 第二章 系統(tǒng)總體設(shè)計(jì)
2.1 電子秤設(shè)計(jì)的要求- 稱重范圍:不超過(guò)9.999Kg
- 測(cè)量精度:≤ 0.005Kg
- 顯示方式:LCD顯示所稱量的物品重量,同時(shí)還可顯示物品的名稱,數(shù)量,單價(jià),金額和所有物品的總金額。
- 使用操作:鍵盤(pán)輸入數(shù)據(jù),操作簡(jiǎn)單方便。
- 特殊功能:具有去皮功能以及能將金額累加計(jì)算;當(dāng)物品重量超過(guò)電子秤量程,即過(guò)載情況或者是物品重量小于A/D轉(zhuǎn)換器所能轉(zhuǎn)換的最小精度,即欠量程的時(shí)候,具有超重報(bào)警功能。
2.2電子秤設(shè)計(jì)的基本思路 將電子秤大致能劃分為三大部分,數(shù)據(jù)采集模塊、控制器模塊和人機(jī)交互界面模塊。其中數(shù)據(jù)采集模塊由壓力傳感器、信號(hào)的前級(jí)處理和A/D轉(zhuǎn)換部分組成。轉(zhuǎn)換后的數(shù)字信號(hào)送給控制器處理,由控制器完成對(duì)該數(shù)字量的處理,驅(qū)動(dòng)顯示模塊完成人機(jī)間的信息交換。此外添加了一個(gè)過(guò)載、欠量報(bào)警提示的特殊功能。 如圖2-1(上圖為本系統(tǒng)的設(shè)計(jì)圖) 2.3單片機(jī)的選型AT89S52單片機(jī)是AT89S系列中的增強(qiáng)型高檔機(jī)產(chǎn)品,它片內(nèi)存儲(chǔ)器容量是AT89S51的一倍,即片內(nèi)8KB的Flash程序存儲(chǔ)器和256B的RAM。另外,它還增加了一個(gè)功能極強(qiáng)的、具有獨(dú)特應(yīng)用的16位定時(shí)/計(jì)數(shù)器2等多種功能。在工程應(yīng)用中AT89S52有一顯著的優(yōu)勢(shì):不需要燒寫(xiě)器,只借助PC 機(jī)的并口輸出和極為簡(jiǎn)單的下載電路,便可將程序通過(guò)串行方式寫(xiě)入單片機(jī)。并且下載電路可設(shè)計(jì)在系統(tǒng)中,可以隨時(shí)修改單片機(jī)的軟件而不對(duì)硬件做任何改動(dòng)。 由此,通過(guò)對(duì)目前主流型號(hào)的比較,我們最終選擇了AT89S52通用的普通單片機(jī)來(lái)實(shí)現(xiàn)系統(tǒng)設(shè)計(jì)。AT89S52是一種兼容MCS51微控制器,工作電壓4.0V到5.5V,全靜態(tài)時(shí)鐘0 Hz 到33 MHz,三級(jí)程序加密,32個(gè)可編程I/O口,2/3個(gè)16位定時(shí)/計(jì)數(shù)器,6/8個(gè)中斷源,全雙工串行通訊口,低功耗支持Idle和Power-down模式,Power down模式支持中斷喚醒, 看門(mén)狗定時(shí)器,雙數(shù)據(jù)指針,上電復(fù)位標(biāo)志。另外在外擴(kuò)展了32K數(shù)據(jù)存儲(chǔ)器,以滿足系統(tǒng)要求。 2.4 A/D轉(zhuǎn)換器介紹 A/D轉(zhuǎn)換器是一種能把輸入模擬電壓或電流-成與它成正比的數(shù)字量,也就是說(shuō)能把被控對(duì)象的各種模擬信息變成計(jì)算機(jī)可以識(shí)別的數(shù)字信息。A/D轉(zhuǎn)換器種類(lèi)較多,從原理上可分為四種:雙積分式A/D轉(zhuǎn)換器,逐次逼近式A/D轉(zhuǎn)換器、并行A/D轉(zhuǎn)換器、計(jì)數(shù)器式A/D轉(zhuǎn)換器及△-∑型A/D轉(zhuǎn)換器。在電子秤的設(shè)計(jì)中用的比較多的是雙積分式A/D轉(zhuǎn)換器和△-∑型A/D轉(zhuǎn)換器。 雙積分ADC的基本原理是對(duì)輸入模擬電壓和參考電壓分別進(jìn)行兩次積分,將輸入電壓平均值變成與之成正比的時(shí)間間隔,然后利用時(shí)鐘脈沖和計(jì)數(shù)器測(cè)出此時(shí)間間隔,進(jìn)而得到相應(yīng)的數(shù)字量輸出。如圖2-6所示是電子秤中常用的雙積分式A/D轉(zhuǎn)換電路,它由積分器、比較器、模擬電子開(kāi)關(guān),積分電阻、積分電容、自動(dòng)回零電阻、電容組成。其中VG是模擬地,VFR是基準(zhǔn)電壓(相對(duì)于VG為負(fù)值),VX是檢測(cè)電壓。 如圖2-6 雙積分A/D轉(zhuǎn)換電路 其次雙積分型A/D轉(zhuǎn)換器具有很強(qiáng)的抗干擾能力。對(duì)正負(fù)對(duì)稱的工頻干擾信號(hào)積分為零,所以對(duì)50HZ的工頻干擾抑制能力特強(qiáng),對(duì)高于工頻干擾(例如噪聲電壓)也具有良好的濾波作用。只要干擾電壓的平均值為零,對(duì)輸出就不產(chǎn)生影響。尤其對(duì)本系統(tǒng),緩慢變化的壓力信號(hào),很容易受到工頻信號(hào)的影響。故而采用雙積分型A/D轉(zhuǎn)換器可大大降低對(duì)濾波電路的要求。 作為電子秤,系統(tǒng)對(duì)AD的轉(zhuǎn)換速度要求并不高,精度上14位的AD足以滿足要求。另外雙積分型A/D轉(zhuǎn)換器較強(qiáng)的抗干擾能力,和精確的差分輸入,低廉的價(jià)格。最終選擇了精度為10Kg/ 20000= 0.5g的ICL7135。 2.5鍵盤(pán)輸入鍵盤(pán)輸入是人機(jī)交互界面中重要的組成部分,它是系統(tǒng)接受用戶指令的直接途徑。鍵盤(pán)是由若干個(gè)按鍵開(kāi)關(guān)組成,鍵的多少根據(jù)單片機(jī)應(yīng)用系統(tǒng)的用途而定。鍵盤(pán)由許多鍵組成,每一個(gè)鍵相當(dāng)于一個(gè)機(jī)械開(kāi)關(guān)觸點(diǎn),當(dāng)鍵按下時(shí),觸點(diǎn)閉合,當(dāng)鍵松開(kāi)時(shí),觸點(diǎn)斷開(kāi)。單片機(jī)接收到按鍵的觸點(diǎn)信號(hào)后作相應(yīng)的功能處理。因此,相對(duì)于單片機(jī)系統(tǒng)來(lái)說(shuō)鍵盤(pán)接口信號(hào)是輸入信號(hào)。 ZLG7289是周立功單片機(jī)公司設(shè)計(jì)的串行輸入輸出可編程鍵盤(pán)顯示芯片,有強(qiáng)大的鍵盤(pán)顯示功能,支持64鍵控制,可以比較方便地?cái)U(kuò)展系統(tǒng)。另外ZLG7289內(nèi)部有譯碼電路,大大簡(jiǎn)化了程序。最終選擇ZLG7289作為鍵盤(pán)掃描顯示芯片。 2.6輸出顯示采用可以設(shè)置顯示單價(jià),金額,中文,購(gòu)物日期等的LCD,它具有低功耗、可視面大、畫(huà)面友好及抗干擾能力強(qiáng)等功能,其顯示技術(shù)已得到廣泛應(yīng)用。 LCD 顯示器的工作原理:液晶顯示器的主要材料是液態(tài)晶體。它在特定的溫度范圍內(nèi),既具有液體的流動(dòng)性,又具有晶體的某些光學(xué)特性,其透明度和顏色隨電場(chǎng)、磁場(chǎng)、光照度等外界條件變化而變化。因此,用液晶做成顯示器件,就可以把上訴外界條件的變化反映出來(lái)從而形成現(xiàn)實(shí)的效果。 雖然ZLG7289具有控制數(shù)碼管顯示的功能,但考慮到本題目要求中文顯示,數(shù)碼管無(wú)法滿足,只能考慮用帶有中文字庫(kù)的液晶顯示器。由于可以分頁(yè)顯示,無(wú)需太大屏幕,最終選擇點(diǎn)陣式128×64型LCD—OCM4x8C。 : 第三章 硬件設(shè)計(jì)與制作 3.2主控電路的設(shè)計(jì)P1口和P2.0~P2.6口作為地址總線,其中P1口作為低地址線和數(shù)據(jù)總線復(fù)用,P2.0~P2.6口做高地址線。P2.7作為62256的片選控制總線,ALE接鎖存器74LS373的使能端。P3.6和P3.7作為外部數(shù)據(jù)存儲(chǔ)器寫(xiě)/讀選通信號(hào)輸出端分別接62256的/WE和/OE端。 主控電路圖如下: 如圖3-2 主控電路設(shè)計(jì)圖 3.3信號(hào)處理電路 以下為濾波放大電路圖: 如圖3-3 信號(hào)濾波放大圖 上圖中電容C5、C6用來(lái)濾除采樣信號(hào)電壓中的高頻噪聲,選用0.1uF的普通獨(dú)石電容;電容C7、C84用來(lái)濾除采樣信號(hào)電壓中的低頻噪聲,選用22uF的普通獨(dú)石電容。電阻R3、R4選用較小的阻值,因?yàn)椴蓸有盘?hào)電壓值只有毫伏級(jí),所以其阻值不宜太大,否則導(dǎo)致放大器由于輸入電流太小而放大效果不明顯。 微弱信號(hào)Vi1和Vi2被分別放大后從AD620的第6腳輸出。A/D轉(zhuǎn)換器ICL7135的輸入電壓變化范圍是-2V~+2V,傳感器的輸出電壓信號(hào)在0~20mv左右,因此放大器的放大倍數(shù)在200~300左右,可將R9接成1K的滑動(dòng)變阻器。由于ICL7135對(duì)高頻干擾不敏感,所以濾波電路主要針對(duì)工頻及其低次諧波引入的干擾。因?yàn)閴毫π盘?hào)變化十分緩慢,所以濾波電路可以把頻率做得很低。 圖中的LM741的輸出端與AD620的地端相連,LM741的2腳與6腳相連構(gòu)成電壓跟隨器,R15與正負(fù)電源相接,通過(guò)改變R15的阻值可使VO與 RET之間的壓差變化,從而實(shí)現(xiàn)調(diào)零、去皮的功能。 ICL7135與單片機(jī)的接口 在讀取A/D轉(zhuǎn)換后的結(jié)果時(shí),選用數(shù)據(jù)選擇器作為數(shù)據(jù)讀取的控制器,這樣簡(jiǎn)化了ICL7135與單片機(jī)的接口電路,便于硬件設(shè)計(jì)與軟件編程的實(shí)現(xiàn)。 在ICL7135進(jìn)行A/D轉(zhuǎn)換結(jié)束后輸出的/STRB負(fù)脈沖引起AT89S52中斷。同時(shí)在第一個(gè)/STB負(fù)脈沖時(shí)由軟件將P1.7口置0,因而使S=0,使74LS157的Y (1Y,2Y,3Y,4Y)=A(4A,3A,2A,1A)。AT89S52讀P1.0~P1.3口便讀得BCD碼,此時(shí)D5=1。此后, D4,D3,D2,D1輪流為“1”,即可讀得千位、百位、十位和個(gè)位的BCD碼。 前端信號(hào)處理電路設(shè)計(jì)如下圖: 如圖3-4 信號(hào)數(shù)模轉(zhuǎn)換圖 ICL7135的輸出時(shí)序圖: 如圖3-5 輸出時(shí)序圖 在A/D轉(zhuǎn)換結(jié)束后立即更新輸出鎖存器并不斷地掃描輸出BCD碼。在A/D轉(zhuǎn)換期間BUSY為低電平,轉(zhuǎn)換完畢后BUSY變?yōu)楦唠娖健/D轉(zhuǎn)換結(jié)束后立刻順序并連續(xù)不斷地輸出位驅(qū)動(dòng)信號(hào)D5、D4、D3、D2、D1(均為正脈沖)。當(dāng)D5為高電平時(shí),B8、B4、B2、B1是萬(wàn)位BCD碼。同樣當(dāng)D4為高電平時(shí),B8、B4、B2、B1是千位BCD碼。同理D3、D2、D1 為正脈沖時(shí)各對(duì)應(yīng)百、十、個(gè)位的BCD碼。在A/D轉(zhuǎn)換完畢后,還連續(xù)輸出5個(gè)/STB負(fù)脈沖,它們分別位于D5、D4、D3、D2、D1正脈沖的中間,脈沖寬度為T(mén)/2。 在設(shè)計(jì)時(shí),還考慮過(guò)使用另一種接口電路,它巧妙地運(yùn)用了ICL7135 地“Busy”端功能,只要一個(gè)I/O口和單片機(jī)內(nèi)部的一個(gè)定時(shí)器就可把ICL7135的數(shù)據(jù)送人單片機(jī),可以節(jié)省大量的單片機(jī)資源,減小系統(tǒng)的體積。原理如下: “Busy”輸出端(ICL7135的21腳)高電平的寬度等于積分和反積分時(shí)間之和。ICL7135內(nèi)部規(guī)定積分時(shí)間固定為10001個(gè)時(shí)鐘脈沖時(shí)間,反積分時(shí)間長(zhǎng)度與被測(cè)電壓的大小成比例。如果利用單片機(jī)內(nèi)部的計(jì)數(shù)器對(duì)ICL7135的時(shí)鐘脈沖計(jì)數(shù),利用"Busy"作為計(jì)數(shù)器門(mén)控信號(hào),控制計(jì)數(shù)器只要在Busy為高電平時(shí)計(jì)數(shù),將這段Busy高電平時(shí)間內(nèi)計(jì)數(shù)器計(jì)的內(nèi)容減去10001,其余數(shù)等于被測(cè)電壓的數(shù)值。 3.3人機(jī)交互界面模塊設(shè)計(jì)3.3.1鍵盤(pán)輸入控制電路如表3-2 ZLG7289引腳說(shuō)明 | | | | | | | | | | | | | | 片選輸入端此引腳為低電平時(shí)可向芯片發(fā)送指令及讀取鍵盤(pán)數(shù)據(jù) | | | 同步時(shí)鐘輸入端向芯片發(fā)送數(shù)據(jù)及讀取鍵盤(pán)數(shù)據(jù)時(shí)此引腳電平上升沿表示數(shù)據(jù)有效 | | | 串行數(shù)據(jù)輸入/輸出端當(dāng)芯片接收指令時(shí)此引腳為輸入端當(dāng)讀取鍵盤(pán)數(shù)據(jù)時(shí)此引腳在讀指令最后一個(gè)時(shí)鐘的下降沿變?yōu)檩敵龆?/div> | | | 按鍵有效輸出端平時(shí)為高電平當(dāng)檢測(cè)到有效按鍵時(shí)此引腳變?yōu)榈碗娖?/div> | | | | | | 小數(shù)點(diǎn)驅(qū)動(dòng)輸出 | | | 數(shù)字0 數(shù)字7 驅(qū)動(dòng)輸出 | | | | | | | | | |
SPI串行接口工作方式介紹: ZLG7289 采用串行方式與微處理器通訊,串行數(shù)據(jù)從DATA 引腳送入芯片,并由CLK 端同步。當(dāng)片選信號(hào)變?yōu)榈碗娖胶螅珼ATA 引腳上的數(shù)據(jù)在CLK 引腳的上升沿被寫(xiě)入ZLG7289 的緩沖寄存器。 ZLG7289 的指令結(jié)構(gòu)有三種類(lèi)型: 1、不帶數(shù)據(jù)的純指令,指令的寬度為8 個(gè)BIT 即微處理器需發(fā)送8個(gè)CLK 脈沖; 如圖3-6 純指令時(shí)序圖 2、帶有數(shù)據(jù)的指令寬度為16 個(gè)BIT 即微處理器需發(fā)送16 個(gè)CLK 脈沖; 如圖3-7 帶數(shù)據(jù)指令時(shí)序圖 3、讀取鍵盤(pán)數(shù)據(jù)指令寬度為16個(gè)BIT,前8個(gè)為微處理器發(fā)送到ZLG7289的指令,后8 個(gè)BIT為ZLG7289返回的鍵盤(pán)代碼,執(zhí)行此指令時(shí)ZLG7289的DATA端在第9個(gè)CLK 脈沖的上升沿變?yōu)檩敵鰻顟B(tài)并與第16個(gè)脈沖的下降沿恢復(fù)為輸入狀態(tài),等待接收下一個(gè)指令。 圖3-8 讀鍵盤(pán)指令時(shí)序圖 下圖為電路圖: 圖3-9 鍵盤(pán)接口圖 圖中P1.5口接/CS;P1.6口接CLK;P1.0口接DIO;P3.2口接/KEY,利用中斷0通知AT89S52讀數(shù)。 鍵盤(pán)控制芯片ZLG7289 控制鍵盤(pán)的掃描,當(dāng)監(jiān)測(cè)到有鍵按下后ZLG7289 的9腳便產(chǎn)生一個(gè)低電平通知單片機(jī),單片機(jī)可以采用查詢或者中斷方式將數(shù)據(jù)通過(guò)P3.0口以串行方式讀入。因?yàn)椴樵兎绞綍?huì)浪費(fèi)大量的時(shí)間,所以本系統(tǒng)采用的是中斷方式。 2、 參數(shù)選擇參考如下 8只下拉電阻和8 只鍵盤(pán)連接位選線DIG0~DIG7 的8 只位選電阻應(yīng)遵從一定的比例關(guān)系,下拉電阻應(yīng)大于位選電阻的5 倍而小于其50 倍,典型值為10 倍,下拉電阻的取值范圍是10K~100K, 位選電阻的取值范圍是1K~10K。所以取上拉電阻為10K,下拉電阻為100K。 ZLG7289需要一外接晶體振蕩電路供系統(tǒng)工作,其典型值分別為F=16MHz C=15pF。實(shí)際使用時(shí)取F=12MHz,C=15pF。 3.3.2 LCD顯示電路OCM4x8C是具有串/并接口,其內(nèi)部含有中文字庫(kù)的圖形點(diǎn)陣液晶顯示模塊。該模塊的控制/驅(qū)動(dòng)器采用臺(tái)灣矽創(chuàng)電子公司的ST7920,因而具有較強(qiáng)的控制顯示功能。OCM4x8C的液晶顯示屏為128×64點(diǎn)陣,可顯示4行、每行8個(gè)漢字。為了便于簡(jiǎn)單、方便地顯示漢字,該模塊具2Mb的中文字型CGROM,該字型ROM中含有8192個(gè)16×16點(diǎn)陣中文字庫(kù);同時(shí),為了便于英文和其它常用字符的顯示,具有16Kb的16×8點(diǎn)陣的ASCII字符庫(kù);為便于構(gòu)造用戶圖形,提供了一個(gè)64×256點(diǎn)陣的GDRAM繪圖區(qū)域,且為了便于構(gòu)造用戶所需字型,提供了4組16×16點(diǎn)陣的造字空間。利用上述功能,OCM4x8C可實(shí)現(xiàn)漢字、ASCII碼、點(diǎn)陣圖形、自造字體的同屏顯示。為便于和多種微處理器、單片機(jī)接口,模塊提供了4位并行、8位并行、2線串行、3線串行多種接口方式。 該模塊具有2.7V~5.5V的寬工作電壓范圍,且具有睡眠、正常及低功耗工作模式,可滿足系統(tǒng)各種工作電壓及便攜式儀器低功耗的要求。液晶模塊顯示負(fù)電壓,也由模塊提供,從而簡(jiǎn)化了系統(tǒng)電源設(shè)計(jì)。模塊同時(shí)還提供LED背光顯示功能。除此之外,模塊還提供了畫(huà)面清除、游標(biāo)顯示/隱藏、游標(biāo)歸位、顯示打開(kāi)/關(guān)閉、顯示字符閃爍、游標(biāo)移位、顯示移位、垂直畫(huà)面旋轉(zhuǎn)、反白顯示、液晶睡眠/喚醒、關(guān)閉顯示等操作指令。 如表3-3引腳功能說(shuō)明 電路圖中PSB接低電平,進(jìn)入串行接口模式;串行數(shù)據(jù)線SID接P3.1口;串行時(shí)鐘線SCLK接P1.6;RS固定接高電平。此為典型二線串行模式。 字符顯示RAM地址與字符顯示位置關(guān)系: 如表3-4 RAM地址與字符顯示位置關(guān)系 2/3線串行接口方式: 當(dāng)模塊的PSB腳接低電平時(shí),模塊即進(jìn)入串行接口模式。串行模式使用串行數(shù)據(jù)線SID與串行時(shí)鐘線SCLK來(lái)傳送數(shù)據(jù),即構(gòu)成2線串行模式。 OCM4x8C還允許同時(shí)接入多個(gè)液晶顯示模塊以完成多路信息顯示功能。此時(shí),要利用片選端“CS”構(gòu)成3線串行接口方式,當(dāng)“CS”接高電位時(shí),模塊可正常接收并顯示數(shù)據(jù),否則模塊顯示將被禁止。通常情況下,當(dāng)系統(tǒng)僅使用一個(gè)液晶顯示模塊時(shí),“CS”可連接固定的高電平。 模塊2線串行工作操作時(shí)序如下圖所示: 如圖3-10 2線串行時(shí)序圖 由圖3.12可以看出,單片機(jī)與液晶模塊之間傳送1字節(jié)的數(shù)據(jù)共需24個(gè)時(shí)鐘脈沖。首先,單片機(jī)要給出數(shù)據(jù)傳輸起始位,這里是以5個(gè)連續(xù)的“1”作數(shù)據(jù)起始位,如模塊接收到連續(xù)的5個(gè)“1”,則內(nèi)部傳輸被重置并且串行傳輸將被同步。緊接著,“RW”位用于選擇數(shù)據(jù)的傳輸方向(讀或?qū)懀癛S”位用于選擇內(nèi)部數(shù)據(jù)寄存器或指令寄存器,最后的第8位固定為“0”。在接收到起始位及“RW”和“RW”的第1個(gè)字節(jié)后,下一個(gè)字節(jié)的數(shù)據(jù)或指令將被分為2個(gè)字節(jié)來(lái)串行傳送或接收。數(shù)據(jù)或指令的高4位,被放在第2個(gè)字節(jié)串行數(shù)據(jù)的高4位,其低4位則置為“0”;數(shù)據(jù)或指令的低4位被放在第3個(gè)字節(jié)的高4位,其低4位也置為“0”,如此完成一個(gè)字節(jié)指令或數(shù)據(jù)的傳送。需要注意的是,當(dāng)有多個(gè)數(shù)據(jù)或指令要傳送時(shí),必須要等到一個(gè)指令完成執(zhí)行完畢后再傳送下一個(gè)指令或數(shù)據(jù),否則,會(huì)造成指令或數(shù)據(jù)的丟失。這是因?yàn)橐壕K內(nèi)部沒(méi)有發(fā)送/接收緩沖區(qū)。
3.4報(bào)警電路的設(shè)計(jì)下圖為系統(tǒng)報(bào)警電路原理圖,用于超載和欠量程提示。系統(tǒng)設(shè)計(jì)了兩個(gè)發(fā)光二極管作為超載和欠量程指示燈,使系統(tǒng)更加完善。當(dāng)系統(tǒng)判斷為超載或欠量程時(shí),ICL7135給輸出一個(gè)高電平信號(hào)OR(超載)或UR(欠量程),經(jīng)非門(mén)后形成低電平從而驅(qū)動(dòng)發(fā)光二極管發(fā)光提示。 如圖3-11 報(bào)警電路原理圖 第四章 軟件設(shè)計(jì)軟件流程圖及程序設(shè)計(jì)為了方便程序調(diào)試和提高可靠性,程序設(shè)計(jì)采用自上而下、模塊化、結(jié)構(gòu)化的程序設(shè)計(jì)方法,把總的編程過(guò)程逐步細(xì)分,分解成一個(gè)個(gè)功能模塊,每個(gè)功能模塊相互獨(dú)立,每個(gè)模塊都能完成一個(gè)明確的任務(wù),實(shí)現(xiàn)某個(gè)具體的功能。本設(shè)計(jì)按任務(wù)模塊劃分的程序主要有初始化程序、主程序, A/D轉(zhuǎn)換子程序、顯示子程序、鍵盤(pán)處理子程序。 4.1初始化程序設(shè)計(jì)流程圖單片機(jī)系統(tǒng)上電后,進(jìn)入初始化程序,完成單片機(jī)片內(nèi)各模塊的設(shè)置和A/D轉(zhuǎn)換器的功能設(shè)置初始化,然后進(jìn)入主程序。 如圖 4-1 初始化程序設(shè)計(jì)流程圖 4.2主程序設(shè)計(jì)流程圖單片機(jī)完成初始化程序后進(jìn)入主程序,主程序主要完成對(duì)存儲(chǔ)參數(shù)的讀取,對(duì)檢測(cè)到的數(shù)據(jù)進(jìn)行數(shù)據(jù)處理,鍵處理,顯示處理等。 <img alt="" src="http://c.51hei.com/a/huq/a/a/8/50/50.034.jpg" _height="594" border="0" width="363">[/code]
如圖4-2 主程序設(shè)計(jì)流程圖 4.2 主程序設(shè)計(jì)及其相關(guān)程序設(shè)計(jì)4.2.1程序清單
- uint max_weight;//最大稱量
- uchar dsel;//分度值
- uchar dp;//小數(shù)點(diǎn)
-
- float beilv;//倍率
- ulong zero_save;//傳感器零位值
- }bdf;
-
- uint code num_ten[4]={1,10,100,1000};
- uchar code adcount2[4]={2,4,5};//數(shù)據(jù)處理進(jìn)平均次數(shù)
-
- uchar code tab_dsel[4]={1,2,5,10};//分度值表
- //0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9
- uchar code tab[]={0xB7,0x03,0xD6,0xC7,0x63,0xE5,0xF5,0x83,0xF7,0xE7,
-
- //A , b , C , d , E , F , 暗, - , t , P
- 0xF3,0x75,0xB4,0x57,0xF4,0xF0,0x00,0x40,0x74,0xF2,
-
- //H , L , o , J , r , n , U, =, - i
- 0x73,0x34,0x55,0x07,0x50,0x51,0x37,0x44,0x04,0x01};
- //顯示位碼表
-
- //0, 1, 2, 3, 4, 5, 6
- uchar code digit[]={0xfe,0xdf,0xef,0xfd,0xfb,0xbf,0xF7};//顯示位碼表
-
- sbit P_OE =P2^1;//顯示控制
- sbit P_LE =P2^0;
-
- sbit buz0 =P3^6;//蜂鳴器
- sbit buz1 =P3^7;
- /******************************************************/
- bit b_follow;//啟動(dòng)零位跟蹤標(biāo)記
- bit b_serial;//串口發(fā)送完標(biāo)記
- bit b_followdelay;//第一次不進(jìn)行零位跟蹤
- bit b_steady;//穩(wěn)定標(biāo)記
- /******************************************************/
- void (* data task)(void);//函數(shù)指針變量,接受下一步要做的任務(wù)
-
- uint idata fendushu;//分度數(shù)
-
- uchar weight_led[6] ;//重量窗顯示緩存
- uchar idata temp_var;
- uchar weight_dp;//小數(shù)點(diǎn)位數(shù)
- uchar fu_number;//負(fù)號(hào)顯示位置
- uchar wdcount;//穩(wěn)定計(jì)數(shù)
- uchar adup_count;//異常值計(jì)數(shù)
- uchar addcount3;//累加次數(shù)
- /******************************************************/
- extern void key_scan(void);//按鍵掃描
- extern void weight_disp(void);//重量計(jì)算,超載報(bào)警
- extern void start_set(void);//單片機(jī)初始化設(shè)置
- extern void adc (void);//讀取AD值
- extern void ad_processor(void);//AD數(shù)據(jù)濾波處理
- extern void fun_weight(void);//正常稱重狀態(tài)
- extern void bd_start(void);//重量或電壓標(biāo)定選擇
- extern void dy_disp(void);//電壓顯示
- extern void led_disp(ulong temp,uchar num);
- extern uchar get_jiaoyan(uchar *address,uchar num);//計(jì)算校驗(yàn)字
- extern void neima(void);
-
- void delay60ms(uchar time);//40ms延時(shí)
- void fendu_val(void);//分度數(shù)運(yùn)算
- void check_canshu(void);//讀參數(shù),并校驗(yàn)是否正確
- void ver_disp(void);//顯示版本號(hào)
- void seg_check(void);//筆畫(huà)檢測(cè)
- /******************************************/
- void main (void)
- {
-
- start_set(); //單片機(jī)初始化
- beep_time=3; //開(kāi)機(jī)鳴叫
- flash_num=6; //沒(méi)有閃爍位
- spi_sys(); //ad芯片初始化
- check_canshu(); //讀參數(shù),并校驗(yàn)是否正確
- if(bdf.shuduval>2) //若是異常值,用默認(rèn)值
- bdf.shuduval=1;
- addcount3=4;
- bdf_dp_temp=bdf.dp; //保存小數(shù)點(diǎn)(標(biāo)定修改參數(shù)時(shí)用)
- bdf_dsel_temp=bdf.dsel;//保存分度值(標(biāo)定修改參數(shù)時(shí)用)
- key_scan(); //標(biāo)定按鍵掃描
-
- switch(key_temp) //功能鍵處理函數(shù)
- {
- case 0xc0:b_biaoding=1;task=bd_start ; break;//
-
- default:
- bdf.dp=0;
- ver_disp();//顯示版本號(hào)
- seg_check();//筆畫(huà)檢測(cè)
- fendu_val();//分度數(shù)運(yùn)算
- zero_current=ad_steady;//保存當(dāng)前零位值
- task=fun_weight;
- break;
- }
-
- do
- { //主循環(huán)程序
- adc(); //A/D采樣
- ad_processor();//數(shù)據(jù)處理
- zero_follow(); //零位跟蹤程序
- neima(); //內(nèi)碼計(jì)算
- weight_disp(); //重量顯示
- key_scan(); //按鍵掃描
- (* task)(); //任務(wù)切換函數(shù)
-
- }
- while(1);
-
-
-
- }
- /*****************************************************************/
- void fendu_val(void)//分度數(shù)運(yùn)算
-
- { uchar i;
- ulong temp;
-
- temp=(ulong)bdf.max_weight*num_ten[bdf_dp_temp];
- fendushu=temp/bdf.dsel;
-
- i=fendushu/3000;
- if (i==0)
- i=1;
- half_sel_bound=5/bdf.beilv;//半個(gè)分度的原始碼
- follow_bound=i*half_sel_bound;//計(jì)算零位跟蹤時(shí)的原始碼,按3000分度
- time_weight=200;
-
- }
- /*****************************************************************/
- void ver_disp(void)//顯示版本號(hào)及最大量程
- {
- weight_led[0]=7;// 7
- weight_led[1]=1;// 1
- weight_led[2]=2;// 2
- weight_led[3]=17;// -
- weight_led[4]=0;// 0
- weight_led[5]=5;// 5
- fun_led=0xff;
- delay60ms(15);//40ms延時(shí)
- beep_time=3;
- led_disp(bdf.max_weight,5);//顯示最大量程
- weight_led[0]=15;// F
- delay60ms(20);//40ms延時(shí)
復(fù)制代碼
4.2信號(hào)采樣與A/D轉(zhuǎn)換子程序的設(shè)計(jì)
如圖 4-3 信號(hào)采樣與A/D轉(zhuǎn)換子程序的設(shè)計(jì)
4.3 鍵盤(pán)/顯示子程序設(shè)計(jì) 如圖 4-4 鍵盤(pán)/顯示子程序設(shè)計(jì) 如圖 4-5 按鍵掃描流程圖 - extern bit b_keyok;//有按鍵產(chǎn)生標(biāo)記
- extern bit b_longdown;//長(zhǎng)按下標(biāo)記
- extern uchar key_num;//鍵值
- extern uchar key_temp;//臨時(shí)鍵值
- extern uchar key_count;//鍵長(zhǎng)按計(jì)數(shù)
- extern uchar key_dly;//鍵去抖動(dòng)延時(shí)
- extern uchar beep_time;//蜂鳴時(shí)間
- void key_scan1();////按鍵松開(kāi)或沒(méi)有按下處理
- /****************************************************/
- oid disp_t1(void) interrupt 3 using 1//顯示中斷程序
- {
- uchar temp;
- TR1 =0;
- P_OE=1;//高阻態(tài),禁止輸出
- if((disp_number==(5-bdf.dp))&(bdf.dp!=0))//這一位是否有小數(shù)點(diǎn)
- temp=0x08;//小數(shù)點(diǎn)段碼
- else
- temp=0;
- if(disp_number==6)//指示燈顯示不用查表
- P0=fun_led;//
- else
- {
- if((disp_number==fu_number)&&b_fuhao)
- temp=temp|0x40;
-
- if((disp_number==flash_num)&b_flash)//是否有閃爍位
- P0=0x0;
- else
- P0=tab[weight_led[disp_number]]|temp;//查表取段碼
- }
- P_LE=1;
- P_LE=0;//573鎖存段碼
- P0=digit[disp_number];//送位碼
- P_OE=0;//573輸出有效
- disp_number++;
- if(disp_number==7)//是否顯示最后一位
- {
- disp_number=0;
- if(beep_time)//是否要鳴叫
- {
- if(!TR0)
- {buz0=~buz1;TR0 =1;}
- beep_time--;
- }
- else
- {TR0=0;buz0=1;buz1=1;}//不鳴叫時(shí)置高,減小電流
- if(key_dly)//按鍵去抖動(dòng)延時(shí)
- key_dly--;
- if(flash_num<6)
- {
- if(flash_time)//閃爍計(jì)時(shí)
- flash_time--;
- else
- { b_flash=!b_flash;flash_time=20;}//時(shí)間到,置閃爍標(biāo)記
- }
- }
- TH1 =0xf8;
- TL1 =0x18;
- TR1 =1 ;
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
基于51單片機(jī)的電子秤的設(shè)計(jì).doc
(1.22 MB, 下載次數(shù): 223)
2018-5-10 22:04 上傳
點(diǎn)擊文件名下載附件
|