从单片机基础到程序框架(全集 2019pdf版).pdf - 第550页

{ SensorSc an(); //开关 感应器的识别 与软件滤波处 理 TH0=0xfc ; TL0=0x66 ; } void Syste mInitial( void) { TMOD=0x01; TH0=0xfc; TL0=0x66; EA=1; ET0=1; TR0=1; } void Delay (unsigned l ong u32Delay Time) { for(;u32 DelayTime>0 ;u32Dela…

100%1 / 836
}
else //如果当前电平状态为“高电平”LED 发亮
{
P1_4=0; //LED 发亮
}
}
}
/* 注释二:
* 本节破题的关键:
* 两个“计时器”相互“清零”相互“抗衡,从而实现了开关感应器的“消抖”处理
* 专业术语也叫“软件滤波”。这种滤波方式,不管是从“高转成低,还是“低转成高”
* 如果在某个瞬间出现干扰抖动,某个计数器都会及时被“清零,从而起到非常高效的消抖滤波作用。
*/
void SensorScan(void) //此函数放在定时中断里每 1ms 扫描一次,用来识别和滤波开关感应器
{
static unsigned int Su16Sensor_K1_H_Cnt=0; //判断高电平的计时器
static unsigned int Su16Sensor_K1_L_Cnt=0; //判断低电平的计时器
if(0==Sensor_K1_sr)
{
Su16Sensor_K1_H_Cnt=0; //在判断低电平的时候,高电平的计时器被清零,巧妙极了!
Su16Sensor_K1_L_Cnt++;
if(Su16Sensor_K1_L_Cnt>=SENSOR_TIME)
{
Su16Sensor_K1_L_Cnt=0;
vGu8Sensor_K1=0; //此全局变量反馈当前电平的状态
}
}
else
{
Su16Sensor_K1_L_Cnt=0; //在判断高电平的时候,低电平的计时器被清零,巧妙极了!
Su16Sensor_K1_H_Cnt++;
if(Su16Sensor_K1_H_Cnt>=SENSOR_TIME)
{
Su16Sensor_K1_H_Cnt=0;
vGu8Sensor_K1=1; //此全局变量反馈当前电平的状态
}
}
}
void T0_time() interrupt 1
{
SensorScan(); //开关感应器的识别与软件滤波处
TH0=0xfc;
TL0=0x66;
}
void SystemInitial(void)
{
TMOD=0x01;
TH0=0xfc;
TL0=0x66;
EA=1;
ET0=1;
TR0=1;
}
void Delay(unsigned long u32DelayTime)
{
for(;u32DelayTime>0;u32DelayTime--);
}
void PeripheralInitial(void)
{
}
第一百零八节: 按键控制跑马灯的启动和暂停和停止。
【108.1 按键控制跑马灯的启动和暂停和停止。
上图 108.1.1 独立按键
上图 108.1.2 LED 电路
上图 108.1.3 有源蜂鸣器的电路
在我眼里按键不仅仅是按键,跑马灯不仅仅是跑马灯。按键是输入设备跑马灯是应用程序。本节
面上讲按键控制跑马灯的简单项目,实际上作者用心良苦立意深远,试图通过按键与跑马灯来分享一种输
入设备如何关联应用程序的程序框架。
本节例程实现的功能如下