完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
前言
这篇以“普中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个独立按键 ***it k1 = P3^1; ***it k2 = P3^0; ***it k3 = P3^2; ***it k4 = P3^3; ***it beep = P1^5; ***it 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《50)&&(GPIO_KEY!=0xf0)) { delay(100); a++; } } int keypros(void)//检测独立按键的值,返回0代表没按按键,1代表按下了key1.。。。。 { 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开发板”为硬件,制作了一个模拟电梯控制系统。 |
|
|
|
只有小组成员才能发言,加入小组>>
2565 浏览 0 评论
762浏览 1评论
521浏览 0评论
275浏览 0评论
456浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 11:16 , Processed in 1.582156 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号