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

自动门控制程序共享

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
自动门控制程序共享$ i+ N( T6 E' X! e  E0 v1 S# |
- H5 i9 @1 D5 g* y) }+ [* X" J" J- d
* m1 B2 p. r* V
#include <reg52.h>. a7 _0 b7 H, Y+ p' Y' Q' J" U) B
#define  uchar unsigned char& }# w! Y# k& r8 B9 ~
#define  uint unsigned int
# \: a4 ^- ~8 T. G8 d0 t' k9 b& d2 M3 {( O8 _4 H
#define TIME_COUNT 11//22.1184MHz晶振10us定时中断
, n- F6 e8 @: V+ }" ?( @#define FOSC 11059200L//22118400L5 N# z) f* D  E( V, v* v6 e

* ^9 p& q. Q: xsfr P2M1=0x95;( \3 W/ ]$ y& r2 v+ c( D$ q
sfr P2M0=0x96;
) H5 h* M" {7 Z8 v9 h
& W6 k5 q7 E& U# [sbit sb=P3^2;//开门信号+ z% i7 L' c$ s  c7 W
sbit sq1=P3^3;//开门限位1 j) L+ J# a" m
sbit sq2=P3^4;//关门限位
) J2 u/ D' _) Hsbit s4=P3^5;//关门防夹/ q6 v/ S& ], x0 d. q% w: m/ N9 A
' [' B, }6 s9 }7 A
sbit x0=P1^0; //延时关门时间选择
( P' x$ Y  l5 \sbit x1=P1^1;/ Q! C$ K. g3 x' @8 L+ O
sbit x2=P1^2;$ Q3 q* s8 W' r1 T$ }, w
sbit x3=P1^3;
( s  q& C  B2 Z+ @. fsbit x4=P1^4;
/ p' O  u# y3 y' Bsbit x5=P1^5;
& i' A9 I: m! j: e" N$ ^2 E) isbit x6=P1^6;* [) M! Z. S0 q' b) M& r& a
sbit x7=P1^7;//延时关门时间选择* r+ b3 w0 Z' s( q* Y0 R$ _

0 n- Z5 Q) M+ x6 x& ^; Rsbit kai=P2^1;//开门(正转)
) t7 W. `9 k, }! o% Vsbit guan=P2^0;//关门(反转)3 i) @, k2 |: U) W; \
, ^. |- m  P  g8 D, |! Q& G
uchar aa[3],bb; //串口收到数据寄存器
; B2 `/ i1 u5 uuchar z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,z10; //时间继电器
/ d) P' n3 U$ t! [8 cuint t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;        //时间继电器# l3 @1 n5 F0 v1 ^/ T
uint num1,n,n1,n2,n3,n4,n5,n6,n7,n8;//延时关门设置 % L- V% z  G0 A: W
uchar a=0,m;//门当前状态
% B9 Q8 A* `9 P3 |9 U5 o
3 B  i# R- z* o% J1 Jvoid delayms(uint xms);) J& i7 v& I1 x2 l* Z7 x' b
void kaimen();
6 M0 V6 N, ]% avoid guanmen();
7 O) w1 f, ]6 X1 S% b. t* a5 y& s) d* \$ X
void delayms(uint xms)            //延时函数9 s) i0 B2 F5 {
{+ V/ ]% t' F  N7 n
   uint i,j;
0 ^" K  `; H3 S, A) y  j, N   for(i=xms;i>0;i--)/ ^2 Q; i9 J7 r7 P
       for(j=330;j>0;j--);
$ p- [% F$ H) K& d9 h}5 j0 a9 x5 R7 F, f
void init()/ `4 K- k6 J# {+ p* Q& O1 e
{
" M, \2 U2 u5 c
* d0 i9 i+ X, ^. z) V6 m( D        P2=0; P2M0=0xff2M1=0;        1 b' J" [. |) {. G: S, A* T, j
        TMOD=0x01;. b8 d; _5 z1 V" o- U: t( G
        TH0=(65536-45872)/256;1 q8 z+ E1 A. D: N- D
        TL0=(65536-45872)%256;                                                                                                                                          
3 X9 m0 i+ A! j8 P( d( j5 T        EA=1;ET0=1;TR0=1;$ b* t  N7 b% d. N) I2 F5 c
        if(x0==0){delayms(5);if(x0==0)n1=20;}        if(x0==1){delayms(5);if(x0==1)n1=0;}
. w/ H9 i9 Y; g1 R2 Y5 \        if(x1==0){delayms(5);if(x1==0)n2=40;}        if(x1==1){delayms(5);if(x1==1)n2=0;}+ ~* ]2 p; K4 h& _6 i6 U( C( s
        if(x2==0){delayms(5);if(x2==0)n3=60;}        if(x2==1){delayms(5);if(x2==1)n3=0;}( e& ^# C( E; |: Z5 |8 Z
        if(x3==0){delayms(5);if(x3==0)n4=100;}        if(x3==1){delayms(5);if(x3==1)n4=0;}2 e; C! \+ p) |. f5 ~  a( I7 Q
        if(x4==0){delayms(5);if(x4==0)n5=160;}        if(x4==1){delayms(5);if(x4==1)n5=0;}& _: O: N0 N9 h+ _; t' r" S! y* f7 G
        if(x5==0){delayms(5);if(x5==0)n6=200;}if(x5==1){delayms(5);if(x5==1)n6=0;}
/ m' G9 a  `  p        if(x6==0){delayms(5);if(x6==0)n7=300;}if(x6==1){delayms(5);if(x6==1)n7=0;}
) {9 u3 n7 m7 j) n        if(x7==0){delayms(5);if(x7==0)n8=400;}if(x7==1){delayms(5);if(x7==1)n8=0;}7 g  W9 S$ G+ I( G8 m9 A5 C+ Z/ ~
        n=n1+n2+n3+n4+n5+n6+n7+n8+1;
3 W0 i3 L% o$ S, u//        while(!sb||!s4);guanmen();( N* O7 j! j. Y; t
}
+ ]# E+ m% Y) n# R1 M2 N2 z, N
; [; A. Y1 f5 _! b) Q6 _$ v
9 ~+ K/ |1 }* ovoid USART_Init(uint BAUD)//初始化串行口和波特率发生器
, Z# W; t$ u( S+ g{                    % o1 t6 _2 I1 m( y; A% ~
        SCON =0x50;           //选择串口工作方式1,打开接收允许
& W4 E1 z; f0 F: f        TMOD=0x21;           //定时器1工作在方式2,定时器0工作在方式1! S4 [4 o9 j/ l# J3 S9 F) n6 C
    TH1 =TL1 = (256 - (FOSC/12/32/BAUD));   //设置波特率重装值
% P7 h: _; D5 Z1 D        TR1 =1;               //启动定时器T1
- o3 _! B2 T, w, B% Y! c        ES=1;                 //允许串行口中断
! P5 L8 r% D8 n/ g4 M        EA=1; 2 l7 s7 E6 A# F- q$ G
}
6 a" D1 L/ A6 Hvoid kaimen()                                                //开门函数
9 I  k: u  Y6 L% ?{
' \  j4 o& ?7 H        t0=0;  //计时器清零3 n$ q2 i2 L1 y( D' t: U& h
        z0=1;        //打开计时器
5 Q, |% l; \# l( h        kai=1;        //开门
! F7 ]- D) R% u+ E* V2 b# M( T        while(1). S4 k- U0 p! W; e
        {. f) w3 A# B: U
                if(a==3&&z4==0){SBUF=0x3b;while(!TI);SBUF=P0;while(!TI);SBUF=0xe7;while(!TI);a=3;z4=1;}        //正在开门信号发出4 w1 L4 }' H- K
                if(sq1==0){delayms(5);if(sq1==0){kai=z0=t0=0;m=1;break;}}         //开门到位
$ \2 N& E" ^& i) ?8 l' N                if(t0>=300)     //计时保护30秒
# S+ y, t) y: g) b" _                {
- {2 U: t+ ^5 y$ I                        kai=0;guan=0;while(!sq2);while(1)  D: O0 d7 @1 H, S' R" H/ @
                        {
" x* k9 o; h. V. r  H; \  @                                if(sq1==0||sq2==0||t0>3000){delayms(5);if(sq1==0||sq2==0||t0>3000){z0=t0=0;break;}}3 W' s7 }: N- N, N, @
                        }break;
, ^0 ?. n% H/ p0 @. j                }/ Z. ?  P" ~( D* }7 F
        }  m7 I4 e" |, o' O
        z2=1;
5 `( l8 z6 h$ C& s# ~- H+ N3 c( h9 X; }        while(!sb||z2||!s4)7 P7 [; ~. w& k
                {+ m0 S# l  w3 D4 n8 L
                        if(a==3&&z3==0){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);z3=1;}           //开门完成信号发出
8 [) O, {, w" c0 F9 z                        if(a==1){SBUF=0x72;while(!TI);SBUF=P0;while(!TI);SBUF=0x69;while(!TI);a=0;}        //门开到位信号发出# x2 b$ x# {9 u( \* l! m$ {( x  E
                        if(a==2){z3=t3=0;}         //AGV收到开门完成信号
7 x  I& d$ I6 Q% R                        if(t3>50)t3=z3=0;//AGV没有收到开门完成信号 重复发送开门信号  V& ?5 p# {6 W& V9 H: N
                        if(t2>=n)z2=t2=0;//延时关门        " c# F+ @5 q" w  _* j8 a$ |) b# Z
                }3 _" F) R( b; Y1 P$ X
        if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出
! D" h9 J: R( U6 x& O8 u2 g        m=a=0;
) l* K, V9 i1 R; g1 E+ @        guanmen();  E* C2 x5 G7 O: r5 W5 C# ^
} & |5 {2 U3 n* O2 \8 V/ k, d
void guanmen()                                                //关门函数
; e" o) m+ R, t  F{% [* k4 E. h) d2 c9 V# j
        t0=0;z0=1;guan=1;
  ~" k( U3 m9 i0 y        while(1)
4 U1 S/ I# ~  z, s9 V        {
6 i# x. J- x& x8 C: H( p                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出8 x. z- ]1 w  r- x1 u  w6 n& h
                if(sq2==0){delayms(5);if(sq2==0){guan=t0=z0=0;break;}}        //关门到位5 y# i/ m. F9 L) O- `1 q
                if(t0==300)     //计时保护
+ E1 z: [, I5 ?8 ^9 T, @! `. p                {$ h5 R, |. S! X! j3 V
                        kai=0;guan=0;while(!sq1);while(1)
, D6 x+ y( d/ |! p) H# P                        {
7 r) y) `0 i9 o" J+ v5 V3 o$ Q4 ]                                if(t0>=3000){num1++;if(num1==4){while(sq2);num1=0;}t0=z0=0;break;}6 f+ o# t* [0 D( G/ h' x3 o: u
                                if(sq1==0||sq2==0){delayms(5);if(sq1==0||sq2==0){t0=z0=0;break;}}5 W4 Q" v6 K3 y' Z
                        }break;/ O- a7 ?8 R2 q
                }( {4 L' O0 c+ Z, |
                if(sb==0||s4==0){delayms(5);if(sb==0||s4==0){guan=0;delayms(2000);kaimen();}}//开门信号
" ?; T4 N# d. t% K        }
& n* b4 _0 d7 s! {, d/ P}                                                                6 t% V  J$ o& c. x
void main()
% k1 u" p* T# S& d6 o# P; h/ p0 o{
5 o( E, p, x: g4 H3 e- ^* O) m' h        init();
& F) d' D( \: Q        USART_Init(9600);
$ J1 Q1 W) e  L        while(1)
0 D. b, j! V4 Z0 H4 h3 f        {        ! L, P; [3 Z: `* S; @
                if(sb==0){delayms(5);if(sb==0)kaimen();}//感应有人
1 A0 E. c- Y- [" a! {                if(sq2==1){delayms(5);if(sq2==1)guanmen(); }//没关好门% I) w' D7 h! L: x  Y0 c  f7 Z
                if(a==4){SBUF=0x75;while(!TI);SBUF=P0;while(!TI);SBUF=0x36;while(!TI);a=0;}//收到关门信号发出        0 t! ]. b* W0 S+ P
        }         # o3 E( s4 H  `: z2 W/ {& q
}) g2 y% g: v! K
" K1 L) L. E2 Z/ c  l1 ^
void T0_time() interrupt 11 G: m# m& J# D: {
{
. i' @' H: A: A1 p3 s; g& s        TH0=(65536-45872)/256;                   //
* C  p6 t' c+ r0 t8 N9 ^        TL0=(65536-45872)%256;
" X/ V: }2 W7 X6 P& s        if(z0==1) t0++;   //时间继电器0        开关门卡死保护         
3 Y" n1 |8 d+ |        if(z1==1) t1++;   //时间继电器1  收信号间隔清零时间          7 F9 F7 k/ U4 P' s/ T
        if(z2==1) t2++;   //时间继电器2        延时关门         
0 F' `! r7 l- O4 B" O& D9 k        if(z3==1) t3++;   //时间继电器3  发出信号没回应延时再次发送            
( \3 f4 q: @) Z! ^7 Q4 d) K        if(z4==1) t4++;   //时间继电器4              
/ K$ @/ b8 W) U7 A9 r% K1 Y( b/ \- z        if(z5==1) t5++;   //时间继电器5              
2 ?" o6 N, F7 N/ n6 x        if(z6==1) t6++;   //时间继电器6           
9 I/ R0 R1 P& W. t        if(z7==1) t7++;   //时间继电器7           8 c/ V: J2 v: @! `; j% e
        if(z8==1) t8++;   //时间继电器8                $ b  ?' I. N. [( K- e
        if(z9==1) t9++;   //时间继电器9               
2 _* b/ A" Y9 [% _  t        if(z10==1) t10++; //时间继电器100 S+ B% ^( O8 w6 \' Y
        ; z8 a* T. N* B. n: N2 `
        if(t1>=2)z1=t1=bb=0;//间隔超时清零. j0 K/ H- y: w+ p+ ]
//        if(t10==0)guan=0;if(t10==5)guan=1;if(t10>10)t10=guan=0;        
7 |. _" c& d) g$ i# s+ O}& C+ I5 `% t5 Y
1 p) u! `% ~! n( `" K
void USART(void) interrupt 4/ b- ~0 E3 }; c3 e
{" [4 B! H  Q9 X( Y

( n6 A2 v/ D% V! {+ Y$ D. W: {        if(RI)
8 r% c$ B6 y+ h- q3 I- L7 j4 f( I        {        
: ]. M. [+ T% V5 {! q, X                aa[bb]=SBUF;
/ |2 z$ X2 X) b                RI=0;& K0 m' F4 I- t( [2 t1 e) s- g
                bb++;
) L4 j1 B) {* C/ L, ~1 Q1 o                z1=1;1 d) |" o: t1 i7 ]% k1 O
                t1=0;
) \5 F$ E) e! ]3 L                if(bb>=3)
- O7 [9 @! I) M- ?                {' Y4 E! G% z: ?) e, R9 o
                        bb=z1=t1=0;
0 f) a- q4 S5 c7 H5 j' \& e$ c                        if(aa[0]==0x1e&&aa[1]==P0&&aa[2]==0x37)        //开门信号: Y7 p* r. g7 K7 B) ^4 o& G$ M6 S
                        {
: R' K% w$ @! d, J6 [/ V8 j                                sb=0;
3 d! R  d% U/ D& r0 @9 h                                if(m==0){z4=0;a=3;}        //正在开门信号发出; R4 p* G# d0 a* T- u
                                if(m==1){a=1;}        //门开到位信号发出! W* f8 ~) Q* u" M6 ]9 O9 ]8 w
                        }0 X" Y9 }/ h  ^" c. _
                        if(aa[0]==0x37&&aa[1]==P0&&aa[2]==0x6e)          //AGV收到开门信号1 y2 g' O0 f/ K( r0 E& h
                        {% G, f4 [3 D# ~) w5 x
                                sb=0;a=2;3 R! B, z4 A5 G7 _
                        }4 |( k  g- p  ]0 U0 t, v# B9 p
                        if(aa[0]==0x69&&aa[1]==P0&&aa[2]==0x17)         //关门信号; b, b; l! Q0 ?. M# B1 P
                        {( i' y. S$ w. ]8 p, q
                           a=4;//关门信号发出
7 j' o& c9 d0 X                           sb=1;% @5 ~0 e+ ^/ `/ i: \' E
                        }* J  K; Y% ]- H+ M& n- H3 h
                }        
6 \$ c7 O' H1 _5 ~7 t! G; `        }. ?' \7 |5 T+ @2 J8 U
        if(TI)
( u& K, ^' s8 P" r4 F                TI=0;9 R/ Z3 l$ p1 d' w3 ?1 Z
}
$ t0 B* T2 d* K% E

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 09:13 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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