|
/*已经实验验证通过*/
% c2 C# g! z" @7 j#include<reg52.h> W1 w6 F( ^3 _2 I6 H
sbit IN3=P1^4;
, i! q, N1 T& ?# k5 ~6 `& ]0 Msbit OUT2=P2^4;
7 _! d& G+ ? G9 n3 xbit flag=0; //自锁标志
8 A$ G6 N9 X1 j! eunsigned char count=0,count1=0;//计数变量
% E9 D- `/ j1 M1 x: B
# T* @* e3 r7 S# V5 f1 Lvoid io_rest()
. K9 U1 m6 r6 m0 z4 y, ]{
y4 @0 v5 w- ^ if(IN3==0) //IN3低电平有效
$ j# E' q9 \# s1 b1 D5 o5 d. Z {
, S6 U# Y5 Z1 i count++; //消抖、消扰2 M6 f; h# \( l4 q8 B" v
if(count>=250) //根据环境干扰强度10到250
+ v. A8 N. ? R3 ^9 `- x; ~ {+ N3 n" d$ _+ ?$ A0 J$ h. u
count=250; //防止溢出
+ x) ]4 z( U; w if(flag==0) //如果自锁标志为0
5 h2 d' S. D, f, f {; \3 q; P* c7 i L" Z9 P7 |% Y
flag=1; //自锁标志置1、不会在持续低电平期间重复计数
0 U4 Q% U$ L K" A. v2 `5 J* o count1++; //脉冲计数变量
; N g8 N7 l6 m/ s8 I+ C6 I if(count1>=3) //脉冲计数变量>=3
0 t' |7 m+ j$ X3 ?3 u; W! ] {" T$ O1 A7 f1 E+ f. A
count1=0; //脉冲计数变量清05 `+ X: u3 c" b" V9 F4 s" |
OUT2=~OUT2; //输出电平取反
2 \ w! A, D9 S4 a8 z) p }
) o1 L8 w* N/ f1 p }
, l' y! A; {4 `; C5 M% o& c* k }; K* A9 T. j: p: o7 X
}
8 H$ c! |& c4 V' g1 }# A/ g else //IN3高电平& L% `. [3 `, d5 y1 L' m; c
{5 M! ]/ F, B+ U- L
flag=0; //自锁标志清0
0 y) P2 h5 U! C0 o1 c/ c, e# P: z count=0; //消抖、消扰计数变量清08 p4 w$ C. ?3 \+ y1 R
}; H! F7 |1 d9 C
}
k! g5 |0 p- m1 ]. \2 } u9 T" kvoid main()) b* S) H7 W2 ]: u
{/ Z( Q& m% ~& s5 p; V8 W
while(1)/ {+ Y( x' T- g1 N Q* `. [
{) l4 t( G$ G8 U7 h6 E" b
io_rest();
+ ~' z8 L& f0 C }; g# u, [" Q$ Q* V) F( L
} |
|