基于单片机的纸张计数装置的设计

2021-06-04 03:09安晓莉
微型电脑应用 2021年5期
关键词:数码管中断按键

安晓莉

(西安思源学院 电子信息工程学院, 陕西 西安 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)

4 总结

本设计能够完成30张以内的纸的张数的测量与显示,具有校准、启动测量和蜂鸣器提示报警功能。不足之处是测试的纸张数较少,原因主要是52单片机运算能力不够。如果将52单片机更换为STM32,则测量速度和测量张数将会大幅度提高。

猜你喜欢
数码管中断按键
基于有限状态机的按键检测程序设计
微课教学设计之“数码管动态显示”
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
按键消抖在单片机和FPGA实验教学中的应用
跟踪导练(二)(5)
千里移防,卫勤保障不中断