C51 C52单片机实现减法秤.docx
《C51 C52单片机实现减法秤.docx》由会员分享,可在线阅读,更多相关《C51 C52单片机实现减法秤.docx(16页珍藏版)》请在冰点文库上搜索。
![C51 C52单片机实现减法秤.docx](https://file1.bingdoc.com/fileroot1/2023-6/17/0a87f8e1-f3fa-43bb-8177-886f5e7bb374/0a87f8e1-f3fa-43bb-8177-886f5e7bb3741.gif)
C51C52单片机实现减法秤
课程设计论文
课程名称 单片机减法秤报告
学 院 电子与电气
专 业 自动化
班 级 11自动C1
学 号
学生姓名
单片机减法秤设计报告
一、方案设计
1、采用高精度电阻应变式压力传感器,测量量程0-5kg,测量精度达5g。
2、采用电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换,HX711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24位A/D转换器芯片。
3、采用STC89C52单片机作为主控芯,实现称重、计算价格等主控功能。
4、采用128*64汉字液晶屏显示称重重量、单价、总价等信息。
5、采用4*4矩阵键盘进行人机交互,键盘容量大,操作便捷。
6、具有超量程报警功能,可以通过蜂鸣器和LED灯报警。
7、系统通过USB电源供电,单片机程序也可通过USB线串行下载。
8.黑金刚配套的28BYJ485V驱动的4相5线的步进电机
二、硬件设计
1、硬件方案
(一):
称重传感器感
称重传感器感应被测重力,输出微弱的毫伏级电压信号。
该电压信号经过电子秤专用模拟/数字(A/D)转换器芯片hx711对传感器信号进行调理转换。
HX711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24位A/D转换器芯片,内置增益控制,精度高,性能稳定。
HX711芯片通过2线串行方式与单片机通信。
单片机读取被测数据,进行计算转换,再液晶屏上显示出来。
电阻应变式传感器测量原理如图2所示。
图3测量电桥原理
(二)、电子秤专用24位AD转换芯片HX711及其电路
该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。
输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。
通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。
通道B则为固定的32增益,用于系统参数检测。
芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。
芯片内的时钟振荡器不需要任何外接器件。
上电自动复位功能简化了开机的初始化过程。
HX711内部方框图如图4所示。
其外部管脚如图5所示。
图4HX711内部方框图
本课题设计的HX711电路如图7所示:
(三)步进电机选择
步进电机的主要特性:
1、步进电机必须加驱动才可以运转,驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止,如果加入适当的脉冲信号,就会以一定的角度(称为步角)转动。
转动的速度和脉冲的频率成正比。
2、步进电机具有瞬间启动和急速停止的优越特性
3、改变脉冲的顺序,可以方便的改变转动的方向。
因此,目前打印机,绘图仪,机器人,等等设备都以步进电机为动力核心。
1、如果不考虑数据锁存功能,步进电机的扩展板电路可以简化为下图:
程序设计
(四)、单片机STC89C52及其电路
(1)STC89C52单片机概述
STC89C52系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成MAX810专用复位电路。
本课题设计的电子秤的单片机应用电路如图9所示:
图9STC89C52单片机电路
(五)、液晶屏电路
图10LCD显示电路
液晶屏电路如图10所示。
LCD_CS、LCD_RES、LCD_RS、LCD_SDA、LCD_SCK为液晶模块与单片机接口的控制线。
CS_ZK、SCK_ZK、SO_ZK和SI_ZK为字库和单片机接口的控制线。
(六)、矩阵键盘电路
矩阵键盘电路如图11所示:
图11矩阵键盘电路
图中4*4矩阵键盘可以显示0-9数字、小数点和五个功能键。
键盘行扫描信号为ROW1—ROW4,列扫描信号为COL1—COL4。
(七).电源电路
本设计采用USB接口供电,电源电压5V。
同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。
其电路原理如图所示。
(八)软件设计
主程序软件流程如图21所示。
图21主程序流程图
3、主程序
下面介绍main.c主程序编写,其他程序略。
#include"main.h"
#include"HX711.h"
#include"LCD1602.h"
unsignedcharcodeCCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};/unsignedcharcodeCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
unsignedlongHX711_Buffer=0;
unsignedlongWeight_Maopi=0;
longWeight_Shiwu=0;
unsignedcharKEY_NUM=0;
charTarget_Count=0;
unsignedcharTarget_Buffer[2]={0x00,0x00};
chartarget=0;
unsignedcharwucha=1;
bitFlag_ERROR=0;
bitFlag_OK=0;
#defineGapValue378//378
voidmain()
{Init_LCD1602();
LCD1602_write_com(0x80);
LCD1602_write_word("Welcometouse!
");
while(K1);
Delay_ms(1000);
while(K1==0)
{motor_cw();}
LCD1602_write_com(0x80);
LCD1602_write_word("Weight:
");
LCD1602_write_com(0x80+0x40);
LCD1602_write_word("Target:
0000g");
Get_Maopi();while
(1)
{Get_Weight();
{LCD1602_write_com(0x80+0x0a);
LCD1602_write_word("ERROR");}
else
{LCD1602_write_com(0x80+0x0a);
LCD1602_write_data(Weight_Shiwu/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");}
if(Flag_OK==1&&(target>Weight_Shiwu+wucha))
{motor_ccw();//电机逆转}
if(target<=Weight_Shiwu+wucha)Flag_OK=0;
if(Flag_OK==0){
KEY_NUM=Scan_Key();
if(KEY_NUM!
=0x55)
{if(KEY_NUM==16)
{Get_Maopi();}
if(KEY_NUM==15){while(K1);
Delay_ms(1000);
while(K1==0)
{motor_cw();}}
if(KEY_NUM==12)
{
Target_Count--;
if(Target_Count<0)
{Target_Count=0;}
Target_Buffer[Target_Count]=0;switch(Target_Count)
{case0:
LCD1602_write_com(0x80+0x40+0x0a);
LCD1602_write_data('');
break;
case1:
LCD1602_write_com(0x80+0x40+0x0b);
LCD1602_write_data('0');
break;default:
break;}}
if(KEY_NUM==13){
target=Target_Buffer[0]*10+Target_Buffer[1];
Flag_OK=1;}
f(KEY_NUM>=0&&KEY_NUM<=9){
Target_Buffer[Target_Count]=KEY_NUM;
switch(Target_Count){
case0:
LCD1602_write_com(0x80+0x40+0x0c);
LCD1602_write_data(Target_Buffer[0]+0x30);
break;
case1:
LCD1602_write_com(0x80+0x40+0x0d);
LCD1602_write_data(Target_Buffer[1]+0x30);
break;
default:
break;}
LCD1602_write_com(0x80+0x40+0x0d);
LCD1602_write_data('g');
Target_Count++;
if(Target_Count>=2)
{Target_Count=2;}}}}}}
unsignedcharScan_Key()
{unsignedchartemp=0;
unsignedcharcom=0x55,com1=0,com2=0;
P1=0xf0;
if(P1!
=0xf0)
{com1=P1;
P1=0x0f;
com2=P1;}
P1=0xf0;
while(P1!
=0xf0);
temp=com1|com2;
if(temp==0xee)com=1;//数字1
if(temp==0xed)com=4;//数字4
if(temp==0xeb)com=7;//数字7
if(temp==0xe7)com=11;
if(temp==0xd7)com=0;//数字0
if(temp==0xb7)com=14;//备用键*号键
if(temp==0xde)com=2;//数字2
if(temp==0xdd)com=5;//数字5
if(temp==0xdb)com=8;//数字8
if(temp==0xbe)com=3;//数字3
if(temp==0xbd)com=6;//数字6
if(temp==0xbb)com=9;//数字9
if(temp==0x7e)com=16;//数字A键,去皮功能
if(temp==0x7d)com=15;//数字B键清除键,二次测量
if(temp==0x7b)com=12;//数字C输入单价错误时返回上一步
if(temp==0x77)com=13;//数字D键,计算总价
return(com);}{
Weight_Shiwu=HX711_Read();
Weight_Shiwu=Weight_Shiwu-Weight_Maopi;
if(Weight_Shiwu>0)
{
Weight_Shiwu=(unsignedint)((float)Weight_Shiwu/GapValue);if(Weight_Shiwu>5000)
{Flag_ERROR=1;}else
{Flag_ERROR=0;}}else
{Weight_Shiwu=0;
Flag_ERROR=1;}}
voidGet_Maopi()
{Weight_Maopi=HX711_Read();}
voidDelay_ms(unsignedintn)
{unsignedinti,j;for(i=0;ifor(j=0;j<123;j++);}
voiddelay500us(void)
{intj;
for(j=0;j<57;j++){;}}
voiddi(void)/
{unsignedinty;
for(y=0;y<250;y++)
{beep=0;
Delay_ms
(1);
beep=1;
Delay_ms
(1);}}
voidmotor_ccw(void)//
{unsignedchari,j;
for(j=0;j<2;j++)//
{for(i=0;i<8;i++)//
F1=CCW[i]&0x01;
F2=CCW[i]&0x02;
F3=CCW[i]&0x04;
F4=CCW[i]&0x08;
Delay_ms(10);}}}
voidmotor_cw(void)
{unsignedchari,j;
for(j=0;j<5;j++)
{for(i=0;i<8;i++){
F1=CW[i]&0x01;
F2=CW[i]&0x02;
F3=CW[i]&0x04;
F4=CW[i]&0x08;
Delay_ms
(1);}}}
(九)操作与使用
1、上电运行
下载完成后程序自动运行,或重上电后程序正常运行,如图所示。
图23上电运行图
2、键盘操作说明
4*4矩阵键盘定义如下
789D(清0)
456C(电机反转)
123B(电机正转)
14(未定义)015(.)A(确定价格)
其中:
●键0—9为数字键,用于单价设定。
●键15为小数点,也用于单价设定。
●B键为电机正转,每次设定数值后,请先按清B键,以驱动电机转动。
C键为电机反转,当达到设定值时,按下该键电机开始向反方向转动3、常用使用步骤:
●打开电源,屏幕显示电子秤初始化成功,此时重量和单价为0,金额为空;
●通过数字键和小数点键键入摇确定的称重数值,完成后按下电机转动键。
●在支架上称出摇秤的数值,液晶屏显示重量(单位为g),当到达设定值时电机停止
●当到达设定值后按下C键,电机向相反方向转动。
(10)误差分析
一:
由于电路的不稳定以及传感器的工作原理造成的误差。
二:
硬件设计时,下面挡板不高造成物料容易掉下来,当数值在一霎啦间以达到设定值,所以电机停止,但数值显示不正确
三:
因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
当发现测试出来的重量偏大时,增加该数值。
如果测试出来的重量偏小时,减小改数值。
该值可以为小数
#defineGapValue378.2
有可能378.2设定的不是不准,有可能造成些误差,估计误差在0.05%
四:
电机28BYJ48?
5V?
?
的4相5?
的步?
?
机,而且是?
速步?
?
机,?
速比?
1:
64,步?
角?
5.625/64度。
由于?
机本身的原因造成?
的角度不是非常精确,所以也是有?
差的
五:
称重传感器的电灵敏度为满负荷输出电压与激励电压的比值,典型值是2mV/V。
当使用2mV/V灵敏度和5V激励电压的传感器时,其满度输出电压为10mV。
通常,为了使用称重传感器线性度最好的一段称重范围,应当仅使用满度范围的三分之二。
因此满度输出电压应当大约为6mV。
当电子秤应用于工业环境时,在6mV满度范围内测量微小的信号变化并非易事。
总误差是指输出误差和额定误差的比值。
典型电子秤的总误差指标大约是0.02%,这一技术指标相当重要,它限制了使用理想信号调节电路所能达到的精确度,决定了ADC分辨率的选择以及放大电路和滤波器的设计。
六:
开发板的外围电路对测量的精确度的影响。
(十一)效果图