#include<reg52.h> //包含頭文件,一般情況不需要改動, //頭文件包含特殊功能寄存器的定義 sbit SCL=P2^0; sbit SDA=P2^1; sbit led=P2^2; sbit led1=P1^5; sbit tz=P2^3; //停止按鈕 sbit lc1=P2^4; //一層樓按鈕 sbit lc2=P2^5; //二層樓按鈕 sbit lc3=P2^6; //三層樓按鈕 sbit lc4=P2^7; //四層樓按鈕 sbit mb=P0^0; //門保險傳感器處理 sbit dw1=P0^1; //一層樓到位處理 sbit dw2x=P0^2; //一層樓到位處理 sbit dw2s=P0^3; //一層樓到位處理 sbit dw3x=P0^4; //一層樓到位處理 sbit dw3s=P0^5; //一層樓到位處理 sbit dw4=P0^6; //一層樓到位處理 sbit jd1=P3^5; // 停止總電源常閉繼電器 sbit jd2=P3^6; //上升繼電器 sbit jd3=P3^7; //下降繼電器 bit fg,fg1,fg2; //位處理 bit sb,jb; // 上升標志位 下降標志位 bit dw2,dw3; //二樓 三樓到位標志 bit lch12; // 1-2樓層之間標志 bit lch23; // 2-3樓層之間標志 bit lch34; // 3-4樓層之間標志 unsigned char num,num1,num2; unsigned char jylc; // 記憶層號變量 void Delay(unsigned int t); //函數聲明 void Init_Timer0(void); /*------------------------------------------------ 主函數 ------------------------------------------------*/ void main (void) { char i,a; char lch,lch1; // 樓層號變量 ,lch1 用在數碼管掃描時只掃描一次 SDA=0; lch=2; fg=1; Delay(60); if(dw1==0) { lch=1;fg=1;lc1=1; } if(dw2x==0||dw2s==0) { lch=2;fg=1;lc2=1;} if(dw3x==0||dw3s==0) { lch=3;fg=1;lc3=1;} if(dw4==0) { lch=4;fg=1;lc4=1; } Init_Timer0(); //定時器初始化 while (1) //主循環 { if(lc1==1&&lc2==1&&lc3==1&&lc4==1) a=1; if(lc1==0&&a==1&&dw1!=0) //樓層選擇 { a=0;jylc=1;lc1=0; } if(lc2==0&&a==1&&dw2!=0) { a=0;jylc=2;lc2=0; } if(lc3==0&&a==1&&dw3!=0) { a=0;jylc=3;lc3=0; } if(lc4==0&&a==1&&dw4!=0) { a=0;jylc=4;lc4=0; } if(tz==0||mb==1) //停止按鈕按下 { lc1=1;lc2=1;lc3=1;lc4=1; //樓層按鈕復位 jylc=0; //記憶樓層復位 if(lch12==0&&lch23==0&&lch34==0&&(sb==1||jb==1)) { fg1=1; if(lch==1&&sb==1) lch12=1; if(lch==2&&sb==1) lch23=1; if(lch==2&&jb==1) lch12=1; if(lch==3&&sb==1) lch34=1; if(lch==3&&jb==1) lch23=1; if(lch==4&&jb==1) lch34=1; } jd2=1;jd3=1; // 繼電器停止通電 電梯停止 } if(dw1==0&&jb==1) { lch=1;fg=1;lc1=1; } if((dw2x==0&&jb==1)||(sb==1&&dw2s==0)) { lch=2;fg=1;lc2=1;dw2=0; } else dw2=1; if((dw3x==0&&jb==1)||(sb==1&&dw3s==0)) { lch=3;fg=1;lc3=1;dw3=0; } else dw3=1; if(dw4==0&&sb==1) { lch=4;fg=1;lc4=1; } if(dw1==0||dw2==0||dw3==0||dw4==0) { fg1=0;lch12=0;lch23=0;lch34=0; } if(jylc!=0) { if(jylc>lch && fg1==0) { jd2=0;jd3=1; sb=1;jb=0; led=0; } //電梯上升 if(jylc<lch && fg1==0) { jd3=0;jd2=1; sb=0;jb=1; led=1;} //電梯下降 if(jylc==lch && fg1==0) { jd2=1;jd3=1; sb=0;jb=0;lc1=1;lc2=1;lc3=1;lc4=1; } //電梯停止 if(lch12==1) { if(jylc==1) { jd3=0;jd2=1; sb=0;jb=1; led=1; } //電梯下降 if(jylc>=2) { jd2=0;jd3=1; sb=1;jb=0; led=0; } //電梯上升 } if(lch23==1) { if(jylc<=2) { jd3=0;jd2=1; sb=0;jb=1; led=1; } //電梯下降 if(jylc>=3) { jd2=0;jd3=1; sb=1;jb=0; led=0; } //電梯上升 } if(lch34==1) { if(jylc<=3) { jd3=0;jd2=1; sb=0;jb=1; led=1; } //電梯下降 if(jylc>=4) { jd2=0;jd3=1; sb=1;jb=0; led=0; } //電梯上升 } } if(lch!=lch1||fg2==1) { fg2=0; switch(lch) { case 1: { for(i=0;i<8;i++) { SCL=0; Delay(1); if(i==0||i==7) SDA=1; else SDA=0; SCL=1; Delay(1); } } break; case 2: { for(i=0;i<8;i++) { SCL=0; Delay(1); if(i==2||i==7) SDA=0; else SDA=1; SCL=1; Delay(1); } } break; case 3: { for(i=0;i<8;i++) { SCL=0; Delay(1); if(i==2||i==4) SDA=0; else SDA=1; SCL=1; Delay(1); } } break; case 4: { for(i=0;i<8;i++) { SCL=0; Delay(1); if(i==1||i==5||i==4) SDA=0; else SDA=1; SCL=1; Delay(1); } } break; } lch1=lch; } } } /*------------------------------------------------ 延時函數,含有輸入參數 unsigned int t,無返回值 unsigned int 是定義無符號整形變量,其值的范圍是 0~65535 ------------------------------------------------*/ void Delay(unsigned int t) { while(--t); } /*------------------------------------------------ 定時器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 //TH0=0x00; //給定初值 //TL0=0x00; EA=1; //總中斷打開 ET0=1; //定時器中斷打開 TR0=1; //定時器開關打開 } /*------------------------------------------------ 定時器中斷子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { TH0=(65536-5000)/256; //重新賦值 5ms TL0=(65536-5000)%256; num++; if(num<20) { led1=0; if(jd2==1&&jd3==1&&mb==0) led=0; } else { led1=1; if(jd2==1&&jd3==1&&mb==0) led=1; } if(mb==1) { if(num%10==0) led=~led; if(num==200) led=1; } if(num==200) { num=0; num2++; if(num2==60) { num2=0;fg2=1; } if(tz==0) // 長按停止鍵 關閉總電源 num1++; else num1=0; if(num1>2) jd1=0; } }