找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7086|回复: 15
收起左侧

单片机8层电梯程序分享(支持修改任意最大楼层)仿真+源程序

  [复制链接]
ID:142059 发表于 2018-7-7 00:32 | 显示全部楼层 |阅读模式
本帖最后由 Angle145 于 2020-1-25 21:28 编辑

修改最大楼层方法,在程序中,#define MaxFloor   8    把8改成想要的楼层数就可以了,支持1-8层,其他不用修改。

按照现实的电梯运行设计,两个版本,一个是用定时器产生定时,定时用来模拟电梯上下楼,别一版本是需要外部的信号来触发,就是现实中的限位器或者传感器,用来传感是否到达某个楼层。理论上每个楼层都要安装一个传感器,电梯经过时就可以知道是否到达楼层了。

仿真文件请使用Proteus8.6及以上版本打开。
源程序用Keil5打开。

//在此声明,代码全部属于原创,没有任何一条是复制粘贴,请尊重个人劳动成果
//在此分享出来仅供大家学习参考使用,请务必禁止用于其他用途

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

直流电机+光耦隔离

直流电机+光耦隔离


单片机源程序:


  1. /*******************电梯主程序**********************/
  2. #include "reg51.h"
  3. #include "intrins.h"

  4. /******************移植部分代码*************************/
  5. sbit DOOR=P3^5;
  6. sbit DlevMotor_P=P3^6; //电梯电机正极
  7. sbit DlevMotor_N=P3^7; //电梯电机负极
  8. #define SEGPort    P0
  9. #define KeyPort_X  P1
  10. #define KeyPort_Y  P2
  11. /******************************************************/


  12. #define u8  unsigned char
  13. #define u16 unsigned int
  14.         
  15. #define MaxFloor   8

  16. #define FloorStayTime 40        //单位:50ms
  17. #define DoorStayTime  2   //单位:S

  18. #define TRUE  1
  19. #define FALSE 0

  20. #define Null  0  
  21. #define STOP  1
  22. #define UP    2
  23. #define DOWN  3
  24. #define Dlev_UP    DlevMotor_P=0;DlevMotor_N=1  //低电平有效
  25. #define Dlev_DOWN  DlevMotor_P=1;DlevMotor_N=0  //低电平有效
  26. #define Dlev_STOP  DlevMotor_P=1;DlevMotor_N=1  //低电平有效

  27. #define OPEN  1  
  28. #define CLOSE 0
  29. #define DOOR_Open  DOOR=OPEN
  30. #define DOOR_Close DOOR=CLOSE


  31. typedef struct
  32. {
  33.         u8 DlevRunning;
  34.   u8 CurrentFloor;
  35.         u8 Direction;
  36.         u8 FloorCallTable[MaxFloor+1];//数组[0]不用,从[1]开始使用
  37.         u8 FloorTimerCount;        
  38.         u8 ArriveFlag;      //到达楼层信号(用于停止或在前一楼层提前加减速)(此版本是定时器模拟,用不到)
  39.         u8 FreeFlag;        
  40. }TYPEDEF_DLEVSTATE;
  41. TYPEDEF_DLEVSTATE DlevState;


  42. u8 code SEG_NUM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f};   //SEG数码管段码  0~9
  43. u8 Timer_Second;
  44. u16 TimerCount;
  45. u8 RICount=0;
  46. u8 RIOver_Flag=0;
  47. u8 ExternKey[2]={0}; //外部按键按下信息
  48. u8 FloorCallTableBUFF[MaxFloor+10]={0};
  49. u8 KeyPressFlag=0;

  50. void delay_ms(u16 xms);
  51. void delay_s(u8 xs);
  52. void EXTI0_Init(void);
  53. void Timer0_Init(void);
  54. void USART_Configure(u16 BaudRate);
  55. u8 KeyScan(void);
  56. void KeyDatHandle(u8 key);
  57. void WaitDoorOpen(u8 ts);
  58. void WaitDoorClose(u8 ts);
  59. void SEG_Display(u8 segnum);
  60. void DlevWorkState(u8 state);
  61. void Elevator(void);
  62. u8 FloorCall_UP(u8 floorside);
  63. u8 FloorCall_DOWN(u8 floorside);
  64. void FLOORCALLCHECK(void);
  65. void SYSYEM_INIT(void);


  66. void main(void)
  67. {
  68.         SYSYEM_INIT();
  69.         EXTI0_Init();
  70.         EXTI1_Init();
  71.         Timer0_Init();
  72.         USART_Configure(9600);
  73.   while(1)
  74.         {
  75.                  KeyPort_Y=0x00;
  76.                  FLOORCALLCHECK();
  77.            Elevator();   
  78.         }
  79. }

  80. void EXTI1_IRQHandler(void) interrupt 2    //矩阵按键中断
  81. {
  82.    KeyDatHandle(KeyScan());
  83. }

  84. void TIM0_IRQHandler(void)  interrupt 1    //定时模拟电梯上升和下降
  85. {
  86.    TH0=(65536-50000)/256;
  87.          TL0=(65536-50000)%256;
  88.         
  89.          TimerCount++;
  90.          if(TimerCount==20)  //1秒
  91.          {
  92.                  TimerCount=0;
  93.                  Timer_Second++;
  94.          }         
  95.          DlevState.FloorTimerCount++;
  96. }
复制代码
0.png 0.png

全部资料51hei下载地址:
8层电梯(双版本).zip (250.59 KB, 下载次数: 236)

评分

参与人数 2黑币 +62 收起 理由
找人PK + 12
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:149783 发表于 2018-7-7 17:32 | 显示全部楼层
谢谢你的分享,下载,下来慢慢学习。
回复

使用道具 举报

ID:437186 发表于 2018-12-13 20:55 | 显示全部楼层
想好好看下  学习哈
回复

使用道具 举报

ID:437186 发表于 2018-12-15 21:15 | 显示全部楼层
打不开怎么回事啊
回复

使用道具 举报

ID:142059 发表于 2019-1-16 02:54 来自手机 | 显示全部楼层
老王头8 发表于 2018-12-15 21:15
打不开怎么回事啊

你的keil版本太低,安装keil5
回复

使用道具 举报

ID:471889 发表于 2019-2-4 06:16 | 显示全部楼层
不错,学习了
回复

使用道具 举报

ID:479667 发表于 2019-2-24 11:20 | 显示全部楼层
proteus为什么打不开
回复

使用道具 举报

ID:142059 发表于 2019-3-1 21:40 来自手机 | 显示全部楼层
dpo 发表于 2019-2-24 11:20
proteus为什么打不开

需要proteus8.6及以上版本
回复

使用道具 举报

ID:273674 发表于 2019-3-18 14:12 | 显示全部楼层
LZ我想问下 如果是2部电梯的话 该怎么弄呢
回复

使用道具 举报

ID:142059 发表于 2019-3-18 21:43 | 显示全部楼层
李海林 发表于 2019-3-18 14:12
LZ我想问下 如果是2部电梯的话 该怎么弄呢

需要通过通讯来达到协调或者独立运行
回复

使用道具 举报

ID:475808 发表于 2019-3-19 08:41 | 显示全部楼层
很棒!收藏了!
回复

使用道具 举报

ID:657980 发表于 2019-12-10 19:01 | 显示全部楼层
有问题想请教,可以私聊吗
回复

使用道具 举报

ID:787940 发表于 2020-6-23 18:55 | 显示全部楼层
大佬 你这个仿真的时候,数码管不起作用?我按下7楼,数码管显示一直不变。。
回复

使用道具 举报

ID:788184 发表于 2020-6-23 22:08 | 显示全部楼层
感谢分享,学习了
回复

使用道具 举报

ID:301242 发表于 2021-5-23 16:24 | 显示全部楼层
请问楼主,传感器是用什么类型的呢?比如是压力?还是光电?c语言编写控制都一样的吗?
回复

使用道具 举报

ID:142059 发表于 2021-5-27 15:34 | 显示全部楼层
易木残阳 发表于 2021-5-23 16:24
请问楼主,传感器是用什么类型的呢?比如是压力?还是光电?c语言编写控制都一样的吗?

传感器光电开关效果最好,都一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表