⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m20.c

📁 一份翼闸的单片机控制代码
💻 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 + -