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