久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3679|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機的電子稱設計報告(word格式文檔下載)

[復制鏈接]
跳轉到指定樓層
樓主
ID:370073 發表于 2018-7-12 20:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個基于51單片機電子秤的報告,希望對有需要的人有幫助。

摘要
電子秤是將檢測與轉換技術、計算機技術、信息處理、數字技術等技術綜合一體的現代新型稱重儀器。它與我們日常生活緊密結合息息相關。
電子稱主要以單片機作為中心控制單元,通過稱重傳感器進行模數轉換單元,在配以鍵盤、顯示電路及強大軟件來組成。電子稱不但計量準確、快速方便,更重要的自動稱重、數字顯示,對人們生活的影響越來越大,廣受歡迎。
本系統的設計主要從硬件電路設計,軟件編程調試,實物焊接調試三部分進行詳細闡述。硬件電路主要是基于單片機STC89C52為核心的控制單元實現數據的處理,采用壓力傳感器對數據進行采集,電子秤專用24位AD轉換芯片HX711對傳感器采集到的模擬量進行AD轉換,轉換后的數據送到單片機進行處理顯示,數據顯示由LCD1602液晶實現,液晶顯示效果穩定無閃爍。

1緒論
2 系統硬件方案設計
2.1系統總體設計方案比較與論證
2.2系統元器件選型及器件參數介紹
2.2.1單片機選型
2.2.2傳感器選擇
2.2.3 顯示器選擇
2.2.4 AD轉換芯片選擇
3系統硬件電路設計
3.1系統電源電路設計
3.3單片機控制電路設計
3.4系統顯示電路設計
3.5超重報警提示電路設計
3.6按鍵輸入電路設計
4 系統軟件設計
4.1系統主程序軟件流程圖
4.2系統顯示部分流程圖
4.3系統按鍵檢測部分流程圖
5 系統整體調試
5.1硬件電路調試中遇到的問題
5.2系統實物調試效果圖
5.3系統設計總結
參考文獻
附錄
附錄1系統整體電路圖
附錄2系統部分源程序
致 謝

1緒論
    稱重技術自古以來就被人們所重視,作為一種計量手段,廣泛應用于工農業、科研、交通、內外貿易等各個領域,與人民的生活緊密相連。電子秤是電子衡器中的一種,衡器是國家法定計量器具,是國計民生、國防建設、科學研究、內外貿易不可缺少的計量設備,衡器產品技術水平的高低,將直接影響各行各業的現代化水平和社會經濟效益的提高。稱重裝置不僅是提供重量數據的單體儀表,而且作為工業控制系統和商業管理系統的一個組成部分,推進了工業生產的自動化和管理的現代化,它起到了縮短作業時間、改善操作條件、降低能源和材料的消耗、提高產品質量以及加強企業管理、改善經營管理等多方面的作用。稱重裝置的應用已遍及到國民經濟各領域,取得了顯著的經濟效益。
電子秤是稱重技術中的一種新型儀表,廣泛應用于各種場合。電子秤與機械秤比較有體積小、重量輕、結構簡單、價格低、實用價值強、維護方便等特點,可在各種環境工作,重量信號可遠傳,易于實現重量顯示數字化,易于與計算機聯網,實現生產過程自動化,提高勞動生產率。從世界水平看,衡器技術已經經歷了四個階段,從傳統的全部由機械元器件組成的機械稱到用電子線路代替部分機械元器件的機電結合秤,再從集成電路式到目前的單片機系統設計的電子計價秤。我國電子衡器從最初的機電結合型發展到現在的全電子型和數字智能型。現今電子衡器制造技術及應用得到了新發展:電子稱重技術從靜態稱重向動態稱重發展;計量方法從模擬測量向數字測量發展;測量特點從單參數測量向多參數測量發展。常規的測試儀器儀表和控制裝置被更先進的智能儀器所取代,使得傳統的電子測量儀器在遠離、功能、精度及自動化水平定方面發生了巨大變化,并相應的出現了各種各樣的智能儀器控制系統,使得科學實驗和應用工程的自動化程度得以顯著提高。
電子稱重的實現首先是通過壓力傳感器采集到被測物體的重量并將其轉換成電壓信號。輸出電壓信號通常很小,需要通過前端信號處理電路進行準確的線性放大。放大后的模擬電壓信號經A/D轉換電路轉換成數字量被送入到主控電路的單片機中,再經過單片機控制譯碼顯示器,從而顯示出被測物體的重量。按照設計的基本要求,系統可分為三大模塊,數據采集模塊、控制器模塊、人機交互液晶顯示界面模塊。其中數據采集模塊由壓力傳感器、信號的前級處理和A/D轉換部分組成。轉換后的數字信號送給控制器處理,由控制器完成對該數字量的處理,驅動顯示模塊完成人機間的信息交換。此部分對軟件的設計要求比較高,系統的大部分功能都需要軟件來控制。在擴展功能上,本設計增加了一個過載報警提示功能使本電子稱的設計更人性化智能化。
2 系統硬件方案設計
2.1系統總體設計方案比較與論證
在設計系統時,針對各個模塊實現的功能來設計電子秤的方案有以下幾種:
方案一  數碼管顯示:

1 數碼管顯示方案

此方案利用數碼管顯示物體重量,簡單可行,可以采用內部帶有模數轉換功能的單片機。由此設計出的電子秤系統,硬件部分簡單,接口電路易于實現,并且在編程時大大減少程序量,在電路結構上只有簡單的輸出輸入關系。缺點是:硬件部分簡單,雖然可以實現電子稱基本的稱重功能,但是不能實現外部數據的輸入,無法根據實際情況靈活地設定各種控制參數。由于數碼管只能實現簡單的數字和英文字符的顯示,不能顯示漢字以及其他的復雜字符,不能達到顯示購物清單的要求。又因為采用了具有模數轉換功能的單片機,系統電路過于簡單,系統硬件的擴展必受到限制,電子秤的功能過于單一,達不到設計的標準。
方案二  在前一種方案的基礎上進行擴展,增加一鍵盤輸入裝置,增加外界對單片機內部的數據設定,使電子稱實現稱重計價的功能。
結構簡圖如圖2所示:

2帶有鍵盤輸入的結構簡圖


此方案設計的電子秤,可以實現稱物計價功能,但是局限于數碼管的功能,在顯示時只能顯示單價、購物總額以及簡單的貨物代碼等。在顯示重量時,如果數碼管沒有足夠的位數,那么稱量物體重量的精度必受到限制,所以此方案需要較多的數碼管接入電路中。這樣在處理輸入輸出接口時需要另行擴展足夠多的I/O接口供數碼管使用,比較麻煩。
方案三 前端信號處理時,選用放大、信號轉換等措施來增加信號采集強度但會增加相應的設計成本;顯示方面采用具有字符圖文顯示功能的LCD顯示器。這種方案不僅加強了人機交換的能力,而且滿足設計要求,可以顯示購物清單、所稱量的物體信息等相關內容,當需要增加擴展功能時可以通過切換液晶顯示界面的方式來實現。
結構簡圖如下圖3所示:

3帶有鍵盤輸入及液晶顯示的結構簡圖


鑒于上述三種方案的優缺點,本系統在設計時充分考慮到系統的實用性及成本的可行性的前提下,設計完成了最終的電子稱方案,最終的硬件設計方案圖如圖4所示,




3系統設計硬件框圖

2.2系統元器件選型及器件參數介紹2.2.1單片機選型

單片機的選擇在整個系統設計中至關重要,要滿足大內存、高速率、通用性、價格便宜等要求,鑒于以上考慮本課題選擇ST89C52作為整個系統的主控芯片。

ST89C52是一個低功耗,高性能CMOS 8位單片機,片內含8k Bytes ISP(In-system programmable)的可反復擦寫10000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構[1],芯片內集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的ST89C52可為許多嵌入式控制應用系統提供高性價比的解決方案。ST89C52芯片具有以下特性[2]:

①指令集和芯片引腳與Intel公司的8051兼容;

②8KB片內在系統可編程Flash程序存儲器;

③時鐘頻率為0~33MHz;

④128字節片內隨機讀寫存儲器(RAM);

⑤32個可編程輸入/輸出引腳;

⑥2個16位定時/計數器;

⑦6個中斷源,2級優先級;

⑧全雙工串行通信接口;

⑨監視定時器;

⑩2個數據指針。

ST89C52單片機的40個引腳中有2個專用于主電源引腳,2個外接晶振的引腳,4個控制或與其它電源復用的引腳,以及32條輸入輸出I/O引腳。

ST89C52單片機引腳圖如圖4所示:



圖4 ST89C52單片機引腳圖
2.2.2傳感器選擇   
壓電傳感器是一種典型的有源傳感器,又稱自發電式傳感器。其工作原理是基于某些材料受力后在其相應的特定表面產生電荷的壓電效應。
壓電傳感器體積小、重量輕、結構簡單、工作可靠,適用于動態力學量的測量,不適合測頻率太低的被測量,更不能測靜態量。目前多用于加速度和動態力或壓力的測量。壓電器件的弱點:高內阻、小功率。功率小,輸出的能量微弱,電纜的分布電容及噪聲干擾影響輸出特性,這對外接電路要求很高。
電阻應變式傳感器是一種利用電阻應變效應,將各種力學量轉換為電信號的結構型傳感器。電阻應變片式電阻應變式傳感器的核心元件,其工作原理是基于材料的電阻應變效應,電阻應變片即可單獨作為傳感器使用,又能作為敏感元件結合彈性元件構成力學量傳感器。
導體的電阻隨著機械變形而發生變化的現象叫做電阻應變效應。電阻應變片把機械應變信號轉換為△R/R后,由于應變量及相應電阻變化一般都很微小,難以直接精確測量,且不便處理。因此,要采用轉換電路把應變片的△R/R變化轉換成電壓或電流變化。其轉換電路常用測量電橋。
直流電橋的特點是信號不會受各元件和導線的分布電感及電容的影響,抗干擾能力強,但因機械應變的輸出信號小,要求用高增益和高穩定性的放大器放大。
圖5為一直流供電的平衡電阻電橋,接直流電源E:










   


圖5 傳感器內部連接圖
當電橋輸出端接無窮大負載電阻時,可視輸出端為開路,此時直流電橋稱為電壓橋,即只有電壓輸出。
當忽略電源的內阻時,由分壓原理有:

=                                   (2.1)

當滿足條件R1R3=R2R4時,即
(2.2)

=0,即電橋平衡。式(2.2)稱平衡條件。
應變片測量電橋在測量前使電橋平衡,從而使測量時電橋輸出電壓只與應變片感受的應變所引起的電阻變化有關。
若差動工作,即R1=R-△R,R2=R+△R,R3=R-△R,R4=R+△R,按式(2.1),則電橋輸出為


                                       (2.3)

應變片式傳感器有如下特點:
(1)應用和測量范圍廣,應變片可制成各種機械量傳感器。
(2)分辨力和靈敏度高,精度較高。
(3)結構輕小,對試件影響小, 對復雜環境適應性強,可在高溫、高壓、強磁場等特殊環境中使用,頻率響應好。
(4)商品化,使用方便,便于實現遠距離、自動化測量[5]。
通過對壓力傳感器與電阻應變式傳感器比較分析,最終選擇了第二種方案。題目要求稱重范圍0~5Kg,滿量程量誤差不大于0.005Kg,考慮到秤臺自重、振動和沖擊分量,還要避免超重損壞傳感器,所以傳感器量程必須大于額定稱重5Kg。我們選擇的是電阻應變片壓力傳感器,量程為5Kg,精度為0.01% ,滿足本系統的精度要求。
2.2.3 顯示器選擇

方案一 數碼管顯示

數碼管是一種半導體發光器件,其基本單元是發光二極管。數碼管按段數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發光二極管單元(多一個小數點顯示);按能顯示多少個“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]。

具體引腳說明如表圖6所示。

圖6 LCD1602字符液晶引腳定義

LCD1602 液晶模塊內部的字符發生存儲器(CGROM)已經存儲了 160 個不同 的點陣字符圖形,如表 1 所示,這些字符有:阿拉伯數字、英文字母的大小寫、 常用的符號、和日文假名等,每一個字符都有一個固定的代碼,它的讀寫操作、 屏幕和光標的操作都是通過指令編程來實現的。

最后綜合了多方面因素的考慮采用了方案二,選擇 LCD1602 顯示器作為系統的顯示界面。

2.2.4 AD轉換芯片選擇

HX711是一款專為高精度電子秤而設計的24位A/D轉換器芯片。與同類型其它芯片相比,該芯片集成了包括穩壓電源、片內時鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應速度快、抗干擾性強等優點。降低了電子秤的整機成本,提高了整機的性能和可靠性。該芯片與后端MCU 芯片的接口和編程非常簡單,所有控制信號由管腳驅動,無需對芯片內部的寄存器編程。輸入選擇開關可任意選取通道A 或通道B,與其內部的低噪聲可編程放大器相連。通道A 的可編程增益為128 或64,對應的滿額度差分輸入信號幅值分別為±20mV或±40mV。通道B 則為固定的64 增益,用于系統參數檢測。芯片內提供的穩壓電源可以直接向外部傳感器和芯片內的A/D 轉換器提供電源,系統板上無需另外的模擬電源。芯片內的時鐘振蕩器不需要任何外接器件。上電自動復位功能簡化了開機的初始化過程。芯片管腳圖如圖7所示。

圖7 HX711管腳定義

HX711典型應用電路如圖8所示。

圖8 HX711典型應用電路

3系統硬件電路設計3.1系統電源電路設計

由于該系統中 51 單片機及 AD 轉換芯片及液晶顯示器所需供電電壓均為 5V 電壓,所以要保證系統穩定可靠的工作,需要設計一個可以穩定提供 5V 電壓的供電系統。本設計采用USB供電方式,USB 接口供電方便程序調試,電源輸接口加上LED 電源指示燈,用來判定電源是否正常工作。該系統電源電路設計如圖 11 所示。

3.3單片機控制電路設計

系統主控電路由STC89C52單片機及晶振電路和復位電路組成,該電路作為整個系統功能實現的核心單元,其連接方式如圖14所示。

圖14單片機主控電路

晶振全稱為晶體振蕩器,其作用在于產生原始的時鐘頻率,這個頻率經過頻率發生器的放大或縮小后就成了電腦中各種不同的總線頻率。晶振一般叫做晶體諧振器,是一種機電器件,是用電損耗很小的石英晶體經精密切割磨削并鍍上電極焊上引線做成。這種晶體有一個很重要的特性,如果給它通電,它就會產生機械振蕩,反之,如果給它機械力,它又會產生電,這種特性叫機電效應。他們有一個很重要的特點,其振蕩頻率與他們的形狀,材料,切割方向等密切相關。由于石英晶體化學性能非常穩定,熱膨脹系數非常小,其振蕩頻率也非常穩定,由于控制幾何尺寸可以做到很精密,因此,其諧振頻率也很準確。根據石英晶體的機電效應,我們可以把它等效為一個電磁振蕩回路,即諧振回路。他們的機電效應是機-電-機-電..的不斷轉換,由電感和電容組成的諧振回路是電場-磁場的不斷轉換。在電路中的應用實際上是把它當作一個高Q值的電磁諧振回路。由于石英晶體的損耗非常小,即Q值非常高,做振蕩器用時,可以產生非常穩定的振蕩,作濾波器用,可以獲得非常穩定和陡削的帶通或帶阻曲線[10]。

復位電路是用來讓單片機返回到初始狀態的輔助電路,其作用是當單片機程序跑飛或系統出現死機狀態時可以讓系統從新恢復工作。本系統復位電路的設計為上電復位復位方式。按鍵復位就沒有太大必要使用看,所以沒有設計按鍵復位。

3.4系統顯示電路設計

顯示部分采用LCD1602液晶顯示模塊,液晶板上排列著若干 5×7或 5×10點陣的字符顯示位,每個顯示位可顯示1個字符,從規格上分為每行 8、16、20、24、32、40位,有一行、兩行及四行三類。其與單片機的連接電路如圖15所示

圖15系統狀態顯示電路圖

     1腳和2腳為液晶1602地和電源引腳,3腳為背光調節引腳,通過10K電位器接地,背光可通過電位器來調節亮度;4腳、5腳、6腳為液晶片選控制引腳,分別連接到單片機的P2.5、P2.6、P2,7端口,7~14腳為數據接口,與單片機的P0口相連實現數據的傳輸,15、16、腳為液晶的背光控制腳,分別接到電源和地[9]。


3.5超重報警提示電路設計

報警指示電路用來在稱重測量超出最高值時報警提示,以免重量太高的情況下損壞傳感器。報警指示電路由PNP三極管9S8550驅動蜂鳴器來實現,單片機IO口控制三極管的基極,當單片機的IO口輸出為低電平時,三極管導通,蜂鳴器的正極與電源接通,蜂鳴器通電發出報警聲,當單片機IO口輸出高電平時,三極管截止,蜂鳴器停止報警。報警指示電路如圖16所示。

圖16報警指示電路

3.6按鍵輸入電路設計

按鍵輸入電路用來在電子稱測量過程中輸入單價值,按鍵輸入電路采用4*4矩陣鍵盤實現,矩陣鍵盤電路如圖17所示。

圖17按鍵輸入電路

電子稱按鍵功能分配如下表所示:

            

此電子秤是開機檢測托盤重量,并將托盤重量清零(即電子秤每次開機后檢測托盤重量,并程序中自動將托盤重量保存在一個變量中,稱量過程中每次都將獲得的重量減去托盤重量,而得到所要稱量物體的真正的重量),

計算功能:在正確輸入了單價之后,按下計算按鍵,將會計算出金額,并在液晶顯示器上顯示出重量、單價、總價。

4 系統軟件設計

本電子稱設計采用C語言編程,編譯環境為keil UV3。

keil c51 是美國Keil Software 公司出品的51 系列兼容單片機C 語言軟件開發系統,和匯編相比,C 在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。

Keil c51 軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows 界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到keil c51 生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。

Keil C51 可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人員可用IDE 本身或其它編輯器編輯C 或匯編源文件,然后分別有C51 及A51 編輯器編譯連接生成單片機可執行的二進制文件(.HEX),然后通過單片機的燒寫軟件將HEX 文件燒入單片機內。軟件主要三個方面:一是初始化系統;二是按鍵檢測;三是數據采集、數據處理并進行顯示。這三個方面的操作分別在主程序中來進行。程序采用模塊化的結構,這樣程序結構清楚,易編程和易讀性好,也便于調試和修改。

4.1系統主程序軟件流程圖
系統軟件部分主程序流程圖如圖20所示。
圖20 系統主程序流程圖
4.2系統顯示部分流程圖
顯示子程序主要是來判斷是否需要顯示,以及如何去顯示,也是十分重要的程序之一。設計流程圖如圖21所示。

圖21 系統顯示部分流程圖
4.3系統按鍵檢測部分流程圖
鍵盤電路設計成4X4矩陣式,在程序中可以先判斷按鍵編碼,然后根據編碼將鍵盤代表的數值送到相應的存儲單元,再進行功能選擇或數據處理。設計流程圖如圖22所示。
圖22 按鍵檢測部分流程圖
5 系統整體調試
5.1硬件電路調試中遇到的問題
1、電子電路的設計中對各種影響因素的考慮不夠完全,比如在對過電壓情況的處理中未作防范措施。
2、系統設計不夠優化,有待改善。比如系統的超量程信號直接由單片機送入報警電路,沒有設計保護電路再入單片機處理后送入報警電路。
3、沒有擴展更多電路,如溫度顯示功能,通訊接口電路與上位機(PC機)進行通訊,上位機顯示功能從而將大量的商品數據存于上位機,然后通過串口或并口通訊與電子稱相連,達到遠距離控制的目的。
4、對各種實用芯片價格了解不夠,選擇上任有欠缺,如所選的稱重傳感器價格較貴。
這些都為我今后的學習和工作留下了積極的影響。
5.2系統實物調試效果圖

經過不懈的努力和導師的細心指導,實物最終得以調試成功,最終完成的實物效果圖如圖23所示。

   


     
圖23 效果圖

5.3系統設計總結

在此畢業設計過程中,鞏固了我在大學4年內學過的知識,尤其是單片機和C語言編程方面的知識,同時通過這次畢設提高了單片機編程的能力,尤其是獲得的軟件調試經驗,同時了解到了其它相關領域的知識,對今后的工作學習有著極大的幫助。

由于時間太倉促,經驗不足,理論方面也相應的存在不足,加上條件有限,仍存在著一些設計方面的問題,個人技能也有待提高。理論知識還要鞏固加強。但是寶貴的實踐經驗還是對自己的提高有著極大的幫助。


附錄
附錄1系統整體電路圖




致 謝
該電子秤控制系統的設計及論文的撰寫是在我的導師老師的精心指導和悉心關懷下完成的,從論文的選題、研究、撰寫到定稿,都得到了?老師細心指導。他寬厚待人,對學生關懷備至,在工作上精益求精,對學生嚴格要求,鼓勵學生學以致用,敢于實踐,勇于創新,在實踐中發現問題、解決問題。?老師具有豐富的科研經驗與理論水平,其開明的學術思想、求實的科研作風和對科學研究及發展趨勢的深刻認識給我以極大的影響、啟迪和熏陶,令我受益匪淺。該設計及論文的圓滿完成是和?老師的細心關懷分不開的。
在系統的設計和論文的研究工作中無不傾注著各位老師的心血和辛勤的汗水,各位老師嚴謹的治學態度、淵博的知識、生動而滿富激情的授課方式,讓我四年里學到了扎實的理論知識。從各位尊敬的老師身上,我不僅學到了扎實的專業知識和豐富的實踐技能,也學到了很多做人的道理。在此,向給予我指導和幫助的各位老師致以最衷心的感謝和深深的敬意!
在這四年多的學習和研究工作中,也得到了學院的師兄弟們的關心和熱心幫助,在此向他們表示由衷的感謝!
最后,衷心感謝在百忙中評閱論文和參加答辯的各位專家、教授和同學!


單片機源碼:


  1. <font color="rgb(0, 0, 0)">#include "main.h"
  2. #include "LCD1602.h"
  3. #include "HX711.h"

  4. unsigned long HX711_Buffer = 0;
  5. unsigned long Weight_Maopi = 0,Weight_Shiwu = 0;
  6. char Price_Count = 0;
  7. unsigned char KEY_NUM = 0;
  8. unsigned char Price_Buffer[3] = {0x00,0x00,0x00};
  9. unsigned long Money = 0;
  10. bit Flag_OK = 0;

  11. //****************************************************
  12. //主函數
  13. //****************************************************
  14. void main()
  15. {
  16.               char k = 10 ;
  17.               Init_LCD1602();                                                                                                                              //初始化LCD1602

  18.               LCD1602_write_com(0x80);                                                                                    //指針設置
  19.               LCD1602_write_word(" Hello Welcome");                                          //開機畫面第一行
  20.               Delay_ms(800);                            //延時1s
  21.               LCD1602_write_com(0x80+0x40);                                                        //指針設置
  22.               LCD1602_write_word("        ");

  23.               Get_Maopi();                                                        //稱毛皮重量
  24.               Delay_ms(1000);                            //延時1s
  25.   Init_LCD1602();                                                                                                                              //初始化LCD1602 消除之前的顯示內容

  26. loop:Price_Count = 0;
  27.               Price_Buffer[0] = 0;
  28.               Price_Buffer[1] = 0;
  29.               Price_Buffer[2] = 0;
  30.               Flag_OK = 0;

  31.               LCD1602_write_com(0x80);                                                                                    //指針設置
  32.               LCD1602_write_word("    W:     Kg");
  33.             
  34.               LCD1602_write_com(0x80+0x40);                                                        //指針
  35.               LCD1602_write_word("P:  .   Z:     ");

  36.   LCD1602_write_com(0x80+0x40+6);                                                        //指針
  37.               LCD1602_write_data(0x5c);

  38.               LCD1602_write_com(0x80+0x40+15);                                                        //指針
  39.               LCD1602_write_data(0x5c);

  40.             
  41.               Get_Maopi();                                                        //稱毛皮重量

  42.               while(1)
  43.               {
  44.                             if( Flag_OK == 0)
  45.                             {
  46.                                           if( k == 0)
  47.                                                         Get_Weight();                                          //稱重
  48.                                           k--;
  49.                                           if( k < 0)
  50.                                           {
  51.                                                         k = 10;
  52.                                           }
  53.             
  54.                                           //顯示當前重量
  55.                                           LCD1602_write_com(0x86);
  56.                                           LCD1602_write_data(Weight_Shiwu/1000 + 0x30);
  57.                                           LCD1602_write_data('.');
  58.                                           LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
  59.                                           LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
  60.                                           LCD1602_write_data(Weight_Shiwu%10 + 0x30);
  61.                             }

  62.                             KEY_NUM = KEY_Scan();

  63.                             if( KEY_NUM != 0x55)                                          //當返回的不是初值時候,確認按鍵按下。
  64.                             {
  65.                                           if(KEY_NUM == 16)                                          //數字A鍵,去皮功能
  66.                                           {
  67.                                                         Get_Maopi();                                          //去皮            
  68.                                           }

  69.                                           if(KEY_NUM == 15)                                          //數字B鍵清除鍵,二次測量
  70.                                           {
  71.                                                         goto loop;            
  72.                                           }

  73.                                           if(KEY_NUM == 12)                                          //數字C輸入單價錯誤時返回上一步
  74.                                           {
  75.                                                         Price_Count--;
  76.                                                         if( Price_Count < 0)
  77.                                                         {
  78.                                                                       Price_Count = 0;
  79.                                                         }
  80.                                                       
  81.                                                         Price_Buffer[Price_Count] = 0;                                             //清除上一個輸入的數據

  82.                                                         switch(Price_Count)
  83.                                                         {
  84.                                                                       case 0:
  85.                                                                                                   LCD1602_write_com(0x80+0x40+2);
  86.                                                                                                   LCD1602_write_data(' ');
  87.                                                                                                   break;
  88.                                                                       case 1:
  89.                                                                                                   LCD1602_write_com(0x80+0x40+3);
  90.                                                                                                   LCD1602_write_data(' ');
  91.                                                                                                   break;
  92.                                                                       case 2:
  93.                                                                                                   LCD1602_write_com(0x80+0x40+5);
  94.                                                                                                   LCD1602_write_data(' ');
  95.                                                                                                   break;
  96.                                                                       default : break;
  97.                                                         }            
  98.                                           }

  99.                                           if(KEY_NUM == 13)                                          //數字D鍵,計算總價
  100.                                           {
  101.                                                         Money = Price_Buffer[0] * 100 + Price_Buffer[1] * 10 + Price_Buffer[2];            
  102.                                                         Money = Money * Weight_Shiwu / 1000;
  103.                                                         LCD1602_write_com(0x80+0x40+10);
  104.                                                         LCD1602_write_data(Money/1000 + 0x30);                                         
  105.                                                         LCD1602_write_data(Money%1000/100 + 0x30);
  106.                                                         LCD1602_write_data(Money%100/10 + 0x30);
  107.                                                         LCD1602_write_data('.');
  108.                                                         LCD1602_write_data(Money%10 + 0x30);
  109.                                                       
  110.                                                         Flag_OK = 1;                                                                     
  111.                                           }

  112.                                           if(KEY_NUM >= 0 && KEY_NUM <= 9)                                                                        //顯示輸入的價格值
  113.                                           {
  114.                                                         Price_Buffer[Price_Count] = KEY_NUM;
  115.                   
  116.                                                       
  117.                                                         switch(Price_Count)
  118.                                                         {
  119.                                                                       LCD1602_write_com(0x80+0x40);                                                        //指針
  120.                        LCD1602_write_word("P:  .   Z:     ");
  121.                                                                      
  122.                                                                       case 0:
  123.                                                                                                   LCD1602_write_com(0x80+0x40+2);
  124.                                                                                                   LCD1602_write_data(Price_Buffer[0] + 0x30);
  125.                                                                                                   break;
  126.                                                                       case 1:
  127.                                                                                                   LCD1602_write_com(0x80+0x40+3);
  128.                                                                                                   LCD1602_write_data(Price_Buffer[1] + 0x30);
  129.                                                                                                   break;
  130.                                                                       case 2:
  131.                                                                                                   LCD1602_write_com(0x80+0x40+5);
  132.                                                                                                   LCD1602_write_data(Price_Buffer[2] + 0x30);
  133.                                                                                                   break;
  134.                                                                       default : break;
  135.                                                         }
  136.             
  137.                                                         Price_Count++;
  138.             
  139.                                                         if( Price_Count >= 3)
  140.                                                         {
  141.                                                                       Price_Count = 3;
  142.                                                         }
  143.                                           }

  144.                             }

  145.               }
  146. }

  147. //****************************************************
  148. //矩陣鍵盤掃描
  149. //****************************************************
  150. unsigned char KEY_Scan()
  151. {
  152.               unsigned char temp = 0;
  153.               unsigned char com = 0x55 , com1 = 0 , com2 = 0;
  154.               P3=0xf0;
  155.               if(P3!=0xf0)
  156.               {
  157.                             com1=P3;
  158.                             P3=0x0f;
  159.                             com2=P3;      
  160.               }
  161.               P3=0xf0;
  162.     while(P3!=0xf0);               
  163.               temp=com1|com2;
  164.               if(temp==0xee)com=1;//數字1
  165.               if(temp==0xed)com=4;//數字4
  166.               if(temp==0xeb)com=7;//數字7
  167.               if(temp==0xe7)com=11;//備用鍵*號鍵
  168.               if(temp==0xd7)com=0;//數字0
  169.               if(temp==0xb7)com=14;//備用鍵*號鍵
  170.             

  171.               if(temp==0xde)com=2; //數字2
  172.               if(temp==0xdd)com=5; //數字5
  173.               if(temp==0xdb)com=8;//數字8

  174.               if(temp==0xbe)com=3;//數字3
  175.               if(temp==0xbd)com=6; //數字6
  176.               if(temp==0xbb)com=9;//數字9

  177.               if(temp==0x7e)com=16;//數字A鍵,去皮功能            
  178.               if(temp==0x7d)com=15;//數字B鍵清除鍵,二次測量
  179.               if(temp==0x7b)com=12;//數字C輸入單價錯誤時返回上一步
  180.               if(temp==0x77)com=13;//數字D鍵,計算總價            
  181.               return(com);
  182. }

  183. //****************************************************
  184. //稱重
  185. //****************************************************
  186. void Get_Weight()
  187. {
  188.               HX711_Buffer = HX711_Read();
  189.               HX711_Buffer = HX711_Buffer/100;
  190.               if(HX711_Buffer > Weight_Maopi)                                         
  191.               {
  192.                             Weight_Shiwu = HX711_Buffer;
  193.                             Weight_Shiwu = Weight_Shiwu - Weight_Maopi;                                                        //獲取實物的AD采樣數值。
  194.             
  195.                             Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/4.40+0.05);               //計算實物的實際重量
  196.                                                                                                                                                                                                                                                             //因為不同的傳感器特性曲線不一樣,因此,每一個傳感器需要矯正這里的4.30這個除數。
  197.                                                                                                                                                                                                                                                             //當發現測試出來的重量偏大時,增加該數值。
  198.                                                                                                                                                                                                                                                             //如果測試出來的重量偏小時,減小改數值。
  199.                                                                                                                                                                                                                                                             //該數值一般在4.0-5.0之間。因傳感器不同而定。
  200.                                                                                                                                                                                                                                                             //+0.05是為了四舍五入百分位
  201.                             Buzzer = 1;                                                        //關閉警報
  202.               }
  203. //              else if(HX711_Buffer < Weight_Maopi - 30)
  204. //              {
  205. //                            Buzzer = 0;                                                        //負重量報警
  206. //              }
  207. //              else if(HX711_Buffer > Weight_Maopi + 24970)                            //大于5Kg的最大量程,報警            
  208. //              {
  209. //                            Buzzer = 0;
  210. //              }

  211.               if(Weight_Shiwu > 5000 || HX711_Buffer < Weight_Maopi - 30)
  212.               {
  213.                             Buzzer = 0;            
  214.               }
  215.               else
  216.               {
  217.                             Buzzer = 1;
  218.               }

  219.             
  220. }

  221. //****************************************************
  222. //獲取毛皮重量
  223. //****************************************************
  224. void Get_Maopi()
  225. {
  226.               HX711_Buffer = HX711_Read();
  227.               Weight_Maopi = HX711_Buffer/100;                           
  228. }

  229. //****************************************************
  230. //MS延時函數(12M晶振下測試)
  231. //****************************************************
  232. void Delay_ms(unsigned int n)
  233. {
  234.               unsigned int  i,j;
  235.               for(i=0;i<n;i++)
  236.                             for(j=0;j<123;j++);
  237. }</font>
復制代碼



完整的Word格式文檔51黑下載地址:

基于單片機的電子稱設計.doc (2.4 MB, 下載次數: 27)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:370073 發表于 2018-7-12 21:07 | 只看該作者
好資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九亚洲 | 亚洲最新网址 | 97视频成人| 国产精品欧美一区二区三区不卡 | 亚洲欧美中文字幕在线观看 | 真人一级毛片 | 一区网站 | 成人精品 | 国产激情片在线观看 | 男人天堂视频在线观看 | 青青草视频网 | 888久久久| 国产亚洲精品精品国产亚洲综合 | 亚洲精品日韩精品 | 亚洲男人的天堂网站 | 国产日韩欧美精品一区二区 | 亚洲一区 | 精品久久九| 国产精品精品3d动漫 | 91精品国产综合久久婷婷香蕉 | 欧美成人精品激情在线观看 | 日韩一区二区三区在线观看视频 | 国产玖玖 | 99精品免费 | 三级成人片 | 久久精品二区亚洲w码 | 亚洲国产成人精品女人久久久野战 | 国产一区视频在线 | 国产精品毛片无码 | 在线观看免费毛片 | 欧美mv日韩mv国产网站91进入 | 日本三级线观看 视频 | 成人影院网站ww555久久精品 | 青青草亚洲 | 亚洲一区二区三区高清 | 久久久激情视频 | 国产在线精品一区二区 | 午夜网| 国产欧美精品 | 日韩国产在线 | 日本超碰 |