一、设计简介:
本设计是基于51单片机智能电子称系统设计,主要实现以下功能:
1.本设计基于单片机型号:STC89C52/51、AT89C52/51、AT89S52/51都可通用。
2.按键具有提示声,具有超量程报警功能当超出压力传感器的量程时蜂鸣器会发出报警声。
3.采用lcd602显示,第一行显示当前重量(单位为kg),第二行单价和总价(单位为元)等信息。
4.采用电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换,HX711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24位A/D转换器芯片
5.采用高精度电阻应变式压力传感器,测量量程0 -5kg,测量精度可达3g
6.采用4*4矩阵键盘进行人机交互,可以实现直接输入单价、删除单价、去皮、清零等功能操作非常方便。
4*4矩阵键盘定义如下
1 2 3 15(删除键)
4 5 6 14(去皮或是清零)
7 8 9 13(清除单价)
10(未定义) 0 11(未定义) 12(未定义)
键0—9为数字键,用于单价输入。
键13为单价一键清零,按下该键则单价清为0。
键14为去皮键,按下后当前重量清为0。
键15为删除键,当我们单价输入错误时可以逐位删除输错的单价,删除后可以继续输入单价。
主要硬件组成:
51单片机+LCD1602液晶 +HX711AD模块 +电阻应变式压力传感器+蜂鸣器+矩阵键盘
二、原理图
三、PCB图
四、Proteus仿真
五、程序源码
部分代码:
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
}
在指定位置显示指定字符//
void write_zifu(uchar hang,uchar add,uchar dat)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(dat);
}
/********************************************************************
* 名称 : write_sfm4_price(uchar hang,uchar add,uchar date)
* 功能 : 显示价格
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void write_sfm4_price(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/1000%10);
write_data(0x30+date/100%10);
write_data('.');
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
/****************开机液晶显示函数 初始化液晶的内容********************************/
void init_1602_dis_csf() //初始化液晶
{
write_string(1,0," W:0.000kg ");
write_string(2,0,"P:00.00 Z:00.00");
write_zifu(2,7,0x5c); //¥
// write_zifu(2,15,0x5c); //¥
}
/*******************压力显示程序***********************/
void write_1602_yl(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/1000%10);
write_data('.');
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void Delay__hx711_us(void)
{
_nop_();
_nop_();
}
ulong ReadCount(void) //增益128
{
ulong count,value = 0;
uchar 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=0;
Delay__hx711_us();
hx711_sck=1;
return(count);
}
void get_pizhong() //获取皮重,秤盘重量
{
ulong hx711_dat;
hx711_dat=ReadCount(); //HX711AD转换数据处理
temp=(uint)(hx711_dat/100);
}
void get_weight() //获取被测物体重量
{
ulong hx711_data,a;
uint get,aa;
hx711_data=ReadCount(); //HX711AD转换数据处理
get=(uint)(hx711_data/100);
if(get>temp)
{
a=ReadCount();
aa=(uint)(a/100)-temp;
weight=(uint)((float)aa/4.9+0.05);//重量转换函数,传感器型号不同此函数要适当修改
}
}
/************************************************/
/* 由于称重传感器线性度参数的不同,而对获得的重量数据处理,
此处可能会根据不同称重传感器,程序的代码会有所不同 */
/************************************************/
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new = 0, key_l;
key_can = 20; //按键值还原
P3 = 0x0f;
if((P3 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P3 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
key_l = P3 | 0xf0; //矩阵键盘扫描
P3 = key_l;
switch(P3)
{
case 0xee: key_can = 1; break; //得到按键值
case 0xde: key_can = 4; break; //得到按键值
case 0xbe: key_can = 7; break; //得到按键值
case 0x7e: key_can = 10; break; //得到按键值
六、资源获取
本项目包含的所有文件都可以点击下面的名片,发送 “ 43、基于51单片机智能电子称系统设计 ” 获取!
项目纯手打,不是免费的哦~
希望可以帮到你哈!