#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; } }