电梯控制系统C语言程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DIGI P0 //宏定义,将P1口定义为数码管
#define SELECT P2 //宏定义,将P2定义为数码管选择口
uchar const shuma[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; //数码显示0-9
uchar select[]={0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
uchar i,j,num,aa,befnum,lightnum,dnum,abcd,uplay,a,key,define,loop,lable;
uint circle;

uchar table_up[]={0x06,0x0c,0x09,0x03}; //步进电机上楼
uchar table_down[]={0x03,0x09,0x0c,0x06}; //步进电机下楼
uchar const lightopen[]={0x00,0x18,0x3c,0x7e,0xff};//流水灯指示电梯门打开
uchar const lightclose[]={0x7e,0x3c,0x18,0x00,0x00,0xff,0x00};//流水灯指示电梯门关闭
char code SST516[3] _at_ 0x003b; //仿真器插入函数
//...................................

void delay(uint z) //延时函数
{uint x,y;
for(x=250;x>0;x--)
for(y=z;y>0;y--);
}
//...................................

void display() //数码管显示函数
{ P0=shuma[dnum/10];
P2=select[0];
delay(1);
P0=shuma[dnum%10];
P2=select[1];
delay(1);
}

void delay2(uint cnt) //延时
{
while(--cnt);
}
///................................
void step_up() //步进电机上启动
{for(circle=100;circle>0;circle--)
{
for(abcd=0;abcd<4;abcd++)
{
P1=table_up[abcd];
delay2(500);
}
}
}

void step_down() //步进电机下启动
{for(circle=100;circle>0;circle--)
{
for(abcd=0;abcd<4;abcd++)
{
P1=table_down[abcd];
delay2(500);
}
}
}
///...............................
void guanmen()
{
for(lightnum=0;lightnum<7;lightnum++) //流水灯关闭电梯门
{
P1=lightclose[lightnum];
delay(100);
}
}
///...............................

void kaimen()
{
for(lightnum=0;lightnum<5;lightnum++) //流水灯开门提示
{
P1=lightopen[lightnum];
delay(150);
}
}
///.........................................................

uchar scankey(void) //按键扫描
{
uint h,l,key;
P3=0x0f;
h=P3&0x0f;
while(h!=0x0f)
{
delay(10); //去抖动
while(h!=0x0f)
{
h=P3&0x0f;
P3=h|0xf0;
l=P3&0xf0;
key=l+h;
switch(key)
{
case 0x77:num=1;break;
case 0xb7:num=2;break;
case 0xd7:num=3;break;
case 0xe7:num=1;break;
case 0x7b:num=5;break;
case 0xbb:num=6;break;
cas
e 0xdb:num=3;break;
case 0x7d:num=9;break;
}
return(num);
}
}
}
///.......................................................
void d1

()
{ kaimen();
num=aa;
delay(150);
scankey();
if(num>befnum&num<5)
{ //define=0;
guanmen();
for(a=2;a<num-befnum+1;a++)//步进电机正转
{
TR1=1;
step_up();
TR1=0;
}
}
}
void d2()
{
kaimen();
num=aa;
delay(150);
scankey();
if(num<befnum&num>0)
{
guanmen();
for(a=2;a<befnum+1-num;a++)
{
TR1=1;
step_down();
TR1=0;
}
}
}


void main()
{
befnum=1;
dnum=1;
TMOD |=0x01; //初始化定时器
TH0=(65536-22500)/256;
TL0=(65536-22500)%256;
EA=1;
ET0=1;
TR0=1;
//.............................
TMOD |=0x01;
TH1=(65536-50000)/256;
TL1=(65536-520000)%256;
EA=1;
ET1=1;

while(1)
{
scankey();

if(num==5|num==6)
{
num=2;
}
aa=num;


///////////////////////// 上 楼 ///////////////////////////////////////////////////
if(num>befnum&num<5)
{ //define=0;
guanmen();
for(a=1;a<num-befnum+1;a++)//步进电机正转
{

TR1=1;

step_up();

TR1=0;
loop:scankey();

if(num==9)
{ num=aa;
goto loop;
}

while(num==5&a==2)
{
d1();
befnum=num;
}

}
befnum=num;
delay(10);
kaimen();
}


///////////////////////////////////下 楼///////////////////////////////////////////
if(num<befnum&num>0)

{
guanmen();
for(a=1;a<befnum+1-num;a++)//步进电机反转
{ TR1=1;

step_down();
TR1=0;
lable:scankey();
if(num==9)
{
num=aa;
goto lable;
}
while(num==6&a==befnum-2)
{
d2();
befnum=num;
}
num=aa;
}
befnum=num;
delay2(10);
kaimen();
}
//////////////////////////////////////////////////////////////////////////////////
}
}

void timer0(void) interrupt 1 //定时器0中断
{
TH0=(65536-22500)/256;
TL0=(65536-22500)%256;
display();
}

void timer1() interrupt 3 //定时器1中断
{
T
H1=(65536-25000)/256;
TL1=(65536-25000)%256;
if(num>befnum&num<5) dnum=befnum+a; //上楼
if(num<befnum&num>0) dnum=befnum-a; //下楼
}

相关文档
最新文档