国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

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

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

8小時前
245
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

共1個文件

一、項目背景

電子秤是一種通過傳感器測量物體質(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è)稱重、食品加工等。

image-20230913121655031

image-20230913115026419

二、項目設(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ù)并進行相應的處理和顯示。

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

相關(guān)推薦

梅河口市| 三都| 鸡西市| 永善县| 丽江市| 昭觉县| 杭州市| 红安县| 西乌| 平乐县| 扎囊县| 杨浦区| 西青区| 利辛县| 柯坪县| 宜州市| 武清区| 康保县| 岚皋县| 田阳县| 安顺市| 会泽县| 乐至县| 珲春市| 皋兰县| 阿拉善右旗| 怀集县| 漯河市| 肥城市| 鹰潭市| 博罗县| 小金县| 兰西县| 河池市| 紫金县| 香河县| 城口县| 涟源市| 新和县| 西平县| 彭山县|