找回密码
 注册
关于网站域名变更的通知
查看: 696|回复: 3
打印 上一主题 下一主题

分享一个遥控开关窗单片机程序 带雨感功能

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-4-15 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2021-4-15 17:59 | 只看该作者
遥控开关窗单片机程序 带雨感功能,收藏了。

该用户从未签到

3#
发表于 2021-4-15 18:18 | 只看该作者
函数定义写的比较规范/ i$ O& W5 x2 E: O  C1 B6 [* U

该用户从未签到

4#
发表于 2021-4-23 17:47 | 只看该作者
谢谢分享     1 I: _2 s/ A+ o4 {, Q4 Z' U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-21 01:08 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表