在没有手指触摸时,ADC的读数会在0×20和0×70之间交替变化。这些数据可能在环境不同时有所不同,但不变的是当手指触摸时ADC读数的变化数值会比没有触摸时大。有了这一项实验现象作为支点,我们接下来要做的就是用单片机处理ADC读数,判断数值变化的规律,从而得知是否有触发。编程并不难,每个人都可以有自己的数值处理方式。下面给出一段我编写的电容式触摸按键的源程序,大家可以参考,但这并不是唯一的处理方式,还会有更好的方法等着你去发现呢。
“电容式触摸开关实验”是我制作的一款简单的触摸开关,在单片机的P1.7接口上接一个LED,使用连接在P1.0接口上的触摸片来控制LED的亮或灭。你可以直接制作这个触摸开关,以此了解电容式触摸的性能。当然,这也是一个很好的实例,参考电路原理图和源程序就可以了解其工作原理。只要在源程序上稍微修改就可以制作属于你自己的电容式触摸作品了。在制作电容式触摸操作作品的时候需要注意一些问题,这些问题并不是从什么专业机构找来的资料,而是我通过实验总结出来的经验,仅供大家参考。另外,对于没有交流信号源参与的电路是否可靠我还没有研究,这一制作是在我的几个实验环境下完成的,并不能表示在你的环境里也可以实现。本文介绍的电容式触摸技术仅算是抛砖引玉,也是大家和我一起共同验证的过程,看看我还有哪些没有考虑周全的地方。欢迎读者朋友把你的想法和建议与我交流,我真的很希望和大家一起把这项技术改进到和专业的触摸芯片媲美。
注意事项:
◆ ADC读数和ADC位数、采集速度具有一定关系。
◆ 使用电池供电和使用市电供电时ADC的读数也有区别。
◆ 使用电池供电时电容式触摸的灵敏度较市电供电时低。
◆ 不用绝缘介质下ADC读数变化有所不同。
◆ 连接ADC输入端的触摸片的面积也会影响电容式触摸的灵敏度。
◆ ADC读数只是在某一个数值的区间,为了判断可靠,需要设计防误判程序。
细心的朋友可能注意到了,我在源程序中ADC读数部分加入了防误判程序,实践证明这是非常有必要的。其实防误判程序就是通过连续多次读取ADC数值,然后把多次读到的结果进行对比。如果有外部干扰或是ADC读数错误,在这个对比的过程中就会被发现,即达到防干扰、防误判的作用。电容式触摸开关实验的源程序文件请到《无线电》杂志网站上下载。
防误判部分源程序
/******************************************************************************
函数名:触摸按键处理函数
调 用:? = Read_R ();
参 数:无
返回值:bit 1表示有感应物,0表示没有感应物
结 果:
备 注:需要根据实现应用调协灵敏度和其他参数
/*****************************************************************************/
bit Read_R (void){
unsigned char R,ii,m=0,i,j,k;
bit aa;
for(ii=0;ii<3;ii++){ //循环检查防干扰
j=0;k=0;
for(i=0;i<10;i++){ //一次采集数据的数量
DELAY_MS (3); //3毫秒延时
R = Read (0); //ADC读取数据
if(R < 0x2F){ //此参数可调整感应灵敏度值在0x01到0x2F
k++; //波谷计数加1
}
if(R == 0xFF){ //ADC读数的最大值必须等于0xFF
j++; //波峰计数加1
}
}
if(k>1 && j>1){ //触摸波形的数量积加m的值
m++;
}else{
m=0; //如果波形条件不符合则m=0
}
}
if(m>2){ //根据m的数值判断是否有感应物体
aa =1;
}else{
aa=0;
}
return(aa); //将aa作为返回值
}
/*****************************************************************************/
制作mini48定时器
虽然上文介绍了这么多关于电容式触摸技术的内容,可是我们下面要完成的制作却是使用了电平式触摸技术。因为电容式触摸的设计还没有成熟,还有可改进的空间。另外我手上目前还没有什么基于电容式触摸技术的作品,虽然我正在开发的mini3216准备使用电容式触摸按钮,可是mini3216的创新重点并不是电容式触摸,而是比电容式触摸更好的设计。为难之下,我将mini48定时器作为这一期的制作实例。尽管是电平式触摸,但mini48的精巧设计定会给你带来创新的启发。Mini48定时器依然是我的精简电路设计风格,它的设计理念延续了mini1608,又另有独特之处。电池盒、单片机、晶体、电容、蜂鸣器、数码管,几种元器件打造简单的定时器制作,我相信这是你所见过的最简单的定时器制作。Mini48采用4位共阳一体数码管,用来显示定时值的小时和分钟,最大定时时间是23小时59分。时间到时蜂鸣器会鸣响,提示用户定时时间到。如果鸣响1分钟依然没有关闭电源,单片机就会进入掉电模式,在此模式下系统几乎不耗电。时间的设定没有采用传统的微动开关,而是采用了电平式触摸技术,当手指触摸数码管各位上方对应的单片机引脚时,定时值就会加1,设置简单,操作还很有趣。电路设计方面没有使用PCB板,而是将单片机与数码管直接焊接在一起,这也得益于元器件特有的结构,诸多创新设计都来源于发现元器件结构和性能方面的巧合。
所需元器件

元器件清单
品名 型号 数量 说明
单片机 STC11L60XE 1 可用STC12C5A60S2等5V单片机代替
晶体 12MHz 1
电容 30pF 2
电池盒 2节5号(AA) 1 电池盒上要带有开关
蜂鸣器 5V无源 1 可用压电陶瓷片代替
LED数码管 SR430563K 1 4位共阳动态显示

电路原理图
好了,闲言少讲,开始行动吧。文中使用的是STC11L60XE,这是一款3V电压的单片机,可以用2节5号(AA)电池供电。如果你买不到3V单片机,也可以使用STC11F60XE或者STC12C5A60S2系列等5V的单片机代替,当然电源也要跟着换成3节5号电池。不能用89C51系列单片机代替,因为89系列的单片机比较古老,不能实现电平式触摸。蜂鸣器要购买那种无源的,如果你想减小体积也可以用压电陶瓷片代替。数码管需要是4位共阳的指定型号,其实就是引脚定义要一致,数码管的体积过大或过小都不能正好焊接在单片机上,所以这个部分一定要注意。
第1步:将12MHz晶体和30pF电容按电路原理图焊接在单片机背面的引脚上。让单片机具有外部精准时钟源,这样可以产生准确的定时器时间。在我写这篇文章时听说STC公司新推出一款15C系列单片机,它的内部R/C振荡器是高精度的,可以完全省去外部的时钟晶体。如果以后有机会把mini48的单片机改成15C系列的话,我们就可以省去这一步,不需要焊接晶体和电容了。

第2步:把电池盒上自有的导线焊接在蜂鸣器上,并把焊接处用热缩管包好。注意无源蜂鸣器也是分正、负极的,不要接反。这样的焊接并不是最终的电路,一会我们还要把导线从中间剪断。

第3步:把电池盒正极的导线(红线)并联在单片机的第40脚上。负极的导线剪断,电池盒一端焊接在单片机的第20脚上,蜂鸣器一端焊接在单片机的第1脚上。如此焊接之后,电池盒、单片机、蜂鸣器三者仍然保持了原来的结构。

第4步:把数码管直接焊接在单片机上。奇妙的是数码管的引脚正好和单片机的引脚相对应,好像是为其量身定做的一样。单片机I/O接口采用推挽输出方式,可以直接驱动数码管显示,不需要驱动电路。程序上采用逐点扫描方式,省去了限流电阻,并保证数码管上的各段码亮度一致。数码管上方对应的单片机引脚正好设计成电平式触摸按键,省去了微动开关,让设计更加简洁。

第5步:打开电源开关,系统初始从3分钟开始倒计时。触摸小时和分钟各位上方对应的单片机引脚就可以将此位加1,加到9时返回到0,从而调整定时时间。

Mini48制作时需要注意以下事项:
在向mini48写入HEX文件时,需要在STC-ISP软件中设置RET为P4.7接口,否则数码管不能正常显示。如果使用与本文中引脚定义不同的数码管,需要在mini48源程序中修改引脚定义,否则不能代替使用。STC单片机内部具有静电保护电路,所以直接触摸引脚不会出现静电损坏芯片的情况。
触摸技术在电子产品中的应用已经很成熟了,可是在电子爱好者的圈子里却还是个新鲜玩意。对于电平式和电容式触摸技术,我所做的研究仍然不够。本文只是希望用我们电子爱好者现有的技术和材料实现与专业触摸芯片同等的性能,让触摸技术可以在电子爱好者的圈子里兴起。让更多的朋友对单片机实现触摸技术产生兴趣,从而让更多的人研究它,让它成熟起来,让我们在微动开关、薄膜键盘之外多出一个选项。让触摸技术的普及带动电子制作的创新,让我们这群废寝忘食的电子爱好者们玩得更新颖、更时尚。