📄 c51.txt
字号:
源程序:
#include <reg51.h>
unsigned char LED[11] = {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF}; //显示码
unsigned char KEYFLAG; //按键标志位
unsigned char LIFTPOSITION = 1; //电梯当前位置
unsigned char LiftState = 3 ; //1向上,2向下,3关门等待
unsigned char LiftDisplayState = 3;
unsigned char REQUESTSEQENCE = 0; //请求标记
unsigned char SERVERSEQUENCE[6] = {0,0,0,0,0,0}; //服务序列
unsigned char DISPLAYSERVERSEQUENCE[6] = {0,0,0,0,0,0}; // 用于显示的。
unsigned char DoorCount = 4; //门开关效果计时计数
unsigned char DoorState = 0; //0:停止,1:正开门,2:正关门
unsigned char DoorCurrState = 1;//门状态,1:关闭 0:开启
unsigned char DoorDOT = 4;
unsigned char MoveCount = 20; //电梯移动计时计数
unsigned char CloseDoorDelyCount = 101; //电梯关门计时计数,如果太旧没人按,就会自动关闭电梯门
sbit P1_4 = P1^4;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P3_6 = P3^6;
char KeyScan();
void delay(int time);
void DisplayLED(unsigned char num);//,unsigned char location);
void DisplayDOT(unsigned char num);
void DisplayLiftState();
void DisplayLiftSever();
char KeyNum(unsigned char num);
void time();
void DisplayRequestSeqence();
void OpenDoor();
void CloseDoor();
void Request();
void Server();
unsigned char ScanRequestServer(unsigned char LIFTPOSITION);
void ClearREQUESTSEQENCE(unsigned char pos);
char Have(); //如果有请求或需要服务,返回真。否则返回假
void main()
{
TMOD = 0x01;
TH0 = 0x0F;
TL0 = 0xFF;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
DisplayLED(LIFTPOSITION); //显示电梯所在位置
DisplayDOT(DoorDOT); //显示电梯门
DisplayRequestSeqence(); //显示请求
DisplayLiftState();
DisplayLiftSever();
if(DoorState || !DoorCurrState)
{
LiftDisplayState = 0;
}
else
{
LiftDisplayState = LiftState;
}
ScanRequestServer(LIFTPOSITION);
//按钮事件
if(KeyScan())
{
if(DoorCurrState)
{
Request(); //门关闭状态,输入的是请求
}
else
{
Server(); //电梯是停止状态,门已经打开,按按钮是要求到那一层
if(KeyNum(7))
{
OpenDoor();
}
if(KeyNum(8))
{
CloseDoor();
}
}
}
}
}
char KeyScan()
{
char i;
unsigned char KeyOut;
P2 = P3 = P1 = P0 = 0xFF;
KEYFLAG = 0x00;
KeyOut = 0xFE;
for(i = 1; i < 9; i++)
{
P0 = KeyOut;
if(P1_0 == 1)
{
KEYFLAG |= ~KeyOut;
}
P0 = 0xFF;
KeyOut = KeyOut<<1;
KeyOut += 1;
}
return KEYFLAG;
}
void delay(int time)
{
int i;
for(i = 0; i < time ;i++);
}
void DisplayLED(unsigned char num)
{
P2 = P3 = P1 = P0 = 0xFF;
P0 = LED[num];
P1_4 = 0;
delay(20);
}
void DisplayLiftState()
{
P2 = P3 = P1 = P0 = 0xFF;
if(LiftDisplayState == 1)
{
P0 = 0xDC;
}
else if(LiftDisplayState == 2)
{
P0 = 0xE3;
}
else
{
P0 = 0xBF;
}
P3_6 = 0;
delay(20);
}
void DisplayLiftSever()
{
unsigned char i,mask = 0xFF;
P2 = P3 = P1 = P0 = 0xFF;
for(i = 5; i > 0; i--)
{
mask <<= 1;
if(!DISPLAYSERVERSEQUENCE[i])
{
mask |= 0x01;
}
}
P0 = mask;
P1_2 = 0;
delay(20);
}
void DisplayDOT(unsigned char num)
{
if(num > 4)
{
return ;
}
P2 = P3 = P1 = P0 = 0xFF;
if(num == 1)
{
P0 = 0x7E;
}
else if(num == 2)
{
P0 = 0x5C;
}
else if(num == 3)
{
P0 = 0x18;
}
else if(num == 4)
{
P0 = 0x0;
}
else
{
P0 = 0xFF;
}
P2 = 0x0;
delay(20);
}
void DisplayRequestSeqence()
{
P2 = P3 = P1 = P0 = 0xFF;
P0 = ~REQUESTSEQENCE;
P1_1 = 0;
delay(20);
}
void time() interrupt 1 using 1
{
TH0 = 0x0F;
TL0 = 0xFF;
//处理门开关效果的时间触发
if(DoorCount < 4)
{
if(DoorCount == 0)
{
if(DoorState == 1)
{
MoveCount = 22;
if(DoorDOT == 0) //门已经开
{
DoorState = 0;
DoorCount = 4;
DoorCurrState = 0;
CloseDoorDelyCount = 100;
}
else
{
DoorDOT--;
}
}
else if(DoorState == 2)
{
MoveCount = 22;
if(DoorDOT == 4) //门已经关上
{
DoorState = 0;
DoorCount = 4;
DoorCurrState = 1;
MoveCount = 20;
}
else
{
DoorDOT++;
}
}
DoorCount = 3;
}
else
{
DoorCount--;
}
}
//处理电梯移动时间触发
if(MoveCount < 21)
{
if(MoveCount == 0)
{
LIFTPOSITION = ScanRequestServer(LIFTPOSITION);
MoveCount = 20;
}
else
{
MoveCount--;
}
}
//电梯自动关门计数
if(CloseDoorDelyCount < 101)
{
if(CloseDoorDelyCount == 0)
{
if(Have())
{
CloseDoor();
}
CloseDoorDelyCount = 101;
}
else
{
CloseDoorDelyCount--;
}
}
}
char KeyNum(unsigned char num)
{
char i;
unsigned char KeyFlag = 0x01;
for(i = 1; i < num; i++)
{
KeyFlag = KeyFlag<<1;
}
return KeyFlag & KEYFLAG;
}
void OpenDoor()
{
DoorState = 1;
DoorCount = 3;
}
void CloseDoor()
{
DoorState = 2;
DoorCount = 3;
}
void Request()
{
REQUESTSEQENCE |= KEYFLAG;
if(LiftState == 3)
{
if(REQUESTSEQENCE & 0x01)
{
SERVERSEQUENCE[1] = 1;
}
if(REQUESTSEQENCE & 0x06)
{
SERVERSEQUENCE[2] = 1;
}
if(REQUESTSEQENCE & 0x18)
{
SERVERSEQUENCE[3] = 1;
}
if(REQUESTSEQENCE & 0x60)
{
SERVERSEQUENCE[4] = 1;
}
if(REQUESTSEQENCE & 0x80)
{
SERVERSEQUENCE[5] = 1;
}
}
else if(LiftState == 1)
{
if(REQUESTSEQENCE & 0x01)
{
SERVERSEQUENCE[1] = 1;
}
if(REQUESTSEQENCE & 0x04)
{
SERVERSEQUENCE[2] = 1;
}
if(REQUESTSEQENCE & 0x10)
{
SERVERSEQUENCE[3] = 1;
}
if(REQUESTSEQENCE & 0x40)
{
SERVERSEQUENCE[4] = 1;
}
}
else if(LiftState == 2)
{
if(REQUESTSEQENCE & 0x02)
{
SERVERSEQUENCE[2] = 1;
}
if(REQUESTSEQENCE & 0x08)
{
SERVERSEQUENCE[3] = 1;
}
if(REQUESTSEQENCE & 0x20)
{
SERVERSEQUENCE[4] = 1;
}
if(REQUESTSEQENCE & 0x80)
{
SERVERSEQUENCE[5] = 1;
}
}
}
void Server()
{
unsigned char i,test = 0x01,flag = KEYFLAG & 0x1F;
for(i = 1; i < 9; i++)
{
if((test & flag) && (LIFTPOSITION != i))
{
SERVERSEQUENCE[i] = 1;
DISPLAYSERVERSEQUENCE[i] = 1;
}
test <<= 1;
}
}
unsigned char ScanRequestServer(unsigned char LIFTPOSITION)
{
char i,haverequest = 0, havefined = 0;
if(LiftState == 3)
{
for(i = 1; i < 6; i++)
{
if(SERVERSEQUENCE[i])
{
if(i > LIFTPOSITION)
{
LiftState = 1;
LIFTPOSITION++;
}
else if(i < LIFTPOSITION)
{
LiftState = 2;
LIFTPOSITION--;
}
else
{
OpenDoor();
SERVERSEQUENCE[i] = DISPLAYSERVERSEQUENCE[i] = 0;
if(i == 1)
{
ClearREQUESTSEQENCE(1);
}
else if(i == 5)
{
ClearREQUESTSEQENCE(8);
}
else
{
ClearREQUESTSEQENCE((i * 2) - 1);
ClearREQUESTSEQENCE((i * 2) - 2);
}
}
haverequest = 1;
break;
}
}
}
else if(LiftState == 1)
{
for(i = LIFTPOSITION; i < 6; i++)
{
if(SERVERSEQUENCE[i])
{
if(i > LIFTPOSITION)
{
LIFTPOSITION++;
}
else
{
LiftDisplayState = 0;
OpenDoor();
SERVERSEQUENCE[i] = DISPLAYSERVERSEQUENCE[i] = 0;
if(i == 1)
{
ClearREQUESTSEQENCE(1);
}
else if(i == 5)
{
ClearREQUESTSEQENCE(8);
}
else
{
ClearREQUESTSEQENCE((i * 2) - 1);
ClearREQUESTSEQENCE((i * 2) - 2);
}
}
havefined = 1;
haverequest = 1;
break;
}
}
if(!havefined)
{
for(i = LIFTPOSITION - 1; i > 0; i--)
{
if(SERVERSEQUENCE[i])
{
if(i < LIFTPOSITION)
{
LiftState = 2;
LIFTPOSITION--;
}
haverequest = 1;
break;
}
}
}
}
else if(LiftState == 2)
{
for(i = LIFTPOSITION; i > 0; i--)
{
if(SERVERSEQUENCE[i])
{
if(i < LIFTPOSITION)
{
LIFTPOSITION--;
}
else
{
LiftDisplayState = 0;
OpenDoor();
SERVERSEQUENCE[i] = DISPLAYSERVERSEQUENCE[i] = 0;
if(i == 1)
{
ClearREQUESTSEQENCE(1);
}
else if(i == 5)
{
ClearREQUESTSEQENCE(8);
}
else
{
ClearREQUESTSEQENCE((i * 2) - 1);
ClearREQUESTSEQENCE((i * 2) - 2);
}
}
havefined = 1;
haverequest = 1;
break;
}
}
if(!havefined)
{
for(i = LIFTPOSITION; i < 6; i++)
{
if(SERVERSEQUENCE[i])
{
if(i > LIFTPOSITION)
{
LiftState = 1;
LIFTPOSITION++;
}
haverequest = 1;
break;
}
}
}
}
if(!haverequest && DoorCurrState)
{
LiftState = 3;
Request();
}
return LIFTPOSITION;
}
void ClearREQUESTSEQENCE(unsigned char pos)
{
unsigned char i,mask = 0x01;
for(i = 1; i < pos; i++)
{
mask <<= 1;
}
REQUESTSEQENCE &= ~mask;
}
char Have()
{
unsigned char i;
for(i = 1; i < 6; i++)
{
if(SERVERSEQUENCE[i])
{
return 1;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -