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