单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2436|回复: 130
打印 上一主题 下一主题
收起左侧

单片机16层可剪裁电梯源码+Proteus仿真设计(实物已通过)

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 Angle145 于 2019-3-15 09:42 编辑

楼层数可选,硬件可删除。16层内任意设置最大楼层数,用不到的楼层硬件可以删除,不影响程序。提供串口通讯,波特率可在main初使化里设置。更新了详细注释版本,需要学习的朋友请关注银穗之家回复:16层电梯源码。即可下获取详细注释版。

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




/*Uart串口发送函数示例:
1.USART_SendByte(u8 dat) //发送单字节数据
  例:USART_SendByte(0x04);

2.USART_Send(u8* arr,u16 len) //发送多字节数据
  例:
  Usart.TX_BUFF[0]=0xA1;
  Usart.TX_BUFF[1]=0x08;
  Usart.TX_BUFF[2]=0x04;
  Usart.TX_BUFF[3]=0xF9;
  USART_SendByte(Usart.TX_BUFF,4);
  或
  u8 Arr[16]={0xA1,0x08,0x04,0xF9};
  USART_SendByte(Arr,4);

3.USART_SendStr(u8* str) //发送字符串数据
  USART_SendStr("大吉在利,晚上吃鸡!\r\n");

4.有关电梯通信代码参考:
<1>发送电梯当前楼层给其他设备:     USART_SendByte(ElevState.CurrentFloor);
<2>发送电梯当前运行方向给其他设备: USART_SendByte(ElevState.Direction);
<3>发送电梯当前所有数据给其他设备: USART_Send((u8*)(&ElevState),sizeof(ElevState));

*/

单片机源程序如下:
  1. /*************************电梯主程序*****************************/

  2. #include "reg51.h"
  3. #include "intrins.h"

  4. /*********************程序选择****************************/
  5. #define USE_MODE 0   //0-定时模拟  1-传感器
  6. /****************************************************************/
  7. /*********************平台移植部分代码****************************/
  8. //定时器模拟版接口:
  9. #if (USE_MODE==0)
  10. sbit DOOR=P3^5;        //电梯门开关控制信号
  11. sbit ElevMotor_P=P3^6; //电梯电机正极控制信号
  12. sbit ElevMotor_N=P3^7; //电梯电机负极控制信号
  13. sbit SHCP=P0^5;        //74HC595  LED、数码管显示驱动
  14. sbit DS=P0^6;          //74HC595  LED、数码管显示驱动
  15. sbit STCP=P0^7;        //74HC595  LED、数码管显示驱动
  16. #define KeyPort_X  P1  //矩阵按键接口
  17. #define KeyPort_Y  P2  //矩阵按键接口
  18. #endif
  19. //除以上定义的IO外,还需用到P33作为矩阵键盘的中断触发引脚
  20. //8路与门可用芯片:CD4068或74LS30(芯片是与非门)+出端接一个三极管反向电平。


  21. //传感器版接口:
  22. #if (USE_MODE==1)
  23. sbit DOOR_CLOSE_SENSOR=P3^4;//电梯门关闭检测传感器输入
  24. sbit DOOR=P3^5;        //电梯门开关控制信号
  25. sbit ElevMotor_P=P3^6; //电梯电机正极控制信号
  26. sbit ElevMotor_N=P3^7; //电梯电机负极控制信号
  27. sbit SHCP=P0^5;        //74HC595  LED、数码管显示驱动
  28. sbit DS=P0^6;          //74HC595  LED、数码管显示驱动
  29. sbit STCP=P0^7;        //74HC595  LED、数码管显示驱动
  30. #define KeyPort_X  P1  //矩阵按键接口
  31. #define KeyPort_Y  P2  //矩阵按键接口
  32. #endif
  33. //除以上定义的IO外,还需用到P33作为矩阵键盘的中断触发引脚
  34. //需用到P32作为楼层限位开关触发中断引脚
  35. //每个楼层一个限位开关,接在N路输入的与门芯片上
  36. //如果大于8层,可用两个8路输入的与门芯片+一个2路的与门芯片组合
  37. //8路与门:用8路与非门CD4068或74LS30+输出端接一个三极管反向电平。
  38. /****************************************************************/
  39. /***********************楼梯参数设置*****************************/
  40. #define MaxFloor      16  //电梯总楼层(最大16)

  41. #define FloorStayTime 40 //单位:50ms, 楼层停留时间:40*50ms=2S
  42. #define DoorStayTime  2  //单位:S   , 电梯门停留时间
  43. #define SEG_Num       2  //数码管数量(为1时请删除第一个数码管的595)
  44. /****************************************************************/
  45. #define u8  unsigned char
  46. #define u16 unsigned int
  47.         
  48. #define TRUE  1
  49. #define FALSE 0

  50. #define Null  0  
  51. #define STOP  1
  52. #define UP    2
  53. #define DOWN  3

  54. #define UP_IN     0x01
  55. #define UP_OUT    0x02
  56. #define DOWN_IN   0x04
  57. #define DOWN_OUT  0x08

  58. #define Elev_UP    ElevMotor_P=0;ElevMotor_N=1  //低电平有效
  59. #define Elev_DOWN  ElevMotor_P=1;ElevMotor_N=0  //低电平有效
  60. #define Elev_STOP  ElevMotor_P=1;ElevMotor_N=1  //低电平有效

  61. #define OPEN  1  
  62. #define CLOSE 0
  63. #define DOOR_Open  DOOR=OPEN
  64. #define DOOR_Close DOOR=CLOSE

  65. #define SHCP_H SHCP=1
  66. #define SHCP_L SHCP=0
  67. #define DS_H   DS=1
  68. #define DS_L   DS=0
  69. #define STCP_H STCP=1
  70. #define STCP_L STCP=0

  71. #if MaxFloor>8  
  72. #define MHC595_NUM 8
  73. #else
  74. #define MHC595_NUM 5
  75. #endif

  76. #define SEGPort 0x01
  77. #define LED_IN_Port 0x02
  78. #define LED_OUT_UP_Port 0x03
  79. #define LED_OUT_DOWN_Port 0x04

  80. typedef struct
  81. {
  82.         u8 ElevRunning;      //电梯运行状态标志
  83.   u8 CurrentFloor;     //当前电梯所处楼层
  84.         u8 Direction;        //电梯运行方向
  85.         u8 FloorCallTable[MaxFloor+1];//数组[0]不用,从[1]开始使用 ,呼叫列表(所有楼层呼叫的信息均保存于此)
  86.         u8 FloorTimerCount;         //计时
  87.         u8 ArriveFlag;       //到达楼层信号(用于停止或在前一楼层提前加减速)(定时器模拟的用不到)
  88.         u8 FreeFlag;               //电梯空闲状态标志
  89. }TYPEDEF_ELEVSTATE;
  90. TYPEDEF_ELEVSTATE ElevState; //电梯状态结构体

  91. //u8 code SEG_NUM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,0x7f,0x6f};   //共阴SEG数码管段码  0~9
  92. u8 code SEG_NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳SEG数码管段码  0~F
  93. u16 code LED_NUM[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};   //SEG数码管段码  0~9

  94. u8 HC595_BUFF[MHC595_NUM]={0};
  95. u8 Timer_Second;
  96. u16 TimerCount;

  97. u8 RIOver_Flag=0;
  98. u8 ExternKey[2]={0}; //外部按键按下信息
  99. u8 FloorCallTableBUFF[MaxFloor+10]={0};
  100. u8 KeyPressFlag=0;

  101. #define USART_RX_LEN 20  //接收缓存长度(请勿超过芯片rom剩余大小)
  102. typedef struct
  103. {
  104.   u8 RX_BUFF[USART_RX_LEN]; //接收缓存
  105.         u8 TX_BUFF[USART_RX_LEN]; //发送缓存
  106.         u16 RX_COUNT;
  107. }USART;
  108. USART Usart;

  109. void delay_ms(u16 xms);
  110. void delay_s(u8 xs);
  111. void EXTI0_Init(void);
  112. void Timer0_Init(void);
  113. void USART_Configure(u16 BaudRate);
  114. void HC595_Send(u8 *p);
  115. u8 KeyScan(void);
  116. void KeyDatHandle(u8 key);
  117. void WaitDoorOpen(u8 ts);
  118. void WaitDoorClose(u8 ts);
  119. void SEG_Display(u8 segnum);
  120. void LED_ON(u8 addr,u8 lednum);
  121. void LED_OFF(u8 addr,u8 lednum);
  122. void DlevWorkState(u8 state);
  123. void Elevator(void);
  124. u8 FloorCall_UP(u8 floorside);
  125. u8 FloorCall_DOWN(u8 floorside);
  126. u8 DelNullCheck(void);
  127. void FloorCallCheck(void);
  128. void USART_SendByte(u8 dat);
  129. void USART_Send(u8* arr,u16 len);
  130. void USART_SendStr(u8* str);
  131. void SYSYEM_INIT(void);

  132. void delay_ms(u16 xms)
  133. {
  134.         u8 i;
  135.         u16 t;
  136.   for(t=xms;t>0;t--)
  137.           for(i=112;i>0;i--);
  138. }

  139. void delay_s(u8 xs)
  140. {
  141.    TimerCount=0;
  142.          Timer_Second=0;
  143.    while(Timer_Second<xs);        
  144. }

  145. void EXTI0_Init(void)
  146. {
  147.   EA = 1;  
  148.         IT0= 1; //下降沿触发
  149.         EX0= 1;
  150. }

  151. void EXTI1_Init(void)
  152. {
  153.   EA = 1;  
  154.         IT1= 1; //下降沿触发
  155.         EX1= 1;
  156. }

  157. ……………………

  158. …………限于本文篇幅 余下代码请从51黑下载附件…………
  159.         else
  160.         if(((key>0)&&(key<=8))||((key>32)&&(key<=40))) //楼梯内的楼层选择按键(使用第1行和第5行作为电梯内部16个按键,每行8个键)
  161.         {
  162.                 if(key>32) tempkey=key-32+8;
  163.                 else       tempkey=key;
  164.                 if(tempkey<=MaxFloor)
  165.                 {
  166.                         LED_ON(LED_IN_Port,tempkey);
  167.                         if(((tempkey>ElevState.CurrentFloor)&&(tempkey<MaxFloor))||(tempkey==1)) ElevState.FloorCallTable[tempkey]|=UP_IN;//内部按1只能往上
  168.                         else
  169.                         if((tempkey<ElevState.CurrentFloor)||(tempkey==MaxFloor)) ElevState.FloorCallTable[tempkey]|=DOWN_IN;        
  170.                 }
  171.         }
  172.         else
  173.         if(((key>9)&&(key<=16))||((key>40)&&(key<=48)))  //每个楼层门口外的向下按键(底楼按向下无效),第2行和第6行
  174.         {
  175.                  if(key>40) tempkey=key-40+8;
  176.                  else       tempkey=key-8;
  177.                  if((tempkey>1)&&(tempkey<=MaxFloor))
  178.                  {
  179.                          LED_ON(LED_OUT_DOWN_Port,tempkey);
  180.                    ElevState.FloorCallTable[tempkey]|=DOWN_OUT;
  181.                  }
  182.         }
  183.         else
  184.         if(((key>16)&&(key<=24))||((key>48)&&(key<56))) //每个楼层门口外的向上按键(顶楼按向上无效),第2行和第7行
  185.         {
  186.                  if(key>48) tempkey=key-48+8;
  187.                  else       tempkey=key-16;
  188.                  if(tempkey<MaxFloor)
  189.                  {
  190.                          LED_ON(LED_OUT_UP_Port,tempkey);
  191.                          ElevState.FloorCallTable[tempkey]|=UP_OUT;
  192.                  }
  193.         }
  194.         else
  195.         if(key==25)  //开门
  196.         {
  197.                 if(ElevState.ElevRunning==FALSE)
  198.                 {
  199.                   if(DOOR==CLOSE) DOOR_Open;
  200.                 }
  201.         }
  202.         else
  203.         if(key==26) //关门
  204.         {
  205.                 if(DOOR==OPEN)
  206.                 {
  207.                         DOOR_Close;
  208.                         ElevState.FloorTimerCount=0;         //计时器清0
  209.                 }
  210.         }
  211. }

  212. void WaitDoorOpen(u8 ts)
  213. {
  214.         DOOR_Open;
  215.         delay_s(ts);
  216. }

  217. void WaitDoorClose(u8 ts)
  218. {
  219.         DOOR_Close;
  220.         #if (USE_MODE==0)
  221.         delay_s(ts);
  222.         #endif
  223.         #if (USE_MODE==1)
  224.         ts=ts; //防止警告
  225.         while(DOOR_CLOSE_SENSOR==OPEN);
  226.         #endif
  227.         
  228. }

  229. void SEG_Display(u8 segnum)
  230. {
  231.         HC595_BUFF[0]=SEG_NUM[segnum/10];
  232.         HC595_BUFF[1]=SEG_NUM[segnum%10];
  233.         HC595_Send(HC595_BUFF);        
  234. }
  235. void LED_ON(u8 addr,u8 lednum)
  236. {
  237.         switch(addr)
  238.         {
  239.                 case LED_IN_Port:        if(lednum<9)   HC595_BUFF[2]|=LED_NUM[lednum];
  240.                                    else           HC595_BUFF[5]|=LED_NUM[lednum-8]; break;
  241.                 case LED_OUT_DOWN_Port:  if(lednum<9)   HC595_BUFF[3]|=LED_NUM[lednum];
  242.                                                                                          else           HC595_BUFF[6]|=LED_NUM[lednum-8]; break;
  243.                 case LED_OUT_UP_Port:    if(lednum<9)   HC595_BUFF[4]|=LED_NUM[lednum];
  244.                                                                                          else           HC595_BUFF[7]|=LED_NUM[lednum-8]; break;
  245.         }
  246.         HC595_Send(HC595_BUFF);        
  247. }
  248. void LED_OFF(u8 addr,u8 lednum)
  249. {
  250.         switch(addr)
  251.         {
  252.                 case LED_IN_Port:        if(lednum<9)  HC595_BUFF[2]&=~LED_NUM[lednum];
  253.                                    else          HC595_BUFF[5]&=~LED_NUM[lednum-8]; break;
  254.                 case LED_OUT_DOWN_Port:  if(lednum<9)  HC595_BUFF[3]&=~LED_NUM[lednum];
  255.                                                                                          else          HC595_BUFF[6]&=~LED_NUM[lednum-8]; break;
  256.                 case LED_OUT_UP_Port:    if(lednum<9)  HC595_BUFF[4]&=~LED_NUM[lednum];
  257.                                                                                          else          HC595_BUFF[7]&=~LED_NUM[lednum-8]; break;
  258.         }
  259.         HC595_Send(HC595_BUFF);        
  260. }

  261. void ElevWorkState(u8 state)
  262. {
  263.   if(state==UP)
  264.         {
  265.                 Elev_UP;
  266.                 ElevState.ElevRunning=TRUE;
  267.         }
  268.         else
  269.         if(state==DOWN)
  270.         {
  271.                 Elev_DOWN;
  272.                 ElevState.ElevRunning=TRUE;
  273.         }
  274.         else
  275.         if(state==STOP)
  276.         {
  277.                 Elev_STOP;
  278.                 ElevState.ElevRunning=FALSE;
  279.         }
  280.         SEG_Display(ElevState.CurrentFloor);                //数码管显示
  281. }

  282. void TurnHead_Check(void)
  283. {
  284.         if(ElevState.CurrentFloor==1)  
  285.         {
  286.                 ElevState.Direction=UP;  //1楼调头
  287.         }
  288.         else if(ElevState.CurrentFloor==MaxFloor)
  289.         {
  290.                 ElevState.Direction=DOWN; //顶楼调头
  291.         }
  292. }
  293. void Elevator(void)
  294. {
  295.         if((DOOR==OPEN)||(ElevState.FreeFlag==TRUE)) ElevWorkState(STOP);        
  296.   else   ElevWorkState(ElevState.Direction);        
  297.         TurnHead_Check();
  298.         if(ElevState.Direction==UP)  //电梯正在向上运行的情况
  299.         {
  300.                 if(ElevState.CurrentFloor<=MaxFloor)  //扫描呼叫列表中的向上方向的呼叫楼层
  301.                 {
  302.                          if(((ElevState.FloorCallTable[ElevState.CurrentFloor]&UP_IN)==UP_IN)||((ElevState.FloorCallTable[ElevState.CurrentFloor]&UP_OUT)==UP_OUT)) //到达目标楼层,停下开门5秒
  303.                          {
  304.                                  LED_OFF(LED_IN_Port,ElevState.CurrentFloor);
  305.                                  LED_OFF(LED_OUT_UP_Port,ElevState.CurrentFloor);
  306.                                  ElevState.FloorCallTable[ElevState.CurrentFloor]&=~UP_IN; //到达相应的楼层从向上列表中清除        
  307.          ElevState.FloorCallTable[ElevState.CurrentFloor]&=~UP_OUT; //到达相应的楼层从向上列表中清除                                         
  308.                                  ElevState.FreeFlag=TRUE; //到达楼层,暂时进入空闲状态                                 
  309.                                  ElevWorkState(STOP);     //修改电梯状态为停止态
  310.                            WaitDoorOpen(DoorStayTime);    //延时等待电梯门打开
  311.                                  delay_s(2*DoorStayTime);       //适当延时
  312.                                  WaitDoorClose(DoorStayTime);   //等待门关好
  313.                                  ElevWorkState(ElevState.Direction);
  314.                                  ElevState.FreeFlag=FALSE; //离开楼层,退出空闲状态
  315.                                  ElevState.FloorTimerCount=0;         //计时器清0
  316.                          }                 
  317.                 }               
  318.         }
  319.         else
  320.         if(ElevState.Direction==DOWN)  //电梯正在向下运行的情况
  321.         {
  322.                 if(ElevState.CurrentFloor>=1)  //扫描呼叫列表中的向下方向的呼叫楼层
  323.                 {
  324.                          if(((ElevState.FloorCallTable[ElevState.CurrentFloor]&DOWN_IN)==DOWN_IN)||((ElevState.FloorCallTable[ElevState.CurrentFloor]&DOWN_OUT)==DOWN_OUT)) //到达楼层,停下开门5秒
  325.                          {        
  326.                                  LED_OFF(LED_IN_Port,ElevState.CurrentFloor);
  327.                                  LED_OFF(LED_OUT_DOWN_Port,ElevState.CurrentFloor);
  328.          ElevState.FloorCallTable[ElevState.CurrentFloor]&=~DOWN_IN; //到达相应的楼层从向下列表中清除        
  329.                                  ElevState.FloorCallTable[ElevState.CurrentFloor]&=~DOWN_OUT; //到达相应的楼层从向下列表中清除        
  330.                                  ElevState.FreeFlag=TRUE; //到达楼层,暂时进入空闲状态                 
  331.                                  ElevWorkState(STOP);     //修改电梯状态为停止态
  332.                            WaitDoorOpen(DoorStayTime);    //延时等待电梯门打开
  333.                                  delay_s(2*DoorStayTime);       //保持门开2秒让人进出
  334.                                  WaitDoorClose(DoorStayTime);   //适当延时
  335.                                  ElevWorkState(ElevState.Direction);   //等待门关好
  336.                                  ElevState.FreeFlag=FALSE; //离开楼层,退出空闲状态
  337.                                  ElevState.FloorTimerCount=0;         //计时器清0
  338.                          }                        
  339.                 }               
  340.         }

  341. }  

  342. u8 FloorCall_UP(u8 floorside) // floorside  =  DOWN在楼下  UP在楼上
  343. {
  344.          u8 i;

  345.          if(floorside==UP)
  346.          {
  347.                  for(i=ElevState.CurrentFloor+1;i<=MaxFloor;i++) //扫描呼叫列表楼上是否有要向上的呼叫
  348.                  {
  349.                          if(((ElevState.FloorCallTable[i]&UP_IN)==UP_IN)||((ElevState.FloorCallTable[i]&UP_OUT)==UP_OUT)) //如果扫描到上方楼层有向上的呼叫
  350.                          {
  351.                                  return TRUE;
  352.                          }
  353.                  }
  354.                  return FALSE;
  355.          }
  356.          else
  357.          if(floorside==DOWN)
  358.          {
  359.                  for(i=ElevState.CurrentFloor-1;i>=1;i--) //扫描呼叫列表楼下是否有要向上的呼叫
  360.                  {
  361.                          if(((ElevState.FloorCallTable[i]&UP_IN)==UP_IN)||((ElevState.FloorCallTable[i]&UP_OUT)==UP_OUT)) //如果扫描到上方楼层有向上的呼叫
  362.                          {
  363.                                  return TRUE;
  364.                          }
  365.                  }
  366.                  return FALSE;
  367.          }
  368.          else return FALSE;
  369. }

  370. u8 FloorCall_DOWN(u8 floorside) // floorside  =  DOWN在楼下  UP在楼上
  371. {
  372.          u8 i;

  373.          if(floorside==UP)
  374.          {
  375.                  for(i=ElevState.CurrentFloor+1;i<=MaxFloor;i++) //扫描呼叫列表楼上是否有要向下的呼叫
  376.                  {
  377.                          if(((ElevState.FloorCallTable[i]&DOWN_IN)==DOWN_IN)||((ElevState.FloorCallTable[i]&DOWN_OUT)==DOWN_OUT)) //如果扫描到上方楼层有向下的呼叫
  378.                          {
  379.                                  return TRUE;
  380.                          }
  381.                  }
  382.                  return FALSE;
  383.          }
  384.          else
  385.          if(floorside==DOWN)
  386.          {
  387.                  for(i=ElevState.CurrentFloor-1;i>=1;i--) //扫描呼叫列表楼下是否有要向下的呼叫
  388.                  {
  389.                          if(((ElevState.FloorCallTable[i]&DOWN_IN)==DOWN_IN)||((ElevState.FloorCallTable[i]&DOWN_OUT)==DOWN_OUT)) //如果扫描到上方楼层有向下的呼叫
  390.                          {
  391.                                  return TRUE;
  392.                          }
  393.                  }
  394.                  return FALSE;
  395.          }
  396.          else return FALSE;
  397. }

  398. u8 DelNullCheck(void) //扫描呼叫列表是否空闲
  399. {
  400.   u8 i;
  401.         u8 result;
  402.                
  403.         for(i=1;i<=MaxFloor;i++)
  404.         {
  405.           if(ElevState.FloorCallTable[i]!=Null)
  406.                 {
  407.                          result=FALSE; //非空闲
  408.        break;
  409.                 }
  410.                 else if(i==MaxFloor) result=TRUE;  //空闲
  411.         }
  412.         return result;
  413. }

  414. void FloorCallCheck(void)
  415. {
  416.         if(DelNullCheck()==FALSE) //非空闲
  417.         {
  418.                  ElevState.FreeFlag=FALSE; //退出空闲状态
  419.                  ElevState.ElevRunning=TRUE;//正在运行标志打开
  420.         }
  421.         else  ElevState.FreeFlag=TRUE; //进入空闲状态
  422.         TurnHead_Check();
  423.   if((ElevState.FreeFlag==FALSE)&&(DOOR==CLOSE)) //非空闲下
  424.         {                                
  425.      if(ElevState.Direction==UP)//方向向上
  426.                  {
  427.                     if((FloorCall_UP(UP)==TRUE)||(FloorCall_DOWN(UP)==TRUE)) //如果当前楼层上方有呼叫向上的 或 如果当前楼层上方有呼叫向下的
  428.                                 {
  429.                                         #if (USE_MODE==0)
  430.                                   if(ElevState.FloorTimerCount>FloorStayTime) //检测是否到达楼层  如果接收到 到达楼层的限位开关信号,则当前楼层值+1(这里用定时器来模拟)
  431.                                   {                                                               
  432.                                           ElevState.FloorTimerCount=0;         //计时器清0
  433.                                           ElevState.CurrentFloor++;//电梯继续往上走
  434.                                   }
  435.                                         #endif
  436.                                         #if (USE_MODE==1)
  437.                                   if(ElevState.ArriveFlag==TRUE) //检测是否到达楼层  如果接收到 到达楼层的限位开关信号,则当前楼层值+1
  438.                                   {               
  439.             ElevState.ArriveFlag=FALSE; //清除标志                                                
  440.                                           ElevState.FloorTimerCount=0;         //计时器清0
  441.                                           ElevState.CurrentFloor++;//电梯继续往上走
  442.                                   }        
  443.           #endif                                       
  444.                                 }
  445.                                 else ElevState.Direction=DOWN; //调头                                
  446.                  }
  447.                  else
  448.                  if(ElevState.Direction==DOWN)//方向向下
  449.                  {
  450.                     if((FloorCall_DOWN(DOWN)==TRUE)||(FloorCall_UP(DOWN)==TRUE)) //如果当前楼层下方有呼叫向下的 或 如果当前楼层下方有呼叫向上的
  451.                                 {
  452.                                         #if (USE_MODE==0)
  453.                                   if(ElevState.FloorTimerCount>FloorStayTime) //检测是否到达楼层  如果接收到 到达楼层的限位开关信号,则当前楼层值+1(这里用定时器来模拟)
  454.                                   {                                                               
  455.                                           ElevState.FloorTimerCount=0;        
  456.                                           ElevState.CurrentFloor--;//电梯继续往下走
  457.                                   }
  458.                                         #endif
  459.                                         #if (USE_MODE==1)
  460.                                   if(ElevState.ArriveFlag==TRUE) //检测是否到达楼层  如果接收到 到达楼层的限位开关信号,则当前楼层值+1
  461.                                   {        
  462.             ElevState.ArriveFlag=FALSE; //清除标志                                                               
  463.                                           ElevState.FloorTimerCount=0;        
  464.                                           ElevState.CurrentFloor--;//电梯继续往下走
  465.                                   }
  466.                                         #endif
  467.                                 }
  468.                                 else ElevState.Direction=UP; //调头                        
  469.                  }
  470.         }
  471.         else
  472.         {               
  473.            ElevWorkState(STOP); //停止运行
  474.                  ElevState.ElevRunning=FALSE;//正在运行标志关闭
  475.         }
  476. }

  477. void USART_SendByte(u8 dat)
  478. {
  479.         SBUF=dat;
  480.         while(!TI);  //等待发送数据完成
  481.         TI=0;                                //清除发送完成标志位
  482. }
  483. void USART_Send(u8* arr,u16 len)
  484. {
  485.   u16 i;
  486.         for(i=0;i<len;i++)
  487.         {
  488.                 SBUF=arr[i];
  489.           while(!TI);  //等待发送数据完成
  490.           TI=0;                                //清除发送完成标志位  
  491.         }
  492. }
  493. void USART_SendStr(u8* str)
  494. {
  495.   while(1)
  496.         {
  497.           if(*str=='\0') break;
  498.                 SBUF=*str++;
  499.                 while(!TI);  //等待发送数据完成
  500.           TI=0;                                //清除发送完成标志位
  501.         }
  502. }

  503. void SYSYEM_INIT(void)
  504. {
  505.          u8 i;
  506.          ElevState.CurrentFloor=1;
  507.          ElevState.Direction=UP;              //初使化方向为向上
  508.          ElevState.FloorTimerCount=0;        
  509.          ElevState.FreeFlag=TRUE;             //初使化为空闲状态
  510.          ElevState.ElevRunning=FALSE;
  511.          RIOver_Flag=FALSE;
  512.          Usart.RX_COUNT=0;
  513.          for(i=0;i<=MaxFloor;i++)
  514.          {
  515.                  ElevState.FloorCallTable[i]=Null; //初使化呼叫列表为Null

  516.          ……………………

  517. …………限于本文篇幅 余下代码请从51黑下载附件…………

  518. void EXTI0_IRQHandler(void) interrupt 0
  519. {         
  520.         #if (USE_MODE==1)
  521.         ElevState.ArriveFlag=TRUE;
  522.         #endif
  523. }
  524. void EXTI1_IRQHandler(void) interrupt 2    //矩阵按键中断
  525. {
  526.    KeyDatHandle(KeyScan());
  527. }
  528. void TIM0_IRQHandler(void)  interrupt 1    //定时模拟电梯上升和下降
  529. {
  530.    TH0=(65536-50000)/256;
  531.          TL0=(65536-50000)%256;
  532.         
  533.          TimerCount++;
  534.          if(TimerCount==20)  //1秒
  535.          {
  536.                  TimerCount=0;
  537.                  Timer_Second++;
  538.          }        
  539.          if(DelNullCheck()==FALSE) ElevState.FloorTimerCount++; //非空闲状态计时累加
  540.          else ElevState.FloorTimerCount=0;  //空闲状态计时清0
  541. }

  542. void USART_IRQHandler(void) interrupt 4  //用于电梯之间的通信
  543. {                  
  544.   if(RI==1)        //判断是否为接收中断(串口中断分为发送中断和接收中断,均用同一个中断服务函数入口)
  545.         {
  546. ……………………

  547. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
游客,如果您要查看本帖隐藏内容请回复



评分

参与人数 2黑币 +109 收起 理由
13912033033 + 9 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
冰冰洁洁 发表于 2019-1-16 07:32 | 只看该作者
16层很多的,一个单片机完成,
回复

使用道具 举报

板凳
Duo2048 发表于 2019-1-16 11:00 来自手机 | 只看该作者
看一下,感觉不错呀
回复

使用道具 举报

地板
lhuijiang 发表于 2019-1-16 14:18 | 只看该作者
好的,有你更精彩。
回复

使用道具 举报

5#
lhuijiang 发表于 2019-1-16 14:19 | 只看该作者
谢谢分享,谢谢分享。
回复

使用道具 举报

6#
songxia8013 发表于 2019-1-17 08:12 | 只看该作者
很不错的设计!
回复

使用道具 举报

7#
uaeng 发表于 2019-1-17 11:38 | 只看该作者
收下了  感谢楼主的无私奉献
回复

使用道具 举报

8#
664695681 发表于 2019-1-17 20:43 | 只看该作者
good,楼主的实物卖吗?
回复

使用道具 举报

9#
664695681 发表于 2019-1-17 20:44 | 只看该作者
回复你看隐藏内容,这个能不能快点审核
回复

使用道具 举报

10#
664695681 发表于 2019-1-17 20:45 | 只看该作者
收下了  感谢楼主的无私奉献
回复

使用道具 举报

11#
a86340 发表于 2019-1-17 23:03 | 只看该作者
为什么要回复才能下载
回复

使用道具 举报

12#
hepingzlh 发表于 2019-1-18 09:44 | 只看该作者
多谢,非常有用,谢谢分享的资料。
回复

使用道具 举报

13#
zhangzj 发表于 2019-1-18 11:15 | 只看该作者
好东西谢谢分享
回复

使用道具 举报

14#
 楼主| Angle145 发表于 2019-1-18 14:03 | 只看该作者
664695681 发表于 2019-1-17 20:43
good,楼主的实物卖吗?

你需要找我再做一个即可
回复

使用道具 举报

15#
liyongan_1985 发表于 2019-1-18 16:20 | 只看该作者
看看资料成熟度。
回复

使用道具 举报

16#
147222832 发表于 2019-1-18 19:01 | 只看该作者
学习中,非常有用,谢谢分享的资料
回复

使用道具 举报

17#
dzljp 发表于 2019-1-18 20:24 | 只看该作者
感谢楼主的无私奉献
回复

使用道具 举报

18#
dzljp 发表于 2019-1-18 20:25 | 只看该作者
感谢楼主的无私奉献。
51有你更精彩
回复

使用道具 举报

19#
king8 发表于 2019-1-18 21:14 | 只看该作者
收下了  感谢楼主的无私奉献
回复

使用道具 举报

20#
毛明岳 发表于 2019-1-18 21:52 | 只看该作者
感谢楼主
回复

使用道具 举报

21#
cliang223 发表于 2019-1-18 22:05 | 只看该作者
学习下
回复

使用道具 举报

22#
pengyongnet 发表于 2019-1-21 09:33 来自手机 | 只看该作者
下载源码
回复

使用道具 举报

23#
zhangxiaoljs 发表于 2019-1-21 21:41 | 只看该作者
学习谢谢
回复

使用道具 举报

24#
chenwg 发表于 2019-2-1 09:22 | 只看该作者
谢谢分享!
回复

使用道具 举报

25#
xs3396 发表于 2019-2-1 09:59 | 只看该作者
以前弄过PLC的电梯程序,看看单片机的
回复

使用道具 举报

26#
comu 发表于 2019-2-1 13:13 来自手机 | 只看该作者
下来看看,谢谢了
回复

使用道具 举报

27#
yilinghai 发表于 2019-2-7 20:48 | 只看该作者
先看看
回复

使用道具 举报

28#
yilinghai 发表于 2019-2-7 21:02 | 只看该作者
这个仿真图我用proteus 8.0 打不开啊,求解
回复

使用道具 举报

29#
cb474265474265 发表于 2019-2-10 14:34 | 只看该作者
多谢楼主分享,学习一下。
回复

使用道具 举报

30#
bob98706 发表于 2019-2-11 14:38 | 只看该作者
謝了
回复

使用道具 举报

31#
bob98706 发表于 2019-2-11 14:52 | 只看该作者
感觉不错
回复

使用道具 举报

32#
uva2015 发表于 2019-2-11 23:22 | 只看该作者
很好,谢谢分享
回复

使用道具 举报

33#
ahljj 发表于 2019-2-12 09:12 | 只看该作者
不错呀
回复

使用道具 举报

34#
weisohu 发表于 2019-2-12 09:34 | 只看该作者
学习下,多谢共享.
回复

使用道具 举报

35#
后面新来的 发表于 2019-2-12 10:34 | 只看该作者
下载来学习
回复

使用道具 举报

36#
hzcxdong 发表于 2019-2-12 10:38 | 只看该作者
感谢楼主的无私奉献
回复

使用道具 举报

37#
 楼主| Angle145 发表于 2019-2-13 10:39 来自手机 | 只看该作者
yilinghai 发表于 2019-2-7 21:02
这个仿真图我用proteus 8.0 打不开啊,求解

用8.7或8.6
回复

使用道具 举报

38#
1234567892 发表于 2019-2-13 16:34 | 只看该作者
很不错  刚好需要
回复

使用道具 举报

39#
随风飘11 发表于 2019-2-14 11:15 | 只看该作者
顶一个
回复

使用道具 举报

40#
随风飘11 发表于 2019-2-15 09:06 | 只看该作者
下了学习一下,谢谢楼主分享!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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