一、系統(tǒng)方案 1、當(dāng)電子稱(chēng)開(kāi)機(jī)時(shí),單片機(jī)會(huì)進(jìn)入一系列初始化,進(jìn)入1602顯示模式設(shè)定,如開(kāi)關(guān)顯示、光標(biāo)有無(wú)設(shè)置、光標(biāo)閃爍設(shè)置,定時(shí)器初始化,進(jìn)入定時(shí)器模式,如初始值賦值。之后液晶會(huì)顯示W(wǎng)elcome To Use Electronic Scale,這是一個(gè)歡迎使用界面: 2、此電子秤是開(kāi)機(jī)檢測(cè)托盤(pán)重量,并將托盤(pán)重量清零(即電子秤每次開(kāi)機(jī)后檢測(cè)托盤(pán)重量,并程序中自動(dòng)將托盤(pán)重量保存在一個(gè)變量中,稱(chēng)量過(guò)程中每次都將獲得的重量減去托盤(pán)重量,而得到所要稱(chēng)量物體的真正的重量),然后單片機(jī)進(jìn)入等待稱(chēng)重界面:WE代表貨物重量,PR代表貨物單價(jià),MONEY代表貨物總價(jià)。 3、在支架上放上待稱(chēng)重物體時(shí),HX711會(huì)采集稱(chēng)重傳感器的模量量,并將這個(gè)模擬量轉(zhuǎn)化數(shù)字量,發(fā)送給單片機(jī),單片機(jī)通過(guò)計(jì)算,將重量顯示在1602上面,由于仿真里面沒(méi)有真實(shí)的貨物,就用兩個(gè)按鍵模量重量,連接HX711的2個(gè)按鍵就是模擬重量加減,一個(gè)按鍵按下,貨物重量加,另外一個(gè)按鍵,貨物重量就會(huì)減。 4、在支架上放上待稱(chēng)重物體時(shí),通過(guò)矩陣鍵盤(pán)設(shè)置好單價(jià),單片機(jī)會(huì)根據(jù)重量乘以單價(jià)計(jì)算出總價(jià)。如果單價(jià)設(shè)置有錯(cuò),按清除按鍵,重新設(shè)置。如果重量有錯(cuò)誤,可以按去皮按鍵清除,校準(zhǔn)加,校準(zhǔn)減按鍵可以對(duì)貨物重量進(jìn)行微調(diào)。 5、在支架上放上待稱(chēng)重物體總量超過(guò)10KG時(shí),蜂鳴器是不停的報(bào)警,LED閃爍,1602上面顯示W(wǎng)E;-.---,直到重量少于10KG蜂鳴器停止報(bào)警,LED停止閃爍。
二、硬件設(shè)計(jì) 原理圖如下:
三、單片機(jī)軟件設(shè)計(jì) 1、首先是系統(tǒng)初始化
Init_LCD1602(); //初始化LCD1602
EA = 0;
Data_Init();
Timer0_Init();
//初中始化完成,開(kāi)斷
EA = 1;
// Get_Maopi();
LCD1602_write_com(0x80); //指針設(shè)置
LCD1602_write_word(" Welcome To Use "); //
LCD1602_write_com(0x80+0x40); //指針設(shè)置
LCD1602_write_word("Wlectronic Scale");
// Delay_ms(2000);
Get_Maopi();
LCD1602_write_com(0x80); //指針設(shè)置
LCD1602_write_word("WE:0.000 PR:00.0");
LCD1602_write_com(0x80+0x40); //指針設(shè)置
LCD1602_write_word("MONEY: 0.00 ");
Display_Price();
// Get_Maopi(); //稱(chēng)毛皮重量
2、液晶顯示程序
//****************************************************
//MS延時(shí)函數(shù)(12M晶振下測(cè)試)
//****************************************************
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
//****************************************************
//寫(xiě)指令
//****************************************************
void LCD1602_write_com(unsigned char com)
{
LCD1602_RS = 0;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
//****************************************************
//寫(xiě)數(shù)據(jù)
//****************************************************
void LCD1602_write_data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_delay_ms(1);
LCD1602_PORT = dat;
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
3、按鍵程序
unsigned char Getkeyboard(void)
{
unsigned char number = 0;
unsigned char i;
//行輸入低電平
ROW1=ROW2=ROW3=ROW4=0;
//如果列輸出不全為高,則說(shuō)明有鍵按下
if ((COL1!=1)||(COL2!=1)||(COL3!=1)||(COL4!=1))
{
//輸入0111
ROW1=0;
ROW2=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 1; // 7
else if (COL2==0) return 2; // 8
else if (COL3==0) return 3; // 9
else if (COL4==0) return 10; // 10
//輸入1011
ROW2=0;
ROW1=ROW3=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 4; //4
else if (COL2==0) return 5; // 5
else if (COL3==0) return 6; // 6
else if (COL4==0) return 11; // 11
//輸入1101
ROW3=0;
ROW1=ROW2=ROW4=1;
for (i=0;i<20;i++);
if (COL1==0) return 7; //1
else if (COL2==0) return 8; // 2
else if (COL3==0) return 9; // 3
else if (COL4==0) return 12; // 12
//輸入0111
ROW4=0;
ROW1=ROW2=ROW3=1;
for (i=0;i<20;i++);
if (COL1==0) return 14;
else if (COL2==0) return 0;
else if (COL3==0) return 15;
else if (COL4==0) return 13;
//沒(méi)有檢測(cè)到列低電平
return 99;
}
return 99;
}
4、核心算法程序
//****************************************************
//讀取HX711
//****************************************************
unsigned long HX711_Read(void) //增益128
{
unsigned long count;
unsigned char i;
HX711_DOUT=1;
Delay__hx711_us();
HX711_SCK=0;
count=0;
while(HX711_DOUT);
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;//第25個(gè)脈沖下降沿來(lái)時(shí),轉(zhuǎn)換數(shù)據(jù)
Delay__hx711_us();
HX711_SCK=0;
return(count);
}
四、proteus仿真設(shè)計(jì) Proteus軟件是一款應(yīng)用比較廣泛的工具,它可以在沒(méi)有硬件平臺(tái)的基礎(chǔ)上通過(guò)自身的軟件仿真出硬件平臺(tái)的運(yùn)行情況,這樣就可以通過(guò)軟件仿真來(lái)驗(yàn)證我們?cè)O(shè)計(jì)的方案有沒(méi)有問(wèn)題,如果有問(wèn)題,可以重新選擇器件,連接器件,直到達(dá)到我們?cè)O(shè)定的目的,避免我們搭建實(shí)物的時(shí)候,如果當(dāng)初選擇的方案有問(wèn)題,我們器件都已經(jīng)焊接好了,再去卸載下去,再去焊接新的方案的器件,測(cè)試,這樣會(huì)浪費(fèi)人力和物力,也給開(kāi)發(fā)者帶來(lái)一定困惑,Proteus仿真軟件就很好的解決這個(gè)問(wèn)題,我們?cè)谠O(shè)計(jì)之初,就使用該軟件進(jìn)行模擬仿真,測(cè)試,選擇滿(mǎn)足我們?cè)O(shè)計(jì)的最優(yōu)方案。最后根據(jù)測(cè)試沒(méi)問(wèn)題的仿真圖紙,焊接實(shí)物,調(diào)試,最終完成本設(shè)計(jì)的作品。
|