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

自动门控制程序共享

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
自动门控制程序共享
  {! G& g" W3 Y' y
: p4 L3 o+ z; X; V! \  N

& Y2 S8 k' N% E0 T( V; M& K. Q#include <reg52.h>+ y9 A: x. g/ R6 T, N9 j# [6 ]
#define  uchar unsigned char5 e0 I* x  ~' X
#define  uint unsigned int
/ e+ a7 j0 s. l0 I$ o1 f5 ~, |
#define TIME_COUNT 11//22.1184MHz晶振10us定时中断
1 V( o. v, Z0 j/ a  `#define FOSC 11059200L//22118400L' `9 Q' R( l. f) ^8 x2 G3 q) Q

& m, s! {2 A7 C) Esfr P2M1=0x95;
7 V& T) L0 W% b  J! |3 zsfr P2M0=0x96;* \# c9 t3 Z4 P: {* t# @4 k& I
- I3 Z* w" {! m; i0 L( G' s+ o
sbit sb=P3^2;//开门信号1 k7 W6 g, d" r  X& O& I; ^- ^5 D9 j
sbit sq1=P3^3;//开门限位
8 d3 v/ Z. I+ B& `sbit sq2=P3^4;//关门限位8 z2 L7 @- X! ]
sbit s4=P3^5;//关门防夹
9 I7 L( F* b9 b
* O" {. E( b) `: U/ {6 S2 T' Q& Vsbit x0=P1^0; //延时关门时间选择/ O% B9 {3 j1 t
sbit x1=P1^1;
! M6 `- \6 z8 e+ m! B/ ^sbit x2=P1^2;) N7 w4 y5 V, h( J
sbit x3=P1^3;1 A& g, s1 U/ @9 m( I- q
sbit x4=P1^4;
5 [7 v* T0 f4 Q, [( nsbit x5=P1^5;# @5 `- ^- R$ z- w
sbit x6=P1^6;, w7 }# d2 h- |5 ~: f0 |6 N. i; ?
sbit x7=P1^7;//延时关门时间选择- y3 t4 l+ A+ ?$ M4 K7 _+ w! {. W8 [' J
* W5 Q$ T# a8 O- b  k8 |
sbit kai=P2^1;//开门(正转)
' t! \0 @# N, h( Z$ a7 ]& U. Bsbit guan=P2^0;//关门(反转)
; l3 B1 e9 u& u$ z& i
- p$ z8 Q2 M& Z# Q' {& d( Ouchar aa[3],bb; //串口收到数据寄存器" I3 J$ P  L9 G- t
uchar z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10; //时间继电器
: i( Y3 h# m; W8 n7 Fuint t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;        //时间继电器
# x2 D, h  L3 e9 Z; B8 nuint num1,n,n1,n2,n3,n4,n5,n6,n7,n8;//延时关门设置 + I) j8 p7 N7 K7 g
uchar a=0,m;//门当前状态( \. j5 C, ]' H, Y: K9 t; o
" |4 ~, l. i# f0 M: R9 s8 [
void delayms(uint xms);! B  b' n0 v/ j- z! K+ `. ^
void kaimen();3 ~5 ~3 b: r2 a) d5 U1 J, Y
void guanmen();; q% b& p2 p/ Q$ D$ L1 T+ [# f
& `4 [2 `$ k8 N
void delayms(uint xms)            //延时函数8 c1 y/ k2 {+ P" x
{8 H4 E$ l+ d3 ^& k9 l
   uint i,j;- D$ R7 j4 o, h
   for(i=xms;i>0;i--)
- \4 V( Z! S/ o: D* m       for(j=330;j>0;j--);
/ L4 c! A/ \* l6 f" [7 i4 i7 Y$ V8 _}1 c9 ~- R! S8 K. c7 O
void init()& ]# C$ L$ o$ p6 d% w- k
{7 U( _: G$ F  Z8 J, _9 N
- c6 X! o# J/ q6 _: d# S# S
        P2=0; P2M0=0xff2M1=0;        : n1 ~- F; c' `) J- I
        TMOD=0x01;0 A/ Y9 q/ j4 S9 G, o, }- L2 ?1 j6 H$ }
        TH0=(65536-45872)/256;
5 @/ ?! l# s. ?- M2 b) D5 t        TL0=(65536-45872)%256;                                                                                                                                            O; \, W7 ~* b7 _
        EA=1;ET0=1;TR0=1;
# i/ r, m) u" G% w        if(x0==0){delayms(5);if(x0==0)n1=20;}        if(x0==1){delayms(5);if(x0==1)n1=0;}. w. w2 \+ D$ {8 M, T
        if(x1==0){delayms(5);if(x1==0)n2=40;}        if(x1==1){delayms(5);if(x1==1)n2=0;}) C- s7 T+ D$ D, }
        if(x2==0){delayms(5);if(x2==0)n3=60;}        if(x2==1){delayms(5);if(x2==1)n3=0;}0 I. M2 Y9 M4 i( n9 v/ _
        if(x3==0){delayms(5);if(x3==0)n4=100;}        if(x3==1){delayms(5);if(x3==1)n4=0;}
" e9 E2 `; [/ R( B& w        if(x4==0){delayms(5);if(x4==0)n5=160;}        if(x4==1){delayms(5);if(x4==1)n5=0;}
# j6 x. n( S/ O9 P        if(x5==0){delayms(5);if(x5==0)n6=200;}if(x5==1){delayms(5);if(x5==1)n6=0;}8 u7 O+ ~" N# \. V
        if(x6==0){delayms(5);if(x6==0)n7=300;}if(x6==1){delayms(5);if(x6==1)n7=0;}! d' g8 A) _2 |
        if(x7==0){delayms(5);if(x7==0)n8=400;}if(x7==1){delayms(5);if(x7==1)n8=0;}7 y1 m: A. M2 T( e
        n=n1+n2+n3+n4+n5+n6+n7+n8+1;
! e6 b- F; r& U: r/ b//        while(!sb||!s4);guanmen();* j1 p; |( h+ j- F
}
$ B, l4 X" R- B! r% h3 f3 M3 K( K2 ?  ^5 W( J" @
5 i( l8 H+ |, U" |; |, h
void USART_Init(uint BAUD)//初始化串行口和波特率发生器
0 v! s1 S' b. n1 j! {3 }+ |; W5 c{                      q! b/ p* {3 f4 I
        SCON =0x50;           //选择串口工作方式1,打开接收允许. N7 F  ~0 D# M2 u& F) N" {
        TMOD=0x21;           //定时器1工作在方式2,定时器0工作在方式1
( X7 T8 [9 Q) n* A) `    TH1 =TL1 = (256 - (FOSC/12/32/BAUD));   //设置波特率重装值
2 q7 q) g: _" Y2 W7 I  ]5 h1 W        TR1 =1;               //启动定时器T11 g- E& K" {0 U4 N% Z4 I5 S! f
        ES=1;                 //允许串行口中断( }- e1 Z) N/ N! ?
        EA=1; $ W  W4 Y; D3 f: J, q3 Z! ]
}
  N* i" d2 `* P8 g2 ~. Rvoid kaimen()                                                //开门函数
! g- _& Z8 P# n. b8 Y6 z) A{4 q( ~5 s' ]0 I  C5 e  Y) u
        t0=0;  //计时器清零
* K- h  f* W5 V        z0=1;        //打开计时器
8 V$ P6 r% M: s        kai=1;        //开门
2 s" H- m* p2 C& s# E; l        while(1)
4 E/ X# `" [. H        {
) W" G# H/ e! J$ F$ x                if(a==3&&z4==0){SBUF=0x3b;while(!TI);SBUF=P0;while(!TI);SBUF=0xe7;while(!TI);a=3;z4=1;}        //正在开门信号发出
$ j8 T% C  N& a  r0 H                if(sq1==0){delayms(5);if(sq1==0){kai=z0=t0=0;m=1;break;}}         //开门到位
8 v3 E* C2 V  x; r/ X$ M- I: q                if(t0>=300)     //计时保护30秒
1 [7 @6 d, m2 @6 K7 L/ F; O4 Z& m                {3 L) E9 d) `3 I- L  {! q
                        kai=0;guan=0;while(!sq2);while(1)
# u5 ^, D: ]8 \$ o2 E# Q                        {
9 c0 e) T9 v( L                                if(sq1==0||sq2==0||t0>3000){delayms(5);if(sq1==0||sq2==0||t0>3000){z0=t0=0;break;}}
$ x# _- i& o- _* ^* W$ x& L" p- `- D                        }break;6 r& E2 R+ F1 D; l$ [
                }, T: _( P/ W. m5 X9 Q
        }6 u! J* h* N) g$ |- v! y2 w
        z2=1;
# u- C/ y) _3 J5 d' B+ U        while(!sb||z2||!s4)/ t2 [/ c* u/ m" n7 E, n- s! U
                {! K5 |/ \; v& e
                        if(a==3&&z3==0){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);z3=1;}           //开门完成信号发出* l! _& c; D" L0 m3 i8 ^
                        if(a==1){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);a=0;}        //门开到位信号发出9 @, P8 v9 D5 x' ?
                        if(a==2){z3=t3=0;}         //AGV收到开门完成信号
+ \& s, Q: Z, i( z2 g                        if(t3>50)t3=z3=0;//AGV没有收到开门完成信号 重复发送开门信号% t. M" Z* ^' `" u7 a1 c
                        if(t2>=n)z2=t2=0;//延时关门        7 P  q/ ^% r# g7 c, E
                }
: P- u. n/ j2 w- o3 `3 D        if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出5 G8 A) A' L7 k" k* U
        m=a=0;
5 |  g2 h8 j( S2 g% b        guanmen();
; P+ q6 R: j: k& q# }: G2 m8 U) J}
6 J% \5 A+ D; K$ Vvoid guanmen()                                                //关门函数1 B  E2 i) E3 b. P1 m/ C  R* A
{
4 M" @! c2 Z" {0 f( [5 B        t0=0;z0=1;guan=1;7 d/ z6 A6 {- P- ?1 ^8 v
        while(1)
" T" G, K: Y$ U! v) u$ W        {
, r* |. X) z" j  e  C) [/ C3 h                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出
0 k1 b4 v( e8 V+ L                if(sq2==0){delayms(5);if(sq2==0){guan=t0=z0=0;break;}}        //关门到位( j6 z% _4 z6 K1 W7 z" h0 F
                if(t0==300)     //计时保护6 k' `1 y9 m: ^3 N( L0 k
                {
( P+ a( g8 `) E' j& w% [- N                        kai=0;guan=0;while(!sq1);while(1)8 E' M! k" |, c" F9 O$ N( H* c8 M
                        {
2 K5 c9 e* R' a# I8 Y9 w                                if(t0>=3000){num1++;if(num1==4){while(sq2);num1=0;}t0=z0=0;break;}
; V: }& \6 z/ `                                if(sq1==0||sq2==0){delayms(5);if(sq1==0||sq2==0){t0=z0=0;break;}}
" K7 h* {; n, E                        }break;" j8 ~" q! S9 s1 b4 d' v, C
                }
$ E! q+ M% {5 r8 H( V                if(sb==0||s4==0){delayms(5);if(sb==0||s4==0){guan=0;delayms(2000);kaimen();}}//开门信号0 L7 y7 L( h% ?& g& p
        }
1 `2 H- M5 l1 {: x: L3 k}                                                               
+ V( O& Z) B0 q% h! X8 Fvoid main()
. |: O' U3 J5 W/ d5 S{, n" Y% S8 M8 |& e
        init();7 h: n/ Q5 O9 F7 n4 J3 E' y
        USART_Init(9600);
' o/ N  q1 H8 O1 w2 k        while(1)# T: m" O- d0 r/ U' e/ H, i
        {        
* u0 c+ L( N% R$ B- O; q. }                if(sb==0){delayms(5);if(sb==0)kaimen();}//感应有人( K6 [# }# I# t1 M* d" \$ |9 X0 G
                if(sq2==1){delayms(5);if(sq2==1)guanmen(); }//没关好门  I, Q' l" i: O( g
                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出        7 X3 M- a) E" P0 J( c9 N
        }         ! ?% a* b  S: Y+ I8 m9 p
}  h5 x7 }; i+ l9 g3 Q# V
7 X+ G4 G9 M7 E4 r9 C: U0 S
void T0_time() interrupt 1; F& _& k7 b% t7 z: o/ A# u
{
2 l6 p/ k4 v. R  F3 q0 _        TH0=(65536-45872)/256;                   //
- I8 a6 }+ E/ a* c        TL0=(65536-45872)%256;
2 E, [" F  U+ M) T; Q# J0 U        if(z0==1) t0++;   //时间继电器0        开关门卡死保护          5 O6 s# H' q  i! b3 U
        if(z1==1) t1++;   //时间继电器1  收信号间隔清零时间         
+ z+ C- E/ ^& v( H8 Q; o        if(z2==1) t2++;   //时间继电器2        延时关门         
( j$ o% r% m& E, a4 ?        if(z3==1) t3++;   //时间继电器3  发出信号没回应延时再次发送            ; [% p8 ?7 X4 M/ ^( X! l
        if(z4==1) t4++;   //时间继电器4              $ M" b. h( _- c2 b% S
        if(z5==1) t5++;   //时间继电器5              
8 v( W/ |4 c  m  |% h; h        if(z6==1) t6++;   //时间继电器6           
/ k1 N5 Z& f3 T5 d  B1 N        if(z7==1) t7++;   //时间继电器7           + L& U2 Y% b3 [5 e  [8 K' I: A& s
        if(z8==1) t8++;   //时间继电器8                " y& A, V3 D% @' E! E
        if(z9==1) t9++;   //时间继电器9               
( N1 {% @3 |9 ^/ V' m        if(z10==1) t10++; //时间继电器100 J, M) X- [6 x, j/ |
        0 f; K* P5 x: \0 b" J8 i
        if(t1>=2)z1=t1=bb=0;//间隔超时清零
- T- I: n5 k2 u- M9 z3 y7 [" n//        if(t10==0)guan=0;if(t10==5)guan=1;if(t10>10)t10=guan=0;        % k- H4 @' k, ]
}0 Y% \9 T/ L+ L! o1 ?
0 d$ m3 l8 {0 \' z- _) f8 L1 a
void USART(void) interrupt 43 {0 u4 e# v$ `' H  R
{
" F  Y- n: ~0 B8 k( B
% n( b& h# h# O, @        if(RI)
) V+ ?2 u0 Z( o, w7 c/ H: l        {        
1 N0 h( q1 k1 R: a( {7 Z                aa[bb]=SBUF;
- G6 ?' L/ w" q                RI=0;& |1 E- j  o- s% g4 k/ @
                bb++;
$ z, h" \6 S- {6 j$ ^                z1=1;
9 _( g5 k8 p: g5 V/ E                t1=0;/ N8 p4 L& [( O
                if(bb>=3)
+ t* ~% w0 ?4 u                {
0 y/ k: ]# Q2 p% }& r5 Q                        bb=z1=t1=0;& \8 R8 I* L' v
                        if(aa[0]==0x1e&&aa[1]==P0&&aa[2]==0x37)        //开门信号
; e. m( \1 j/ _9 F& m7 ^; R                        {
  l. P' W0 s2 s; K/ _                                sb=0;
1 {4 b6 i' X: I+ b* {' B                                if(m==0){z4=0;a=3;}        //正在开门信号发出. K* P- I) |" \: T7 ?4 O! v5 o1 N
                                if(m==1){a=1;}        //门开到位信号发出
* v# w0 Y" @; G                        }) ^9 `1 J9 Z8 m8 V
                        if(aa[0]==0x37&&aa[1]==P0&&aa[2]==0x6e)          //AGV收到开门信号  v" o) M. ~% _; {; D% A
                        {3 k9 c- H7 Y. d* M$ L# A5 r
                                sb=0;a=2;" J6 d- C& r& H+ b5 Y; N
                        }2 T* ^7 I! l- @7 o
                        if(aa[0]==0x69&&aa[1]==P0&&aa[2]==0x17)         //关门信号
: m# e& J( a+ H7 r                        {
/ ~; ~% u8 A5 C: Q                           a=4;//关门信号发出
; `# e) W$ I( F" L                           sb=1;
4 Q8 P6 S9 w% b4 f$ v" w" V                        }- b( r# Q( _( H
                }        
  U( N) g& n( F        }
( f2 {5 {, k; n0 b# P7 `/ F        if(TI)- |  k6 w2 H" o. c+ T
                TI=0;
5 R4 l' d; H7 y}

) L+ h9 @" p3 m& X8 b! T8 D6 u9 |

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-29 00:42 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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