仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計(jì)編號(hào):【P03】
1.? 簡介
? 本文提出了一種基于51單片機(jī)的電子秤設(shè)計(jì)。該設(shè)計(jì)在硬件方面主要采用AT89C51單片機(jī)作為主控核心,采用壓力傳感器對(duì)數(shù)據(jù)進(jìn)行采集,電子秤專用24位AD轉(zhuǎn)換芯片HX711對(duì)傳感器采集到的模擬量進(jìn)行AD轉(zhuǎn)換,轉(zhuǎn)換后的數(shù)據(jù)送到單片機(jī)進(jìn)行處理顯示,數(shù)據(jù)顯示由4位數(shù)碼管液晶實(shí)現(xiàn)。
2.? 主要功能
a.系統(tǒng)可實(shí)現(xiàn)電子稱基本的稱重功能(稱重范圍為0~5Kg,重量誤差0.001Kg);
b.系統(tǒng)應(yīng)具備去皮、校準(zhǔn)加減的功能;
c.系統(tǒng)超出最大測量范圍5Kg時(shí)應(yīng)有報(bào)警指示功能(蜂鳴器報(bào)警提示);
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "main.h"
#include "HX711.h"
#include "eeprom52.h"
#define uchar unsigned char
#define uint unsigned int
unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0;
unsigned long Weight_Maopi_0 = 0;
long Weight_Shiwu = 0;
unsigned int qupi=0;
unsigned char p=0;
//鍵盤處理變量
unsigned char keycode;
unsigned char key_press_num=0;
uint GapValue,GapValue1;
bit flag_cz=0;
uchar code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B}; //數(shù)碼管顯示碼表
//定義標(biāo)識(shí)
volatile bit FlagTest = 0; //定時(shí)測試標(biāo)志,每0.5秒置位,測完清0
volatile bit FlagKeyPress = 0; //有鍵按下標(biāo)志,處理完畢清0
//校準(zhǔn)參數(shù)
//因?yàn)椴煌膫鞲衅魈匦郧€不是很一致,因此,每一個(gè)傳感器需要矯正這里這個(gè)參數(shù)才能使測量值更準(zhǔn)確。
//當(dāng)發(fā)現(xiàn)測試出來的重量偏大時(shí),增加該數(shù)值。
//如果測試出來的重量偏小時(shí),減小改數(shù)值。
//該值可以為小數(shù)
sbit LED=P1^1;
sbit ROW1=P3^0;
sbit ROW2=P3^1;
sbit ROW3=P3^2;
sbit DIAN = P0^5; //小數(shù)點(diǎn)
volatile bit ClearWeighFlag = 0; //傳感器調(diào)零標(biāo)志位,清除0漂
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
GapValue1=GapValue&0x00ff;
byte_write(0x2000, GapValue1);
GapValue1=(GapValue&0xff00)>>8;
byte_write(0x2001, GapValue1);
byte_write(0x2060, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
void read_eeprom()
{
GapValue = byte_read(0x2001);
GapValue = (GapValue<<8)|byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************開機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
{
GapValue = 3500;
a_a = 1;
write_eeprom(); //保存數(shù)據(jù)
}
}
/*****顯示開機(jī)初始化等待畫面*****/
void Disp_init(void)
{
P0 = ~0x80; //顯示----
P2 = 0xBF; //依次打開各位
Delay_ms(1); //延時(shí)
P2 = 0xEF;
Delay_ms(1);
P2 = 0xFB;
Delay_ms(1);
P2 = 0xFE;
Delay_ms(1);
P2 = 0xFF; //關(guān)閉顯示
}
//顯示重量,單位kg,兩位整數(shù),三位小數(shù)
void Display_Weight()
{
P0 = ~LEDData[Weight_Shiwu%10]; //
P2 = 0xBF; //打開位
Delay_ms(1); //延時(shí)
P2 = 0xff; //關(guān)閉顯示
P0=~LEDData[Weight_Shiwu%100/10]; //顯示個(gè)位
P2 = 0xEF;
Delay_ms(1);
P2 = 0xff; //關(guān)閉顯示
P0 =~LEDData[Weight_Shiwu%1000/100]; //顯示十位
P2 = 0xFB;
Delay_ms(1);
P2 = 0xff; //關(guān)閉顯示
P0 =~LEDData[Weight_Shiwu%10000/1000]; //顯示百位
DIAN = 0; //顯示小數(shù)點(diǎn)
P2 = 0xFE;
Delay_ms(1);
P2 = 0xff; //關(guān)閉顯示
}
//定時(shí)器0初始化
void Timer0_Init()
{
ET0 = 1; //允許定時(shí)器0中斷
TMOD = 1; //定時(shí)器工作方式選擇
TL0 = 0xb0;
TH0 = 0x3c; //定時(shí)器賦予初值
TR0 = 1; //啟動(dòng)定時(shí)器
}
//定時(shí)器0中斷
void Timer0_ISR (void) interrupt 1 using 0
{
uchar Counter;
TL0 = 0xb0;
TH0 = 0x3c; //定時(shí)器賦予初值
//每0.5秒鐘刷新重量
Counter ++;
if (Counter >= 10)
{
FlagTest = 1;
Counter = 0;
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
稱重:
超重報(bào)警:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【P03】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集