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

static unsig ned int S u16SensorR ight_L_Cn t=0; //判断低电平 的计时 器 static unsig ned int S u16SensorU p_H_Cnt=0 ; //判断高电平 的计时器 static unsig ned int S u16SensorU p_L_Cnt=0 ; //判断低电平 的计时器 //右感应器的 滤波 if(0==Sens orRight_s r) { Su…

100%1 / 836
sbit KEY_INPUT1=P2^2; //【启动】按键 K1 的输入口。
sbit SensorRight_sr=P2^1; //右感应器的输入口
sbit SensorUp_sr=P2^0; //上感应器的输入口
volatile unsigned char vGu8SensorRight=0; //右感应器经过滤波后的当前电平状态。
volatile unsigned char vGu8SensorUp=0; //上感应器经过滤波后的当前电平状态。
volatile unsigned char vGu8BeepTimerFlag=0;
volatile unsigned int vGu16BeepTimerCnt=0;
volatile unsigned char vGu8KeySec=0;
unsigned char Gu8RunStart=0; //启动的总开关
unsigned char Gu8RunStatus=0; //运动的状态,0 为停止,1 为运行
unsigned int Gu16RunCnt=0; //计数
unsigned int Gu16ReturnLeftTime=3000; //水平往左跑的延时变量,默认为 3
unsigned int Gu16GoDownTime=2000; //垂直往下跑的延时变量,默认为 2
volatile unsigned char vGu8RunTimerFlag=0; //用于控制运动过程中的延时的定时器
volatile unsigned int vGu16RunTimerCnt=0;
void main()
{
SystemInitial();
Delay(10000);
PeripheralInitial();
while(1)
{
KeyTask(); //按键的任务函数
RunTask(); //运动控制的任务函
}
}
/* 注释一:
* 两个“计时器”相互“清零”相互“抗衡,从而实现了开关感应器的“消抖”处理
* 专业术语也叫“软件滤波”。这种滤波方式,不管是从“高转成低,还是“低转成高”
* 如果在某个瞬间出现干扰抖动,某个计数器都会及时被“清零,从而起到非常高效的消抖滤波作用。
*/
void SensorScan(void) //此函数放在定时中断里每 1ms 扫描一次,用来识别和滤波开关感应器
{
static unsigned int Su16SensorRight_H_Cnt=0; //判断高电平的计时
static unsigned int Su16SensorRight_L_Cnt=0; //判断低电平的计时
static unsigned int Su16SensorUp_H_Cnt=0; //判断高电平的计时器
static unsigned int Su16SensorUp_L_Cnt=0; //判断低电平的计时器
//右感应器的滤波
if(0==SensorRight_sr)
{
Su16SensorRight_H_Cnt=0; //在判断低电平的时候,高电平的计时器被清零,巧妙极了!
Su16SensorRight_L_Cnt++;
if(Su16SensorRight_L_Cnt>=SENSOR_TIME)
{
Su16SensorRight_L_Cnt=0;
vGu8SensorRight=0; //此全局变量反馈经过滤波后“右感应器”当前电平的状态
}
}
else
{
Su16SensorRight_L_Cnt=0; //在判断高电平的时候,低电平的计时器被清零,巧妙极了!
Su16SensorRight_H_Cnt++;
if(Su16SensorRight_H_Cnt>=SENSOR_TIME)
{
Su16SensorRight_H_Cnt=0;
vGu8SensorRight=1; //此全局变量反馈经过滤波后“右感应器”当前电平的状态
}
}
//上感应器的滤波
if(0==SensorUp_sr)
{
Su16SensorUp_H_Cnt=0;
Su16SensorUp_L_Cnt++;
if(Su16SensorUp_L_Cnt>=SENSOR_TIME)
{
Su16SensorUp_L_Cnt=0;
vGu8SensorUp=0; //此全局变量反馈经过滤波后“上感应器”当前电平的状态
}
}
else
{
Su16SensorUp_L_Cnt=0;
Su16SensorUp_H_Cnt++;
if(Su16SensorUp_H_Cnt>=SENSOR_TIME)
{
Su16SensorUp_H_Cnt=0;
vGu8SensorUp=1; //此全局变量反馈经过滤波后“上感应器”当前电平的状态
}
}
}
void T0_time() interrupt 1
{
VoiceScan();
KeyScan();
SensorScan(); //用来识别和滤波开关感应器
if(1==vGu8RunTimerFlag&&vGu16RunTimerCnt>0) //用于控制运动延时的定时器
{
vGu16RunTimerCnt--;
}
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)
{
//上电初始化气缸的开机位