一、項目背景
電子秤是一種通過傳感器測量物體質(zhì)量的設(shè)備,被廣泛應用于商業(yè)和工業(yè)領(lǐng)域。傳統(tǒng)的機械秤已經(jīng)逐漸被電子秤取代,因為電子秤具有更高的精度、更方便的使用和更多的功能。
本項目利用STC89C52單片機和HX711模塊完成電子秤設(shè)計,具有去皮功能、累加功能以及LCD1602顯示屏顯示實時稱重數(shù)據(jù)。通過HX711模塊實現(xiàn)對物品重量的精確測量;支持去皮功能,可以在測量前將容器的重量減去,得到凈重;具備累加功能,可以記錄多次測量結(jié)果并進行累加;使用LCD1602顯示屏實時顯示當前稱重數(shù)據(jù),方便用戶查看。
該電子秤實現(xiàn)了基本稱重功能和去皮功能?;痉Q重功能指的是通過傳感器測量物體質(zhì)量并顯示結(jié)果。HX711模塊連接到電子秤上的傳感器,通過讀取HX711模塊輸出的數(shù)字信號來獲取物體的重量數(shù)據(jù)。STC89C52單片機通過串行通信協(xié)議與HX711模塊進行通信,并從中獲取到稱重數(shù)據(jù)。然后,通過控制LCD1602顯示器,將稱重結(jié)果以可讀的方式顯示在LCD屏幕上。用戶可以清晰地看到物體的重量。
除了基本稱重功能,該電子秤還具有去皮功能。當用戶按下獨立按鍵時,系統(tǒng)將自動記錄當前的稱重值為皮重。之后,無論在物體放置前還是放置后按下獨立按鍵,系統(tǒng)都會自動去除皮重,并顯示凈重。這樣可以方便地進行物體重量的測量,而無需手動計算。
整個系統(tǒng)的核心是STC89C52單片機,負責與HX711模塊和LCD1602顯示器進行通信,并控制顯示內(nèi)容和去皮功能。該設(shè)計不僅簡單實用,而且具有良好的可擴展性和穩(wěn)定性,適用于各種實際應用場景,如商業(yè)稱重、食品加工等。
二、項目設(shè)計思路
【1】硬件設(shè)計思路:
本項目采用STC89C52單片機作為核心控制器,HX711模塊作為傳感器,以及LCD1602顯示屏和獨立按鍵作為用戶接口。
整個系統(tǒng)的連接方式如下:
將PD_SCK引腳連接到P1.5引腳(中斷0),DOUT引腳連接到P1.6引腳(中斷1),這兩個引腳用于與HX711模塊進行SPI通信。LCD1602顯示屏數(shù)據(jù)線DB0-DB7分別連接到P0.0-P0.7引腳,RS(寄存器/數(shù)據(jù)選擇)引腳連接至P2.0引腳,R/W(讀寫模式選擇)引腳連接至P2.1引腳,E(使能)引腳連接至P2.2引腳,這些引腳用于控制LCD1602顯示器上的文本顯示。獨立按鍵引腳連接至P3.2引腳,用于觸發(fā)去皮功能。
【2】軟件設(shè)計思路:
(1)初始化 LCD1602 顯示器。設(shè)置顯示模式、清除顯示、光標復位等。
(2)初始化 HX711 模塊。通過 SPI 通信協(xié)議與模塊建立連接,設(shè)置增益和偏移量等參數(shù)。
(3)建立中斷服務程序。P1.5和P1.6引腳在正常工作時,都是高電平狀態(tài),但當需要進行SPI通信時,需要向這兩個引腳分別輸出規(guī)定的低電平與高電平??梢酝ㄟ^設(shè)置中斷服務程序,在需要進行SPI通信的時候向P1.5和P1.6引腳分別輸出指定的電平。當SPI通信完成后,恢復高電平狀態(tài)。
(4)定義數(shù)據(jù)結(jié)構(gòu)體。在程序中定義一個數(shù)據(jù)結(jié)構(gòu)體,包含去皮函數(shù)的標志位、去皮值以及重量值等變量。當需要對秤進行去皮操作時,可以通過修改該數(shù)據(jù)結(jié)構(gòu)體中的參數(shù)來實現(xiàn)。
(5)測量重量并顯示結(jié)果。通過調(diào)用HX711模塊的函數(shù)讀取傳感器的模擬信號,并將其轉(zhuǎn)換為數(shù)字信號。然后再通過數(shù)學運算計算出物體的重量,并將其轉(zhuǎn)換成字符串的形式依次顯示在LCD1602顯示屏上的第一行和第二行。
(6)實現(xiàn)去皮功能。當用戶按下獨立按鍵時,首先判斷是否已經(jīng)進行過去皮操作,如果沒有就記錄當前稱重值為皮重值。之后,每次測量重量時都從當前重量中減去去皮值,得到凈重值。
(7)主程序循環(huán)執(zhí)行。主程序通過延時函數(shù)實現(xiàn)循環(huán)執(zhí)行的功能。在這個過程中,不斷測量重量并顯示結(jié)果,同時根據(jù)用戶輸入實現(xiàn)去皮功能。
本項目的硬件設(shè)計采用STC89C52單片機、HX711模塊、LCD1602顯示屏和獨立按鍵。軟件設(shè)計主要包括初始化程序、中斷服務程序、重量測量與顯示程序、去皮函數(shù)和主程序等部分。通過完美地結(jié)合硬件和軟件的功能,可以實現(xiàn)電子秤的基本稱重和去皮功能,并且具有較高的精度和穩(wěn)定性。
三、項目代碼編寫
#include <reg52.h>
#include <intrins.h>
// 定義LCD1602相關(guān)引腳
sbit RS = P2^0; // RS引腳
sbit RW = P2^1; // RW引腳
sbit E = P2^2; // E引腳
sbit DATA = P0; // 數(shù)據(jù)線引腳
// 定義HX711相關(guān)引腳
sbit PD_SCK = P1^5; // 時鐘引腳
sbit DOUT = P1^6; // 數(shù)據(jù)引腳
// 定義獨立按鍵引腳
sbit KEY = P3^2;
// 定義全局變量
bit tareFlag = 0; // 去皮操作標志位
long tareValue = 0; // 去皮值
// LCD1602寫命令
void LcdWriteCmd(unsigned char cmd) {
RS = 0;
RW = 0;
DATA = cmd;
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
}
// LCD1602寫數(shù)據(jù)
void LcdWriteData(unsigned char dat) {
RS = 1;
RW = 0;
DATA = dat;
_nop_();
E = 1;
_nop_();
E = 0;
_nop_();
}
// LCD1602初始化
void LcdInit() {
LcdWriteCmd(0x38); // 設(shè)置16x2顯示模式
LcdWriteCmd(0x0c); // 開啟光標并關(guān)閉閃爍
LcdWriteCmd(0x06); // 光標右移
LcdWriteCmd(0x01); // 清除顯示
LcdWriteCmd(0x80); // 設(shè)置顯示位置為第一行第一個字符
}
// HX711讀取數(shù)據(jù)
long Hx711Read() {
unsigned char i;
long value = 0;
while(DOUT);
for (i = 0; i < 24; i++) {
PD_SCK = 1;
value = value << 1;
_nop_();
if (DOUT) {
value++;
}
PD_SCK = 0;
_nop_();
}
for (i = 0; i < 1; i++) {
PD_SCK = 1;
_nop_();
PD_SCK = 0;
_nop_();
}
return value;
}
// 延時函數(shù)
void Delay(unsigned int n) {
unsigned int i, j;
for (i = n; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
// 顯示重量和去皮值
void DisplayWeight(long weight) {
unsigned char i;
unsigned long temp;
unsigned char str[] = "Weight:";
temp = weight;
for (i = 7; i >= 0; i--) {
str[7 - i + 7] = temp % 10 + '0';
temp /= 10;
}
for (i = 0; i < 8; i++) {
LcdWriteData(str[i]);
}
if (tareFlag) {
unsigned char strTare[] = " Tare:";
temp = tareValue;
for (i = 7; i >= 0; i--) {
strTare[7 - i + 6] = temp % 10 + '0';
temp /= 10;
}
for (i = 0; i < 7; i++) {
LcdWriteData(strTare[i]);
}
}
}
// 去皮操作
void Tare() {
tareFlag = 1;
tareValue = Hx711Read();
}
// 主函數(shù)
void main() {
long weight;
LcdInit(); // 初始化LCD1602
Delay(5);
while (1) {
weight = Hx711Read(); // 讀取重量
if (tareFlag) {
weight -= tareValue; // 計算凈重
}
DisplayWeight(weight); // 顯示重量
if (KEY == 0) {
Delay(50);
if (KEY == 0) {
Tare(); // 執(zhí)行去皮操作
while (!KEY);
Delay(10);
}
}
}
}
項目代碼里實現(xiàn)了HX711傳感器讀取重量數(shù)據(jù),并通過LCD1602模塊顯示重量信息。在引入頭文件和定義相關(guān)引腳后,通過全局變量來設(shè)置去皮操作的標志位和去皮值。定義了幾個輔助函數(shù),包括LCD1602的寫命令和寫數(shù)據(jù)函數(shù)、LCD1602的初始化函數(shù)、HX711傳感器讀取數(shù)據(jù)函數(shù)以及延時函數(shù)。
在主函數(shù)中,進行LCD1602的初始化。進入一個無限循環(huán),不斷讀取HX711傳感器的重量數(shù)據(jù)并顯示在LCD上。如果去皮操作的標志位被設(shè)置了,會計算凈重并顯示在LCD上。當檢測到一個按鍵按下時,執(zhí)行去皮操作,并等待按鍵釋放。
四、總結(jié)
本項目是一個基于8051單片機的電子秤程序,利用HX711傳感器讀取重量數(shù)據(jù),并通過LCD1602模塊顯示重量信息。
在項目實現(xiàn)過程中,進行了硬件的連接,包括將HX711傳感器與單片機相連以及將LCD1602模塊與單片機相連。然后,通過編寫相應的代碼來實現(xiàn)功能。
在代碼實現(xiàn)中,主要包括了對LCD1602的初始化和寫命令、寫數(shù)據(jù)操作的函數(shù)定義,以及對HX711傳感器的數(shù)據(jù)讀取和顯示重量的函數(shù)定義。利用全局變量設(shè)置了去皮操作的標志位和去皮值,并在主函數(shù)中通過循環(huán)不斷讀取HX711傳感器的重量數(shù)據(jù)并進行相應的處理和顯示。