基于51单片机的电子秤设计
摘要
電子秤是將檢測與轉換技術、計算機技術、信息處理、數字技術等技術綜合一體的現代新型稱重儀器。它與我們日常生活緊密結合息息相關。
電子稱主要以單片機作為中心控制單元,通過稱重傳感器進行模數轉換單元,在配以鍵盤、顯示電路及強大軟件來組成。電子稱不但計量準確、快速方便,更重要的自動稱重、數字顯示,對人們生活的影響越來越大,廣受歡迎。
本系統的設計主要從硬件電路設計,軟件編程調試,實物焊接調試三部分進行詳細闡述。硬件電路主要是基于單片機STC89C52為核心的控制單元實現數據的處理,采用壓力傳感器對數據進行采集,電子秤專用24位AD轉換芯片HX711對傳感器采集到的模擬量進行AD轉換,轉換后的數據送到單片機進行處理顯示,數據顯示由LCD1602液晶實現,液晶顯示效果穩定無閃爍。
緒論
稱重技術自古以來就被人們所重視,作為一種計量手段,廣泛應用于工農業、科研、交通、內外貿易等各個領域,與人民的生活緊密相連。電子秤是電子衡器中的一種,衡器是國家法定計量器具,是國計民生、國防建設、科學研究、內外貿易不可缺少的計量設備,衡器產品技術水平的高低,將直接影響各行各業的現代化水平和社會經濟效益的提高。稱重裝置不僅是提供重量數據的單體儀表,而且作為工業控制系統和商業管理系統的一個組成部分,推進了工業生產的自動化和管理的現代化,它起到了縮短作業時間、改善操作條件、降低能源和材料的消耗、提高產品質量以及加強企業管理、改善經營管理等多方面的作用。稱重裝置的應用已遍及到國民經濟各領域,取得了顯著的經濟效益。
電子秤是稱重技術中的一種新型儀表,廣泛應用于各種場合。電子秤與機械秤比較有體積小、重量輕、結構簡單、價格低、實用價值強、維護方便等特點,可在各種環境工作,重量信號可遠傳,易于實現重量顯示數字化,易于與計算機聯網,實現生產過程自動化,提高勞動生產率。從世界水平看,衡器技術已經經歷了四個階段,從傳統的全部由機械元器件組成的機械稱到用電子線路代替部分機械元器件的機電結合秤,再從集成電路式到目前的單片機系統設計的電子計價秤。我國電子衡器從最初的機電結合型發展到現在的全電子型和數字智能型?,F今電子衡器制造技術及應用得到了新發展:電子稱重技術從靜態稱重向動態稱重發展;計量方法從模擬測量向數字測量發展;測量特點從單參數測量向多參數測量發展。常規的測試儀器儀表和控制裝置被更先進的智能儀器所取代,使得傳統的電子測量儀器在遠離、功能、精度及自動化水平定方面發生了巨大變化,并相應的出現了各種各樣的智能儀器控制系統,使得科學實驗和應用工程的自動化程度得以顯著提高。
電子稱重的實現首先是通過壓力傳感器采集到被測物體的重量并將其轉換成電壓信號。輸出電壓信號通常很小,需要通過前端信號處理電路進行準確的線性放大。放大后的模擬電壓信號經A/D轉換電路轉換成數字量被送入到主控電路的單片機中,再經過單片機控制譯碼顯示器,從而顯示出被測物體的重量。按照設計的基本要求,系統可分為三大模塊,數據采集模塊、控制器模塊、人機交互液晶顯示界面模塊。其中數據采集模塊由壓力傳感器、信號的前級處理和A/D轉換部分組成。轉換后的數字信號送給控制器處理,由控制器完成對該數字量的處理,驅動顯示模塊完成人機間的信息交換。此部分對軟件的設計要求比較高,系統的大部分功能都需要軟件來控制。在擴展功能上,本設計增加了一個過載報警提示功能使本電子稱的設計更人性化智能化。
系統硬件設計方案
系統總體設計方案比較
在設計系統時,針對各個模塊實現的功能來設計電子秤的方案有以下幾種:
方案一 數碼管顯示:
此方案利用數碼管顯示物體重量,簡單可行,可以采用內部帶有模數轉換功能的單片機。由此設計出的電子秤系統,硬件部分簡單,接口電路易于實現,并且在編程時大大減少程序量,在電路結構上只有簡單的輸出輸入關系。缺點是:硬件部分簡單,雖然可以實現電子稱基本的稱重功能,但是不能實現外部數據的輸入,無法根據實際情況靈活地設定各種控制參數。由于數碼管只能實現簡單的數字和英文字符的顯示,不能顯示漢字以及其他的復雜字符,不能達到顯示購物清單的要求。又因為采用了具有模數轉換功能的單片機,系統電路過于簡單,系統硬件的擴展必受到限制,電子秤的功能過于單一,達不到設計的標準。
方案二 在前一種方案的基礎上進行擴展,增加一鍵盤輸入裝置,增加外界對單片機內部的數據設定,使電子稱實現稱重計價的功能。
結構簡圖如圖2所示:
此方案設計的電子秤,可以實現稱物計價功能,但是局限于數碼管的功能,在顯示時只能顯示單價、購物總額以及簡單的貨物代碼等。在顯示重量時,如果數碼管沒有足夠的位數,那么稱量物體重量的精度必受到限制,所以此方案需要較多的數碼管接入電路中。這樣在處理輸入輸出接口時需要另行擴展足夠多的I/O接口供數碼管使用,比較麻煩。
方案三 前端信號處理時,選用放大、信號轉換等措施來增加信號采集強度但會增加相應的設計成本;顯示方面采用具有字符圖文顯示功能的LCD顯示器。這種方案不僅加強了人機交換的能力,而且滿足設計要求,可以顯示購物清單、所稱量的物體信息等相關內容,當需要增加擴展功能時可以通過切換液晶顯示界面的方式來實現。
鑒于上述三種方案的優缺點,本系統在設計時充分考慮到系統的實用性及成本的可行性的前提下,設計完成了最終的電子稱方案,最終的硬件設計方案圖如圖4所示,
系統元器件選型及器件參數介紹
傳感器選擇
壓電傳感器是一種典型的有源傳感器,又稱自發電式傳感器。其工作原理是基于某些材料受力后在其相應的特定表面產生電荷的壓電效應。
壓電傳感器體積小、重量輕、結構簡單、工作可靠,適用于動態力學量的測量,不適合測頻率太低的被測量,更不能測靜態量。目前多用于加速度和動態力或壓力的測量。壓電器件的弱點:高內阻、小功率。功率小,輸出的能量微弱,電纜的分布電容及噪聲干擾影響輸出特性,這對外接電路要求很高。
電阻應變式傳感器是一種利用電阻應變效應,將各種力學量轉換為電信號的結構型傳感器。電阻應變片式電阻應變式傳感器的核心元件,其工作原理是基于材料的電阻應變效應,電阻應變片即可單獨作為傳感器使用,又能作為敏感元件結合彈性元件構成力學量傳感器。
導體的電阻隨著機械變形而發生變化的現象叫做電阻應變效應。電阻應變片把機械應變信號轉換為△R/R后,由于應變量及相應電阻變化一般都很微小,難以直接精確測量,且不便處理。因此,要采用轉換電路把應變片的△R/R變化轉換成電壓或電流變化。其轉換電路常用測量電橋。
直流電橋的特點是信號不會受各元件和導線的分布電感及電容的影響,抗干擾能力強,但因機械應變的輸出信號小,要求用高增益和高穩定性的放大器放大。
圖5為一直流供電的平衡電阻電橋, 接直流電源E:
當電橋輸出端接無窮大負載電阻時,可視輸出端為開路,此時直流電橋稱為電壓橋,即只有電壓輸出。
顯示器選擇
方案一 數碼管顯示
數碼管是一種半導體發光器件,其基本單元是發光二極管。數碼管按段數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等等數碼管;按發光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極(COM)的數碼管。共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮。當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極(COM)的數碼管。共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段就點亮。當某一字段的陽極為低電平時,相應字段就不亮。
數碼管顯示信息有限,當顯示信息較多時需要多個數碼管級聯方可,這樣會造成硬件連接復雜,成本增加;數碼管對大部分字符不能很好的顯示,動態掃描時處理不好易出現閃爍現象。
方案二 LCD字符液晶顯示
采用點陣字符型 LCD 液晶顯示,液晶顯示模塊具有體積小、功耗低、顯示內容豐富等特點,現在字符型液晶顯示模塊已經是單片機應用設計中最常用的信息顯示器件,但采用LCD液晶顯示會造成設計成本增加。
LCD1602可以顯示2行 16 個字符,有 8 位數據總線 D0-D7,和 RS、R/W、 EN 三個控制端口,工作電壓為 5V,并且帶有字符對比度調節和背光[4]。
LCD1602 液晶模塊內部的字符發生存儲器(CGROM)已經存儲了 160 個不同 的點陣字符圖形,如表 1 所示,這些字符有:阿拉伯數字、英文字母的大小寫、 常用的符號、和日文假名等,每一個字符都有一個固定的代碼,它的讀寫操作、 屏幕和光標的操作都是通過指令編程來實現的。
最后綜合了多方面因素的考慮采用了方案二,選擇 LCD1602 顯示器作為系統的顯示界面。
AD轉換芯片
HX711是一款專為高精度電子秤而設計的24位A/D轉換器芯片。與同類型其它芯片相比,該芯片集成了包括穩壓電源、片內時鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應速度快、抗干擾性強等優點。降低了電子秤的整機成本,提高了整機的性能和可靠性。該芯片與后端MCU 芯片的接口和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的寄存器編程。輸入選擇開關可任意選取通道A 或通道B,與其內部的低噪聲可編程放大器相連。通道A 的可編程增益為128 或64,對應的滿額度差分輸入信號幅值分別為±20mV或±40mV。通道B 則為固定的64 增益,用于系統參數檢測。芯片內提供的穩壓電源可以直接向外部傳感器和芯片內的A/D 轉換器提供電源,系統板上無需另外的模擬電源。芯片內的時鐘振蕩器不需要任何外接器件。上電自動復位功能簡化了開機的初始化過程。芯片管腳圖如圖7所示。
系統硬件電路
系統硬件電路設計
由于該系統中 51 單片機及 AD 轉換芯片及液晶顯示器所需供電電壓均為 5V 電壓,所以要保證系統穩定可靠的工作,需要設計一個可以穩定提供 5V 電壓的供電系統。本設計采用USB供電方式,USB 接口供電方便程序調試,電源輸接口加上LED 電源指示燈,用來判定電源是否正常工作。該系統電源電路設計如圖 11 所示。
單片機控制電路設計
系統主控電路由STC89C52單片機及晶振電路和復位電路組成,該電路作為整個系統功能實現的核心單元,其連接方式如圖14所示。
晶振全稱為晶體振蕩器,其作用在于產生原始的時鐘頻率,這個頻率經過頻率發生器的放大或縮小后就成了電腦中各種不同的總線頻率。晶振一般叫做晶體諧振器,是一種機電器件,是用電損耗很小的石英晶體經精密切割磨削并鍍上電極焊上引線做成。這種晶體有一個很重要的特性,如果給它通電,它就會產生機械振蕩,反之,如果給它機械力,它又會產生電,這種特性叫機電效應。他們有一個很重要的特點,其振蕩頻率與他們的形狀,材料,切割方向等密切相關。由于石英晶體化學性能非常穩定,熱膨脹系數非常小,其振蕩頻率也非常穩定,由于控制幾何尺寸可以做到很精密,因此,其諧振頻率也很準確。根據石英晶體的機電效應,我們可以把它等效為一個電磁振蕩回路,即諧振回路。他們的機電效應是機-電-機-電…的不斷轉換,由電感和電容組成的諧振回路是電場-磁場的不斷轉換。在電路中的應用實際上是把它當作一個高Q值的電磁諧振回路。由于石英晶體的損耗非常小,即Q值非常高,做振蕩器用時,可以產生非常穩定的振蕩,作濾波器用,可以獲得非常穩定和陡削的帶通或帶阻曲線[10]。
復位電路是用來讓單片機返回到初始狀態的輔助電路,其作用是當單片機程序跑飛或系統出現死機狀態時可以讓系統從新恢復工作。本系統復位電路的設計為上電復位復位方式。按鍵復位就沒有太大必要使用看,所以沒有設計按鍵復位。
系統顯示電路設計
顯示部分采用LCD1602液晶顯示模塊,液晶板上排列著若干 5×7或 5×10點陣的字符顯示位,每個顯示位可顯示1個字符,從規格上分為每行 8、16、20、24、32、40位,有一行、兩行及四行三類。其與單片機的連接電路如圖15所示
1腳和2腳為液晶1602地和電源引腳,3腳為背光調節引腳,通過10K電位器接地,背光可通過電位器來調節亮度;4腳、5腳、6腳為液晶片選控制引腳,分別連接到單片機的P2.5、P2.6、P2,7端口,7~14腳為數據接口,與單片機的P0口相連實現數據的傳輸,15、16、腳為液晶的背光控制腳,分別接到電源和地[9]。
超重報警電路設計
報警指示電路用來在稱重測量超出最高值時報警提示,以免重量太高的情況下損壞傳感器。報警指示電路由PNP三極管9S8550驅動蜂鳴器來實現,單片機IO口控制三極管的基極,當單片機的IO口輸出為低電平時,三極管導通,蜂鳴器的正極與電源接通,蜂鳴器通電發出報警聲,當單片機IO口輸出高電平時,三極管截止,蜂鳴器停止報警。報警指示電路如圖16所示。
按鍵輸入電路設計
按鍵輸入電路用來在電子稱測量過程中輸入單價值,按鍵輸入電路采用4*4矩陣鍵盤實現,矩陣鍵盤電路如圖17所示。
此電子秤是開機檢測托盤重量,并將托盤重量清零(即電子秤每次開機后檢測托盤重量,并程序中自動將托盤重量保存在一個變量中,稱量過程中每次都將獲得的重量減去托盤重量,而得到所要稱量物體的真正的重量),
計算功能:在正確輸入了單價之后,按下計算按鍵,將會計算出金額,并在液晶顯示器上顯示出重量、單價、總價。
系統軟件
主程序
顯示部分
按鍵檢測
系統整體調試
硬件電路調試中遇到的問題
1、電子電路的設計中對各種影響因素的考慮不夠完全,比如在對過電壓情況的處理中未作防范措施。
2、系統設計不夠優化,有待改善。比如系統的超量程信號直接由單片機送入報警電路,沒有設計保護電路再入單片機處理后送入報警電路。
3、沒有擴展更多電路,如溫度顯示功能,通訊接口電路與上位機(PC機)進行通訊,上位機顯示功能從而將大量的商品數據存于上位機,然后通過串口或并口通訊與電子稱相連,達到遠距離控制的目的。
4、對各種實用芯片價格了解不夠,選擇上任有欠缺,如所選的稱重傳感器價格較貴。
這些都為我今后的學習和工作留下了積極的影響。
系統實物調試效果圖
代碼
#include "main.h" #include "LCD1602.h" #include "HX711.h"unsigned long HX711_Buffer = 0; unsigned long Weight_Maopi = 0,Weight_Shiwu = 0; char Price_Count = 0; unsigned char KEY_NUM = 0; unsigned char Price_Buffer[3] = {0x00,0x00,0x00}; unsigned long Money = 0; bit Flag_OK = 0;//**************************************************** //主函數 //**************************************************** void main() {char k = 10 ;Init_LCD1602(); //初始化LCD1602LCD1602_write_com(0x80); //指針設置LCD1602_write_word(" Hello Welcome"); //開機畫面第一行Delay_ms(800); //延時1sLCD1602_write_com(0x80+0x40); //指針設置LCD1602_write_word(" ");Get_Maopi(); //稱毛皮重量Delay_ms(1000); //延時1sInit_LCD1602(); //初始化LCD1602 消除之前的顯示內容loop:Price_Count = 0;Price_Buffer[0] = 0;Price_Buffer[1] = 0;Price_Buffer[2] = 0;Flag_OK = 0;LCD1602_write_com(0x80); //指針設置LCD1602_write_word(" W: Kg");LCD1602_write_com(0x80+0x40); //指針 LCD1602_write_word("P: . Z: ");LCD1602_write_com(0x80+0x40+6); //指針 LCD1602_write_data(0x5c);LCD1602_write_com(0x80+0x40+15); //指針 LCD1602_write_data(0x5c);Get_Maopi(); //稱毛皮重量while(1){if( Flag_OK == 0){if( k == 0)Get_Weight(); //稱重k--;if( k < 0){k = 10;}//顯示當前重量LCD1602_write_com(0x86);LCD1602_write_data(Weight_Shiwu/1000 + 0x30);LCD1602_write_data('.');LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);LCD1602_write_data(Weight_Shiwu%10 + 0x30);}KEY_NUM = KEY_Scan();if( KEY_NUM != 0x55) //當返回的不是初值時候,確認按鍵按下。{if(KEY_NUM == 16) //數字A鍵,去皮功能{Get_Maopi(); //去皮 }if(KEY_NUM == 15) //數字B鍵清除鍵,二次測量{goto loop; }if(KEY_NUM == 12) //數字C輸入單價錯誤時返回上一步{Price_Count--;if( Price_Count < 0){Price_Count = 0;}Price_Buffer[Price_Count] = 0; //清除上一個輸入的數據switch(Price_Count){case 0:LCD1602_write_com(0x80+0x40+2);LCD1602_write_data(' ');break;case 1:LCD1602_write_com(0x80+0x40+3);LCD1602_write_data(' ');break;case 2:LCD1602_write_com(0x80+0x40+5);LCD1602_write_data(' ');break;default : break;} }if(KEY_NUM == 13) //數字D鍵,計算總價{Money = Price_Buffer[0] * 100 + Price_Buffer[1] * 10 + Price_Buffer[2]; Money = Money * Weight_Shiwu / 1000;LCD1602_write_com(0x80+0x40+10);LCD1602_write_data(Money/1000 + 0x30); LCD1602_write_data(Money%1000/100 + 0x30);LCD1602_write_data(Money%100/10 + 0x30);LCD1602_write_data('.');LCD1602_write_data(Money%10 + 0x30);Flag_OK = 1; }if(KEY_NUM >= 0 && KEY_NUM <= 9) //顯示輸入的價格值{Price_Buffer[Price_Count] = KEY_NUM;switch(Price_Count){ LCD1602_write_com(0x80+0x40); //指針 LCD1602_write_word("P: . Z: ");case 0:LCD1602_write_com(0x80+0x40+2);LCD1602_write_data(Price_Buffer[0] + 0x30);break;case 1:LCD1602_write_com(0x80+0x40+3);LCD1602_write_data(Price_Buffer[1] + 0x30);break;case 2:LCD1602_write_com(0x80+0x40+5);LCD1602_write_data(Price_Buffer[2] + 0x30);break;default : break;}Price_Count++;if( Price_Count >= 3){Price_Count = 3;}}}} }//**************************************************** //矩陣鍵盤掃描 //**************************************************** unsigned char KEY_Scan() {unsigned char temp = 0;unsigned char com = 0x55 , com1 = 0 , com2 = 0;P3=0xf0;if(P3!=0xf0){com1=P3;P3=0x0f;com2=P3; }P3=0xf0;while(P3!=0xf0); temp=com1|com2;if(temp==0xee)com=1;//數字1if(temp==0xed)com=4;//數字4if(temp==0xeb)com=7;//數字7if(temp==0xe7)com=11;//備用鍵*號鍵if(temp==0xd7)com=0;//數字0if(temp==0xb7)com=14;//備用鍵*號鍵if(temp==0xde)com=2; //數字2if(temp==0xdd)com=5; //數字5if(temp==0xdb)com=8;//數字8if(temp==0xbe)com=3;//數字3if(temp==0xbd)com=6; //數字6if(temp==0xbb)com=9;//數字9if(temp==0x7e)com=16;//數字A鍵,去皮功能 if(temp==0x7d)com=15;//數字B鍵清除鍵,二次測量if(temp==0x7b)com=12;//數字C輸入單價錯誤時返回上一步if(temp==0x77)com=13;//數字D鍵,計算總價 return(com); }//**************************************************** //稱重 //**************************************************** void Get_Weight() {HX711_Buffer = HX711_Read();HX711_Buffer = HX711_Buffer/100;if(HX711_Buffer > Weight_Maopi) {Weight_Shiwu = HX711_Buffer;Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //獲取實物的AD采樣數值。Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.40+0.05); //計算實物的實際重量//因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的4.30這個除數。//當發現測試出來的重量偏大時,增加該數值。//如果測試出來的重量偏小時,減小改數值。//該數值一般在4.0-5.0之間。因傳感器不同而定。//+0.05是為了四舍五入百分位Buzzer = 1; //關閉警報} // else if(HX711_Buffer < Weight_Maopi - 30) // { // Buzzer = 0; //負重量報警 // } // else if(HX711_Buffer > Weight_Maopi + 24970) //大于5Kg的最大量程,報警 // { // Buzzer = 0; // }if(Weight_Shiwu > 5000 || HX711_Buffer < Weight_Maopi - 30){Buzzer = 0; }else{Buzzer = 1;}}//**************************************************** //獲取毛皮重量 //**************************************************** void Get_Maopi() {HX711_Buffer = HX711_Read();Weight_Maopi = HX711_Buffer/100; } //**************************************************** //MS延時函數(12M晶振下測試) //**************************************************** void Delay_ms(unsigned int n) {unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<123;j++); }系統電路圖
總結
以上是生活随笔為你收集整理的基于51单片机的电子秤设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zigbee协议栈无线通信系统
- 下一篇: 数学建模系列-优化模型(三)---排队论