基于单片机的纸张计数装置的设计
2021-06-04安晓莉
安晓莉
(西安思源学院 电子信息工程学院, 陕西 西安 710038)
0 引言
本文采用52单片机设计了一款纸张计数装置,该装置前端的两块50 mm×50 mm的平行板分别通过导线a和导线b连接到测量显示电路,它可测量并显示置于极板间的纸张的数量。
1 设计思路
从设计任务可知,前端的两块50 mm×50 mm的平行板构成平行板电容器。改变两块板之间的纸的张数(电容器极板中间的介质发生改变),就会引起电容容量改变[1]。如果将此电容接到555定时器上构成多谐振荡器,电容量的改变就可以改变多谐振荡器输出脉冲的频率。
如果采用52单片机的定时/计数器实现200 m/s时间内对555定时器输出的振荡脉冲进行计数,通过计算就可获得振荡脉冲的频率。通过测试,将每增加一张纸所对应的振荡脉冲的频率记录下来,列成表格,在程序中通过取表的办法获得纸的张数并显示。
2 系统硬件设计
根据上述设计思路,得出设计框图,如图1所示。
图1 系统设计框图
2.1 电路功能模块
单片机工作时钟由晶振电路产生;复位电路完成单片机的初始化;555定时器用来输出矩形波,该矩形波的宽度随纸张数变化而变化;按键由启动测量按键和较准按键组成;24C02存储器用于存储每增加一张纸所对应的矩形波的频率值;数码管显示电路显示纸张数;蜂鸣器用于电容两极板短路时的报警和启动键按下后,给出测量结果时的鸣叫提示。
2.2 电路功能模块实现
2.2.1 555定时器构成的多谐振荡器
平行板的一个极板接555定时器的2脚和6脚,另一个极板接地;555的7脚和6脚之间接200 K的电阻和二级管1N5817;8脚和4脚连在一起;8脚(4脚)经200 K电阻和7脚相连;1脚接地、5脚通过0.01 μF的电容接地;3脚输出矩形波[2],如图2所示。
图2 多谱振荡器示意图
本设计选择R1和R2为200 kΩ,原因是此时数码管显示的数不庞大,且能反映出纸张的变化。
2.2.2 24C02存储器
24C02是容量为256个字节的串行EEPROM存储器。本设计中纸张数所对应的频率值为int型,在存储时占两个字节。除去两极板短路时的频率0外,可存储127个频率值,但是,随着纸张数的增加,频率的变化会越来越小,因此,本系统只能识别30张以内的纸的数量,误差在一张以内。
2.2.3 数码管显示电路
数码管采用动态显示方式实现纸张数的显示。由PO口输出的字段数据经74LS245后驱动数码8个字段;P2.2、P2.3、P2.4接74LS138译码器A、B、C端,74LS138译码器的八路输出作为选通信号接8位数码管的公共端。采用“逐位点亮,轮流显示”的方法实现稳定显示纸张数[3]。
3 系统软件设计
本系统采用单片机的定时/计数器0定时200 m/s,在此期间,启动定时/计数器1对矩形波个数计数,当200 m/s定时时间到,停止定时/计数器1计数。计数值除以200 m/s即为频率值。
为了使测量更准确,采用一秒钟采集5次频率(每200 m/s采集一个频率数据),把5个频率数据加权平均,将其作为当前纸张所对应的频率值。
主函数流程图如图3所示。
图3 主函数流程图
要能根据频率范围得出纸张数,需事先将每增加一张纸所对应的频率值存储进24C02,在这里把这个过程叫校准 。校准按键接在P3.3引脚上,该键按下时,CPU跳转到外部中断1中断服务程序。在中服程序中,将频率的高八位存入低位地址中,频率的低八位存入高位地址中,每存完一个频率,地址值加2。
程序代码如下。
首先定义按键,声明纸张计数变量。
sbit KeySure=P3^3; //定义按键
u16 NumOfTest = 0;//计数起始位
//外部中断1的中断函数
void Int1() interrupt 2
{
delay(3 000); //延时消抖
if(KeySure==0)
{
At24c02Write(NumOfTest,Freq_array[5]/255);
NumOfTest++;
delay(2 000);
At24c02Write(NumOfTest,Freq_array[5]%255);
NumOfTest++;
delay(2 000);
}
}
启动测量按键接在P3.2上,按下该键后,CPU跳转到外部中断0中断服务程序,在该中服程序中调用一个计算纸张数函数,实现根据频率值计算出纸张数,并将结果送数码管显示,启动蜂鸣器报警,提示一次测量结束[4]。
程序代码如下。
//外部中断0中断函数
void Int0() interrupt 0
{
delay(1 000); //延时消抖
if(KeyAddNum==0)
{
Num = CalPNum(Freq_array[5]);
//数码管显示
DisplayData[7]=smgd[Num/10];
DisplayData[6]=smgd[Num%10];
//蜂鸣器报警
}
}
计算纸张数函数流程图如图4所示。
图4 计数流程
程序代码如下。
char Num = 0; //当前纸张数量
#define AllNUM 60 //30张纸,需要60个字节存储空间
sbit KeyAddNum=P3^2; //定义按键K
张数计算函数
unsigned char CalPNum(u16 frequence)
{
char i;
int freq1,num11,num12;//n-1 张纸时的频率
int freq2,num21,num22;//n 张纸时的频率
int freq3,num31,num32;//n+1 张纸时的频率
unsigned char PNum;
for(i=2; i { num11 = At24c02Read(i-2); delay(1000); num12 = At24c02Read(i-1); delay(1000); freq1 = num11*255 + num12; //取出n-1张纸的频率 num21 = At24c02Read(i); delay(1000); num22 = At24c02Read(i+1); delay(1000); freq2 = num21*255 + num22; //取出n张纸的频率 num31 = At24c02Read(i+2); delay(1000); num32 = At24c02Read(i+3); delay(1000); freq3 = num31*255 + num32; //取出n+1张纸的频率 //在频率表内查该频率对照的纸张数 if( (freq2 -(0.4) * (freq2 - freq1) <= frequence) && (frequence < freq2 + (0.6)*(freq3 - freq2)) ) { PNum = i/2; return PNum; } } return 0; } 由于本设计只能识别30张纸,即对应的频率只占60字节,在判断框中设置上限为60-3,是为了防止n+1张纸对应的频率超出地址上限而出错[5]。 频率落在n张纸对应得频率范围是依据试验得来的公式如下。 freq2-0.4(freq2-freq1)≤f≤freq2+0.6(freq3-freq2) 本设计能够完成30张以内的纸的张数的测量与显示,具有校准、启动测量和蜂鸣器提示报警功能。不足之处是测试的纸张数较少,原因主要是52单片机运算能力不够。如果将52单片机更换为STM32,则测量速度和测量张数将会大幅度提高。4 总结