历史上的今天
今天是:2025年08月04日(星期一)
2018年08月04日 | stc15f104实现触摸开关
2018-08-04 来源:eefocus
想做个触摸打开,延时关断的小控制器
用普通的轻触开关似乎很难看,而且开关也不方便 固定,总不好把控制板放在外面吧?
想使用触摸的开关,网上搜索了好久没找到合适的,stc官方文档上有个电容感应开关
需要占用2个io,一个产生pwm信号,一个用于ad判断,另外还需要2个电阻2个二极管和1个电容。
感觉有点复杂了,尝试了一下,最后只用了一个io口,一个电阻和一个电容搞定了。
思路是这样的:
一个2M电阻接电源和IO口(我用了p3.3)
一个33p电容接IO口和地。
IO口接一根线到金属片什么的用来触摸。
p3.3置0先把电容的电放掉,然后置高阻态,这时候电源会通过电阻给电容充电,
时间常数2M*33p约66μs,使用定时器统计io口变成高电平的时间,
不用计时器的话担心受中断的影响,会有误差。
这个时间可能需要做平滑处理避免干扰。
开机的时候没有人触摸,记录下这个时候充电时间做为基准。
如果有人触摸,则充电时间加长,所以定时检测下这个充电时间,
发现充电时间比基准充电时间长很多(我用了2倍基准时间来比较),就可以认为是有人触摸了。
已经完工投入使用,目前看可靠性、抗干扰能力都可以满足要求。
void mw(){//主工作循环
unsigned int i;
static unsigned int cdsj=0,bzz;//充电时间,标准值
static unsigned char csh=10;//初始化计数
T2H=T2L=0;//计数器2计数值初始化为0
P3M1 |=0x8;//p3.3置开漏状态
P3M0 |=0x8;//
P3_3=0;//p3.3输出清0
delay(100);
P3M1 |=0x8;//p3.3置高阻状态
P3M0 &=0xf7;//
AUXR |= 0x10; //开始计数器2运行
P3_3=1;//p3.3输出为1,输入状态
IE1=0;//清外部中断1的状态
EX1=1;//打开外部中断1
while(EX1);//外部中断未执行完毕循环等待
i=cdsj>>3;
cdsj=cdsj-i+T2L;//平滑处理
if(csh){
csh--;
if(csh==0){//初始10次计数结束,取当前值为标准值
bzz=i+i;
};
return;
};
if(i>bzz){
此条件满足表明开关被触摸
};
}
下一篇:ARM中的特殊寄存器
史海拾趣
|
不宜学单片机的人容易问:我到底该学什么; ----踏踏实实的学点基本的吧?连单片机都不知道是什么就想去学ARM? c语言不会想搞LINUX?别老是好高骛远. 不宜学单片机的人容易问:谁有xxx源码?--(你给人家多少钱啊?自己的劳动白送你?) 不宜 ...… 查看全部问答> |
|
基于WSN的路灯监控管理系统 摘要:介绍了一个基于无线传感器网络的远程路灯监控管理系统,系统主要由传感器节点、远程控制终端(RTU)和监控中心组成。在单个路灯中嵌入无线传感模块,形成具有采集、收发信息数据,控制各个路灯节点以及自组织等功 ...… 查看全部问答> |
|
现在刚刚接触嵌入式,以前只有工控的经验,哪些书比较好一点?大学的时候研究过windows内核,对于操作系统也比较了解。对于嵌入式的开发环境和流程还不是很了解,希望能尽快入门,以后上来和大家一起讨论问题。… 查看全部问答> |
|
现象:1、我用2410和2440 一个做服务器一个做客户端可以正常通信 2、他们也都可以和PC正常通信 他们不管是做服务器还是客户端,都是可以正常通信 3、以上链接都是通过交叉网线连得 现在的 ...… 查看全部问答> |
|
已经新建立了一个连接,使用RasDial()函数连接到了 输入 at 指令的模块,问题是怎么让程序自动输入at指令 并且自动 按继续按钮连接上网呢?谢谢大家了. at指令是:at+cgdcont=1,\"ip\",\"cmnet\" 和 atdt*99# ,我 ...… 查看全部问答> |
|
6410按键处理,有时候按下键没响应,有时候按下出好几个字符,求助大家! 我把6410的按键驱动映射为我需要的字符了,可是总是响应时有些问题,有时候按下键不能响应,有时候会出好几个字符,这是怎么回事啊,我应该修改哪些地方啊?… 查看全部问答> |




