电梯模拟控制系统
时间:10-02
整理:3721RD
点击:
#include <REGX51.H>
#include <intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
sbit SH_CP = P3^4; //移位时钟脉冲
sbit DS = P3^5; //串行数据输入
sbit ST_CP = P3^6; //输出锁存器控制脉冲
code INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99};//01234
INT16U myData[4] = {1,2,3,4}; //显示1234
INT16U louceng=0,zhangai=0; //louceng按键请求的楼层
INT16U n,lift=0; //n 为所在楼层 lift存储当前楼层 n lift初始为0
INT8U i,t; //i显示第几位 t显示段码第几个
sbit gaowenled=P3^0;
sbit zhangailed=P3^1;
sbit ledshang=P0^3;
sbit ledxia=P0^4;
sbit k=P1^0;
sbit k1=P1^1; //仿真调试用
sbit k2=P1^2;
sbit L0=P0^0; //开关门LED
sbit L1=P0^1;
sbit L2=P0^2;
void delay();
void Serial_Input_595();
void Parallel_Output_595();
void shanglou();
void xialou();
void int_chushi();
void saomiao();
void main()
{
int_chushi();
while(1)
{
//zhangai=0;
saomiao();
// kai();
// guan();
if((L0==1)&&(L1==1)&&(L2==1)) //关门后才能上下
{
if(louceng>lift)
{
shanglou();
}
else if(louceng<lift)
{
xialou();
}
else
{
gaowenled=1; //不执行上下时,灯灭
zhangailed=1;
}
}
}
}
void delay(INT16U ms)
{
INT8U s;
while(ms--)
for(s=0;s<121;s++);
}
// 1字节数据串行输入595子程序
void Serial_Input_595(INT8U d)
{
INT8U z;
for(z=0;z<8;z++)
{
d=d<<1;
DS=CY;
SH_CP=1;_nop_();
SH_CP=0;_nop_();
}
}
void Parallel_Output_595()
{
ST_CP=0;_nop_();
ST_CP=1;_nop_();
ST_CP=0;_nop_();
}
void saomiao()
{
INT8U key;
P1=0X7F;
key=P1&0X0F;
switch(key)
{
case 14 :louceng=0;t=t;i=i;n=n;break; //1
case 13 :louceng=5;t=t;i=i;n=n;break; //2
case 11 :louceng=10;t=t;i=i;n=n; break; //3
case 7 :louceng=15;t=t;i=i;n=n; break; //4
default :;
}
P1=0XbF;
key=P1&0X0F;
switch(key)
{
case 14 :
if((L0==0)&&(L1==0)&&(L2==0))
{
L0=1;L1=0;L2=0;delay(200);
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=1;L2=1;delay(200);
}
else
{
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=0;L2=0;delay(200);
L0=0;L1=0;L2=0;delay(200);
delay(2000);
L0=1;L1=0;L2=0;delay(200);
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=1;L2=1;delay(200);
}
break; //5 开门
case 13 :
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
if(zhangai==0)
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}break; //6
case 11 :louceng=0; break;
case 7 :louceng=5;break;
default : ;
}
P1=0XdF;
key=P1&0X0F;
switch(key)
{
case 14 :louceng=5;break;
case 13 :louceng=10; break;
case 11 :louceng=10;break;
case 7 :louceng=15;break;
default : ;
}
}
void shanglou() //上楼函数
{
for(n=lift;n<=louceng;n++) //lift 楼层初始值
{
P2=n;
delay(200);
lift=n;
ledshang=0;
ledxia=1;
{L0=1;L1=1;L2=1;}
}
ledshang=1;
ledxia=1;
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
// if(louceng>lift)
if(zhangai==0) //没有障碍时
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}
}
void xialou() //下楼函数
{
for(n=lift;n>=louceng;n--)
{
P2=n;
delay(200);
lift=n;
ledshang=1;
ledxia=0;
if(n==0)
{L0=1;L1=1;L2=1;n=n+1;break;} //n=0 一直执行向下。
}
ledshang=1;
ledxia=1;
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
if(zhangai==0)
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}
}
void int_chushi()
{
EA=1;
TMOD=0X11;
ET0=1;
TR1=1;
ET1=1;
EX0=1;
EX1=1;
TR1=0;
TR0=1;
P2=0X00;
}
void zhangai2() interrupt 0 // 高温报警函数
{
zhangailed=0;
zhangai=1;
}
void gaowen1() interrupt 2 //障碍报警函数
{
gaowenled=0;
if(louceng>=lift)
{
if((P2<5)&&(louceng>=5))louceng=5;
if((P2<10)&&(louceng>=10))louceng=10;
if((P2<=15)&&(louceng>=15))louceng=15;
for(n=lift;n<=louceng;n++) //lift 楼层初始值
{
P2=n;
delay(200);
lift=n;
ledshang=0;
ledxia=1;
}
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
ledshang=1;
ledxia=1;
}
else
{
if((P2>15)&&(louceng<=15))louceng=15;
if((P2>10)&&(louceng<=10))louceng=10;
if((P2>5)&&(louceng<=5))louceng=5;
for(n=lift;n>=louceng;n--)
{
P2=n;
delay(200);
lift=n;
ledshang=1;
ledxia=0;
if(n==0)
{
L0=1;L1=1;L2=1;n=n+1;
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
break;
} //n=0 一直执行向下。
}
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
ledshang=1;
ledxia=1;
}
while(n=lift)break;
}
void temp() interrupt 1 //显示函数
{
if(P2==1)i=0;
if(P2==5)i=1;
if(P2==10)i=2;
if(P2==15)i=3;
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
delay(10);
}
这是我编的程序来的,但是为什么没有起到优先的作用呢,比如你上4楼的过程中突然有人按2楼的按键时,应该到了4楼后会回到二楼才对的,但我我的程序就是不得的,只能是按下哪个按键就到哪层楼而已,所起求各位大神帮改正来,拜托了。
搜索
#include <intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
sbit SH_CP = P3^4; //移位时钟脉冲
sbit DS = P3^5; //串行数据输入
sbit ST_CP = P3^6; //输出锁存器控制脉冲
code INT8U SEG_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99};//01234
INT16U myData[4] = {1,2,3,4}; //显示1234
INT16U louceng=0,zhangai=0; //louceng按键请求的楼层
INT16U n,lift=0; //n 为所在楼层 lift存储当前楼层 n lift初始为0
INT8U i,t; //i显示第几位 t显示段码第几个
sbit gaowenled=P3^0;
sbit zhangailed=P3^1;
sbit ledshang=P0^3;
sbit ledxia=P0^4;
sbit k=P1^0;
sbit k1=P1^1; //仿真调试用
sbit k2=P1^2;
sbit L0=P0^0; //开关门LED
sbit L1=P0^1;
sbit L2=P0^2;
void delay();
void Serial_Input_595();
void Parallel_Output_595();
void shanglou();
void xialou();
void int_chushi();
void saomiao();
void main()
{
int_chushi();
while(1)
{
//zhangai=0;
saomiao();
// kai();
// guan();
if((L0==1)&&(L1==1)&&(L2==1)) //关门后才能上下
{
if(louceng>lift)
{
shanglou();
}
else if(louceng<lift)
{
xialou();
}
else
{
gaowenled=1; //不执行上下时,灯灭
zhangailed=1;
}
}
}
}
void delay(INT16U ms)
{
INT8U s;
while(ms--)
for(s=0;s<121;s++);
}
// 1字节数据串行输入595子程序
void Serial_Input_595(INT8U d)
{
INT8U z;
for(z=0;z<8;z++)
{
d=d<<1;
DS=CY;
SH_CP=1;_nop_();
SH_CP=0;_nop_();
}
}
void Parallel_Output_595()
{
ST_CP=0;_nop_();
ST_CP=1;_nop_();
ST_CP=0;_nop_();
}
void saomiao()
{
INT8U key;
P1=0X7F;
key=P1&0X0F;
switch(key)
{
case 14 :louceng=0;t=t;i=i;n=n;break; //1
case 13 :louceng=5;t=t;i=i;n=n;break; //2
case 11 :louceng=10;t=t;i=i;n=n; break; //3
case 7 :louceng=15;t=t;i=i;n=n; break; //4
default :;
}
P1=0XbF;
key=P1&0X0F;
switch(key)
{
case 14 :
if((L0==0)&&(L1==0)&&(L2==0))
{
L0=1;L1=0;L2=0;delay(200);
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=1;L2=1;delay(200);
}
else
{
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=0;L2=0;delay(200);
L0=0;L1=0;L2=0;delay(200);
delay(2000);
L0=1;L1=0;L2=0;delay(200);
L0=1;L1=1;L2=0;delay(200);
L0=1;L1=1;L2=1;delay(200);
}
break; //5 开门
case 13 :
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
if(zhangai==0)
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}break; //6
case 11 :louceng=0; break;
case 7 :louceng=5;break;
default : ;
}
P1=0XdF;
key=P1&0X0F;
switch(key)
{
case 14 :louceng=5;break;
case 13 :louceng=10; break;
case 11 :louceng=10;break;
case 7 :louceng=15;break;
default : ;
}
}
void shanglou() //上楼函数
{
for(n=lift;n<=louceng;n++) //lift 楼层初始值
{
P2=n;
delay(200);
lift=n;
ledshang=0;
ledxia=1;
{L0=1;L1=1;L2=1;}
}
ledshang=1;
ledxia=1;
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
// if(louceng>lift)
if(zhangai==0) //没有障碍时
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}
}
void xialou() //下楼函数
{
for(n=lift;n>=louceng;n--)
{
P2=n;
delay(200);
lift=n;
ledshang=1;
ledxia=0;
if(n==0)
{L0=1;L1=1;L2=1;n=n+1;break;} //n=0 一直执行向下。
}
ledshang=1;
ledxia=1;
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=0;L2=0;}delay(200);
{L0=0;L1=0;L2=0;}delay(200);
if(zhangai==0)
{ delay(2000);
{L0=1;L1=0;L2=0;}delay(200);
{L0=1;L1=1;L2=0;}delay(200);
{L0=1;L1=1;L2=1;}delay(200);
}
}
void int_chushi()
{
EA=1;
TMOD=0X11;
ET0=1;
TR1=1;
ET1=1;
EX0=1;
EX1=1;
TR1=0;
TR0=1;
P2=0X00;
}
void zhangai2() interrupt 0 // 高温报警函数
{
zhangailed=0;
zhangai=1;
}
void gaowen1() interrupt 2 //障碍报警函数
{
gaowenled=0;
if(louceng>=lift)
{
if((P2<5)&&(louceng>=5))louceng=5;
if((P2<10)&&(louceng>=10))louceng=10;
if((P2<=15)&&(louceng>=15))louceng=15;
for(n=lift;n<=louceng;n++) //lift 楼层初始值
{
P2=n;
delay(200);
lift=n;
ledshang=0;
ledxia=1;
}
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
ledshang=1;
ledxia=1;
}
else
{
if((P2>15)&&(louceng<=15))louceng=15;
if((P2>10)&&(louceng<=10))louceng=10;
if((P2>5)&&(louceng<=5))louceng=5;
for(n=lift;n>=louceng;n--)
{
P2=n;
delay(200);
lift=n;
ledshang=1;
ledxia=0;
if(n==0)
{
L0=1;L1=1;L2=1;n=n+1;
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
break;
} //n=0 一直执行向下。
}
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
ledshang=1;
ledxia=1;
}
while(n=lift)break;
}
void temp() interrupt 1 //显示函数
{
if(P2==1)i=0;
if(P2==5)i=1;
if(P2==10)i=2;
if(P2==15)i=3;
t=SEG_CODE[myData];
Serial_Input_595(t);
Parallel_Output_595();
delay(10);
}
这是我编的程序来的,但是为什么没有起到优先的作用呢,比如你上4楼的过程中突然有人按2楼的按键时,应该到了4楼后会回到二楼才对的,但我我的程序就是不得的,只能是按下哪个按键就到哪层楼而已,所起求各位大神帮改正来,拜托了。
搜索
复制
666666666666
还没看明白
各位大神请尽快回复啊!等着用啊!
什么都有。有点意思。
你会不会啊?会的话就告诉我可以吗?
看明白了没有啊?我等着用啊。现在都还没有解决啊!
怎么没有人会吗?
