基于單片機的電子秤設計,基于,單片機,電子秤,設計
黑龍江八一農(nóng)墾大學
題目 智能電子秤設計
姓 名 李 宏
專 業(yè) 電子信息工程
班 級 10級電子一班
學 號 20104075004
時 間 2013年4月10日
第一章 功能說明
本設計系統(tǒng)以單片機AT89S52為控制核心,實現(xiàn)電子秤的基本控制功能。在設計系統(tǒng)時,為了更好地采用模塊化設計法,分步設計了各個單元功能模塊。
系統(tǒng)的硬件部分包括最小系統(tǒng)部分、數(shù)據(jù)采集部分、人機交互界面和系統(tǒng)電源四大部分。最小系統(tǒng)部分主要包括AT89S52和擴展的外部數(shù)據(jù)存儲器;數(shù)據(jù)采集部分由稱重傳感器,信號的前期處理和A/D轉換部分組成,包括運算放大器AD620和A/D轉換器ICL7135;人機界面部分為鍵盤輸入,四位LED數(shù)碼顯示器,可以直觀的顯示重量的具體數(shù)字以及方便的輸入數(shù)據(jù),使用方便;系統(tǒng)電源以LM317和LM337為核心設計電路以提供系統(tǒng)正常工作電源。
系統(tǒng)的軟件部分應用單片機C語言進行編程,實現(xiàn)了該設計的全部控制功能。該電子秤可以實現(xiàn)基本的稱重功能(稱重范圍為0~9.999Kg,重量誤差不大于±0.005Kg),并發(fā)揮部分的顯示購物清單的功能,可以設置日期和設定十種商品的單價, 還具有超量程和欠量程的報警功能。
本系統(tǒng)設計結構簡單,使用方便,功能齊全,精度高,具有一定的開發(fā)價值。
稱重傳感器原理
即由非電量(質量或重量)轉換成電量的轉換元件,它是把支承力變換成電的或其它形式的適合于計量求值的信號所用的一種輔助手段。
按照稱重傳感器的結構型式不同,可以分直接位移傳感器(電容式、電感式、電位計式、振弦式、空腔諧振器式等)和應變傳感器(電阻應變式、聲表面諧振式)或是利用磁彈性、壓電和壓阻等物理效應的傳感器。
對稱重傳感器的基本要求是:輸出電量與輸入重量保持單值對應,并有良好的線性關系;有較高的靈敏度;對被稱物體的狀態(tài)的影響要小;能在較差的工作條件下工作;有較好的頻響特性;穩(wěn)定可靠。
傳感器下的定義是:“能感受規(guī)定的被測量并按照一定的規(guī)律轉換成可用信號的器件或裝置,通常由敏感元件和轉換元件組成”。其中敏感元件指傳感器中能直接感受被測量的部分,轉換元件指傳感器中能將敏感元件輸出量轉換為適于傳輸和測量的電信號部分。此外傳感器是一種檢測裝置,能感受到被測量的信息,并能將檢測感受到的信息,按一定規(guī)律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。它是實現(xiàn)自動檢測和自動控制的首要環(huán)節(jié)。
稱重傳感器在電子秤中占有十分重要的位置,被喻為電子秤的心臟部件,它的性能好壞很大程度上決定了電子秤的精確度和穩(wěn)定性。通常稱重傳感器產(chǎn)生的誤差約占電子秤整機誤差的50%~70%。若在環(huán)境惡劣的條件下(如高低溫、濕熱),傳感器所占的誤差比例就更大,因此,在人們設計電子秤時,正確地選用稱重傳感器非常重要。
稱重傳感器的種類很多,根據(jù)工作原理來分常用的有以下幾種: 電阻應變式、電容式、壓磁式、壓電式、諧振式等。(本設計采用的是電阻應變式)
電阻應變式稱重傳感器包括兩個主要部分,一個是彈性敏感元件:利用它將被測的重量轉換為彈性體的應變值;另一個是電阻應變計:它作為傳感元件將彈性體的應變,同步地轉換為電阻值的變化。電阻應變片所感受的機械應變量一般為10 - 6~10 - 2,隨之而產(chǎn)生的電阻變化率也大約在10 - 6~10 - 2數(shù)量級之間。這樣小的電阻變化用一般測量電阻的儀表很難測出,必須采用一定形式的測量電路將微小的電阻變化率轉變成電壓或電流的變化,才能用二次儀表顯示出來。在電阻應變式稱重傳感器中通過橋式電路將電阻的變化轉換為電壓變化。電阻應變式稱重傳感器工作原理框圖如圖2-1所示:
載荷P 應變 電阻變化R 輸出電壓
敏感元件
應變片
測量電橋
如圖2-2電阻應變式稱重傳感器工作原理框圖
當傳感器不受載荷時,彈性敏感元件不產(chǎn)生應變,粘貼在其上的應變片不發(fā)生變形,阻值不變,電橋平衡,輸出電壓為零;當傳感器受力時,即彈性敏感元件受載荷P時,應變片就會發(fā)生變形,阻值發(fā)生變化,電橋失去平衡,有輸出電壓。
如圖2-3 橋式測量電路
R1、R2、R3、R4為4個應變片電阻,組成了橋式測量電路,Rm為溫度補償電阻,e為激勵電壓,V為輸出電壓。
若不考慮Rm,在應變片電阻變化以前,電橋的輸出電壓為:
V=
由于橋臂的起始電阻全等,即R1 = R2 = R3 = R4 = R,所以V=0 。
當應變片的電阻R1、R2、R3、R4變成R+△R1、R+△R2、R+△R3、R+△R4時,電橋的輸出電壓變?yōu)椋?
V=
通過化簡,上式則變?yōu)椋?
V=
也就是說,電橋輸出電壓的變化與各臂電阻變化率的代數(shù)和成正比。
如果四個橋臂應變片的靈敏系數(shù)相同,且 = Kε,則上式又可寫成:
V=ε1 - ε2 + ε3 - ε4 )
式中K為應變片靈敏系數(shù),ε為應變量。
上式表明,電橋的輸出電壓和四個轎臂的應變片所感受的應變量的代數(shù)和成正比。在電阻應變式稱重傳感器中,4個應變片分別貼在彈性梁的4個敏感部位,傳感器受力作用后發(fā)生變形。在力的作用下,R1、R3被拉伸,阻值增大,△R1、△R3正值,R2、R4被壓縮,阻值減小,△R2、△R4為負值。再加之應變片阻值變化的絕對值相同,即
△R1 = △R3 = + △R或ε1 = ε3 = +ε
△R2 = △R4= - △R或ε2 = ε4 = - ε
因此,V=×4ε = e Kε。若考慮 Rm,則電橋的輸出電壓變成:
V=
= = K εe
令SU = ,則SU = K ε
SU稱為傳感器系數(shù)或傳感器輸出靈敏度。
對于一個高精度的應變傳感器來說,僅僅靠4個應變片組成橋式測量電路還是遠遠不夠的。由于彈性梁材料金相組織的不均勻性及熱處理工藝、應變片性能及粘貼工藝、溫度變化等因素的影響,傳感器勢必產(chǎn)生一定的誤差。為了減少傳感器隨溫度變化產(chǎn)生的誤差,提高其精度和穩(wěn)定性,需要在橋路兩端和橋臂中串入一些補償元件。如:初始不平衡值的補償、零載輸出溫度補償、輸出靈敏度溫度補償?shù)取?
第二章 系統(tǒng)總體設計
2.1 電子秤設計的要求
1) 稱重范圍:不超過9.999Kg
2) 測量精度:≤ 0.005Kg
3) 顯示方式:LCD顯示所稱量的物品重量,同時還可顯示物品的名稱,數(shù)量,單價,金額和所有物品的總金額。
4) 使用操作:鍵盤輸入數(shù)據(jù),操作簡單方便。
5) 特殊功能:具有去皮功能以及能將金額累加計算;當物品重量超過電子秤量程,即過載情況或者是物品重量小于A/D轉換器所能轉換的最小精度,即欠量程的時候,具有超重報警功能。
2.2電子秤設計的基本思路
將電子秤大致能劃分為三大部分,數(shù)據(jù)采集模塊、控制器模塊和人機交互界面模塊。其中數(shù)據(jù)采集模塊由壓力傳感器、信號的前級處理和A/D轉換部分組成。轉換后的數(shù)字信號送給控制器處理,由控制器完成對該數(shù)字量的處理,驅動顯示模塊完成人機間的信息交換。此外添加了一個過載、欠量報警提示的特殊功能。
如圖2-1(上圖為本系統(tǒng)的設計圖)
2.3單片機的選型
AT89S52單片機是AT89S系列中的增強型高檔機產(chǎn)品,它片內(nèi)存儲器容量是AT89S51的一倍,即片內(nèi)8KB的Flash程序存儲器和256B的RAM。另外,它還增加了一個功能極強的、具有獨特應用的16位定時/計數(shù)器2等多種功能。在工程應用中AT89S52有一顯著的優(yōu)勢:不需要燒寫器,只借助PC 機的并口輸出和極為簡單的下載電路,便可將程序通過串行方式寫入單片機。并且下載電路可設計在系統(tǒng)中,可以隨時修改單片機的軟件而不對硬件做任何改動。
由此,通過對目前主流型號的比較,我們最終選擇了AT89S52通用的普通單片機來實現(xiàn)系統(tǒng)設計。AT89S52是一種兼容MCS51微控制器,工作電壓4.0V到5.5V,全靜態(tài)時鐘0 Hz 到33 MHz,三級程序加密,32個可編程I/O口,2/3個16位定時/計數(shù)器,6/8個中斷源,全雙工串行通訊口,低功耗支持Idle和Power-down模式,Power down模式支持中斷喚醒, 看門狗定時器,雙數(shù)據(jù)指針,上電復位標志。另外在外擴展了32K數(shù)據(jù)存儲器,以滿足系統(tǒng)要求。
2.4 A/D轉換器介紹
A/D轉換器是一種能把輸入模擬電壓或電流-成與它成正比的數(shù)字量,也就是說能把被控對象的各種模擬信息變成計算機可以識別的數(shù)字信息。A/D轉換器種類較多,從原理上可分為四種:雙積分式A/D轉換器,逐次逼近式A/D轉換器、并行A/D轉換器、計數(shù)器式A/D轉換器及△-∑型A/D轉換器。在電子秤的設計中用的比較多的是雙積分式A/D轉換器和△-∑型A/D轉換器。
雙積分ADC的基本原理是對輸入模擬電壓和參考電壓分別進行兩次積分,將輸入電壓平均值變成與之成正比的時間間隔,然后利用時鐘脈沖和計數(shù)器測出此時間間隔,進而得到相應的數(shù)字量輸出。如圖2-6所示是電子秤中常用的雙積分式A/D轉換電路,它由積分器、比較器、模擬電子開關,積分電阻、積分電容、自動回零電阻、電容組成。其中VG是模擬地,VFR是基準電壓(相對于VG為負值),VX是檢測電壓。
如圖2-6 雙積分A/D轉換電路
其次雙積分型A/D轉換器具有很強的抗干擾能力。對正負對稱的工頻干擾信號積分為零,所以對50HZ的工頻干擾抑制能力特強,對高于工頻干擾(例如噪聲電壓)也具有良好的濾波作用。只要干擾電壓的平均值為零,對輸出就不產(chǎn)生影響。尤其對本系統(tǒng),緩慢變化的壓力信號,很容易受到工頻信號的影響。故而采用雙積分型A/D轉換器可大大降低對濾波電路的要求。
作為電子秤,系統(tǒng)對AD的轉換速度要求并不高,精度上14位的AD足以滿足要求。另外雙積分型A/D轉換器較強的抗干擾能力,和精確的差分輸入,低廉的價格。最終選擇了精度為10Kg/ 20000= 0.5g的ICL7135。
2.5鍵盤輸入
鍵盤輸入是人機交互界面中重要的組成部分,它是系統(tǒng)接受用戶指令的直接途徑。鍵盤是由若干個按鍵開關組成,鍵的多少根據(jù)單片機應用系統(tǒng)的用途而定。鍵盤由許多鍵組成,每一個鍵相當于一個機械開關觸點,當鍵按下時,觸點閉合,當鍵松開時,觸點斷開。單片機接收到按鍵的觸點信號后作相應的功能處理。因此,相對于單片機系統(tǒng)來說鍵盤接口信號是輸入信號。
ZLG7289是周立功單片機公司設計的串行輸入輸出可編程鍵盤顯示芯片,有強大的鍵盤顯示功能,支持64鍵控制,可以比較方便地擴展系統(tǒng)。另外ZLG7289內(nèi)部有譯碼電路,大大簡化了程序。最終選擇ZLG7289作為鍵盤掃描顯示芯片。
2.6輸出顯示
采用可以設置顯示單價,金額,中文,購物日期等的LCD,它具有低功耗、可視面大、畫面友好及抗干擾能力強等功能,其顯示技術已得到廣泛應用。
LCD 顯示器的工作原理:液晶顯示器的主要材料是液態(tài)晶體。它在特定的溫度范圍內(nèi),既具有液體的流動性,又具有晶體的某些光學特性,其透明度和顏色隨電場、磁場、光照度等外界條件變化而變化。因此,用液晶做成顯示器件,就可以把上訴外界條件的變化反映出來從而形成現(xiàn)實的效果。
雖然ZLG7289具有控制數(shù)碼管顯示的功能,但考慮到本題目要求中文顯示,數(shù)碼管無法滿足,只能考慮用帶有中文字庫的液晶顯示器。由于可以分頁顯示,無需太大屏幕,最終選擇點陣式128×64型LCD—OCM4x8C。
: 第三章 硬件設計與制作
3.1 AT89S52芯片
AT89S52單片機是ATMEL公司新近推出的高檔型AT89S系列單片機中的增強型產(chǎn)品。ATMEL公司是美國20世紀80年代中期成立并發(fā)展起來的半導體公司。該公司的技術優(yōu)勢在于推出Flash存儲器技術和高質量、高可靠性的生產(chǎn)技術,它率先將獨特的Flash存儲技術注入于單片機產(chǎn)品中。其推出的AT89系列單片機,在世界電子技術行業(yè)中引起了極大的反響,在國內(nèi)也受到廣大用戶歡迎。
AT89S52是一個低功耗,高性能CMOS 8位單片機,片內(nèi)含8k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器。器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統(tǒng)及80C51引腳結構。芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S52可為許多嵌入式控制應用系統(tǒng)提供高性價比的解決方案。
??? AT89S52具有如下特點:40個引腳,8k Bytes Flash片內(nèi)程序存儲器,256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套中斷,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,看門狗(WDT)電路,片內(nèi)時鐘振蕩器。
此外,AT89S52設計和配置了振蕩頻率可為0Hz,并可通過軟件設置省電模式。空閑模式下,CPU暫停工作,而RAM定時計數(shù)器、串行口、外中斷系統(tǒng)可繼續(xù)工作,掉電模式凍結振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復位。同時該芯片還具有PDIP、TQFP和PLCC等三種封裝形式,以適應不同產(chǎn)品的需求。
主要功能特性見下表:
· 兼容MCS-51指令系統(tǒng)
· 8k可反復擦寫(>1000次)ISP Flash ROM
· 32個雙向I/O口
· 4.5-5.5V工作電壓
· 3個16位可編程定時/計數(shù)器
· 時鐘頻率0-33MHz
· 全雙工UART串行中斷口線
· 256x8bit內(nèi)部RAM
· 2個外部中斷源
· 低功耗空閑和省電模式
· 中斷喚醒省電模式
· 3級加密位
· 看門狗(WDT)電路
· 軟件設置空閑和省電功能
· 靈活的ISP字節(jié)和分頁編程
· 雙數(shù)據(jù)寄存器指針
如表3-1 AT89S52功能
引腳封裝如下圖所示:
如圖3-1 AT89S52的引腳圖
3.2主控電路的設計
P1口和P2.0~P2.6口作為地址總線,其中P1口作為低地址線和數(shù)據(jù)總線復用,P2.0~P2.6口做高地址線。P2.7作為62256的片選控制總線,ALE接鎖存器74LS373的使能端。P3.6和P3.7作為外部數(shù)據(jù)存儲器寫/讀選通信號輸出端分別接62256的/WE和/OE端。
主控電路圖如下:
如圖3-2 主控電路設計圖
3.3信號處理電路
以下為濾波放大電路圖:
如圖3-3 信號濾波放大圖
上圖中電容C5、C6用來濾除采樣信號電壓中的高頻噪聲,選用0.1uF的普通獨石電容;電容C7、C84用來濾除采樣信號電壓中的低頻噪聲,選用22uF的普通獨石電容。電阻R3、R4選用較小的阻值,因為采樣信號電壓值只有毫伏級,所以其阻值不宜太大,否則導致放大器由于輸入電流太小而放大效果不明顯。
微弱信號Vi1和Vi2被分別放大后從AD620的第6腳輸出。A/D轉換器ICL7135的輸入電壓變化范圍是-2V~+2V,傳感器的輸出電壓信號在0~20mv左右,因此放大器的放大倍數(shù)在200~300左右,可將R9接成1K的滑動變阻器。由于ICL7135對高頻干擾不敏感,所以濾波電路主要針對工頻及其低次諧波引入的干擾。因為壓力信號變化十分緩慢,所以濾波電路可以把頻率做得很低。
圖中的LM741的輸出端與AD620的地端相連,LM741的2腳與6腳相連構成電壓跟隨器,R15與正負電源相接,通過改變R15的阻值可使VO與 RET之間的壓差變化,從而實現(xiàn)調(diào)零、去皮的功能。
ICL7135與單片機的接口
在讀取A/D轉換后的結果時,選用數(shù)據(jù)選擇器作為數(shù)據(jù)讀取的控制器,這樣簡化了ICL7135與單片機的接口電路,便于硬件設計與軟件編程的實現(xiàn)。
在ICL7135進行A/D轉換結束后輸出的/STRB負脈沖引起AT89S52中斷。同時在第一個/STB負脈沖時由軟件將P1.7口置0,因而使S=0,使74LS157的Y
(1Y,2Y,3Y,4Y)=A(4A,3A,2A,1A)。AT89S52讀P1.0~P1.3口便讀得BCD碼,此時D5=1。此后, D4,D3,D2,D1輪流為“1”,即可讀得千位、百位、十位和個位的BCD碼。
前端信號處理電路設計如下圖:
如圖3-4 信號數(shù)模轉換圖
ICL7135的輸出時序圖:
如圖3-5 輸出時序圖
在A/D轉換結束后立即更新輸出鎖存器并不斷地掃描輸出BCD碼。在A/D轉換期間BUSY為低電平,轉換完畢后BUSY變?yōu)楦唠娖?。A/D轉換結束后立刻順序并連續(xù)不斷地輸出位驅動信號D5、D4、D3、D2、D1(均為正脈沖)。當D5為高電平時,B8、B4、B2、B1是萬位BCD碼。同樣當D4為高電平時,B8、B4、B2、B1是千位BCD碼。同理D3、D2、D1 為正脈沖時各對應百、十、個位的BCD碼。在A/D轉換完畢后,還連續(xù)輸出5個/STB負脈沖,它們分別位于D5、D4、D3、D2、D1正脈沖的中間,脈沖寬度為T/2。
在設計時,還考慮過使用另一種接口電路,它巧妙地運用了ICL7135 地“Busy”端功能,只要一個I/O口和單片機內(nèi)部的一個定時器就可把ICL7135的數(shù)據(jù)送人單片機,可以節(jié)省大量的單片機資源,減小系統(tǒng)的體積。原理如下:
“Busy”輸出端(ICL7135的21腳)高電平的寬度等于積分和反積分時間之和。ICL7135內(nèi)部規(guī)定積分時間固定為10001個時鐘脈沖時間,反積分時間長度與被測電壓的大小成比例。如果利用單片機內(nèi)部的計數(shù)器對ICL7135的時鐘脈沖計數(shù),利用"Busy"作為計數(shù)器門控信號,控制計數(shù)器只要在Busy為高電平時計數(shù),將這段Busy高電平時間內(nèi)計數(shù)器計的內(nèi)容減去10001,其余數(shù)等于被測電壓的數(shù)值。
3.3人機交互界面模塊設計
3.3.1鍵盤輸入控制電路
如表3-2 ZLG7289引腳說明
引 腳 號
名 稱
說 明
1,2
VDD
正電源
3,5
NC
懸空
4
VSS
接地
6
/CS
片選輸入端此引腳為低電平時可向芯片發(fā)送指令及讀取鍵盤數(shù)據(jù)
7
CLK
同步時鐘輸入端向芯片發(fā)送數(shù)據(jù)及讀取鍵盤數(shù)據(jù)時此引腳電平上升沿表示數(shù)據(jù)有效
8
DATA
串行數(shù)據(jù)輸入/輸出端當芯片接收指令時此引腳為輸入端當讀取鍵盤數(shù)據(jù)時此引腳在讀指令最后一個時鐘的下降沿變?yōu)檩敵龆?
9
/KEY
按鍵有效輸出端平時為高電平當檢測到有效按鍵時此引腳變?yōu)榈碗娖?
10~16
SG~SA
段g~段a 驅動輸出
17
DP
小數(shù)點驅動輸出
18~25
DIG0~DIG7
數(shù)字0 數(shù)字7 驅動輸出
26
OSC2
振蕩器輸出端
27
OSC1
振蕩器輸入端
28
/RESET
復位端低電平有效
SPI串行接口工作方式介紹:
ZLG7289 采用串行方式與微處理器通訊,串行數(shù)據(jù)從DATA 引腳送入芯片,并由CLK 端同步。當片選信號變?yōu)榈碗娖胶?,DATA 引腳上的數(shù)據(jù)在CLK 引腳的上升沿被寫入ZLG7289 的緩沖寄存器。
ZLG7289 的指令結構有三種類型:
1、不帶數(shù)據(jù)的純指令,指令的寬度為8 個BIT 即微處理器需發(fā)送8個CLK 脈沖;
如圖3-6 純指令時序圖
2、帶有數(shù)據(jù)的指令寬度為16 個BIT 即微處理器需發(fā)送16 個CLK 脈沖;
如圖3-7 帶數(shù)據(jù)指令時序圖
3、讀取鍵盤數(shù)據(jù)指令寬度為16個BIT,前8個為微處理器發(fā)送到ZLG7289的指令,后8 個BIT為ZLG7289返回的鍵盤代碼,執(zhí)行此指令時ZLG7289的DATA端在第9個CLK 脈沖的上升沿變?yōu)檩敵鰻顟B(tài)并與第16個脈沖的下降沿恢復為輸入狀態(tài),等待接收下一個指令。
圖3-8 讀鍵盤指令時序圖
下圖為電路圖:
圖3-9 鍵盤接口圖
圖中P1.5口接/CS;P1.6口接CLK;P1.0口接DIO;P3.2口接/KEY,利用中斷0通知AT89S52讀數(shù)。
鍵盤控制芯片ZLG7289 控制鍵盤的掃描,當監(jiān)測到有鍵按下后ZLG7289 的9腳便產(chǎn)生一個低電平通知單片機,單片機可以采用查詢或者中斷方式將數(shù)據(jù)通過P3.0口以串行方式讀入。因為查詢方式會浪費大量的時間,所以本系統(tǒng)采用的是中斷方式。
2、 參數(shù)選擇參考如下
8只下拉電阻和8 只鍵盤連接位選線DIG0~DIG7 的8 只位選電阻應遵從一定的比例關系,下拉電阻應大于位選電阻的5 倍而小于其50 倍,典型值為10 倍,下拉電阻的取值范圍是10K~100K, 位選電阻的取值范圍是1K~10K。所以取上拉電阻為10K,下拉電阻為100K。
ZLG7289需要一外接晶體振蕩電路供系統(tǒng)工作,其典型值分別為F=16MHz C=15pF。實際使用時取F=12MHz,C=15pF。
3.3.2 LCD顯示電路
OCM4x8C是具有串/并接口,其內(nèi)部含有中文字庫的圖形點陣液晶顯示模塊。該模塊的控制/驅動器采用臺灣矽創(chuàng)電子公司的ST7920,因而具有較強的控制顯示功能。OCM4x8C的液晶顯示屏為128×64點陣,可顯示4行、每行8個漢字。為了便于簡單、方便地顯示漢字,該模塊具2Mb的中文字型CGROM,該字型ROM中含有8192個16×16點陣中文字庫;同時,為了便于英文和其它常用字符的顯示,具有16Kb的16×8點陣的ASCII字符庫;為便于構造用戶圖形,提供了一個64×256點陣的GDRAM繪圖區(qū)域,且為了便于構造用戶所需字型,提供了4組16×16點陣的造字空間。利用上述功能,OCM4x8C可實現(xiàn)漢字、ASCII碼、點陣圖形、自造字體的同屏顯示。為便于和多種微處理器、單片機接口,模塊提供了4位并行、8位并行、2線串行、3線串行多種接口方式。
該模塊具有2.7V~5.5V的寬工作電壓范圍,且具有睡眠、正常及低功耗工作模式,可滿足系統(tǒng)各種工作電壓及便攜式儀器低功耗的要求。液晶模塊顯示負電壓,也由模塊提供,從而簡化了系統(tǒng)電源設計。模塊同時還提供LED背光顯示功能。除此之外,模塊還提供了畫面清除、游標顯示/隱藏、游標歸位、顯示打開/關閉、顯示字符閃爍、游標移位、顯示移位、垂直畫面旋轉、反白顯示、液晶睡眠/喚醒、關閉顯示等操作指令。
如表3-3引腳功能說明
引 腳 號
名 稱
說 明
1
VSS
GND(0V)
2
VDD
邏輯電源(+5V)
3
V0
LCD電源(懸空)
4
RS(CS)
H:數(shù)據(jù),L:指令
5
R/W(SID)
H:讀,L:寫
6
E(SCLK)
使能
7
DB0
數(shù)據(jù)0
8
DB1
數(shù)據(jù)1
9
DB2
數(shù)據(jù)2
10
DB3
數(shù)據(jù)3
11
DB4
數(shù)據(jù)4
12
DB5
數(shù)據(jù)5
13
DB6
數(shù)據(jù)6
14
DB7
數(shù)據(jù)7
15
PSB
H:并行,L:串行
16
NC
空腳
17
RST
復位(低電平有效)
18
NC
空腳
19
LEDA
背光源正極(LED+5V)
20
LEDK
背光源負極(LED-0V)
電路圖中PSB接低電平,進入串行接口模式;串行數(shù)據(jù)線SID接P3.1口;串行時鐘線SCLK接P1.6;RS固定接高電平。此為典型二線串行模式。
字符顯示RAM地址與字符顯示位置關系:
如表3-4 RAM地址與字符顯示位置關系
80H
81H
82H
83H
84H
85H
86H
87H
90H
91H
92H
93H
94H
95H
96H
97H
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
2/3線串行接口方式:
當模塊的PSB腳接低電平時,模塊即進入串行接口模式。串行模式使用串行數(shù)據(jù)線SID與串行時鐘線SCLK來傳送數(shù)據(jù),即構成2線串行模式。
OCM4x8C還允許同時接入多個液晶顯示模塊以完成多路信息顯示功能。此時,要利用片選端“CS”構成3線串行接口方式,當“CS”接高電位時,模塊可正常接收并顯示數(shù)據(jù),否則模塊顯示將被禁止。通常情況下,當系統(tǒng)僅使用一個液晶顯示模塊時,“CS”可連接固定的高電平。
模塊2線串行工作操作時序如下圖所示:
如圖3-10 2線串行時序圖
由圖3.12可以看出,單片機與液晶模塊之間傳送1字節(jié)的數(shù)據(jù)共需24個時鐘脈沖。首先,單片機要給出數(shù)據(jù)傳輸起始位,這里是以5個連續(xù)的“1”作數(shù)據(jù)起始位,如模塊接收到連續(xù)的5個“1”,則內(nèi)部傳輸被重置并且串行傳輸將被同步。緊接著,“RW”位用于選擇數(shù)據(jù)的傳輸方向(讀或寫),“RS”位用于選擇內(nèi)部數(shù)據(jù)寄存器或指令寄存器,最后的第8位固定為“0”。在接收到起始位及“RW”和“RW”的第1個字節(jié)后,下一個字節(jié)的數(shù)據(jù)或指令將被分為2個字節(jié)來串行傳送或接收。數(shù)據(jù)或指令的高4位,被放在第2個字節(jié)串行數(shù)據(jù)的高4位,其低4位則置為“0”;數(shù)據(jù)或指令的低4位被放在第3個字節(jié)的高4位,其低4位也置為“0”,如此完成一個字節(jié)指令或數(shù)據(jù)的傳送。需要注意的是,當有多個數(shù)據(jù)或指令要傳送時,必須要等到一個指令完成執(zhí)行完畢后再傳送下一個指令或數(shù)據(jù),否則,會造成指令或數(shù)據(jù)的丟失。這是因為液晶模塊內(nèi)部沒有發(fā)送/接收緩沖區(qū)。
3.4報警電路的設計
下圖為系統(tǒng)報警電路原理圖,用于超載和欠量程提示。系統(tǒng)設計了兩個發(fā)光二極管作為超載和欠量程指示燈,使系統(tǒng)更加完善。當系統(tǒng)判斷為超載或欠量程時,ICL7135給輸出一個高電平信號OR(超載)或UR(欠量程),經(jīng)非門后形成低電平從而驅動發(fā)光二極管發(fā)光提示。
如圖3-11? 報警電路原理圖
第四章 軟件設計
軟件流程圖及程序設計
為了方便程序調(diào)試和提高可靠性,程序設計采用自上而下、模塊化、結構化的程序設計方法,把總的編程過程逐步細分,分解成一個個功能模塊,每個功能模塊相互獨立,每個模塊都能完成一個明確的任務,實現(xiàn)某個具體的功能。本設計按任務模塊劃分的程序主要有初始化程序、主程序, A/D轉換子程序、顯示子程序、鍵盤處理子程序。
4.1初始化程序設計流程圖
單片機系統(tǒng)上電后,進入初始化程序,完成單片機片內(nèi)各模塊的設置和A/D轉換器的功能設置初始化,然后進入主程序。
如圖 4-1 初始化程序設計流程圖
4.2主程序設計流程圖
單片機完成初始化程序后進入主程序,主程序主要完成對存儲參數(shù)的讀取,對檢測到的數(shù)據(jù)進行數(shù)據(jù)處理,鍵處理,顯示處理等。
如圖4-2 主程序設計流程圖
4.2 主程序設計及其相關程序設計
4.2.1程序清單
uint max_weight;//最大稱量
uchar dsel;//分度值
uchar dp;//小數(shù)點
float beilv;//倍率
ulong zero_save;//傳感器零位值
}bdf;
uint code num_ten[4]={1,10,100,1000};
uchar code adcount2[4]={2,4,5};//數(shù)據(jù)處理進平均次數(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;//啟動零位跟蹤標記
bit b_serial;//串口發(fā)送完標記
bit b_followdelay;//第一次不進行零位跟蹤
bit b_steady;//穩(wěn)定標記
/******************************************************/
void (* data task)(void);//函數(shù)指針變量,接受下一步要做的任務
uint idata fendushu;//分度數(shù)
uchar weight_led[6] ;//重量窗顯示緩存
uchar idata temp_var;
uchar weight_dp;//小數(shù)點位數(shù)
uchar fu_number;//負號顯示位置
uchar wdcount;//穩(wěn)定計數(shù)
uchar adup_count;//異常值計數(shù)
uchar addcount3;//累加次數(shù)
/******************************************************/
extern void key_scan(void);//按鍵掃描
extern void weight_disp(void);//重量計算,超載報警
extern void start_set(void);//單片機初始化設置
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);//重量或電壓標定選擇
extern void dy_disp(void);//電壓顯示
extern void led_disp(ulong temp,uchar num);
extern uchar get_jiaoyan(uchar *address,uchar num);//計算校驗字
extern void neima(void);
void delay60ms(uchar time);//40ms延時
void fendu_val(void);//分度數(shù)運算
void check_canshu(void);//讀參數(shù),并校驗是否正確
void ver_disp(void);//顯示版本號
void seg_check(void);//筆畫檢測
/******************************************/
void main (void)
{
start_set(); //單片機初始化
beep_time=3; //開機鳴叫
flash_num=6; //沒有閃爍位
spi_sys(); //ad芯片初始化
check_canshu(); //讀參數(shù),并校驗是否正確
if(bdf.shuduval>2) //若是異常值,用默認值
bdf.shuduval=1;
addcount3=4;
bdf_dp_temp=bdf.dp; //保存小數(shù)點(標定修改參數(shù)時用)
bdf_dsel_temp=bdf.dsel;//保存分度值(標定修改參數(shù)時用)
key_scan(); //標定按鍵掃描
switch(key_temp) //功能鍵處理函數(shù)
{
case 0xc0:b_biaoding=1;task=bd_start ; break;//
default:
bdf.dp=0;
ver_disp();//顯示版本號
seg_check();//筆畫檢測
fendu_val();//分度數(shù)運算
zero_current=ad_steady;//保存當前零位值
task=fun_weight;
break;
}
do
{ //主循環(huán)程序
adc(); //A/D采樣
ad_processor();//數(shù)據(jù)處理
zero_follow(); //零位跟蹤程序
neima(); //內(nèi)碼計算
weight_disp(); //重量顯示
key_scan(); //按鍵掃描
(* task)(); //任務切換函數(shù)
}
while(1);
}
/*****************************************************************/
void fendu_val(void)//分度數(shù)運算
{ 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;//半個分度的原始碼
follow_bound=i*half_sel_bound;//計算零位跟蹤時的原始碼,按3000分度
time_weight=200;
}
/*****************************************************************/
void ver_disp(void)//顯示版本號及最大量程
{
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延時
beep_time=3;
led_disp(bdf.max_weight,5);//顯示最大量程
weight_led[0]=15;// F
delay60ms(20);//40ms延時
4.2信號采樣與A/D轉換子程序的設計
如圖 4-3 信號采樣與A/D轉換子程序的設計
extern uchar code adcount2[3];
extern bit bAd;//已產(chǎn)生AD值
extern bit b_warnled;
extern bit b_steady;
extern bit b_up_last;
extern uchar adup_count;
extern ulong idata ad_steady;//AD數(shù)據(jù)處理后的穩(wěn)定值
extern uchar add_count;//AD累加計數(shù)器
extern ulong idata add_val;//AD累加值
extern uchar wdcount;
extern uchar adup_count;//AD異常值計數(shù)
extern uchar addcount3;
extern ulong idata up_val;
extern ulong idata adval;//AD芯片采樣值
extern ulong idata lvbo[6];
extern uchar idata follow_time;//零位跟蹤時間
extern uchar idata time_weight;//重量為0時,消隱時間
void time(void);
ulong buf_left(ulong temp);
/*******************************************/
//
void ad_processor(void)
{ ulong temp1;
ulong temp2;
uchar i;
bit b_up;
if(bAd)
{
bAd=0;
time();//時間計數(shù)器自減
//--------------------------------------------------------
adval=adval>>4;
add_val=add_val+adval;//傳感器累加濾波
add_count++;
if(add_count
>16)+1;
4.3 鍵盤/顯示子程序設計
如圖 4-4 鍵盤/顯示子程序設計
如圖 4-5 按鍵掃描流程圖
程序清單
extern bit b_keyok;//有按鍵產(chǎn)生標記
extern bit b_longdown;//長按下標記
extern uchar key_num;//鍵值
extern uchar key_temp;//臨時鍵值
extern uchar key_count;//鍵長按計數(shù)
extern uchar key_dly;//鍵去抖動延時
extern uchar beep_time;//蜂鳴時間
void key_scan1();////按鍵松開或沒有按下處理
/****************************************************/
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ù)點
temp=0x08;//小數(shù)點段碼
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;}//不鳴叫時置高,減小電流
if(key_dly)//按鍵去抖動延時
key_dly--;
if(flash_num<6)
{
if(flash_time)//閃爍計時
flash_time--;
else
{ b_flash=!b_flash;flash_time=20;}//時間到,置閃爍標記
}
}
TH1 =0xf8;
TL1 =0x18;
TR1 =1 ;
}
參 考 文 獻
1、 馬心凱.基于FPGA的實用電子秤[J],低壓電器,2006
2、 康華光.電子技術基礎[M].模擬部分.高等教育出版社,1998
3、 于敬芬.基于AT89S52和TLC0834的數(shù)據(jù)采集系統(tǒng)[J].中國水運(學術版),2006
4、 王幸之.AT89系列單片機原理及接口技術[M].北京航天航空出版社,2006
5、 康華光.電子技術基礎[M].數(shù)字部分.高等教育出版社,1998
6、 王素珍,鄭淑芬,周梅.稱重配料系統(tǒng)傳感器電源及放大電路[J].傳感器技術,2006
7、 周立功.單片機ZLG7289B串行接口LED數(shù)碼管及鍵盤管理器件數(shù)據(jù)手冊
8、 胡漢才.單片機原理及系統(tǒng)設計[M].清華大學出版社,2002
9、 王福瑞.集成電路器件大全[M].北京航天航空出版社,1999
10、夏路易.電路原理圖與電路板設計教程Protel99se[M].北京希望電子出版社,2002
11、Theodore Wildi.Electrical machine,and power system[M],2002
附錄A:原理圖
27