简易电子硬币识别装置.docx
《简易电子硬币识别装置.docx》由会员分享,可在线阅读,更多相关《简易电子硬币识别装置.docx(20页珍藏版)》请在冰点文库上搜索。
![简易电子硬币识别装置.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/3479d496-4814-4ccc-89a8-04dc0b4c521f/3479d496-4814-4ccc-89a8-04dc0b4c521f1.gif)
简易电子硬币识别装置
简易电子硬币识别装置
————————————————————————————————作者:
————————————————————————————————日期:
简易电子硬币识别装置
摘要:
本设计为简易电子硬币设别装置,采用不同种类的硬币重量不同进行识别。
采用电阻应变式传感器进行硬币的测量,并用HX711高精度放大器兼A/D功能的称重专用集成芯片读取传感器测量值送至具备64KROM的STC12A60S12的单片机,利用查表法寻找最接近的重量来识别硬币的数量和金额。
关键词:
称重A/D转换器单片机
一、系统方案
1.1总体方案
由于各种硬币的重量不同,因此,本系统采用称重的方法进行硬币识别,由此可知称重系统以及A/D转换器是本次课题的主要核心,只有达到足够准确的精度才能正确实现人民币硬币识别和计算功能。
本系统主要由电源供电部分、电阻应变式传感器组成的称重部分、进行数据采集的A/D转换部分、外部按键控制部分、单片机以及LCD液晶显示部分组成。
用A/D转换器读取由电阻应变式传感器传出的模拟量,再由单片机读取经过A/D转换后的数字量,CPU进行运算和处理就可达到要求。
总体结构框图如下图1-1所示。
图1-1系统总体结构框图
1.2重量检测方案选择与论证
方案一:
压电效应的重力传感器
基于压电效应的传感器的敏感元件由压电材料制成。
压电材料受力后表面产生电荷。
此电荷经电荷放大器和测量电路的放大和变换阻抗后就成为正比于所受外力的电量输出。
它的优点是频带宽、灵敏度高、信噪比高、结构简单、等。
缺点是某些压电材料需要防潮措施,而且输出的直流响应差。
方案二:
电阻应变式传感器
电阻应变式传感器是将电阻应变片粘贴在弹性体上,当弹性体受外力(拉力或压力)作用产生形变时,传感器将该形变转化成电量输出,通过相应的测量仪表检测出这个与外加重量成一定比例关系的电量,从而测出质量。
电阻应变式传感器的优点是精度高,测量范围广寿命长,结构简单,频响特性好,能在恶劣条件下工作,易于实现小型化、整体化和品种多样化等。
综合两种方案的分析与比较,电阻应变式传感器可以达到精确测量,搭建电路简单,容易掌握与使用,价格相对便宜等等,所以选择方案二。
1.3A/D转换方案选择与论证
方案一:
外搭A/D电路
A/D转换可以选用A/D合成芯片或是根据A/D转换器的原理自行搭建A/D转换系统。
自搭A/D转换电路难度较高,不易搭建。
且焊接时占用电路板面积大,不美观。
需要的人为操作过多,更加容易出现错误。
方案二:
集成A/D转换器
使用集成的A/D转换器,可以大量减少人为操作,不易损坏,搭建方便。
集成A/D转换器HX711是一款专为高精度电子称而设计的24位A/D转换器芯片,分辨率大,精度高,响应速度快,抗干扰性能高。
HX711自带低噪声可编程放大器,通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为+-20mV或+-40mV。
通道B则为固定的32增益,减少了对信号放大电路的设计,对本次设计更为有利。
综合两种方案的分析与比较,集成A/D转换器更加贴合我们的需求,因此选用集成A/D转换器HX711作为本设计的A/D转换器。
二、理论分析与计算
2.1电阻应变式重量检测原理
电阻应变式传感器内部电路图如图2-1所示
图2-2电阻应变式传感器内部结构
图中R1、R2、R3、R4为4个应变片电阻,组成了桥式测量电路,e为电源电压,V为信号电压。
当应变片受到力的变化时,电阻R1、R2、R3、R4变成R+△R1、R+△R2、R+△R3、R+△R4,电桥的输出电压变为:
V=kF。
其中V为电桥的输出电压,k为系数,F为力的大小。
2.2A/D转化器原理
由于设计的要求,我们选择设计的增益倍数为128倍。
HX711有32、64、128三种增益可供选择,但是由于传感器的输出信号较小,若选择较小的增益可能最后精度达不到要求。
虽然增益越高带来的噪声比越大,但是HX711的特点有低噪声,影响不大。
因此选用128倍的增益。
HX711的输出数据速率有10Hz和80Hz。
由于10Hz速率的精度要高于80Hz,且本设计需要较高的精度,所以选用10Hz的数据输出速率。
同时HX711是一款专为高精度电子称而设计的24位A/D转换器芯片,其分辨率可以达到224=16777216,完全可以完成本次设计。
三、程序设计流程图
3.1任务分配
以单片机作为主要的控制器件进行任务分配。
当电阻应变式传感器检测到力的变化时,将微弱的电信号传到A/D转化器HX711,HX711通过信号放大等一系列动作,将模拟量转化成数字量送往单片机。
芯片的串口数据输出端接在单片机的外部中断0即P3.2口。
单片机的1,2,3引脚,即P1.0,P1.1,P1.2口,控制LCD液晶显示屏,分别与12864的片选信号输入,串行数据输入,使能信号相连。
单片机P2口的第四位接四个按键,用来控制模式的选择,上下移动以及确认。
3.2主程序流程图
主程序流程图如下图3-1所示。
图3-1主程序流程图
3.3中断程序流程图
中断程序流程图如下图3-2所示。
图3-2中断程序流程图
四、系统测试与结果分析
4.1测试环境与工具
测试在实验室进行,环境温度为26摄氏度。
测试工具有计算机、一角硬币(新)数枚、一角硬币(旧)数枚、五角硬币数枚以及一元硬币数枚。
4.2测试结果
在本此设计完成后,我们进行了大量实验来验证,对基本要求和发挥部分内的各项进行了逐一实验,并达到了满意的要求。
我们主要进行了单币种的测试试验以及多币种的测试试验。
其中多币种的测试试验包括超出设定总额时显示应退总额以及个数。
单币种测试结果如下图表4-1所示。
币种
真实值
测量值
真实值
测量值
真实值
测量值
一元
1
1
2
2
3
3
五角
1
1
2
2
3
3
新版一角
1
1
2
2
3
3
旧版一角
1
1
2
2
3
3
表4-1单币种测试结果
测量显示多个单币值品种的数量和总额如下表4-2所示
旧1角
新1角
5角
1元
实际个数
2
3
5
6
测量值
2
3
5
6
准确率
100%
100%
100%
100%
表4-2测量显示多个单币值品种
多币种测试结果如下表4-3所示。
设定总额为3元
实际投入金额(元)
1
2
3
4
实际投入个数(个)
10
3
3
11
测量得出金额(元)
1
2
3
4
测量的出个数(个)
10
3
3
11
应返还金额(元)
0
0
0
1
应返还个数(个)
0
0
0
10或1
表4-3多币种测试结果
第一次
第二次
第三次
新1角
旧1角
新1角
旧1角
新1角
旧1角
实际值
1
2
3
4
5
5
测量值
1
2
3
4
5
5
准确率
100%
100%
100%
100%
100%
100%
测量混合新旧版的1角硬币。
如下表4-4所示。
表4-4测量混合新旧版的1角硬币
第一次
第二次
实际值
测量值显示
准确率
实际值
测量值显示
准确率
新1角
2
2
100%
1
1
100%
5角
2
2
1
1
1元
3
3
1
1
一次性放入各种多个币值的硬币,能计算出货币总额及币值种类的数量。
(如表4-5)
表4-5一次性放入各种多个币值的硬币
附录一整体电路图
图一整体电路图
附录二源程序
#include"reg52.h"
#defineulongunsignedlong
#defineucharunsignedchar
#include"12864lcd.h"
#include"mode.h"
/*macro*/
typedefvoid(*Ptr)(ulong);
#definemeanAmount20
#defineMODIFY33
#defineEND44
#defineKeyP2
sbitDOUT=P3^2;
sbitCLK=P3^3;
sbitLED=P1^3;
/*global*/
ulongadcVal;
charmode=MODIFY;
ucharkeyVal,setValue=0;
ulongval[meanAmount]={0},pi;
ulongcodeold=14828,new=41557,five=49488,yuan=77983;
PtrptrArray[]={0,LCD_Mode1,LCD_Mode2,LCD_Mode3,LCD_Mode4,LCD_Mode5,LCD_Mode6};
externchara1,a2,a3;
externulongpreValue;
/*dec*/
voidHX711_Init();
voiddelay1ms(unsignedT);//?
?
0us
ulongMean(ulong*Array);
ucharKeyScan();
charstable(ulong*Array);
voidmain()
{
ucharmodify[]="Modifying...";
/*Configuration*/
LED=OFF;
LCD12864_Init();
delay1ms(5);
/*startModify*/
LCD12864_DisplayString(0,0,modify);
delay1ms(4000);/*延时四秒等待稳定*/
HX711_Init();/*开始校准*/
while(mode!
=END);/*等待校准结束*/
/*endmodifying*/
mode=1;
while
(1)
{
if(KeyScan())
{
switch(keyVal)
{
/*clear键*/
case0x0E:
{
while((Key&0x0F)!
=0x0F);/*等待按键释放*/
a1=a2=a3=preValue=setValue=0;/*清空数据*/
}break;
/*模式切换键*/
case0x07:
{
while((Key&0x0F)!
=0x0F);
LED=OFF;
//delay1ms(200);
if(mode==6)
mode=1;
else
mode++;
/*模式切换好*/
/*清屏*/
LCD12864_CleanScans();
delay1ms(10);
/*模式界面*/
switch(mode)
{
case1:
{
/*刚切换到模式1*/
a1=a2=a3=0;
preValue=0;
LCD_Show(0,0,0);
}break;
/*切到模式2*/
case2:
{
LCD12864_DisplayString(1,2,"YiJiao:
00");
LCD12864_DisplayString(2,2,"Value:
00.0");
}break;
/*切到模式3*/
case3:
{
a1=a2=a3=0;
preValue=0;
setValue=0;
LCD_ShowMode3(a3,a2,a1,setValue);
}break;
/*模式4:
区分新旧一角*/
case4:
{
LCD12864_DisplayString(1,3,"Old:
0");
LCD12864_DisplayString(2,3,"New:
0");
}break;
/*模式5:
一次放入各种币*/
case5:
{
LCD_ShowMode5(0,0,0,0,0,0,0);
}break;
/*模式6:
测重*/
case6:
{
LCD12864_DisplayString(0,1,"Weighing...");
LCD12864_DisplayString(1,2,"00.00g");
}break;
}
}break;
/*元键*/
case0x0B:
{
while((Key&0x0F)!
=0x0F);
if(mode==3)
{
setValue+=10;
if(setValue>99)
setValue-=100;
LCD_ShowMode3(a3,a2,a1,setValue);
}
}break;
/*角键*/
case0x0D:
{
while((Key&0x0F)!
=0x0F);
if(mode==3)
{
setValue++;
if(setValue>99)
setValue-=100;
LCD_ShowMode3(a3,a2,a1,setValue);
}
}break;
}
}
}
}
/*HX711初始化*/
voidHX711_Init()
{
IE0=0;
EX0=IT0=1;
EA=1;/*GlobalInterrupt*/
CLK=0;
IE0=0;
}
/*外部中断0*/
voidEXT0_ISR()interrupt0
{
staticcnt=0;
chari;
ulongtestVal=0;
CLK=0;
for(i=0;i<24;i++)
{
CLK=1;
testVal<<=1;
CLK=0;
if(DOUT)
testVal++;
}
CLK=1;
CLK=0;
/*ADConversionCompleted*/
val[cnt]=testVal;
if(cnt==(meanAmount-1))//测完20个
{
cnt=0;
if(stable(val))/*稳定了即为有效数据*/
{
adcVal=Mean(val);
/*若为矫正模式不相减*/
if(mode!
=MODIFY)
{
if(adcVal/10000==1674)/*无盘*/
{
IE0=0;
return;
}
else
adcVal-=pi;
}
//getaValue
if(mode==MODIFY)
LCD_MODIFY(adcVal);
else
ptrArray[mode](adcVal);
}
}
else
cnt++;
//ClearITFlag
IE0=0;
}
ucharKeyScan()
{
ucharkeyValue=0;
if((Key&0x0F)!
=0x0F)
{
keyValue=Key&0x0F;
delay1ms(20);
if(keyValue==(Key&0x0F))/*ConfirmKeyPressing*/
{
keyVal=keyValue;
return1;
}
else
return0;/*NoKeyPressing*/
}
return0;
}
voiddelay1ms(unsignedT)//?
?
0us
{
unsignedchara,b;
while(T--)
for(b=39;b>0;b--)
for(a=1;a>0;a--);
}
ulongMean(ulong*Array)
{
chari,j;
ulongtemp,sum=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{
if(Array[j]>Array[j+1])
{
temp=Array[j];
Array[j]=Array[j+1];
Array[j+1]=temp;
}
}
/*endsort*/
for(i=5;i<15;i++)
sum+=Array[i];
returnsum/10;
}
charstable(ulong*Array)
{
ulongmax=*Array,min=*Array;
chari;
for(i=0;i<20;i++)
{
if(Array[i]>max)
max=Array[i];
if(Array[i]min=Array[i];
}
if(max-min<150)
return1;
return0;
}
附录三元器件清单
元器件清单
名称
备注
数量
交流电线
220V
1
变压器
220V转9V
1
整流桥
DB107
1
稳压集成电路
7805
2
A/D转换芯片
HX711
1
电阻应变式传感器
100g
1
单片机
60S2
1
晶振
12M
1
显示屏
LCD12864
1
电解电容
1000uF
1
电解电容
100uF
2
电解电容
10uF
2
瓷片电容
104
8
瓷片电容
30pF
2
电阻
10k
5
电阻
1k
2
表一元器件清单