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