日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

51单片机电子秤(HX711模块 + LCD1602)

發(fā)布時(shí)間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机电子秤(HX711模块 + LCD1602) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

51單片機(jī)電子秤(HX711模塊 + LCD1602)

(簡(jiǎn)單易懂)

1.---------------序
2.HX711測(cè)重模塊
3.LCD1602顯示模塊
4.電子秤整體實(shí)現(xiàn)原理
5.模塊升級(jí)>>去皮與還原
6.源代碼

零.先來(lái)一個(gè)效果展示

這里可以看到3個(gè)20g砝碼加上去顯示60g的重量
5個(gè)20g砝碼加上去顯示100g的重量,精度是比較準(zhǔn)的

一.首先考慮如何把這樣一個(gè)項(xiàng)目設(shè)計(jì)出來(lái)

1.明確目標(biāo)
–做這樣一個(gè)東西,我們需要實(shí)現(xiàn)怎樣的效果–
2.思路清晰
–整個(gè)執(zhí)行過(guò)程我門(mén)需要設(shè)計(jì)哪些事–
–整個(gè)執(zhí)行過(guò)程我們要按照怎樣的一個(gè)邏輯–
3.確保執(zhí)行
–有效(花時(shí)間并不等于有效)的執(zhí)行力是成功所必不可缺的–
4.總結(jié)收獲
–在實(shí)現(xiàn)項(xiàng)目過(guò)程中我們學(xué)到了什么–
–以后應(yīng)對(duì)不同的項(xiàng)目有哪些想法是可以通用的–

二.HX711測(cè)重模塊原理

1.HX711模塊可以看成由三個(gè)部分組成>>壓力傳感器,電壓放大器,ad轉(zhuǎn)換芯片

壓力傳感器:感知物體重力,并轉(zhuǎn)化為電壓信號(hào)這里是0~5kg壓力傳感器,靈敏電壓為1mv,即1kg重力產(chǎn)生1mv電壓電壓放大器:由于壓力傳感器產(chǎn)生電壓太小,需要對(duì)電壓信號(hào)放大這里用的是128倍電壓增益ad轉(zhuǎn)換芯片(24位):將模擬信號(hào)(放大后的電壓值)轉(zhuǎn)化為數(shù)字信號(hào)(ad值)

2.ad值轉(zhuǎn)化為重力大小

假設(shè)重力為x kg,ad = (x/5)*128*2^24*(5/5000),(滿(mǎn)量程為5kg,128倍放大,精度為2^24)(傳感器滿(mǎn)偏電壓5mv,單片機(jī)為5v)ad = 429496.7296x >> x = ad/429496.7296 (按g顯示再乘1000即可) //ad轉(zhuǎn)化為重力大小公式,(float)將整除轉(zhuǎn)化為小數(shù)運(yùn)算,再將運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)化為無(wú)符號(hào)整型數(shù)值 Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15); //理論上是除以429.5,實(shí)際上存在誤差(傳感器曲線以及電壓的微小誤差),需要根據(jù)顯示情況來(lái)調(diào)整這一數(shù)值

3.HX711時(shí)序圖 & ad取值代碼

sbit HX711_DOUT = P2^1; //聲明P2^1口接HX711數(shù)據(jù)線 sbit HX711_SCK = P2^0; //聲明P2^0口接HX711時(shí)鐘線 unsigned long HX711_Read(void) {unsigned long count; //存ad值unsigned char i; HX711_DOUT = 1; //數(shù)據(jù)端口拉高,參照時(shí)序圖寫(xiě)_nop_(); //延時(shí)_nop_();HX711_SCK = 0; //時(shí)鐘端口拉低count = 0; //ad值初始化for(i=0; i<24; i++) //循環(huán)24次傳數(shù)據(jù),按位接收數(shù)據(jù){ HX711_SCK = 1; //準(zhǔn)備轉(zhuǎn)換數(shù)據(jù)count = count << 1; //向左移位,即向低位補(bǔ)0,空出最低位進(jìn)行傳值操作,如1<<1為10HX711_SCK = 0; //時(shí)鐘脈沖下降延,數(shù)據(jù)開(kāi)始轉(zhuǎn)換if(HX711_DOUT)count++; //數(shù)據(jù)端為高則最低位+1,為1,數(shù)據(jù)端為低則最低位不變,為0(左移把最低位空出)} HX711_SCK = 1; //第25個(gè)脈沖延count = count^0x800000; //異或輸出原碼_nop_();_nop_();HX711_SCK = 0; //結(jié)束ad轉(zhuǎn)換return(count); //傳出ad值 }

ad值以二進(jìn)制補(bǔ)碼輸出

這里用的是128倍增益A通道

三.LCD1602液晶顯示模塊原理

引腳說(shuō)明

讀寫(xiě)說(shuō)明

寫(xiě)指令/數(shù)據(jù)時(shí)序圖

1.寫(xiě)指令(發(fā)送寫(xiě)下的指令碼給LCD1602并執(zhí)行)

sbit LCD1602_RS = P3^5; //sbit LCD1602_RW = P2^5; //郭天祥51板LCDRW端直接接了地,故省略(就不能拉高不能讀指令/數(shù)據(jù)操作) sbit LCD1602_EN = P3^4; void LCD1602_write_com(unsigned char com) //聲明指令參數(shù) {LCD1602_RS = 0;Delay(10);LCD1602_EN = 1;P0 = com; //生成指令Delay(10);LCD1602_EN = 0; }

lcd1602指令表

2.寫(xiě)數(shù)據(jù)(把數(shù)據(jù)寫(xiě)入LCD1602并顯示)

void LCD1602_write_data(unsigned char dat) //聲明數(shù)據(jù)參數(shù) {LCD1602_RS = 1;Delay(10); P0 = dat; //生成數(shù)據(jù)LCD1602_EN = 1;Delay(10);LCD1602_EN = 0; }

3.寫(xiě)連續(xù)字符(字符串)

void LCD1602_write_word(unsigned char *s) {while(*s>0){LCD1602_write_data(*s); //寫(xiě)指針位置處字符數(shù)據(jù)s++; //指針++指向連續(xù)字符下一個(gè)位置} }

4.LCD1602初始化

void Init_LCD1602() {LCD1602_EN = 0;//LCD1602_RW = 0; //設(shè)置為寫(xiě)狀態(tài)LCD1602_write_com(0x38); //顯示模式設(shè)定LCD1602_write_com(0x0c); //開(kāi)關(guān)顯示、光標(biāo)有無(wú)設(shè)置、光標(biāo)閃爍設(shè)置LCD1602_write_com(0x06); //寫(xiě)一個(gè)字符后指針加一LCD1602_write_com(0x01); //清屏指令 }

四.電子秤整體實(shí)現(xiàn)原理

1.HX711模塊與51單片機(jī)的通信(獲取到重量電壓信號(hào)ad值傳給單片機(jī))
2.51單片機(jī)與LCD1602的通信(在LCD1602上顯示ad值轉(zhuǎn)換為的實(shí)際重量)

以下是如何顯示重量值

/*0x80為移動(dòng)光標(biāo)到顯示屏第一行首位,+0x40是光標(biāo)到第二行首位,再+0x09是光標(biāo)再往后挪九格,指令表中可查*/ LCD1602_write_com(0x80+0x49); /*取千位具體數(shù)字值,+0x30表示將該數(shù)字值轉(zhuǎn)為ASCII碼表地址,例int a=8,ASCII碼表中8的地址為0x38,即a+0x30*/ LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); LCD1602_write_com(0x80+0x49); //光標(biāo)移動(dòng)第二行第九個(gè)位置LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); //千位LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30); //百位LCD1602_write_data(Weight_Shiwu%100/10 + 0X30); //十位LCD1602_write_data(Weight_Shiwu%10 + 0X30); //個(gè)位LCD1602_write_word(" g"); //顯示單位克

五.模塊升級(jí)>>去皮與還原

1.首先理解去皮的含義:
假如你有一個(gè)梨,你想知道它的重量,看看賣(mài)家有沒(méi)有坑你,以后能不能再到這買(mǎi)梨,
可你覺(jué)得秤太臟了,秤一下梨都沒(méi)有食欲不想吃了,靈光突然一閃想到可以用一個(gè)碗墊著秤,
想法不錯(cuò)可問(wèn)題就來(lái)了,碗的重量怎么辦呢,這時(shí)去皮的意義就出來(lái)了
先把碗放在秤盤(pán)上,這時(shí)顯示屏顯示的是碗的重量,小手一抖按一下去皮鍵,
碗的重量就沒(méi)有了,顯示屏顯示0,這下可以安心秤梨了

2.去皮如何實(shí)現(xiàn):

I/O口聲明&變量聲明 sbit key1 = P3^6; //聲明按鍵1(去皮鍵)具體I/O口和單片機(jī)型號(hào)有關(guān) sbit key2 = P3^7; //聲明按鍵2(還原鍵) unsigned long Weight_Shiwu = 0; //無(wú)符號(hào)長(zhǎng)型變量存實(shí)物重量 unsigned long Weight_Maopi = 0; //毛皮重量(相當(dāng)于碗的重量)

先判斷去皮鍵是否被按下

void Keyscan() {if(key1 == 0)Delay(10); //消抖if(key1 == 0){Get_Maopi(); //獲取毛皮重量(相當(dāng)于碗的重量)while(!key1); //松手檢測(cè)} }

去皮鍵按下后,就可以獲取毛皮重量(碗重量)了

void Get_Maopi() {Weight_Maopi = HX711_Read(); //把a(bǔ)d值獲取到Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); //換算成真正的毛皮重量 }

將按鍵掃描放在主函數(shù)while(1)死循環(huán)的最開(kāi)始,去皮鍵按下才執(zhí)行
去皮鍵未按下就直接稱(chēng)重,跳過(guò)去皮環(huán)節(jié)

while(1){Keyscan();Get_Weight();/*............*/void Get_Weight() {Weight_Shiwu = HX711_Read(); //把a(bǔ)d值獲取到Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15); //換算成真正的實(shí)物重量Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //毛皮重量初始為0 }

3.如何還原去皮:
在按鍵掃描函數(shù)中再加一個(gè)還原按鍵
如果還原鍵按下,毛皮重量被初始化(置0)
就實(shí)現(xiàn)了還原去皮的效果

void Keyscan() {if(key1 == 0)Delay(10);if(key1 == 0){Get_Maopi();while(!key1);}if(key2 == 0)Delay(10);if(key2 == 0){Weight_Maopi = 0; //毛皮重量置0while(!key2);} }

六.源代碼及注釋

#include<reg52.h> #include <intrins.h>/*I/O口聲明*/ sbit LCD1602_RS = P3^5; //sbit LCD1602_RW = P2^5; sbit LCD1602_EN = P3^4; sbit HX711_DOUT = P2^1; sbit HX711_SCK = P2^0; sbit key1 = P3^6; sbit key2 = P3^7;/*全局變量定義*/ unsigned long Weight_Shiwu = 0; unsigned long Weight_Maopi = 0;/*函數(shù)聲明*/ void Delay(unsigned int n); void Init_LCD1602(); void LCD1602_write_com(unsigned char com); void LCD1602_write_word(unsigned char *s); void LCD1602_write_data(unsigned char dat); unsigned long HX711_Read(void); void Keyscan(); void Get_Maopi(); void Get_Weight();int main() { Init_LCD1602(); //LCD1602初始化LCD1602_write_com(0x80); //移動(dòng)光標(biāo)到第一行首位LCD1602_write_word(" Dian Zi Cheng! "); //顯示 Dian Zi Cheng! LCD1602_write_com(0x80 + 0x40); //移動(dòng)光標(biāo)到第二行首位LCD1602_write_word("Weight :"), //顯示W(wǎng)eight :Delay(1000); //1s延時(shí)while(1){Keyscan();Get_Weight(); LCD1602_write_com(0x80+0x49); //移動(dòng)光標(biāo)到第二行第九位LCD1602_write_data(Weight_Shiwu%10000/1000 + 0X30); LCD1602_write_data(Weight_Shiwu%1000/100 + 0X30);LCD1602_write_data(Weight_Shiwu%100/10 + 0X30);LCD1602_write_data(Weight_Shiwu%10 + 0X30);LCD1602_write_word(" g");}return 0; }/*稱(chēng)實(shí)物重*/ void Get_Weight() {Weight_Shiwu = HX711_Read();Weight_Shiwu = (unsigned int)((float)Weight_Shiwu/423.15);Weight_Shiwu = Weight_Shiwu - Weight_Maopi; }/*延時(shí)子函數(shù)*/ void Delay(unsigned int n) {int i, j;for(i=0; i<n; i++)for(j=0; j<110; j++); }/*寫(xiě)指令*/ void LCD1602_write_com(unsigned char com) {LCD1602_RS = 0;Delay(10);LCD1602_EN = 1;P0 = com;Delay(10);LCD1602_EN = 0; }/*寫(xiě)數(shù)據(jù)*/ void LCD1602_write_data(unsigned char dat) {LCD1602_RS = 1;Delay(10); P0 = dat;LCD1602_EN = 1;Delay(10);LCD1602_EN = 0; }/*寫(xiě)連續(xù)字符(字符串)*/ void LCD1602_write_word(unsigned char *s) {while(*s>0){LCD1602_write_data(*s);s++;} }/*初始化LCD1602*/ void Init_LCD1602() {LCD1602_EN = 0;//LCD1602_RW = 0;LCD1602_write_com(0x38);LCD1602_write_com(0x0c);LCD1602_write_com(0x06);LCD1602_write_com(0x01); }/*獲取ad值*/ unsigned long HX711_Read(void) {unsigned long count; unsigned char i; HX711_DOUT = 1; _nop_();_nop_();HX711_SCK = 0; count=0;for(i=0; i<24; i++){ HX711_SCK = 1; count = count << 1; HX711_SCK = 0; if(HX711_DOUT)count++; } HX711_SCK = 1; count = count^0x800000;_nop_();_nop_();HX711_SCK = 0; return(count); }/*稱(chēng)毛皮重*/ void Get_Maopi() {Weight_Maopi = HX711_Read();Weight_Maopi = (unsigned int)((float)Weight_Maopi/423.15); }/*按鍵掃描*/ void Keyscan() {if(key1 == 0)Delay(10);if(key1 == 0){Get_Maopi();while(!key1);}if(key2 == 0)Delay(10);if(key2 == 0){Weight_Maopi = 0;while(!key2);} }

總結(jié)

以上是生活随笔為你收集整理的51单片机电子秤(HX711模块 + LCD1602)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。