📄 m20.c
字号:
#include<reg8252.h>
#define baud 9600
#define OSC_FREQ 11059200L
#define EVLT_MS 65536L-OSC_FREQ/12L/140
#define H_MS EVLT_MS>>8
#define L_MS EVLT_MS
#define T0_evaluate() TH0=H_MS;TL0=L_MS;
#define EVLT_T1 65536L-OSC_FREQ/12L/20
#define H_T1 EVLT_T1>>8
#define L_T1 EVLT_T1
#define T1_evaluate() TH1=H_T1;TL1=L_T1;
#define EVLT_frequency 65536L-OSC_FREQ/32L/baud
#define H_FREQ EVLT_frequency>>8
#define L_FREQ EVLT_frequency
#define enactment 1200 //1200*50ms=60s
#define closedelay 20 //20*50ms=1000ms
#define alarmdelay 100 //100*50ms=5s
#define memorylimit 5
#define directA 0
#define directB 1
#define opencode 0x80
#define closecode 0x81
#define motoraddr1 0xa6
#define motoraddr2 0xa7
#define ledaddrA 0xc8
#define ledaddrB 0xc9
#define XX 0x99 //10011001
#define XV 0x96 //10010110
#define VX 0x69 //01101001
sbit zero1=P1^0;
sbit zero2=P1^1;
sbit open_io=P1^2;
//sbit being2=P1^3;
sbit openinA=P3^2;
sbit openinB=P3^3;
sbit dog=P3^5;
sbit c485=P3^6;
sbit alarm=P3^7;
unsigned char bdata port0;
sbit red0=port0^0;
sbit red1=port0^1;
sbit red2=port0^2;
sbit red3=port0^3;
sbit red4=port0^4;
sbit red5=port0^5;
sbit red6=port0^6;
sbit red7=port0^7;
unsigned char data come,sbufbak,recno,peoplenumber;
unsigned char data checkkeycount1,checkkeycount2,checkredcount0,checkredcount1,checkredcount2,checkredcount3,checkzerocount1,checkzerocount2;
bit isup1,isup2,openAflag,openBflag,havelight0,red0flag,havelight1,red1flag,havelight2,red2flag,havelight3,red3flag,working,direct;
bit zeroup1,zeroup2,zero1flag,zero2flag,needclose,inalarmbitA,inalarmbitB;
unsigned int data closetimecount,alarmcount,peoplecountA,peoplecountB,cleartime;
unsigned char xdata eep[0x7ff];
void disB (unsigned int pcountbak) {
unsigned char n1,n2,n3,n4,ns5;
n1=pcountbak/1000;
pcountbak-=n1*1000;
n2=pcountbak/100;
pcountbak-=n2*100;
n3=pcountbak/10;
n4=pcountbak%10;
ns5=n1+n2+n3+n4;
c485=1;
SBUF=ledaddrB;
while (!TI) {}
TI=0;
SBUF=ledaddrB;
while (!TI) {}
TI=0;
SBUF=n1+0x30;
while (!TI) {}
TI=0;
SBUF=n2+0x30;
while (!TI) {}
TI=0;
SBUF=n3+0x30;
while (!TI) {}
TI=0;
SBUF=n4+0x30;
while (!TI) {}
TI=0;
SBUF=ns5;
while (!TI) {}
TI=0;
c485=0;
}
void disA (unsigned int pcountbak) {
unsigned char n1,n2,n3,n4,ns5;
n1=pcountbak/1000;
pcountbak-=n1*1000;
n2=pcountbak/100;
pcountbak-=n2*100;
n3=pcountbak/10;
n4=pcountbak%10;
ns5=n1+n2+n3+n4;
c485=1;
SBUF=ledaddrA;
while (!TI) {}
TI=0;
SBUF=ledaddrA;
while (!TI) {}
TI=0;
SBUF=n1+0x30;
while (!TI) {}
TI=0;
SBUF=n2+0x30;
while (!TI) {}
TI=0;
SBUF=n3+0x30;
while (!TI) {}
TI=0;
SBUF=n4+0x30;
while (!TI) {}
TI=0;
SBUF=ns5;
while (!TI) {}
TI=0;
c485=0;
}
void close(void) {
open_io=0;
needclose=0;
c485=1;
SBUF=motoraddr1;
while (!TI) {}
TI=0;
SBUF=motoraddr1;
while (!TI) {}
TI=0;
SBUF=closecode;
while (!TI) {}
TI=0;
SBUF=~closecode;
while (!TI) {}
TI=0;
c485=0;
}
void open (void) {
open_io=1;
needclose=0;
c485=1;
SBUF=motoraddr1;
while (!TI) {}
TI=0;
SBUF=motoraddr1;
while (!TI) {}
TI=0;
SBUF=opencode;
while (!TI) {}
TI=0;
SBUF=~opencode;
while (!TI) {}
TI=0;
c485=0;
}
void timer0(void) interrupt 1 {
TR0=0;
T0_evaluate()
TR0=1;
port0=P0;
/*
if (havelight0==1) {if (red0==0) {checkredcount0=0;}
else {checkredcount0++;
if (checkredcount0>10) {red0flag=1;havelight0=0;checkredcount0=0;}
}
}
else {if (red0==1) {checkredcount0=0;}
else {checkredcount0++;
if (checkredcount0>10) {havelight0=1;checkredcount0=0;}
}
}
*/
if (havelight1==1) {if (red1==0) {checkredcount1=0;}
else {checkredcount1++;
if (checkredcount1>10) {red1flag=1;havelight1=0;checkredcount1=0;}
}
}
else {if (red1==1) {checkredcount1=0;}
else {checkredcount1++;
if (checkredcount1>10) {havelight1=1;checkredcount1=0;}
}
}
if (havelight2==1) {if (red2==0) {checkredcount2=0;}
else {checkredcount2++;
if (checkredcount2>10) {red2flag=1;havelight2=0;checkredcount2=0;}
}
}
else {if (red2==1) {checkredcount2=0;}
else {checkredcount2++;
if (checkredcount2>10) {havelight2=1;checkredcount2=0;}
}
}
/*
if (havelight3==1) {if (red3==0) {checkredcount3=0;}
else {checkredcount3++;
if (checkredcount3>10) {red3flag=1;havelight3=0;checkredcount3=0;}
}
}
else {if (red3==1) {checkredcount3=0;}
else {checkredcount3++;
if (checkredcount3>10) {havelight3=1;checkredcount3=0;}
}
}
*/
if (isup1==1) {if (openinA==1) {checkkeycount1=0;}
else {checkkeycount1++;
if (checkkeycount1>20) {openAflag=1;isup1=0;checkkeycount1=0;}
}
}
else {if (openinA==0) {checkkeycount1=0;}
else {checkkeycount1++;
if (checkkeycount1>10) {isup1=1;checkkeycount1=0;}
}
}
if (isup2==1) {if (openinB==1) {checkkeycount2=0;}
else {checkkeycount2++;
if (checkkeycount2>20) {openBflag=1;isup2=0;checkkeycount2=0;}
}
}
else {if (openinB==0) {checkkeycount2=0;}
else {checkkeycount2++;
if (checkkeycount2>10) {isup2=1;checkkeycount2=0;}
}
}
if (zeroup1==1) {if (zero1==1) {checkzerocount1=0;}
else {checkzerocount1++;
if (checkzerocount1>20) {zero1flag=1;zeroup1=0;checkzerocount1=0;}
}
}
else {if (zero1==0) {checkzerocount1=0;}
else {checkzerocount1++;
if (checkzerocount1>10) {zeroup1=1;checkzerocount1=0;}
}
}
if (zeroup2==1) {if (zero2==1) {checkzerocount2=0;}
else {checkzerocount2++;
if (checkzerocount2>20) {zero2flag=1;zeroup2=0;checkzerocount2=0;}
}
}
else {if (zero2==0) {checkzerocount2=0;}
else {checkzerocount2++;
if (checkzerocount2>10) {zeroup2=1;checkzerocount2=0;}
}
}
}
void timer1(void) interrupt 3 {
T1_evaluate()
if (needclose) {if (closetimecount>closedelay) {
port0=P0;
if ((red1==0)&&(red2==0)) close();
else alarmcount=alarmdelay;
}
else closetimecount++;
}
if (alarmcount!=0) {alarm=1;alarmcount--;}
else alarm=0;
if (cleartime!=0) {cleartime--;
if (cleartime==0) {needclose=1;
closetimecount=closedelay+2;
working=0;
alarmcount=2;
peoplenumber=0;
}
}
}
void receve23(void) interrupt 4{}
void delay (void) {
unsigned int jj;
for (jj=0;jj<20000;jj++) {}
dog=0;
for (jj=0;jj<20000;jj++) {}
dog=1;
}
bit firstcheck (void) {
unsigned char xx;
port0=P0;
while (red1||red2) {alarm=1;port0=P0;dog=!dog;}
delay();
alarm=0;
for (xx=20;xx>0;xx--) delay(); //4s
alarm=1;
delay();
port0=P0;
while (red1||red2) {alarm=1;port0=P0;dog=!dog;}
close();
alarm=0;
for (xx=10;xx>0;xx--) delay(); //2s
return 0;
}
void main(void)
{
unsigned char cram;
c485=0;
alarm=0;
TMOD=0x11;
SCON=0x50;
RCLK=1;
TCLK=1;
TH2=H_FREQ;
TL2=L_FREQ;
RCAP2H=H_FREQ;
RCAP2L=L_FREQ;
ET2=0;
TR2=1;
ES=0; //不中断
EA=1;
if (firstcheck()) alarmcount=alarmdelay; //现在只有简单的测试功能
ES=0; //不中断
ET0=1;
TR0=1;
ET1=1;
TR1=1;
WMCON|=0x08; //仅可读
if ((eep[10]==0xaa)&&(eep[11]==0x55)) {peoplecountA=eep[20];peoplecountA<<=8;peoplecountA|=eep[21];
peoplecountB=eep[30];peoplecountB<<=8;peoplecountB|=eep[31];
}
else {WMCON|=0x18; //可读写
eep[10]=0xaa;
while ((WMCON&2)==0) {}
eep[11]=0x55;
while ((WMCON&2)==0) {}
eep[20]=0;
while ((WMCON&2)==0) {}
eep[21]=0;
while ((WMCON&2)==0) {}
eep[30]=0;
while ((WMCON&2)==0) {}
eep[31]=0;
while ((WMCON&2)==0) {}
peoplecountA=0;
peoplecountB=0;
}
WMCON&=0xe7;
disA(peoplecountA);
disB(peoplecountB);
WMCON|=0xe1;
working=0; //各段人全部出后才清零,然后方向才无效
while(1) {
dog=!dog;
WMCON|=0x02;
if (openAflag) {openAflag=0;
if (working==0) {EA=0;
cleartime=enactment;
needclose=0;
working=1;
direct=directA;
peoplenumber=1;
EA=1;
open();
}
else {if (direct==directA) {if (peoplenumber<memorylimit) {peoplenumber++;
cleartime=enactment;
open();
}
else cleartime=enactment;
}
}
}
if (openBflag) {openBflag=0;
if (working==0) {EA=0;
cleartime=enactment;
needclose=0;
working=1;
direct=directB;
peoplenumber=1;
EA=1;
open();
}
else {if (direct==directB) {if (peoplenumber<memorylimit) {peoplenumber++;
cleartime=enactment;
open();
}
else cleartime=enactment;
}
}
}
if (red2flag) {red2flag=0;
if (working==1) {if (direct==directA) {if (peoplenumber!=0) peoplenumber--;
if (peoplenumber==0) {closetimecount=0;
needclose=1;
cleartime=0;
working=0;
}
disA(++peoplecountA);
WMCON|=0x18; //可读写
eep[20]=peoplecountA>>8;
while ((WMCON&2)==0) {}
eep[21]=peoplecountA;
while ((WMCON&2)==0) {}
WMCON&=0xe7; //不可读写
}
if (direct==directB) {}
}
else alarmcount=alarmdelay;
}
if (red1flag) {red1flag=0;
if (working==1) {if (direct==directB) {if (peoplenumber!=0) peoplenumber--;
if (peoplenumber==0) {closetimecount=0;
needclose=1;
cleartime=0;
working=0;
}
disB(++peoplecountB);
WMCON|=0x18; //可读写
eep[30]=peoplecountB>>8;
while ((WMCON&2)==0) {}
eep[31]=peoplecountB;
while ((WMCON&2)==0) {}
WMCON&=0xe7; //不可读写
}
if (direct==directA) {}
}
else alarmcount=alarmdelay;
}
if (working==0) P2=XX;
else {if (direct==directA) P2=XV;
else P2=VX;
}
if (!zero1) {for (cram=200;cram>0;cram--) {}
if ((!zero1)&&(peoplecountA!=0)) {WMCON|=0x18; //可读写
eep[20]=0;
while ((WMCON&2)==0) {}
eep[21]=0;
while ((WMCON&2)==0) {}
peoplecountA=0;
WMCON&=0xe7; //不可读写
disA(peoplecountA);
}
}
if (!zero2) {for (cram=200;cram>0;cram--) {}
if ((!zero2)&&(peoplecountB!=0)) {WMCON|=0x18; //可读写
eep[30]=0;
while ((WMCON&2)==0) {}
eep[31]=0;
while ((WMCON&2)==0) {}
peoplecountB=0;
WMCON&=0xe7; //不可读写
disB(peoplecountB);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -