|
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=0xff 2M1=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 ~
|
|