• 方案介紹
    • 一、項(xiàng)目背景
    • 二、項(xiàng)目設(shè)計思路
    • 三、項(xiàng)目代碼編寫
    • 四、總結(jié)
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

STC89C52+HX711完成電子秤設(shè)計

4小時前
161
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請聯(lián)系.docx

共1個文件

一、項(xiàng)目背景

電子秤是一種通過傳感器測量物體質(zhì)量的設(shè)備,被廣泛應(yīng)用于商業(yè)和工業(yè)領(lǐng)域。傳統(tǒng)的機(jī)械秤已經(jīng)逐漸被電子秤取代,因?yàn)殡娮映泳哂懈叩木?、更方便的使用和更多的功能?/p>

本項(xiàng)目利用STC89C52單片機(jī)HX711模塊完成電子秤設(shè)計,具有去皮功能、累加功能以及LCD1602顯示屏顯示實(shí)時稱重數(shù)據(jù)。通過HX711模塊實(shí)現(xiàn)對物品重量的精確測量;支持去皮功能,可以在測量前將容器的重量減去,得到凈重;具備累加功能,可以記錄多次測量結(jié)果并進(jìn)行累加;使用LCD1602顯示屏實(shí)時顯示當(dāng)前稱重數(shù)據(jù),方便用戶查看。

該電子秤實(shí)現(xiàn)了基本稱重功能和去皮功能?;痉Q重功能指的是通過傳感器測量物體質(zhì)量并顯示結(jié)果。HX711模塊連接到電子秤上的傳感器,通過讀取HX711模塊輸出的數(shù)字信號來獲取物體的重量數(shù)據(jù)。STC89C52單片機(jī)通過串行通信協(xié)議與HX711模塊進(jìn)行通信,并從中獲取到稱重數(shù)據(jù)。然后,通過控制LCD1602顯示器,將稱重結(jié)果以可讀的方式顯示在LCD屏幕上。用戶可以清晰地看到物體的重量。

除了基本稱重功能,該電子秤還具有去皮功能。當(dāng)用戶按下獨(dú)立按鍵時,系統(tǒng)將自動記錄當(dāng)前的稱重值為皮重。之后,無論在物體放置前還是放置后按下獨(dú)立按鍵,系統(tǒng)都會自動去除皮重,并顯示凈重。這樣可以方便地進(jìn)行物體重量的測量,而無需手動計算。

整個系統(tǒng)的核心是STC89C52單片機(jī),負(fù)責(zé)與HX711模塊和LCD1602顯示器進(jìn)行通信,并控制顯示內(nèi)容和去皮功能。該設(shè)計不僅簡單實(shí)用,而且具有良好的可擴(kuò)展性和穩(wěn)定性,適用于各種實(shí)際應(yīng)用場景,如商業(yè)稱重、食品加工等。

image-20230913121655031

image-20230913115026419

二、項(xiàng)目設(shè)計思路

【1】硬件設(shè)計思路:

本項(xiàng)目采用STC89C52單片機(jī)作為核心控制器,HX711模塊作為傳感器,以及LCD1602顯示屏和獨(dú)立按鍵作為用戶接口。

整個系統(tǒng)的連接方式如下:

將PD_SCK引腳連接到P1.5引腳(中斷0),DOUT引腳連接到P1.6引腳(中斷1),這兩個引腳用于與HX711模塊進(jìn)行SPI通信。LCD1602顯示屏數(shù)據(jù)線DB0-DB7分別連接到P0.0-P0.7引腳,RS(寄存器/數(shù)據(jù)選擇)引腳連接至P2.0引腳,R/W(讀寫模式選擇)引腳連接至P2.1引腳,E(使能)引腳連接至P2.2引腳,這些引腳用于控制LCD1602顯示器上的文本顯示。獨(dú)立按鍵引腳連接至P3.2引腳,用于觸發(fā)去皮功能。

【2】軟件設(shè)計思路:

(1)初始化 LCD1602 顯示器。設(shè)置顯示模式、清除顯示、光標(biāo)復(fù)位等。

(2)初始化 HX711 模塊。通過 SPI 通信協(xié)議與模塊建立連接,設(shè)置增益和偏移量等參數(shù)。

(3)建立中斷服務(wù)程序。P1.5和P1.6引腳在正常工作時,都是高電平狀態(tài),但當(dāng)需要進(jìn)行SPI通信時,需要向這兩個引腳分別輸出規(guī)定的低電平與高電平。可以通過設(shè)置中斷服務(wù)程序,在需要進(jìn)行SPI通信的時候向P1.5和P1.6引腳分別輸出指定的電平。當(dāng)SPI通信完成后,恢復(fù)高電平狀態(tài)。

(4)定義數(shù)據(jù)結(jié)構(gòu)體。在程序中定義一個數(shù)據(jù)結(jié)構(gòu)體,包含去皮函數(shù)的標(biāo)志位、去皮值以及重量值等變量。當(dāng)需要對秤進(jìn)行去皮操作時,可以通過修改該數(shù)據(jù)結(jié)構(gòu)體中的參數(shù)來實(shí)現(xiàn)。

(5)測量重量并顯示結(jié)果。通過調(diào)用HX711模塊的函數(shù)讀取傳感器的模擬信號,并將其轉(zhuǎn)換為數(shù)字信號。然后再通過數(shù)學(xué)運(yùn)算計算出物體的重量,并將其轉(zhuǎn)換成字符串的形式依次顯示在LCD1602顯示屏上的第一行和第二行。

(6)實(shí)現(xiàn)去皮功能。當(dāng)用戶按下獨(dú)立按鍵時,首先判斷是否已經(jīng)進(jìn)行過去皮操作,如果沒有就記錄當(dāng)前稱重值為皮重值。之后,每次測量重量時都從當(dāng)前重量中減去去皮值,得到凈重值。

(7)主程序循環(huán)執(zhí)行。主程序通過延時函數(shù)實(shí)現(xiàn)循環(huán)執(zhí)行的功能。在這個過程中,不斷測量重量并顯示結(jié)果,同時根據(jù)用戶輸入實(shí)現(xiàn)去皮功能。

本項(xiàng)目的硬件設(shè)計采用STC89C52單片機(jī)、HX711模塊、LCD1602顯示屏和獨(dú)立按鍵。軟件設(shè)計主要包括初始化程序、中斷服務(wù)程序、重量測量與顯示程序、去皮函數(shù)和主程序等部分。通過完美地結(jié)合硬件和軟件的功能,可以實(shí)現(xiàn)電子秤的基本稱重和去皮功能,并且具有較高的精度和穩(wěn)定性。

三、項(xiàng)目代碼編寫

#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ù)引腳

// 定義獨(dú)立按鍵引腳
sbit KEY = P3^2;

// 定義全局變量
bit tareFlag = 0;     // 去皮操作標(biāo)志位
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);   // 開啟光標(biāo)并關(guān)閉閃爍
    LcdWriteCmd(0x06);   // 光標(biāo)右移
    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àng)目代碼里實(shí)現(xiàn)了HX711傳感器讀取重量數(shù)據(jù),并通過LCD1602模塊顯示重量信息。在引入頭文件和定義相關(guān)引腳后,通過全局變量來設(shè)置去皮操作的標(biāo)志位和去皮值。定義了幾個輔助函數(shù),包括LCD1602的寫命令和寫數(shù)據(jù)函數(shù)、LCD1602的初始化函數(shù)、HX711傳感器讀取數(shù)據(jù)函數(shù)以及延時函數(shù)。

在主函數(shù)中,進(jìn)行LCD1602的初始化。進(jìn)入一個無限循環(huán),不斷讀取HX711傳感器的重量數(shù)據(jù)并顯示在LCD上。如果去皮操作的標(biāo)志位被設(shè)置了,會計算凈重并顯示在LCD上。當(dāng)檢測到一個按鍵按下時,執(zhí)行去皮操作,并等待按鍵釋放。

四、總結(jié)

本項(xiàng)目是一個基于8051單片機(jī)的電子秤程序,利用HX711傳感器讀取重量數(shù)據(jù),并通過LCD1602模塊顯示重量信息。

在項(xiàng)目實(shí)現(xiàn)過程中,進(jìn)行了硬件的連接,包括將HX711傳感器與單片機(jī)相連以及將LCD1602模塊與單片機(jī)相連。然后,通過編寫相應(yīng)的代碼來實(shí)現(xiàn)功能。

在代碼實(shí)現(xiàn)中,主要包括了對LCD1602的初始化和寫命令、寫數(shù)據(jù)操作的函數(shù)定義,以及對HX711傳感器的數(shù)據(jù)讀取和顯示重量的函數(shù)定義。利用全局變量設(shè)置了去皮操作的標(biāo)志位和去皮值,并在主函數(shù)中通過循環(huán)不斷讀取HX711傳感器的重量數(shù)據(jù)并進(jìn)行相應(yīng)的處理和顯示。

  • 更多詳細(xì)資料請聯(lián)系.docx
    下載

相關(guān)推薦