51单片机利用I/O口高阻状态实现触摸控制LED灯
1.概述
这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚,改变电平信号控制灯的亮灭。
2.实验过程
2.1.实验材料
名称 | 型号 | 数量 |
---|---|---|
单片机 | STC12C2052 | 1 |
LED彩灯 | 无 | 1 |
晶振 | 12MHZ | 1 |
电容 | 30pf | 2 |
电阻 | 100欧姆 | 1 |
面包板 | 无 | 1 |
连接线 | 无 | 5 |
2.2.电路原理
将P3.7接口的灯连接到P1.7接口上,其他的按照电路图链接即可。
2.3.实验程序
/*************************************************************
* 程序名: IO口高阻模式实现触控控制LED灯
* 编写人: bruce
* 硬件支持:STC12C2052
* 日 期: 2023-11-23
* 修改日志:
/*************************************************************/
#include<STC12C2052AD.H>
// 定义P1.3 和 P1.2接口
sbit LED1 = P1^7;
sbit KEY = P3^7;
void main(void){
//设置P1接口为准双口模式
P1M0 = 0X00;
P1M1 = 0X00;
//设置P3.7接口为高阻模式
P3M0 = 0X80;
P3M1 = 0X00;
// 定义接口高电平
LED1 = 1;
while(1){
LED1 = ~KEY;
}
}
将手指放在P3.7接口上灯就会点亮,离开后就会熄灭。但是在实际使用中,手指还没接触到P3.7接口,灯就亮了,这就是受到干扰造成的。下面对此做了优化。
- 首先将P3.7设置为准双口+延迟,避免未接触到P3.7就变为低电平控制灯亮。在手开始接触P3.7时,该接口处于准双口,有输出功能可以将干扰电流拉到GND,消除了一部分干扰
- 当设置P3.7为高阻状态时,增加一个延迟,再次消除一部分干扰。
- 经过优化后比之前要稳定很多,手指触摸到P3.7和P1.0引脚才会点亮LED灯。
/*************************************************************
* 程序名: IO口高阻模式实现触控控制LED灯
* 编写人: bruce
* 硬件支持:STC12C2052
* 日 期: 2023-11-23
* 修改日志:
/*************************************************************/
#include<STC12C2052AD.H>
// 定义P1.3 和 P1.2接口
sbit LED1 = P1^7;
sbit KEY = P3^7;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
void main(void){
//设置P1接口为准双口模式
P1M0 = 0X00;
P1M1 = 0X00;
//设置P3.7接口为高阻模式
P3M0 = 0X80;
P3M1 = 0X00;
//初始化高低电平
LED1 = 1;
KEY = 0;
while(1){
//当手靠近还未触摸到P3.7引脚,感应到微电流后就会改变状态使控制灯的开关不稳定。
//设置为准双口,+ 延迟 过滤微电流影响触摸不稳定现象。
P3M0 = 0X00;
DELAY_MS(2);
P3M0 = 0X80;
DELAY_MS(2);
LED1 = ~KEY;
}
}