|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
小白一枚,第一次编写见笑,自己不会写代码找了几个代码拼凑的,用着还行,写的很啰嗦老师们给优化下吧。 r: F4 j/ ~8 q( M$ M# N
就是很简单的遥控开关,按一下开窗打开窗户,按一下关窗关闭窗户,如果开窗下雨自动关闭窗户,关闭后即使有雨感信号也不再执行关窗动作。开窗器自带过流保护所以不用加限位开关。
; v& {! G1 J L1 ]1 q! {. W! _7 u% A! B& X2 j- r& w
单片机源程序如下:
/ B g7 K. Q* p9 S//2021年4月10日遥控开关窗雨感关窗程序/// D+ |- L/ L) f) ^# ]9 w- ^
//遥控信号高电平有效,雨感低电平有效,继电器输出控制高电平有效//7 x* C9 K1 y, ^4 V% `
#include "STC15F104E.H" //单片机头文件
1 ^9 }- ^& Q& a5 l/ R5 [: {#define uint unsigned int //宏定义无符号整型数据 w) c$ D0 p; D; T H$ W. j
#define uchar unsigned char //宏定义无符号字符型数据
; O3 v t. ?6 g0 l s- h/ L7 hsbit KAI=P3^4; //开窗信号输入 y8 I9 s1 _3 S" X
sbit KAIO=P3^5; //开窗输出
' k0 v/ z3 }- ?. P8 F6 E# G# b% u3 Osbit YG=P3^0; //雨感输入. A; L; H. t7 v `
sbit GUANO=P3^1; //关窗输出2 j4 H" g3 t- I- F2 r: d
sbit GUAN=P3^2; //关窗信号输入
0 i6 |1 W3 t! m3 I% [6 h) Csbit ting=P3^3; //停止信号 j0 H# |8 M+ u( i
uchar Cnt50ms,Cnt1s; //中断计时变量# E( w. M9 G# L* ?+ v' B6 m" B
bit K_sign=0; //开窗状态标志
+ I6 \5 g: m6 Y; _bit G_sign=0; //关窗状态标志# H, r+ D; j( Z+ w3 M S# Q
bit K1_sign=0; //开窗状态1用于雨感; U. J6 f8 t! x( J2 P$ G! }
bit YG_sign=0; //雨感状态标志' O( ]( |2 a8 T, t1 E, E8 e; h
bit T_sign=0; //停止状态标志
; Y! L+ o6 l( Q' Y
3 }- R b. C9 ^4 {4 ]/***********停止子程序****************/8 F% R* {& ]% Z' a _
void TINGZHI()
0 j$ N- h- R" R0 B{* i) u# k! l- {4 w( m7 u
static uchar count=0; //计数变量
1 b1 F& d. h) t! r& N9 ^ if(ting==1) //检测输入如果为1
3 O, F+ c4 n% c7 T' S% K {
: c0 \3 Y, s: F0 f* D, y count++; //计数延时消抖
- L5 W1 O9 }" \! z if(count>=100) //100次检测按键如果为0) r' {5 Z7 |5 D
{ " Q2 g9 [! h1 V2 t6 i- ~, s
count=100; //防止溢出) ]4 y5 x* p w$ p ^
9 _/ D7 O! S5 b6 M0 ? if(T_sign==0) //按键状态标志为0# h' j! |8 o4 |, ]1 V/ t% w/ s/ ] F; ^
{
# l' Z5 ]. V7 J T_sign=1; // 停止状态置1防止重复响应
& F; `; h5 V( @2 b- ` K_sign=0; //开窗状态标志清0- U2 D l7 e( {/ o$ H
KAIO=0; //关闭开窗输出
" a4 [& r$ o2 s: i8 K G_sign=0; //按键状态标志清0
/ p j4 c2 ^1 O* p- x GUANO=0;+ {( s0 }$ q5 Y( a- d
YG_sign=0;
) x# k( M! r- o T_sign=0;
6 z2 f+ y) v5 j+ E- T. y: E, d TR0=0; 1 `# Q7 r, k4 D1 L# \
* k! X! [, b. i% b }
f$ l; l4 X$ n2 J0 H }
4 @& O8 k2 H4 Z, r# N: ]- \ }
1 B+ M* I7 s; ^! z; G9 V, ?% `( y5 V8 s# P) w+ q2 @" c: f8 a- Q2 p# F
`8 o8 d8 U- D( C else count=0; //计数变量清0% y& T4 g7 q9 v0 H
}
9 c! M6 l }0 p9 ]void KAICHUANG() ) y5 |6 F q$ l7 Y7 S
{$ ?$ t- s- B- C1 R0 F6 S
static uchar count=0; //计数变量 # f% F3 M+ w! t
if(KAI==1&&G_sign==0&&YG_sign==0) //检测输入如果为0
, `7 Z* b" h- u( F8 p {
6 P, j+ n7 u# { count++; //计数延时消抖$ h' w0 F8 \0 Y, R1 W7 D
if(count>=100) //100次检测按键如果为0, L! u) G3 [! ?0 j: ^
{
# S% h; J0 K) d4 s count=100; //防止溢出
0 v+ q4 L* Z5 H4 [9 L0 `, N. y8 r, J2 ^4 S) G) K* _; n) m
if(K_sign==0) //按键状态标志为0; O- W) [' v) B3 B8 a7 _% m
{
6 V, v2 K) L. z, H& i$ d K_sign=1; //按键状态标志置1,防止重复响应$ K. l7 Q+ @! G. i u7 A
KAIO=1; //输出低电平有效
3 c5 |6 U3 I/ k! i+ q( d K1_sign=1;+ E7 m& D2 O6 S/ v3 y
TR0= 1; //启动定时器
/ U1 Y0 @$ r+ y3 O0 p y3 w! X3 J7 {+ n8 t, z
}) U' V3 X. p9 I- t6 Y8 J# v
}6 D1 a7 g# N I
}
' y* T& a+ ?) Z% ^
( c, k$ e; X4 \5 }& z3 P3 b' G* m7 L O' n
else count=0; //计数变量清0
; K# P5 N P8 P: ^6 K}6 v* K& |& r* D5 b
void GUANCHUANG()
5 C( f2 Z" t! K{# x( P& e0 I+ G8 |7 H
static uchar count=0; //计数变量 & z6 c- \/ C9 R" y6 [7 c A
if(GUAN==1 &&K_sign==0) //检测输入如果为0
& A* Q/ l# Y, s3 p# K {
& {3 s- |/ G7 u count++; //计数延时消抖9 `1 t/ r' a3 h! z2 \) |/ z( H6 H! P
if(count>=100) //100次检测按键如果为04 F+ u! o2 G* a2 j. S2 M1 v" ~
{
. }( x! W! s5 Z/ X; i7 x; \ count=100; //防止溢出
' b8 P% o+ L/ J2 y if(G_sign==0) //按键状态标志为0( \# p1 q z% n9 n3 C/ @9 r
{9 q, f" b4 w' ? v M1 A8 ?7 ]4 Z; a
G_sign=1; //按键状态标志置1,防止重复响应( o/ j& J; N- b* S0 l
GUANO=1; //输出低电平有效
$ I Y+ f0 J% q* y- c! a
. _" c4 s; ~2 x5 M. a4 }6 i' {6 E TR0= 1; //启动定时器7 f0 F) s" ~1 H
4 M3 d1 ]4 C7 O( d9 w }( _ w# w; G0 X- m R' h: c
}
: g. s7 Q3 e% ?3 S Q3 H' Z F } 6 m b( ^3 C6 R9 m; D' d
- ~- J2 O/ Z0 x3 F& k, U2 w$ j
/ Z& N# V4 [4 t1 |+ C9 ^ else count=0; //计数变量清0
) }& i; _# H6 m" y5 @}4 m' M' B/ A8 ]) t* W5 a
& O2 \1 a. C, O8 `void yugan()2 U+ g0 C, p; j4 X- U
{, w/ v: k: o1 S' g2 {! n3 s* @
static uchar count=0; //计数变量
8 A' k# V* |* I if(YG==0&&K_sign==0&&K1_sign==1) //检测输入如果为03 G" E9 }9 I, @2 z* w7 M8 J" a( [
{9 z9 j$ ~: B7 m# h5 k
count++; //计数延时消抖
2 X0 t7 s9 v: U* t' c9 h if(count>=100) //100次检测按键如果为0
" F2 y4 W; t3 X4 H1 i! P6 r { 6 r: G& ~& |$ \" J1 _7 }
count=100; //防止溢出
- H% U0 l `# `: W. U if(YG_sign==0) //按键状态标志为0
* c# L& s1 M; T8 b {, {6 \8 a" r) u
YG_sign=1; //按键状态标志置1,防止重复响应
8 ^ a% F0 Z2 R' ?+ ^ GUANO=1; //输出低电平有效2 G9 p$ e5 i0 r6 H6 s
K1_sign=0;9 `! ^2 B: I1 D* F
TR0= 1; //启动定时器6 X6 z( ?: a P& \* l. Z! \/ ?5 Q( G
2 J$ t( X. |$ V, ]7 u7 K* q" l
}
5 ^' D1 f7 B- O1 J }, ~- I5 j* u2 W6 p% G! r
}
; P! x* G( p+ C2 ^2 Y* | s
4 G+ X" u$ b, l" \& \0 b4 T. c: ]- ^7 { I8 h
else count=0; //计数变量清0+ s/ k$ D% k: D7 M% ]8 b; H4 e
}0 y) m4 o" t& z/ r- [- v
# Z& _ h7 n# {$ H
" c3 H7 n' M6 A; w. Y/***********定时器初始化程序****************/- q; X+ E* I$ C4 h
void Timer0Init() //50毫秒@11.0592MHz
3 ?9 P5 w) d D4 R2 D" ?{
9 L" ]& V# o ^4 m, k; w" k AUXR &= 0x7F; //定时器时钟12T模式6 U8 W4 a; v! ?
TMOD &= 0xF0; //设置自动重载模式
# X4 Q0 b4 Z9 e% g( ~! y TL0 = 0x00; //设置定时初值
# n/ Q$ H; H" W1 F& @! N2 n; E1 b TH0 = 0x4C; //设置定时初值
' y' O' e+ N* R7 c/ l TF0 = 0; //清除TF0标志+ L) U1 s% c9 n# `3 h- y0 }7 j
//TR0 = 1; //定时器0开始计时4 V( ~. ]' k& Z( v1 B2 {# b) l0 W5 l
}
' G; ]) _; d0 w# y' x' E/***************主程序****************/0 U8 \2 L) ^0 M$ P
void main()
H! N) L8 i& T: j{- L0 r/ B6 L' `/ k, {1 c `
Timer0Init(); //定时器初始化+ e4 \( \9 i! l: B
EA=1; //开总中断
+ ^- Q% ?! ?9 ^; R ET0=1; //开定时器0中断
, @, E( [) I+ I' |% R9 ^2 ~ Cnt50ms=0; //赋初值0
# r% N- g& @" ~7 \0 K8 M Cnt1s=0; //赋初值0
1 b. {* L4 b/ O5 x2 Z; O( S GUANO=0;! Z4 y! B& F2 r5 [) }9 B
KAIO=0;
5 ~" y( E$ P$ g P3M1=0x00;
) E: Z& i* q, `9 ?/ s* E P3M0=0x22;
9 Z0 v% I8 C5 M2 I6 K: a5 T! p9 X# P* X
while(1)
- V- W# i9 b1 K* L' l8 }3 ` {1 s- f9 I+ n7 b0 [, a8 P+ a! e
; i# d4 {2 `; H+ i
! F% x# m$ x' `$ Q. {$ C9 l
! t4 n$ g$ C$ f9 i" u
KAICHUANG(); 5 Z/ o& d- [ D3 L8 w
yugan(); 1 t/ z M) F( w! H
TINGZHI();; i; {5 Y% S8 T: S2 [3 W
GUANCHUANG();
9 A6 U+ b" n7 z; s) c; ?! C' V* p9 s+ n
8 f _: E; o/ U# ?
}
% S0 ~# A; a3 [. b% w n+ ^7 N2 Q8 X- X}
' u$ P" ^/ j! }; q. z" R/**************中断服务程序*****************/
5 j! O6 h& g6 A8 \void timer0() interrupt 1
: o" o6 P0 X! c5 Q( ^2 m% f) V( o9 B{; a6 N+ a5 e( {7 a/ P
Cnt50ms++; //中断变量Cnt50ms自+1- S. W3 m- `4 N: C9 i4 A9 B1 O
if(Cnt50ms>=20) //1秒+ E( I7 _& @, a/ W# k. i: Z, Y
{9 R8 p8 u- m& K4 _% Y4 b1 ?3 Q
Cnt50ms=0; //中断变量Cnt50ms清0
/ v0 [7 W Y$ q/ z% c, x' O# g$ z, v Cnt1s++; //计数清0/ W* Y, i/ s. L E0 ^/ g" n
if(Cnt1s>=35) //1~255秒任意设置
. T/ u! ~& M" P* A, e {& q, L% E3 o3 x5 K6 v3 ]
Cnt1s=0; //中断变量Cnt1s自清0
2 {# s0 J- d2 y4 _2 \: Y K_sign=0; //按键状态标志清0
U- B9 U; C# I' m# z) R* ? KAIO=0; //关闭输出
~" I0 Y: M& U. w G_sign=0; //按键状态标志清0% t' ?* T- L5 V: Y- Z+ Y @0 T
GUANO=0;
5 l$ ?5 M& r3 \$ u( X YG_sign=0;1 ]0 {/ y+ N$ C9 E+ R+ V
T_sign=0;
N( Z% A; U. z# q TR0=0; //关闭定时器3 Q8 E6 W z$ ]: C$ k* |* r% Z9 C" P' F
}
+ H8 \. V0 h& H8 R @+ u6 b* p }
. o7 G0 Q2 v, }5 i/ V2 S& p$ d8 R3 U}% S- |6 b- R, C
7 u( B0 q) \* I1 q& B
|
|