51单片机模拟电梯控制(含完整代码) 您所在的位置:网站首页 电梯控制板图片高清 51单片机模拟电梯控制(含完整代码)

51单片机模拟电梯控制(含完整代码)

2024-07-17 06:41| 来源: 网络整理| 查看: 265

51单片机模拟电梯控制 前言一、普中51-单核-A2开发板二、系统功能三 、预定义四、电梯内按有报警按键,该功能由外部中断功能和蜂鸣器实现五、延时函数-----电梯每上升,下降一层和开门关门的时间,均为2秒;六、按键检测函数七、主函数总结

前言

这篇博客以“普中51-单核-A2开发板”为硬件,制作了一个模拟电梯控制系统;

一、普中51-单核-A2开发板

该开发板的相关电路图可去这个网站下载:普中科技 在这里插入图片描述

二、系统功能 矩阵按键S1 ~ S4分别代表1楼,2楼下,2楼上,3楼的电梯外请求按键;独立按键K1~K3代表电梯内按键,分别代表123楼;+ 数码管显示当前电梯所在楼层,每上升,下降一层,均耗时约2秒K4控制蜂鸣器报警led灯代表电梯门开关状态,led亮就表示开门,灭就表示关门了;先按下矩阵按键,电梯会移动到对应呼叫楼层,然后开门(led亮),2秒后关门;之后等待电梯内按键(独立按键K1~K3),电梯就会移动到目标楼层,开门,2秒后关门;然后重新等待电梯外呼叫(矩阵按键)2楼上呼叫,电梯内按键只有K3(去三楼)有效;2楼下呼叫,电梯内按键只有K1(去一楼)有效; 三 、预定义 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; //定义4个独立按键 sbit k1 = P3^1; sbit k2 = P3^0; sbit k3 = P3^2; sbit k4 = P3^3; sbit beep = P3^4; //开发板上蜂鸣器接的P1^5,但和矩阵按键冲突,这里给他换个引脚 sbit led = P2^0; #define GPIO_DIG P0 //控制数码管显示引脚 #define GPIO_KEY P1 //矩阵按键控制端口 u8 KeyValue;//存储当前矩阵按键的值 u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管显示对应值 四、电梯内按有报警按键,该功能由外部中断功能和蜂鸣器实现 void Int1Init()//开启外部中断1(蜂鸣器报警用) { IT1=1; EX1=1; EA=1; } void Int1() interrupt 2 //外部中断1函数 { delay(1000); if(k4==0) { beep = ~beep;//k4触发蜂鸣器报警,蜂鸣器响/不响 } } 五、延时函数-----电梯每上升,下降一层和开门关门的时间,均为2秒; void delay(u16 i)//延时函数 { while(i--); } void delay_2s()//延时2s { delay(2000000); } 六、按键检测函数 void KeyDown(void)//检测矩阵按键的值,返回给keyvalue { char a=0; GPIO_KEY=0x0f; if(GPIO_KEY!=0x0f) { delay(1000); if(GPIO_KEY!=0x0f) { GPIO_KEY=0X0F; switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } GPIO_KEY=0XF0; switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } } } while((a if(k1==0) { delay(1000); if(k1==0) { while(!k1); return 1; } else return 0; } else if(k2==0) { delay(1000); if(k2==0) { while(!k2); return 2; } else return 0; } else if(k3==0) { delay(1000); if(k3==0) { while(!k3); return 3; } else return 0; } else return 0; } 七、主函数 int main() { char level = 1;//当前楼层 char key = 0;//独立按键 beep = 1;//蜂鸣器 led = 1;//led灯 GPIO_DIG=~smgduan[level];//显示当前楼层 Int1Init();//外部中断1初始化 while(1) { KeyValue = 10;//矩阵按键的值在0~3,这里代表没有按下 key = 0;//独立按键值 while(KeyValue > 4)//如果按下了,矩阵按键值应为0~3,否则等待矩阵按键按下(电梯外呼叫) { KeyDown(); } if(KeyValue == 0)//如果1楼呼叫 { while(level!=1)//去1楼 { level = level - 1; delay_2s(); GPIO_DIG=~smgduan[level]; } led = 0;//开门,2秒后关门 delay_2s(); led = 1; while(!key)//等待电梯内按键按下 { key = keypros(); } if(key == 1)//如果去1楼,什么也不执行,升到对应楼层后的开关门在后面写着 { key = 1; } else if(key == 2)//如果去2楼,升到2楼 { level = 2; delay_2s(); GPIO_DIG=~smgduan[level]; } else //否则就是去3楼,升到3楼 { while(level!= 3) { level = level + 1; delay_2s(); GPIO_DIG=~smgduan[level]; } } } else if(KeyValue == 1)//如果是2楼下呼叫 { if(level != 2)//如果当前不在2楼,电梯去2楼 { level = 2; delay_2s(); GPIO_DIG=~smgduan[level]; } led = 0;//开门,关门 delay_2s(); led = 1; while(key != 1)//如果电梯内不按键去1楼,等待 { key = keypros(); } level = 1;//去1楼 delay_2s(); GPIO_DIG=~smgduan[level]; } else if(KeyValue == 2)//如果是2楼上呼叫 { if(level != 2)//当前电梯不在2楼,就让电梯来二楼 { level = 2; delay_2s(); GPIO_DIG=~smgduan[level]; } led = 0; delay_2s(); led = 1; while(key != 3)//电梯内是否请求去三楼,不是就继续等待 { key = keypros(); } level = 3;//去3楼 delay_2s(); GPIO_DIG=~smgduan[level]; } else if(KeyValue == 3)//是否电梯外3楼呼叫 { while(level != 3)//当前电梯在3楼?不在就升到3楼 { level = level + 1; delay_2s(); GPIO_DIG=~smgduan[level]; } led = 0; delay_2s(); led = 1; while(key == 0)//等待电梯内按键按下 { key = keypros(); } if(key == 3)//去3楼? { key=3; } else if(key == 2)//去2楼? { level = 2; delay_2s(); GPIO_DIG=~smgduan[level]; } else //去1楼? { while(level!= 1) { level = level - 1; delay_2s(); GPIO_DIG=~smgduan[level]; } } } led = 0;//电梯到达目的地,开门延时2秒后,关门 delay_2s(); led = 1; } } 总结

这篇博客以“普中51-单核-A2开发板”为硬件,制作了一个模拟电梯控制系统;



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有