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

自动门控制程序共享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-14 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
自动门控制程序共享6 b- d  a* I+ m. [' S) o3 T  j( E
9 h  p8 Q! N% K

; ~& s2 G/ l5 j& k#include <reg52.h>7 ]( W& g2 l/ l) B1 S0 V: r  c
#define  uchar unsigned char
# t) Y3 H: B$ O#define  uint unsigned int
" S  Y) Q, m% w* E) j/ j8 u2 l1 @9 @. l
#define TIME_COUNT 11//22.1184MHz晶振10us定时中断9 U, i. n% p9 {, r9 N5 E& i  A
#define FOSC 11059200L//22118400L
2 f! X! Z& g0 l$ q$ ^* k# ~! R  s0 c& s6 |2 E) y; U
sfr P2M1=0x95;  Q# x6 v$ N' d- K; B8 {0 S- }
sfr P2M0=0x96;" L: S' N  Q2 D' d+ W/ ?1 k/ @3 U

- v* ?- D" ^) ^) Csbit sb=P3^2;//开门信号
3 Q. e2 B2 a$ z, Y4 {2 R4 F2 @: csbit sq1=P3^3;//开门限位
6 T9 s2 b7 t+ W0 Gsbit sq2=P3^4;//关门限位
% D+ h& h' V0 ysbit s4=P3^5;//关门防夹
* T* @# [1 T' b" h
8 z: \1 w, e4 g7 ssbit x0=P1^0; //延时关门时间选择9 x' B6 [6 m* t: V% z8 {
sbit x1=P1^1;% h1 U% g# R8 L! Z
sbit x2=P1^2;% ?* O& T5 C% _& `0 {
sbit x3=P1^3;2 x( {: [5 p$ I
sbit x4=P1^4;. Z$ x1 R" Q  ?5 ?8 T
sbit x5=P1^5;! g6 x3 x( L4 |2 Y- O
sbit x6=P1^6;
7 j7 j! j& |0 @8 {sbit x7=P1^7;//延时关门时间选择: Q  o4 d0 ~+ \( o2 J  K& u

/ ]' w8 p0 x* r, Rsbit kai=P2^1;//开门(正转)3 g! S5 y( y) _( G+ G1 e7 M
sbit guan=P2^0;//关门(反转): U0 D! ]8 x  ^* a1 ]9 b; {
$ {) x+ A2 c  t6 _- o: U+ c
uchar aa[3],bb; //串口收到数据寄存器
! M( m6 h! u0 U$ x5 K2 Uuchar z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10; //时间继电器
. m2 e) \' I( h0 ^# iuint t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;        //时间继电器
  W( N* |7 L8 x8 M& o2 nuint num1,n,n1,n2,n3,n4,n5,n6,n7,n8;//延时关门设置 9 h% |# g- i% W) F. V$ O0 u  j
uchar a=0,m;//门当前状态
( ?+ L) C7 ~$ |3 q! f: z
% s& j$ m9 c# G. r& [- evoid delayms(uint xms);
2 _/ G! u* F- y3 Q, a7 Q' U0 rvoid kaimen();
( s# @* l1 M, [  o- Y- h+ g5 Evoid guanmen();" d" K' k. ]0 A5 L

3 ~1 Z4 Z; W, C' L9 Avoid delayms(uint xms)            //延时函数! {" N: d) O% Q6 D% U
{
* @2 h' W; x& r* O4 f, S5 U  v   uint i,j;% l; G7 C: U% D! I' H% M
   for(i=xms;i>0;i--)% S: |! |" }3 w6 G* D
       for(j=330;j>0;j--);. {7 t+ J4 p( }& N3 |; ~' d
}
/ k% z( I; ?8 T/ h3 A$ [void init()7 v+ n5 i1 }; s
{* B. \0 o, V  n- Y0 D) L& \7 P; g

; ]0 o" c1 P6 j: T- b) v5 {        P2=0; P2M0=0xff2M1=0;        7 w/ B$ M7 }) l$ D# ]2 J; i
        TMOD=0x01;* e/ d. i; h+ ^
        TH0=(65536-45872)/256;0 a/ E9 k/ U8 ^# X
        TL0=(65536-45872)%256;                                                                                                                                          ) L& u' V7 x4 b" a$ ^
        EA=1;ET0=1;TR0=1;
  p! _7 j; [! _  R5 l        if(x0==0){delayms(5);if(x0==0)n1=20;}        if(x0==1){delayms(5);if(x0==1)n1=0;}/ B- U7 v$ i$ F# \9 @
        if(x1==0){delayms(5);if(x1==0)n2=40;}        if(x1==1){delayms(5);if(x1==1)n2=0;}+ G+ U$ z0 v, t" L3 K7 B
        if(x2==0){delayms(5);if(x2==0)n3=60;}        if(x2==1){delayms(5);if(x2==1)n3=0;}/ p5 ?9 r: R3 A1 h8 S
        if(x3==0){delayms(5);if(x3==0)n4=100;}        if(x3==1){delayms(5);if(x3==1)n4=0;}: j8 t; W8 C5 u( F2 q. C
        if(x4==0){delayms(5);if(x4==0)n5=160;}        if(x4==1){delayms(5);if(x4==1)n5=0;}
  Y4 F8 h  e  t' i( M9 y2 n# d) c        if(x5==0){delayms(5);if(x5==0)n6=200;}if(x5==1){delayms(5);if(x5==1)n6=0;}7 ?; }0 A/ W' ^% F1 g$ x
        if(x6==0){delayms(5);if(x6==0)n7=300;}if(x6==1){delayms(5);if(x6==1)n7=0;}
) s: Z1 h2 f) |% B. G. R6 q        if(x7==0){delayms(5);if(x7==0)n8=400;}if(x7==1){delayms(5);if(x7==1)n8=0;}2 u, l. @- _6 c# B% ?5 Q8 ?
        n=n1+n2+n3+n4+n5+n6+n7+n8+1;
0 O+ @( b5 o" I8 p//        while(!sb||!s4);guanmen();- a4 W2 m2 F* C9 \
}
. i6 v9 l2 W8 f( x$ E3 F, L0 M& p3 d1 k0 `

" n6 w+ d% Q% H/ g6 q7 svoid USART_Init(uint BAUD)//初始化串行口和波特率发生器
" ?' c2 N4 Q  n* b1 Q& y% K; t{                    
& N/ A- o& r. d% l        SCON =0x50;           //选择串口工作方式1,打开接收允许4 m7 F$ k2 y3 o6 q: K
        TMOD=0x21;           //定时器1工作在方式2,定时器0工作在方式1! b' j9 E5 ?% k
    TH1 =TL1 = (256 - (FOSC/12/32/BAUD));   //设置波特率重装值
5 p4 r* f" E! o2 o1 K        TR1 =1;               //启动定时器T13 J' H2 d4 M7 [# X6 N2 W
        ES=1;                 //允许串行口中断  n+ }# k0 I. K4 E( d
        EA=1; - e1 J% N7 j% U! M/ G; p, i
}) s6 [) Q9 p- f# Y' G6 }
void kaimen()                                                //开门函数# A: b1 d+ q  K, J2 h, J5 S8 @# X9 w
{+ }+ B0 _) p# C, T) c# u) q
        t0=0;  //计时器清零0 A3 U* f: R' U: F: J% l' c
        z0=1;        //打开计时器$ ^: m& F* f9 L6 m2 c, X
        kai=1;        //开门
$ \4 k0 ^& r7 S8 Z        while(1)5 S6 A# m- N" Q; U% L
        {- w* [# {6 U( L% N9 }
                if(a==3&&z4==0){SBUF=0x3b;while(!TI);SBUF=P0;while(!TI);SBUF=0xe7;while(!TI);a=3;z4=1;}        //正在开门信号发出  n7 N0 [( g/ Q" m) a- ?: |
                if(sq1==0){delayms(5);if(sq1==0){kai=z0=t0=0;m=1;break;}}         //开门到位
+ W4 y! q% T( I, s7 C                if(t0>=300)     //计时保护30秒
% l! R( n# t  ]; K7 o                {
4 c' L, z: s7 ?7 _5 f, I6 f                        kai=0;guan=0;while(!sq2);while(1)3 g' _+ \1 X! j
                        {
8 r4 |. w7 N0 _- ]                                if(sq1==0||sq2==0||t0>3000){delayms(5);if(sq1==0||sq2==0||t0>3000){z0=t0=0;break;}}
. o5 X. k5 n' k! X5 D                        }break;
- J9 ^) @! a; j! O+ F5 i" B- W: x% r: _                }, x, Q' b3 d' j4 [0 P; [9 o
        }) y! a; A. \+ x7 [4 P% ^7 f
        z2=1;: {5 }- L- x* O+ M; B$ v% i1 [# \
        while(!sb||z2||!s4)5 L; F* I* K7 ?$ y; f  n, k
                {
; ?, H2 H2 h& h- l8 w                        if(a==3&&z3==0){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);z3=1;}           //开门完成信号发出
1 B% @" r8 r. ^& C: W& K3 ^* O                        if(a==1){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);a=0;}        //门开到位信号发出
+ t9 j4 d7 ^0 d1 [7 `                        if(a==2){z3=t3=0;}         //AGV收到开门完成信号
+ j5 J) c9 U& b                        if(t3>50)t3=z3=0;//AGV没有收到开门完成信号 重复发送开门信号
- `9 H1 H+ C0 \: i) X$ }+ o                        if(t2>=n)z2=t2=0;//延时关门        
- H  C1 k( r/ N9 a                }
7 \+ o, S* w  b# A& A$ W        if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出  D6 @+ e7 y8 S3 x  {$ |
        m=a=0;
/ |# {7 X& i" N1 C        guanmen();5 A/ I! W; U1 M2 K' V
}
8 {8 g/ z* O5 b$ I3 r$ Ivoid guanmen()                                                //关门函数9 g1 F( w# V) M1 x
{
7 U- w( c# k  j4 e! ?) @' _, f" }        t0=0;z0=1;guan=1;
( s- [" P# T6 P        while(1)
( F" X( s5 Q1 y. \8 N0 x        {
3 V: y& e* N2 p                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出9 S5 y) c  {% f3 P# g, F+ F3 d' g
                if(sq2==0){delayms(5);if(sq2==0){guan=t0=z0=0;break;}}        //关门到位
# P) B8 w- D. C4 v$ @8 k                if(t0==300)     //计时保护
7 D+ B! i- u! C3 k                {4 ~8 c( C! D5 K. h6 w0 S
                        kai=0;guan=0;while(!sq1);while(1)$ l& t* ]* Z# e. C! D
                        {# z/ W5 x: r2 k. ^! [
                                if(t0>=3000){num1++;if(num1==4){while(sq2);num1=0;}t0=z0=0;break;}; z, V) I% }" X. C/ ?& h
                                if(sq1==0||sq2==0){delayms(5);if(sq1==0||sq2==0){t0=z0=0;break;}}
8 A( r$ Q! A2 `- i- h5 z4 o7 l) T" N% o                        }break;- e$ y' S9 l, u1 H/ d
                }$ j  U& }9 I( U. E$ |2 r$ |
                if(sb==0||s4==0){delayms(5);if(sb==0||s4==0){guan=0;delayms(2000);kaimen();}}//开门信号, |$ Y$ {, f& f4 r7 K
        }) \& L+ P' J, o  o- p2 a* z; Z
}                                                                : @$ _" b" d& x/ W  `
void main()
9 F0 R+ L: g- y1 I- E# q% K& x( c  \- O{4 t8 E6 k) D& P8 S! S* a
        init();
/ }) R/ H+ K, ^/ ^3 ]; n' U" c* m        USART_Init(9600);
0 b  ]# q2 V) h, Z- B; m8 v, f        while(1)
8 {1 ~) h7 m) m- ~4 Y5 _        {        0 W0 J) P6 k! F  R* ^! e$ X
                if(sb==0){delayms(5);if(sb==0)kaimen();}//感应有人$ O- f0 V+ f7 U! ^; `
                if(sq2==1){delayms(5);if(sq2==1)guanmen(); }//没关好门
. P/ v6 E& g$ X: ?' N                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出        ) T; q8 u4 a2 M7 N0 R
        }         
0 i2 s1 F( e7 S}
+ s, ?8 l0 C6 ^/ B! j' v1 A7 N6 P! P' @
void T0_time() interrupt 1( U5 c$ C! [9 S' U* K
{( s9 |# _! g- I6 k+ j! P% m( H. O
        TH0=(65536-45872)/256;                   //- \1 z! x6 V3 m- J# ~
        TL0=(65536-45872)%256;$ h8 m. Z# |) o, Q8 X
        if(z0==1) t0++;   //时间继电器0        开关门卡死保护         
. W# B5 K' l0 Q2 F- K7 h        if(z1==1) t1++;   //时间继电器1  收信号间隔清零时间         
, v: ^3 l/ ?1 {        if(z2==1) t2++;   //时间继电器2        延时关门         
3 ]/ m8 R# e" L! t" S' P& _/ b' \# }        if(z3==1) t3++;   //时间继电器3  发出信号没回应延时再次发送            1 j( L9 K: }! |7 t
        if(z4==1) t4++;   //时间继电器4              
: b6 F, v- b0 I& r# n! U        if(z5==1) t5++;   //时间继电器5              5 ]! f3 D) Y/ X6 o# n
        if(z6==1) t6++;   //时间继电器6           
* W4 U9 B8 N+ G/ E        if(z7==1) t7++;   //时间继电器7             ]( [7 p3 i* @$ @
        if(z8==1) t8++;   //时间继电器8               
/ d- x) V0 h( ]" s5 U. u" Z        if(z9==1) t9++;   //时间继电器9               
  U6 I1 E/ H. m        if(z10==1) t10++; //时间继电器10
6 ^( x  b4 }! c  ^5 s- r* V        ( P2 j# _% \! C  l/ C8 j
        if(t1>=2)z1=t1=bb=0;//间隔超时清零
- C, m4 U% {3 f) I2 ^//        if(t10==0)guan=0;if(t10==5)guan=1;if(t10>10)t10=guan=0;        ! G( c0 B( n# V: ~# e
}
  H  b, @3 W! B
& }& I: B1 N; W# Y3 W. K# e) }void USART(void) interrupt 4
4 I+ c- r( e, f* P8 W% z{" C% u2 w& [. j$ [

" Z: r- k5 r9 [5 x8 ?/ u4 t/ n" |5 t        if(RI)
$ O; x7 j& ~, E+ ^% H0 N# |( l        {        
: E" q- C% o, K0 v' Y/ e9 V                aa[bb]=SBUF;
5 n# q, p. Y# q/ q, F' O2 t                RI=0;
3 j; F: `* W& f  @# {                bb++;
9 F2 P) w* z( U8 K. v                z1=1;5 y6 m( q# l, z, q- A0 t$ k. h
                t1=0;
" @- V7 I# b! J. u9 ]0 M                if(bb>=3)
' q) S7 @- O5 P3 w" v8 ]% h                {9 M% b6 ]- {5 y* o( U
                        bb=z1=t1=0;
* D: d# q  s- s' N: ?; i7 D                        if(aa[0]==0x1e&&aa[1]==P0&&aa[2]==0x37)        //开门信号( R/ y, d$ D1 t/ W
                        {3 ~: ]" l. A: o3 J* x
                                sb=0;, i+ T& j* N$ E. W7 }# d# d- h
                                if(m==0){z4=0;a=3;}        //正在开门信号发出1 g4 l/ z% R1 ?4 D7 A0 ?6 D1 ]5 L
                                if(m==1){a=1;}        //门开到位信号发出
8 ]+ N) f+ F9 A( n                        }7 l3 B: g* i; I1 c
                        if(aa[0]==0x37&&aa[1]==P0&&aa[2]==0x6e)          //AGV收到开门信号! ^. @# ]: ?# f: b2 g5 _9 g* Z
                        {
0 w9 G! L: n0 ~( S& n                                sb=0;a=2;
  s  {- ]. o; ^                        }( a, L' ~! \( \/ I* ]/ z4 w# y
                        if(aa[0]==0x69&&aa[1]==P0&&aa[2]==0x17)         //关门信号5 R7 H# O! O- F% ]( K
                        {
+ a/ W5 `, J/ M- ~/ t/ E9 K                           a=4;//关门信号发出! H+ x  X% A3 P% n. E# w
                           sb=1;
2 M. r; k2 T, {9 N( f                        }
5 M/ q+ ?3 B8 R! @$ ]                }        
4 O0 e$ b5 c# ]1 Z+ ?        }
# h  y0 {% W3 w0 G, O+ G, l$ Z        if(TI)
. R1 b" _$ I% q/ F                TI=0;+ L. M7 c. A2 ?/ i% j2 g
}
  m# \5 M6 L6 m+ @6 ~) y0 d8 ~

该用户从未签到

2#
发表于 2019-1-14 15:27 | 只看该作者
楼主的代码不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 06:20 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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