⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51.txt

📁 1. 电梯初始位置在第一层。 2. 算法完全模拟电梯工作。 3. 显示电梯所在层数和运动方向。 4. 按键复用
💻 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 + -