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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

簡易電子秤設計各種資料

  [復制鏈接]
跳轉到指定樓層
樓主
ID:386709 發表于 2018-8-15 22:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機電子秤設計報告

秤是一種在實際工作和生活中經常用到的測量器具。隨著計量技術和電子技術的發展,傳統純機械結構的桿秤、臺秤、磅秤等稱量裝置逐步被淘汰,電子稱量裝置電子秤、電子天平等以其準確、快速、方便、顯示直觀等諸多優點而受到人們的青睞。
和傳統秤相比較,電子秤利用新型傳感器、高精度AD轉換器件、單片機設計實現,具有精度高、功能強等特點。本課題設計的電子秤具有基本稱重、鍵盤輸入、計算價格、顯示、超重報警功能。該電子秤的測量范圍為0-10Kg,測量精度達到5g,有高精度,低成本,易攜帶的特點。電子秤采用液晶顯示漢字和測量記過,比傳統秤具有更高的準確性和直觀性。另外,該電子秤電路簡單,使用壽命長,應用范圍廣,可以應用于商場、超市、家庭等場所,成為人們日常生活中不可少的必需品。
一、功能描述
1、采用高精度電阻應變式壓力傳感器,測量量程0-10kg,測量精度可達5g。
2、采用電子秤專用模擬/數字(A/D)轉換器芯片hx711對傳感器信號進行調理轉換,HX711 采用了海芯科技集成電路專利技術,是一款專為高精度電子秤而設計的24 位A/D 轉換器芯片。
3、采用STC89C52單片機作為主控芯片,實現稱重、計算價格等主控功能。
4、采用128*64漢字液晶屏顯示稱重重量、單價、總價等信息。
5、采用4*4矩陣鍵盤進行人機交互,鍵盤容量大,操作便捷。
6、具有超量程報警功能,可以通過蜂鳴器和LED燈報警。
7、系統通過USB電源供電,單片機程序也可通過USB線串行下載。
二、硬件設計

1、硬件方案

單片機電子秤硬件方案如圖1所示:
圖1  單片機電子秤硬件方案
稱重傳感器感應被測重力,輸出微弱的毫伏級電壓信號。該電壓信號經過電子秤專用模擬/數字(A/D)轉換器芯片hx711對傳感器信號進行調理轉換。HX711 采用了海芯科技集成電路專利技術,是一款專為高精度電子秤而設計的24 位A/D 轉換器芯片,內置增益控制,精度高,性能穩定。HX711芯片通過2線串行方式與單片機通信。單片機讀取被測數據,進行計算轉換,再液晶屏上顯示出來。
矩陣鍵盤主要用于計算金額。當被測物體重量得到后,用戶可以通過矩陣鍵盤輸入單價,電子秤自動計算總金額并在液晶屏顯示。電源系統給單片機、HX711電路及傳感器供電。

2、稱重傳感器

傳感器是測量機構最重要的部件。稱重傳感器本身具有單調性,其主要參數指標是靈敏度、總誤差和溫度漂移。
(1) 靈敏度
稱重傳感器的電靈敏度為滿負荷輸出電壓與激勵電壓的比值,典型值是2mV/V。當使用2 mV/V靈敏度和5 V激勵電壓的傳感器時,其滿度輸出電壓為10 mV。通常,為了使用稱重傳感器線性度最好的一段稱重范圍,應當僅使用滿度范圍的三分之二。因此滿度輸出電壓應當大約為6mV。當電子秤應用于工業環境時,在6mV滿度范圍內測量微小的信號變化并非易事。
(2) 總誤差
總誤差是指輸出誤差和額定誤差的比值。典型電子秤的總誤差指標大約是0.02%,這一技術指標相當重要,它限制了使用理想信號調節電路所能達到的精確度,決定了ADC分辨率的選擇以及放大電路和濾波器的設計。
(3) 漂移
稱重傳感器也產生與時間相關的漂移。
目前常用的稱重傳感器有電阻應變式壓力傳感器、電容壓力傳感器、壓電式壓力傳感器。選用時應按穩定行、精度登記、壽命和安裝環境要求考慮,其主要特點如下:
(1) 電容式壓力傳感器穩定性較差,精度和靈敏度較高,壽命較短,對環境要求苛刻,不易長距離傳輸。
(2) 壓電式壓力傳感器穩定性好,精度和靈敏度高,壽命長,但大量程的壓力傳感器尚待進一步研究。
(3) 電阻應變式壓力傳感器穩定性較好,精度和靈敏度較高,壽命較長,對測量環境要求不太嚴格。
綜上所述,選用電阻應變式壓力傳感器作為電子秤稱重傳感器是最為合適的。電阻應變式壓力傳感器主要由彈性體、電阻應變片電纜線等組成,內部線路采用惠更斯電橋,當彈性體承受載荷產生變形時,電阻應變片(轉換元件)受到拉伸或壓縮應變片變形后,它的阻值將發生變化(增大或減小),從而使電橋失去平衡,產生相應的差動信號,供后續電路測量和處理。電阻應變式傳感器測量原理如圖2所示。
圖2  電阻應變式傳感器測量原理
當垂直正壓力P作用于梁上時,梁產生形變,電阻應變片R1、R3受壓彎拉伸,阻值增加;R2、R4受壓縮,阻值減小。電橋失去平衡,產生不平衡電壓,不平衡電壓與作用在傳感器上的載菏P成正比,從而將非電量轉化成電量輸出。
R1、R2、R3和R4組成惠更斯電橋,將2對電阻應變片的阻值變化轉變成輸出電壓,其工作原理如圖3所示。
圖3  測量電橋原理

3、電子秤專用24位AD轉換芯片HX711及其電路

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

4、單片機STC89C52及其電路

(1) STC89C52 單片機概述

STC89C52系列單片機是宏晶科技生產的單時鐘/機器周期(1T)的單片機,是高速/低功耗/超強抗干擾的新一代8051單片機,指令代碼完全兼容傳統8051,但速度快8-12倍,內部集成MAX810專用復位電路。

(2) STC89C52 單片機特點
  • 增強型 8051 CPU1T,單時鐘/機器周期,指令代碼完全兼容傳統8051
  • 工作電壓: 5.5V - 3.5V5V單片機)
  • 工作頻率范圍:040MHz,相當于普通8051 080MHz
  • 用戶應用程序空間 4K//8K/16k/32K/64K字節
  • 片上集成1280字節 RAM
  • 通用I/O口(32/36個),復位后為準雙向口/弱上拉(普通8051傳統I/O口)
  • ISP(在系統可編程)/IAP(在應用可編程),無需專用編程器/仿真器。
  • 每個I/O口驅動能力均可達到20mA,但整個芯片最大不要超過120mA
  • 可通過串口(P3.0/P3.1)直接下載用戶程序,數秒即可完成一片
  • EEPROM功能
  • 看門狗
  • 內部集成MAX810專用復位電路(外部晶體12M以下時,復位腳可直接1K電阻到地)
  • 時鐘源:外部高精度晶體/時鐘,內部R/C振蕩器
  • 用戶在下載用戶程序時,可選擇是使用內部R/C 振蕩器還是外部晶體/ 時鐘
  • 常溫下內部R/C 振蕩器頻率為:5.0V 單片機為: 11MHz 17MHz
  • 416位定時器兩個與傳統8051兼容的定時器/計數器,16位定時器T0T1,沒有定時器2,但有獨立波特率發生器做串行通訊的波特率發生器,再加上2PCA模塊可再實現216位定時器
  • 外部中斷I/O4,傳統的下降沿中斷或低電平觸發中斷,并新增支持上升沿中斷的PCA模塊,Power Down模式可由外部中斷喚醒;
  • 通用全雙工異步串行口(UART)
  • 工作溫度范圍:-40 ~ +85(工業級) / 0 ~ 75(商業級)
  • 封裝:PDIP-40, PLCC-44
  (3) STC89C52 單片機管腳及封裝

STC89C52單片機有多種封裝形式,本設計中選用40DIP封裝,其管腳定義如圖8所示。

圖8 STC89C52 管腳圖
本課題設計的電子秤的單片機應用電路如圖9所示:
圖9  STC89C52單片機電路

圖中DOUT和PDSCK為單片機與HX711的AD轉換電路交換數據的通信線。beep為蜂鳴器報警信號線,alert為報警燈信號線,RXD和TXD為串口通信線,也可以用于單片機程序的串行ISP下載。

5、液晶屏電路

圖10  LCD顯示電路

液晶屏電路如圖10所示。LCD_CS、LCD_RES、LCD_RS、LCD_SDA、LCD_SCK為液晶模塊與單片機接口的控制線。CS_ZK、SCK_ZK、SO_ZK和SI_ZK為字庫和單片機接口的控制線。

該液晶為晶訊聯公司的128*64漢字屏JLX12864G-086-PC顯示信息。該顯示模塊既可以當成普通的圖像型液晶顯示模塊使用(即顯示普通圖像型的單色圖片功能),又含有JLX-GB2312 字庫IC,可以從字庫IC 中讀出內置的字庫的點陣數據寫入到LCD 驅動IC 中,以達到顯示漢字的目的。其接口引腳功能介紹:

表一  液晶模塊接口引腳功能

6、矩陣鍵盤電路

矩陣鍵盤電路如圖11所示:

圖11 矩陣鍵盤電路

圖中4*4矩陣鍵盤可以顯示0-9數字、小數點和五個功能鍵。鍵盤行掃描信號為ROW1—ROW4,列掃描信號為COL1—COL4。行信號為輸入信號,低電平有效;列信號為輸出信號。當沒有鍵按下時,即使行掃描輸入低電平信號,列信號仍為高電平;當行掃描為低電平并且有鍵按下時,相應的列輸出低電平。該低電平信號可以定位至按下鍵的位置。

7、聲光報警電路

聲光報警電路如圖12所示。

圖12   聲光報警電路

    當測量重量超過量程時,beep和alert給出低電平信號,驅動蜂鳴器鳴響,報警燈亮。

8.電源電路

本設計采用USB接口供電,電源電壓5V。同時,USB接口通過內含PL2303芯片的轉換電路對單片機進行程序編寫。其電路原理如圖所示。

圖16  供電及程序下載電路
三、Protel硬件開發軟件
Protel是目前國內最流行的通用EDA軟件,它是將電路原理圖設計、PCB板圖設計、電路仿真和PLD設計等多個實用工具軟件組合后構成的EDA工作平臺,是第一個將EDA軟件設計成基于Windows的普及型產品。它集成了軟件界面、仿真功能和PLD設計和信號完整性分析,在此基礎上Protel 99SE又增加了一些新的功能,用戶使用更加方便靈活。Protel的功能十分強大,在電子電路設計領域占有極其重要的地位。它以其強大功能和實用性,逐漸獲得廣大硬件設計人員的青睞,是目前眾多EDA設計軟件中用戶最多的產品之一。

1.Protel軟件組成

Protel軟件主要由電路原理圖設計模塊、印制電路板設計模塊(PCB設計模塊)、電路信號仿真模塊和PLD邏輯器件設計模塊等組成,各模塊具有強大的功能,可以很好的實現電路設計與分析。
(1)  原理圖設計模塊(Schematic模塊)
電路原理圖是表示電氣產品或電路工作原理的重要技術文件,電路原理圖主要由代表各種電子器件的圖形符號、線路和結點組成。圖4.1所示為一張電路原理圖。該原理圖是由Schematic模塊設計完成的。Schematic模塊具有如下功能:豐富而靈活的編輯功能、在線庫編輯及完善的庫管理功能、強大的設計自動化功能、支持層次化設計功能等。
(2) 印制電路板設計模塊(PCB設計模塊)
印制電路板(PCB)制板圖是由電路原理圖到制作電路板的橋梁。設計了電路原理圖后,需要根據原理圖生設計成印制電路板的制板圖,然后在根據制板圖制作具體的電路板。印制電路板設計模塊具有如下主要功能和特點:可完成復雜印制電路板(PCB)的設計;方便而又靈活的編輯功能;強大的設計自動化功能;在線式庫編輯及完善的庫管理;完備的輸出系統等。
(3) 電路信號仿真模塊
電路信號仿真模塊是一個功能強大的數字/模擬混合信號電路仿真器,能提供連續的模擬信號和離散的數字信號仿真。它運行在Protel的EDA/Client集成環境下,與Protel Advanced Schematic原理圖輸入程序協同工作,作為Advanced Schematic的擴展,為用戶提供了一個完整的從設計到驗證仿真設計環境。
在Protel中進行仿真,只需從仿真用元器件庫中放置所需的元器件,連接好原理圖,加上激勵源,然后單擊防真按鈕即可自動開始。

2.PCB板設計

(1)  定元件的封裝
① 打開網絡表(可以利用一些編輯器輔助編輯),將所有封裝瀏覽一遍,確保所有元件的封裝都正確無誤并且元件庫中包含所有元件的封裝,網絡表中所有信息全部大寫,一面載入出問題,或PCB BOM不連續。
② 標準元件全部采用公司統一元件庫中的封裝。
③ ④⑥⑤元件庫中不存在的封裝,應自己建立元器件庫。
(2) 建立PCB板框
① 根據PCB結構圖,或相應的模板建立PCB文件,包括安裝孔、禁布區等相關信息。
② 尺寸標注。在鉆孔層中應標明PCB的精確結構,且不可以形成封閉尺寸標注。
(3) 載入網絡表
① 載入網表并排除所有載入問題,具體請看《PROTEL技術大全》。其他軟件載入問題有很多相似之處,可以借鑒。
② 如果使用PROTEL,網表須載入兩次以上(沒有任何提示信息)才可以確認載入無誤。
(4) 布局
① 首先要確定參考點。
一般參考點都設置在左邊和底邊的邊框線的交點(或延長線的交點)上或印制板的插件的第一個焊盤。
② 一但參考點確定以后,元件布局、布線均以此參考點為準。布局推薦使用25MIL網格。
③ 根據要求先將所有有定位要求的元件固定并鎖定。
④ 布局的基本原則
A. 遵循先難后易、先大后小的原則。
B. 布局可以參考硬件工程師提供的原理圖和大致的布局,根據信號流向規律放置主要原器件。
C. 總的連線盡可能的短,關鍵信號線最短。
D. 強信號、弱信號、高電壓信號和弱電壓信號要完全分開。
E. 高頻元件間隔要充分。
F. 模擬信號、數字信號分開。
⑤ 相同結構電路部分應盡可能采取對稱布局。
⑥ 按照均勻分布、重心平衡、版面美觀的標準來優化布局。
(5) PCB設計遵循的規則
① 地線回路規則:

圖17 地線回路規則

環路最小規則,即信號線與其回路構成的環面積要盡可能小,環面積要盡可能小,環面積越小,對外的輻射越少,接收外界的干擾也越小。針對這一規則,在地平面分割時,要考慮到地平面與重要信號走線的分布,防止由于地平面開槽等帶來的問題;在雙層板設計中,在為電源留下足夠空間的情況下,應該將留下的部分用參考地填充,且增加一些必要的過孔,將雙面信號有效連接起來,對一些關鍵信號盡量采用地線隔離,對一些頻率較高的設計,需特別考慮其地平面信號回路問題,建議采用多層板為宜。
② 竄擾控制
竄擾(CrossTalk)是指PCB上不同網絡之間因較長的平行布線引起的相互干擾,主要是由于平行線間的分布電容和分布電感的作用。克服竄擾的主要措施是:
A.加大平行布線的間距,遵循3W規則。
B.在平行線間插入接地的隔離線。
C.減少布線層與地平面的距離
屏蔽保護

圖18 屏蔽保護

對應地線回路規則,實際上也是為了盡量減小信號的回路面積,多用于一些比較重要的信號,如時鐘信號,同步信號;對一些特別重要,頻率特別高的信號,應該考慮采用銅軸電纜屏蔽結構設計,即將所布的線上下左右用地線隔離,而且還要考慮好如何有效的讓屏蔽地與實際地平面有效結合。
④ 走線方向控制規則
相鄰層的走線方向成正交結構,避免將不同的信號線在相鄰層走成同一方向,以減少不必要的層間竄擾;當由于板結構限制(如某些背板)難以避免出現該情況,特別是信號速率較高時,應考慮用地平面隔離各布線層,用地信號線隔離各信號線。
電源與地線層的完整性規則
對于導通孔密集的區域,要注意避免孔在電源和地層的挖空區域相互連接,形成對平面層的分割,從而破壞平面層的完整性,并進而導致信號線在地層 的回路面積增大。
四、        軟件設計

1、軟件流程圖

本設計主程序使用了定時器,用來實現每0.5秒稱重一次的功能,流程圖如圖19所示。鍵盤掃描程序如圖20所示。

                              

    圖19  時鐘中斷程序流程圖               圖20  鍵盤掃描程序流程圖

主程序軟件流程如圖21所示。

            

圖21  主程序流程圖           

3、主程序

    下面介紹main.c主程序編寫,其他程序略。
(1)  頭文件和一些宏定義
(1)  頭文件和一些宏定義
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "lcd.h"
#include "hx711.h"
#include "keyboard.h"

//定義量程系數
#define RATIO     2114/1623

(2) 管腳、常量、變量定義
//定義標識
volatile bit FlagTest = 0;                            //定時測試標志,每0.5秒置位,測完清0
volatile bit FlagKeyPress = 0;  //有鍵按下標志,處理完畢清0
volatile bit FlagSetPrice = 0;  //價格設置狀態標志,設置好為1。

//管腳定義
sbit LedA = P2^2;
sbit beep = P1^0;
sbit alert = P1^1;

//顯示用變量
int Counter;
uchar idata str1[6] = "000000";
int i, iTemp;
//稱重用變量
unsigned long idata FullScale; //滿量程AD值/1000
unsigned long AdVal;     //AD采樣值
unsigned long weight;    //重量值,單位g
unsigned long idata price;     //單價,長整型值,單位為分  
unsigned long idata money;     //總價,長整型值,單位為分
//鍵盤處理變量
uchar keycode;
uchar DotPos;                                                           //小數點標志及位置

(3) 函數聲明
void int2str(int, char *);
void Data_Init();
void Port_Init();
void Timer0_Init();
void Timer0_ISR () ;
void INT1_Init();
void KeyPress(uchar);
void To_Zero();
void Display_Price();
void Display_Weight();
void Display_Money();

(4) 各子程序
//整型轉字符串的函數,轉換范圍0--65536
void int2str(int x, char* str)
{
    int i=1;
    int tmp=10;
    while(x/tmp!=0)
    {
        i++;
        tmp*=10;
    }
    tmp=x;
    str='\0';
    while(i>1)
    {
        str[--i]='0'+(tmp%10);
        tmp/=10;
    }
    str[0]=tmp+'0';
}

//重新找回零點,每次測量前調用
void To_Zero()
{
   FullScale=ReadCount()/1000;
   price=0;
}

//顯示單價,單位為元,四位整數,兩位小數
void Display_Price()
{
   unsigned int i,j;

   display_GB2312_string(5,44,"       ");

   i = price/100;    //得到整數部分
   j = price - i*100;//得到小數部分
   int2str(i,str1);
   //顯示整數部分
   if (i>=1000)
   {
      display_GB2312_string(5,44,str1);
   }
   else if (i>=100)
   {
      display_GB2312_string(5,52,str1);
   }
   else if (i>=10)
   {
      display_GB2312_string(5,60,str1);
   }
   else
   {
      display_GB2312_string(5,68,str1);
   }
   //顯示小數點
   display_GB2312_string(5,76,".");  
   //顯示小數部分
   int2str(j,str1);
   if (j<10)
   {
      display_GB2312_string(5,84,"0");
      display_GB2312_string(5,92,str1);

   }
   else
   {
      display_GB2312_string(5,84,str1);
   }
}

//顯示重量,單位kg,兩位整數,三位小數
void Display_Weight()
{
   unsigned int i,j;

   display_GB2312_string(3,60,"      ");
   //weight單位是g
   i = weight/1000;    //得到整數部分
   j = weight - i*1000;//得到小數部分
   int2str(i,str1);
   if (i>=10)
   {
      display_GB2312_string(3,60,str1);
   }
   else
   {
      display_GB2312_string(3,68,str1);
   }
   display_GB2312_string(3,76,".");  
   int2str(j,str1);
   if (j<10)
   {
      display_GB2312_string(3,84,"00");
                display_GB2312_string(3,100,str1);
   }
   else if (j<100)
   {
      display_GB2312_string(3,84,"0");
                display_GB2312_string(3,92,str1);

   }
   else
   {
      display_GB2312_string(3,84,str1);
   }
}

//顯示總價,單位為元,四位整數,兩位小數
void Display_Money()
{
   unsigned int i,j;

   display_GB2312_string(7,44,"       ");
   if (money>999999)               //超出顯示量程
   {
      display_GB2312_string(7,44,"-------");
      return;      
   }  

   i = money/100;    //得到整數部分
   j = money - i*100;//得到小數部分
   int2str(i,str1);
   //顯示整數部分
   if (i>=1000)
   {
      display_GB2312_string(7,44,str1);
   }
   else if (i>=100)
   {
      display_GB2312_string(7,52,str1);
   }
   else if (i>=10)
   {
      display_GB2312_string(7,60,str1);
   }
   else
   {
      display_GB2312_string(7,68,str1);
   }
   //顯示小數點
   display_GB2312_string(7,76,".");  
   //顯示小數部分
   int2str(j,str1);
   if (j<10)
   {
      display_GB2312_string(7,84,"0");
      display_GB2312_string(7,92,str1);

   }
   else
   {
      display_GB2312_string(7,84,str1);
   }
}

//數據初始化
void Data_Init()
{
   price = 0;
   DotPos = 0;
   beep = 1;
   alert = 1;
}

//管腳配置
void Port_Init()
{
            
}

//定時器0初始化
void Timer0_Init()
{
              ET0 = 1;        //允許定時器0中斷
              TMOD = 1;       //定時器工作方式選擇
              TL0 = 0x06;   
              TH0 = 0xf8;     //定時器賦予初值
              TR0 = 1;        //啟動定時器
}

//定時器0中斷
void Timer0_ISR (void) interrupt 1 using 0
{
              TL0 = 0x06;
              TH0 = 0xf8;     //定時器賦予初值

              //每0.5秒鐘刷新重量
    Counter ++;
    if (Counter >= 200)
    {
       FlagTest = 1;
                 Counter = 0;
    }
}


//按鍵響應程序,參數是鍵值
//返回鍵值:
//         7          8    9      10(清0)
//         4          5    6      11(刪除)
//         1          2    3      12(未定義)
//         14(未定義) 0    15(.)  13(確定價格)

void KeyPress(uchar keycode)
{
   switch (keycode)
   {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
      case 8:
      case 9:
                   //目前在設置整數位,要注意price是整型,存儲單位為分
                   if (DotPos == 0)
                            {
                                //最多只能設置到千位
                                          if (price<100000)
                                          {
                                   price=price*10+keycode*100;
                                          }
                            }
                            //目前在設置小數位
                            else if (DotPos==1)  //小數點后第一位
                            {
                                price=price+keycode*10;
                                          DotPos++;
                            }
                            else if (DotPos==2)
                            {
                                price=price+keycode;
                            }
                            Display_Price();
                   break;
      case 10:   //清零鍵
                   To_Zero();
                            Display_Price();
                            FlagSetPrice = 0;
                            DotPos = 0;
                            break;
                case 11:              //刪除鍵,按一次刪除最右一個數字
                   if (DotPos==2)
                            {
                                price=price/10;
                                          price=price*10;
                                          DotPos--;
                            }
                            else if (DotPos==1)
                            {
                                price=price/100;
                                          price=price*100;
                                          DotPos--;
                            }
                            else if (DotPos==0)
                            {
                                price=price/1000;
                                          price=price*100;
                            }
                            Display_Price();
         break;
      case 13:   //確認鍵
                   FlagSetPrice = 1;
                            break;
                case 15:   //小數點按下
                            if (DotPos == 0)
                            {  
                                          DotPos = 1;      //小數點后第一位
                            }
                   break;

   }
}




//===============main program===================//
void main(void)
{
   Rom_CS=1;
   initial_lcd();
   EA = 0;
   Data_Init();
   Port_Init();
   Timer0_Init();
   //初始化完成,開中斷
   EA = 1;
   //背光
   LedA = 1;
   clear_screen();    //clear all dots
   display_GB2312_string(1,1,"電子秤初始化....");
   To_Zero();
   display_GB2312_string(1,1,"電子秤初始化成功");
   display_GB2312_string(3,1,"重量:         kg");
   display_GB2312_string(5,1,"單價:         元");
   display_GB2312_string(7,1,"金額:         元");
   Display_Price();  

   while(1)
   {
      //每0.5秒稱重一次
                if (FlagTest==1)
                {
                   //稱重,得到重量值weight,單位為g
                            AdVal=ReadCount();
                            weight=FullScale-AdVal/1000;
                            if (weight>0x8000) weight=0;
                            weight=10000*weight/FullScale;
                            weight=weight*RATIO;
                            //如果超量程,則報警
                            if (weight >= 10000)
                            {
                                beep = 0;
                                          alert = 0;
                                          display_GB2312_string(3,60,"------");
                                          display_GB2312_string(7,44,"--------");
                            }
                            //如果不超量程
                            else
                            {
                                beep = 1;
                                          alert = 1;
                                          //顯示重量值
                      Display_Weight();                           
                                          //如果單價設定好了,則計算價格
            if (FlagSetPrice == 1)
                                {
                                   money = weight*price/1000;  //money單位為分
                                   //顯示總金額
                                   Display_Money();
                                }
                                else
                                {
                                   display_GB2312_string(7,44,"        ");
                                }
                                //清測試標志
                                FlagTest = 0;
                   }
                }
                //獲取按鍵
                keycode = Getkeyboard();
                //有效鍵值0-15
                if ((keycode<16)&&(FlagKeyPress==0))
                {
                   FlagKeyPress = 1;
                            KeyPress(keycode);
                            FlagKeyPress = 0;
                }
                delay(20);
   }
}
五、        下載與調試

提供例程在uVision4環境下編譯,如果是其他版本uVision,只需將所有.c和.h 文件拷貝至新建項目,重新編譯即可。當編譯生成.hex文件后,就可以下載并進行調試了。

  • USB轉串口驅動安裝

打開USB驅動文件夾下的PL2303_Prolific_DriverInstaller_v130.exe安裝文件,按提示安裝USB轉串口驅動程序。安裝完成后,插入USB下載線后,在[開始]-[控制面板]-[打印機和其他硬件]-[設備管理器],在“端口”分支下有(Prolific USB-to-Serial Comm Port(COMX)。X表示串口號,如果沒有說明USB轉串口驅動沒有安裝,須重新安裝。記住括號里的COM口號。

圖22 成功安裝USB轉串口驅動示意圖
  • 下載程序
打開STC單片機下載軟件文件夾,點擊運行STC_ISP_V481.exe程序,出現如下界面。
圖23 下載軟件
正確選擇MCU 類型為STC89C52,COM口(與剛才安裝的COM號一致),最高波特率和最低波特率選擇高速,如果不成功則嘗試降低撥特率,并打開正確的.hex數據文件。
點擊“Download/下載”按紐,窗口出現提示:
Chinese:正在嘗試與 MCU/單片機 握手連接 ...
Connection is failure. You can try:
1.Give your MCU Power On Reset.
2.Stop operation, then re-select COM Port.
3.Because PLCC-DIP/PQFP-DIP Socket trace too long.
4.Update the STC ISP.exe version.
5.If still error, your MCU Firmware is error
   or null.
Chinese:連接失敗,請嘗試以下操作:
1.在單片機停電狀態下,點下載按鈕,再給單片機上電
2.停止下載,重新選擇 RS-232 串口, 接好電纜
3.可能需要先將 P1.0/P1.1 短接到地
4.可能外部時鐘未接
5.因 PLCC、PQFP 轉換座引線過長而引起時鐘不振蕩,請
   調整參數
6.可能要升級電腦端的 STC ISP.exe 軟件
7.若仍然不成功,可能 MCU/單片機內無 ISP 系統引導碼,
   或需退回升級,或 MCU 已損壞
8.若使用 USB 轉 RS-232 串口線下載,可能會遇到不兼容
   的問題,可以讓我們幫助購買兼容的 USB 轉 RS-232
   串口線

仍在連接中, 請給 MCU 上電...

按下電路板上的電源按紐,保證其有個失電至上電的過程,則窗口顯示開始燒錄芯片。
  • proteus仿真





七、        運行與使用

1、上電運行

下載完成后程序自動運行,或重上電后程序正常運行,如圖23所示。
圖23  上電運行圖

2、鍵盤操作說明

4*4矩陣鍵盤定義如下

         7          8           9           10(清0)

         4          5           6           11(刪除)

         1          2           3           12(未定義)

         14(未定義)  0          15(.)         13(確定價格)

其中:









      • 0—9為數字鍵,用于單價設定。
      • 15為小數點,也用于單價設定。
      • 10為清零鍵,每次測量之前,請先按清0鍵,以使重量和價格回零。
      • 11為刪除鍵,逐位刪除敲錯的單價。
      • 13為單價確定鍵,按下該鍵則設定的單價有效,開始計算總價。

3、常用使用步驟:









      • 打開電源,屏幕顯示電子秤初始化成功,此時重量和單價為0,金額為空;
      • 通過數字鍵和小數點鍵鍵入單價,完成后按下單價確定鍵。
      • 在支架上放上待稱重物體,液晶屏顯示重量(單位為kg),單價(單位為元)和總金額(單位為元)。
      • 稱重量程為0—10kg,單價設定范圍為0.01—9999.99元,總金額顯示范圍為0—9999.99元。超過量程聲光報警


以上的Word格式文檔51黑下載地址:
單片機智能電子秤設計之硬件設計報告.doc (1.91 MB, 下載次數: 68)

評分

參與人數 1黑幣 +6 收起 理由
夏末酷涼 + 6 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:386709 發表于 2018-8-15 22:48 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:474386 發表于 2021-3-16 08:56 | 只看該作者
非常詳盡的資料,非常感謝無私分享。
回復

使用道具 舉報

地板
ID:872228 發表于 2021-3-16 14:27 | 只看該作者
very good and wonderful data for 電子秤
回復

使用道具 舉報

5#
ID:894709 發表于 2021-3-21 19:11 | 只看該作者
Proteus電路圖能發一下嗎
回復

使用道具 舉報

6#
ID:328014 發表于 2021-3-21 21:58 | 只看該作者
nightbirds 發表于 2021-3-21 19:11
Proteus電路圖能發一下嗎

51hei搜索電子秤可以找到很多 http://www.zg4o1577.cn/bbs/dpj-126224-1.html
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 爱爱免费视频 | 久久网一区二区 | 国产成人精品一区二区三区视频 | 亚洲欧美日韩在线不卡 | 激情网站 | 欧美视频在线免费 | 国产精品久久久久久久久久软件 | 欧美亚洲国语精品一区二区 | 久久高清免费视频 | 欧美成人激情视频 | 羞羞视频网站在线观看 | 国产999精品久久久 精品三级在线观看 | 欧美日韩午夜精品 | 国产欧美日韩综合精品一 | 欧美久久一区二区三区 | 激情六月丁香 | 福利社午夜影院 | 国产精品日韩 | 亚洲精品在线免费 | 午夜视频在线免费观看 | 欧美一区二区三区视频 | 日日碰狠狠躁久久躁婷婷 | 欧美自拍一区 | 一级黄色淫片 | 欧美一区二区三区久久精品视 | 91亚洲精品在线 | 国产精品福利一区二区三区 | 国产一区| 久久精品99国产精品 | 久久久久国产一区二区三区四区 | 黄色高清视频 | 999国产视频| 欧美日韩亚洲在线 | 中文字幕1区| 天天综合成人网 | 国产一区二区三区免费观看视频 | 国产农村一级片 | 亚洲成人网在线播放 | 日本三级电影免费 | 国产精品亚洲第一区在线暖暖韩国 | 亚洲免费在线观看 |