单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 107|回复: 1
收起左侧

单片机电梯楼层Proteus仿真设计+代码

[复制链接]
sfj 发表于 2019-5-15 22:15 | 显示全部楼层 |阅读模式

下二楼

下二楼

上3楼

上3楼

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define UCHAR unsigned char
  4. #define UINT unsigned int
  5. #define IDATA idata
  6. #define BUZZER_ON   0
  7. #define BUZZER_OFF   1
  8. #define ON           1
  9. #define OFF          0
  10. //--------硬件功能IO端口定义--------Start
  11. sbit sbBUZZER=P3^7;    //蜂鸣器
  12. //1位数码管的a/b/c/d/e/f/g为P1.0-P1.6


  13. //按键定义
  14. enum KEY_LIST
  15. {
  16.     KEY_SET=0,
  17.     KEY_INCREASE,
  18.     KEY_REDUCE,
  19.     KEY_EXIT,
  20.     KEY_MAX
  21. };

  22. //电梯按键  共5层,1楼只有上行按键,5楼只有下行按键,2/3/4楼既有上行又有下行按键
  23. //上行
  24. sbit sbL1KeyUp = P2^0;
  25. sbit sbL2KeyUp = P2^2;
  26. sbit sbL3KeyUp = P2^6;
  27. sbit sbL4KeyUp = P0^5;
  28. //下行
  29. sbit sbL2KeyDown = P2^4;
  30. sbit sbL3KeyDown = P0^7;
  31. sbit sbL4KeyDown = P0^3;
  32. sbit sbL5KeyDown = P0^1;
  33. //电梯楼层上/下指示灯
  34. //上行指示灯
  35. sbit sbL1LedUp = P2^1;
  36. sbit sbL2LedUp = P2^3;
  37. sbit sbL3LedUp = P2^7;
  38. sbit sbL4LedUp = P0^4;
  39. //下行指示灯
  40. sbit sbL2LedDown = P2^5;
  41. sbit sbL3LedDown = P0^6;
  42. sbit sbL4LedDown = P0^2;
  43. sbit sbL5LedDown = P0^0;
  44. //电梯运行指示箭头LED控制
  45. sbit sbUpPoint = P3^3; //上箭头
  46. sbit sbMidPoint = P3^4; //中竖条
  47. sbit sbDownPoint = P3^5; //下箭头
  48. //步进电机控制
  49. UCHAR code FFW[]=
  50. {
  51. 0x03,0x06,0x0c,0x09
  52. };

  53. UCHAR code REV[]=
  54. {
  55.          0x09,0x0c,0x06,0x03
  56. };

  57. sbit sbMotor0Blue = P3^0;
  58. sbit sbMotor1Pink = P3^6;
  59. sbit sbMotor2Yellow = P3^2;
  60. sbit sbMotor3Orange = P1^7;
  61. //--------硬件功能IO端口定义--------End

  62. //--------常量定义--------Start
  63. //****晶振参数定义
  64. #define CRYSTAL_110592M      0  //11.0592Mhz晶振
  65. #define CRYSTAL_12M          1  //12Mhz晶振
  66. #define CRYSTAL_SELECT       CRYSTAL_12M
  67. //FOSC为晶振频率,如选用11.0592M晶振则FOSC=11059200
  68. #if (CRYSTAL_SELECT == CRYSTAL_110592M)
  69. //定时器T0计数器初值
  70. //#define SEQ_TIMER0_H      0xDC  //16位定时器,6T,5ms
  71. //#define SEQ_TIMER0_L            0x00
  72. #define SEQ_TIMER0_H      0xF8  //16位定时器,6T,1ms
  73. #define SEQ_TIMER0_L            0xCD
  74. #else
  75. #define SEQ_TIMER0_H      0xEC  //16位定时器,12T,5ms
  76. #define SEQ_TIMER0_L            0xF0
  77. //#define SEQ_TIMER0_H      0xD8  //16位定时器,12T,10ms
  78. //#define SEQ_TIMER0_L            0xF0
  79. #endif
  80. #define TIME_50MS_COUNT 10 //T0为5ms

  81. //支持STC单片机,特别是内部EEP
  82. //建议仅在使用STC单片机时开启即#define SUPPORT_STC_MCU  1  
  83. //其他情况(包括proteus仿真)都需要关闭#define SUPPORT_STC_MCU  0
  84. #define SUPPORT_STC_MCU  0  


  85. //数码管显示定义
  86. enum LED_DISPLAY_CODE
  87. {
  88.     LED_NUM_0 = 0,
  89.     LED_NUM_1,
  90.     LED_NUM_2,
  91.     LED_NUM_3,
  92.     LED_NUM_4,
  93.     LED_NUM_5,
  94.     LED_NUM_6,
  95.     LED_NUM_7,
  96.     LED_NUM_8,
  97.     LED_NUM_9,

  98.     LED_0_DOT ,
  99.     LED_1_DOT,
  100.     LED_2_DOT,
  101.     LED_3_DOT,
  102.     LED_4_DOT,
  103.     LED_5_DOT,
  104.     LED_6_DOT,
  105.     LED_7_DOT,
  106.     LED_8_DOT,
  107.     LED_9_DOT,

  108.     LED_ASC_L,
  109.     LED_ASC_H,
  110.     LED_ASC_HDOT,
  111.     LED_ASC_P,
  112.     LED_ASC_PDOT,
  113.     LED_ASC_A,
  114.     LED_ASC_SPLIT,
  115.     LED_ASC_BLANK,
  116.     LED_ASC_O,
  117.     LED_ASC_E,
  118.     LED_ASC_EDOT,
  119.     LED_ASC_N,
  120.     LED_ASC_C,
  121.     LED_ASC_CDOT,
  122.     LED_ASC_DOT,
  123.     LED_ASC_r,
  124.     LED_ASC_K,
  125.     LED_ASC_F,

  126.     LED_ASC_b,
  127.     LED_ASC_d,
  128.     LED_ASC_g,

  129.     LED_ASC_U,
  130.     LED_ASC_n,

  131.     LED_ASC_S,
  132.     LED_ASC_y,
  133.     LED_ASC_LDOT,
  134.     LED_ASC_FDOT,

  135.     LED_MAX
  136. };

  137. UCHAR code  LED_DISP_NUM[LED_MAX]=
  138. //  0      1      2      3      4      5      6      7      8       9
  139. {0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98
  140. };
  141. #define DEF_IDLE_DISP_CHAR LED_NUM_1
  142. #define LED_FLASH_INTERVAL                20   // 1 second


  143. UCHAR code  TBL_DISP_POS_VALUE[]={0xF7,0xEF,0xDF,0xBF};

  144. //--------变量定义--------Start

  145. //时钟
  146. UCHAR ucBaseTimeCount; //基础计数(记至50ms为一个循环),用于整个系统基础计时
  147. //数码管显示
  148. #define KEY_MAX_LEN    4
  149. UCHAR DisBuffer;
  150. UCHAR ucDispState;
  151. enum DISP_STATE
  152. {
  153.     DS_IDLE = 0,  //空闲待机状态
  154.     DS_KEY_INPUT, //按键输入状态
  155.     DS_MAX
  156. };
  157. UCHAR ucDispIdleChar; //空闲待机时显示的字符

  158. //蜂鸣器
  159. bit   bSoundfgTips;

  160. //按键
  161. //按键IO口定义
  162. #define KEY_DOWN         0
  163. #define KEY_UP             1
  164. //LED状态指示灯IO口定义
  165. #define LED_ON           0
  166. #define LED_OFF          1


  167. //楼层列表
  168. enum FLOOR_LIST
  169. {
  170.     FL_1 = 0,  // 1层
  171.     FL_2, // 2层
  172.     FL_3, // 3层
  173.     FL_4, // 4层
  174.     FL_5, // 5层
  175.     FL_MAX //
  176. };

  177. #define FLOOR_MIN FL_1 // 1层
  178. #define FLOOR_MAX FL_5 // 5层




  179. //电梯运行箭头指示灯分解
  180. enum SET_EVLEVATOR_LED
  181. {
  182.     SEL_NONE = 0, // 全部熄灭
  183.     SEL_UP ,  // 上行
  184.     SEL_DOWN, // 下行
  185.     SEL_ALL, // 全部点亮
  186.     SEL_MAX
  187. };


  188. //住户呼叫电梯动作
  189. enum CALL_EVLEVATOR_LIST
  190. {
  191.     CEL_UP = 0,  // 上行
  192.     CEL_DOWN, // 下行
  193.     CEL_MAX
  194. };

  195. enum FLOOR_CALL_LIST
  196. {
  197.     FCL_FL1_UP = 0,
  198.     FCL_FL2_UP,
  199.     FCL_FL3_UP,
  200.     FCL_FL4_UP,
  201.     FCL_FL2_DOWN,
  202.     FCL_FL3_DOWN,
  203.     FCL_FL4_DOWN,
  204.     FCL_FL5_DOWN,
  205.     FCL_MAX
  206. };

  207. #define FCL_UP_MIN FCL_FL1_UP
  208. #define FCL_UP_MAX FCL_FL4_UP
  209. #define FCL_DOWN_MIN FCL_FL2_DOWN
  210. #define FCL_DOWN_MAX FCL_FL5_DOWN



  211. UCHAR ucFloorCallList[FCL_MAX] ={FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX,FCL_MAX};
  212. UCHAR ucFCLLen;

  213. //电梯状态
  214. enum EVLEVATOR_STATE_LIST
  215. {
  216.     ESL_STANDBY = 0,  // 停留在某层等待楼层呼叫
  217.     ESL_UP, // 电梯上行
  218.     ESL_DOWN, // 电梯下行
  219.     ESL_MAX
  220. };
  221. UCHAR ucElevatorState;  //电梯状态
  222. UCHAR ucElevatorFL;  //电梯当前所处的楼层
  223. UCHAR ucElevatorTargetFL;  //电梯当前准备前往的楼层
  224. UCHAR ucElevatorTargetFLListID;  //电梯当前准备前往的楼层
  225. UCHAR ucCallElevatorState;  //呼叫方向


  226. UCHAR ucFLLedUp[FL_MAX] ={LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};
  227. UCHAR ucFLLedDown[FL_MAX] ={LED_OFF,LED_OFF,LED_OFF,LED_OFF,LED_OFF};

  228. UCHAR ucElevatorTimeCount; //电梯运行计数
  229. UCHAR ucElevatorTimeOut; //电梯计数限值
  230. #define TIME_ELEVATOR_FLOOR_SPEED  60 //电梯运行一层的时间
  231. #define TIME_ELEVATOR_OPEN_DOOR   40 //电梯开门时间
  232. #define TIME_ELEVATOR_FLOOR_WAIT   40 //电梯等待时间
  233. #define TIME_ELEVATOR_CLOSE_DOOR   40 //电梯关门门时间



  234. //空闲中
  235. #define TIME_IDLE_LED_ON_COUNT  20
  236. #define TIME_IDLE_LED_OFF_COUNT  20
  237. //按键输入中
  238. #define TIME_KEYINPUT_LED_ON_COUNT  10
  239. #define TIME_KEYINPUT_LED_OFF_COUNT  10


  240. //--------变量定义--------End

  241. //--------函数定义--------Start

  242. //--------函数定义--------End

  243. //按键
  244. bit bKeyReleased;
  245. bit bKeyReaded;
  246. bit bSoundfgKey;
  247. bit bKeyRepeated;
  248. UCHAR  IDATA ucKeyDet; //已经检测到的按键
  249. UCHAR  IDATA ucKeyCur; //当前检测到正按下的按键
  250. UINT   IDATA uiKeyTimeCount;
  251. UCHAR  IDATA ucKeyDownCount; //检测按键按下延迟时间
  252. #define TIME_KEY_DOWN_COUNT  2 //按键按下时间超过4*50=200ms即认为按键有效,否则无效
  253. #define TIME_KEY_REPEAT_COUNT  10 //按键按下时间超过10*50=500ms即认为按键有效,否则无效

  254. //蜂鸣器
  255. bit   bSoundfgTips; //蜂鸣器提示声标识

  256. //空闲中
  257. #define TIME_IDLE_LED_ON_COUNT  20
  258. #define TIME_IDLE_LED_OFF_COUNT  20
  259. //设置状态中
  260. #define TIME_SETTING_LED_ON_COUNT  10
  261. #define TIME_SETTING_LED_OFF_COUNT  10
  262. //闹铃状态中
  263. #define TIME_ALARMCLOCK_LED_ON_COUNT  5
  264. #define TIME_ALARMCLOCK_LED_OFF_COUNT  5
  265. //系统状态
  266. enum STATE_LIST
  267. {
  268.     SL_IDLE = 0, // 空闲
  269.     SL_SETTING, //设置
  270.     SL_ALARM,//闹铃or 报警
  271.     SL_MAX
  272. };
  273. UCHAR IDATA ucSysState; //系统状态
  274. //时钟

  275. //箭头闪烁控制
  276. UCHAR IDATA ucFlashArrowTimeCount; //闪烁计时
  277. bit bFlashShowArrow; //是否当前显示空白
  278. #define TIME_FLASH_ARROW_COUNT  2 //每0.25S闪烁一次


  279. //字符闪烁
  280. UCHAR IDATA ucFlashTimeCount; //闪烁计时
  281. bit bFlashShowBlanking; //是否当前显示空白
  282. #define TIME_FLASH_FREQ_COUNT  10 //每0.5S闪烁一次

  283. //提示声
  284. bit bAlarmingSoundOn; //闹铃提示音

  285. UCHAR IDATA ucAlarmingCount; //报警计数
  286. UCHAR IDATA ucAlarmingTimeOut;//延时
  287. #define TIME_ALARM_ON_COUNT 5
  288. #define TIME_ALARM_OFF_COUNT 5
  289. #define TIME_ALARM_REPEAT_COUNT 6
  290. #define TIME_ALARM_INTERVAL_COUNT 20


  291. //延时1ms,有误差  
  292. void DelayMS(UINT ms)
  293. {
  294.          UCHAR n = 100;
  295.         while(ms--)
  296.         {
  297.             while (n--)
  298.         {
  299.             _nop_();
  300.             _nop_();
  301.         }
  302.         }
  303. }
  304. //蜂鸣器
  305. void vSoundOnOff(UCHAR ucOnOff, UINT uiDelayTime)
  306. {

  307.     if (ucOnOff == ON)
  308.     {
  309.         sbBUZZER = BUZZER_ON;
  310.         bSoundfgTips = 1;
  311.         if (uiDelayTime>0)
  312.         {
  313.             //vDelayTime1Ms(uiDelayTime);
  314.             DelayMS(uiDelayTime);
  315.         }
  316.     }
  317.     else
  318.     {
  319.         sbBUZZER = BUZZER_OFF;
  320.         bSoundfgTips = 0;
  321.         if (uiDelayTime>0)
  322.         {
  323.             //vDelayTime1Ms(uiDelayTime);
  324.             DelayMS(uiDelayTime);
  325.         }
  326.     }

  327. }

  328. //
  329. void vAdd2FCL(UCHAR ucFclItem)
  330. {
  331.     UCHAR i;
  332.     for(i=0;i<ucFCLLen;i++)
  333.     {
  334.         if (ucFloorCallList[i]==ucFclItem)
  335.         {
  336.             return ;
  337.         }
  338.     }
  339.     if (ucFCLLen<FCL_MAX)
  340.     {
  341.         ucFloorCallList[ucFCLLen] = ucFclItem;
  342.         ucFCLLen ++;
  343.     }
  344. }
  345. //
  346. /*
  347. void vDelFCLItem(UCHAR ucFclItem)
  348. {
  349.     UCHAR i,j;
  350.     if ((ucFclItem<FCL_MAX)&&(ucFCLLen>0))
  351.     {
  352.         j= FCL_MAX;
  353.         for (i=0;i<ucFCLLen;i++)
  354.         {
  355.             if (ucFloorCallList[i]==ucFclItem)
  356.             {
  357.                 ucFloorCallList[i] = FCL_MAX;
  358.                 j=i;
  359.                 break;
  360.             }
  361.         }
  362.         if (j<FCL_MAX)
  363.         {
  364.             for (i=j;i<ucFCLLen;i++)
  365.             {
  366.                 ucFloorCallList[i] = ucFloorCallList[i+1];
  367.             }
  368.             ucFloorCallList[ucFCLLen-1] = FCL_MAX;
  369.         }
  370.         ucFCLLen --;
  371.     }
  372. }
  373. */
  374. void vDelFCLItem(UCHAR ucFclItemListID)
  375. {
  376.     UCHAR i;
  377.     if ((ucFclItemListID<ucFCLLen)&&(ucFCLLen>0))
  378.     {
  379.         for (i=ucFclItemListID;i<ucFCLLen;i++)
  380.         {
  381.            ucFloorCallList[i] = ucFloorCallList[i+1];
  382.         }
  383.         ucFloorCallList[ucFCLLen-1] = FCL_MAX;
  384.         ucFCLLen --;
  385.     }
  386. }



  387. //
  388. void dj()
  389. {
  390. sbMotor0Blue=0;
  391. DelayMS(100);
  392. sbMotor1Pink =0;
  393. DelayMS(100);
  394. sbMotor2Yellow =0;
  395. DelayMS(100);
  396. sbMotor3Orange=1;
  397. DelayMS(100);
  398. }
  399. UCHAR ucGetFloorByFCL(UCHAR ucFCLItem)
  400. {
  401.     UCHAR ucFloor;
  402.     ucFloor = FL_MAX;
  403.     switch (ucFCLItem)
  404.     {
  405.         case FCL_FL1_UP:
  406.             ucFloor = FL_1;
  407.             break;
  408.         case FCL_FL2_UP:
  409.         case FCL_FL2_DOWN:
  410.             ucFloor = FL_2;
  411.             break;
  412.         case FCL_FL3_UP:
  413.         case FCL_FL3_DOWN:
  414.             ucFloor = FL_3;
  415.             break;
  416.         case FCL_FL4_UP:
  417.         case FCL_FL4_DOWN:
  418.             ucFloor = FL_4;
  419.             break;
  420.         case FCL_FL5_DOWN:
  421.             ucFloor = FL_5;
  422.             break;
  423.     }
  424.     return ucFloor;
  425. }


  426. //设置电梯箭头方向灯
  427. void vSetElevatorLed(UCHAR ucCall)
  428. {
  429.     if (ucCall>=SEL_MAX)
  430.     {
  431.         return ;
  432.     }
  433.     switch (ucCall)
  434.     {
  435.         case SEL_NONE:
  436.             sbUpPoint = 1;
  437.             sbMidPoint= 1;
  438.             sbDownPoint = 1;
  439.                
  440.             break;
  441.         case SEL_UP:
  442.             sbUpPoint = 0;
  443.             sbMidPoint= 0;
  444.             sbDownPoint = 1;        dj();
  445.             break;
  446.         case SEL_DOWN:
  447.             sbUpPoint = 1;
  448.             sbMidPoint= 0;
  449.             sbDownPoint = 0;
  450.                
  451.             break;
  452.         case SEL_ALL:
  453.             sbUpPoint = 0;
  454.             sbMidPoint= 0;
  455.             sbDownPoint = 0;
  456.                         
  457.             break;
  458.     }
  459. }

  460. //设置楼层按键上行or下行指示灯
  461. void vSetFloorLed(UCHAR ucFloor,UCHAR ucCall,UCHAR ucOnOff)
  462. {
  463.     if ((ucFloor>=FL_MAX)||(ucCall>=CEL_MAX) ||((ucFloor==FL_1)&&(ucCall==CEL_DOWN))||((ucFloor==FL_5)&&(ucCall==CEL_UP)))
  464.     {
  465.         return ;
  466.     }
  467.     if ((ucCall==CEL_UP)&&(ucFloor<FL_5))
  468.     {
  469.         ucFLLedUp[ucFloor] = ucOnOff;
  470.         switch (ucFloor)
  471.         {
  472.            case FL_1:
  473.               sbL1LedUp = ucOnOff;
  474.               break;
  475.            case FL_2:
  476.               sbL2LedUp = ucOnOff;
  477.               break;
  478.            case FL_3:
  479.               sbL3LedUp = ucOnOff;
  480.               break;
  481.            case FL_4:
  482.               sbL4LedUp = ucOnOff;
  483.               break;
  484.         }
  485.     }
  486.     else if ((ucCall==CEL_DOWN)&&(ucFloor>FL_1))
  487.     {
  488.         ucFLLedDown[ucFloor] = ucOnOff;
  489.         switch (ucFloor)
  490.         {
  491.            case FL_2:
  492.               sbL2LedDown= ucOnOff;
  493.               break;
  494.            case FL_3:
  495.               sbL3LedDown = ucOnOff;
  496.               break;
  497.            case FL_4:
  498.               sbL4LedDown = ucOnOff;
  499.               break;
  500.            case FL_5:
  501.               sbL5LedDown = ucOnOff;
  502.               break;
  503.         }
  504.     }

  505. }


  506. //软硬件初始化函数
  507. void vInit()
  508. {
  509.    UCHAR i;
  510.    //时钟
  511.    ucBaseTimeCount = 0;

  512.    //蜂鸣器
  513.    bSoundfgTips = 0;
  514.    //按键
  515.    bKeyReleased = 1;
  516.    bSoundfgKey = 0;
  517.    bKeyRepeated = 0;
  518.    uiKeyTimeCount = 0;
  519.    ucKeyDownCount= 0;
  520.    ucKeyDet = KEY_MAX;
  521.    ucKeyCur = KEY_MAX;

  522.    //电梯初始状态,停留在1层
  523.    ucElevatorState = ESL_STANDBY;
  524.    ucCallElevatorState = ESL_MAX;
  525.    ucElevatorFL = FL_1;
  526.    ucElevatorTimeCount = 0; //电梯运行计数
  527.    ucElevatorTimeOut = 0; //电梯计数限值
  528.    ucFCLLen = 0;
  529.    //设置电梯运行箭头
  530.    vSetElevatorLed(SEL_NONE);
  531.    //设置各个楼层的上行按键灯
  532.    sbL1LedUp = LED_OFF;
  533.    sbL2LedUp = LED_OFF;
  534.    sbL3LedUp = LED_OFF;
  535.    sbL4LedUp = LED_OFF;
  536.    for (i=0;i<FL_MAX;i++)
  537.    {
  538.        ucFLLedUp[i] = LED_OFF;
  539.    }
  540.    //设置各个楼层的下行按键灯
  541.    sbL2LedDown= LED_OFF;
  542.    sbL3LedDown = LED_OFF;
  543.    sbL4LedDown = LED_OFF;
  544.    sbL5LedDown = LED_OFF;
  545.    for (i=0;i<FL_MAX;i++)
  546.    {
  547.        ucFLLedDown[i] = LED_OFF;
  548.    }
  549.    //状态
  550.    ucSysState = SL_IDLE;
  551.    //显示
  552.    DisBuffer = DEF_IDLE_DISP_CHAR;
  553.    ucDispState = DS_IDLE;
  554.    P1 = LED_DISP_NUM[ucElevatorFL+1];

  555.    ucFlashArrowTimeCount = 0; //闪烁计时
  556.    bFlashShowArrow = 1; //是否当前显示空白


  557.    //定时器配置
  558.    TMOD = 0x11; //T0:16位定时器  T1:8位定时器
  559.    //T0 配置
  560.    TH0 = SEQ_TIMER0_H; //T0附初值
  561.    TL0 = SEQ_TIMER0_L;
  562.    ET0 = 1; //使能T0中断
  563.    TR0 = 1; //使能T0
  564.    //T1配置
  565.    /*
  566.    TH1 = SEQ_TIMER1_H;
  567.    TL1 = SEQ_TIMER1_L;   
  568.    ET1 = 0;
  569.    TR1 = 0;
  570.    */
  571.    /*
  572.    //串口配置
  573.    PCON = 0x00; //SMOD=0 即波特率无倍增
  574.    SCON = 0x50; //8位数据,可变波特率
  575.    RCLK = 0; //设置T1为串口的波特率发生器
  576.    TCLK = 0;
  577.    TH1= RELOAD_BAUD_9600;
  578.    TL1 = RELOAD_BAUD_9600;
  579.    ET1 = 0;//禁止定时器1中断
  580.    TR1 = 1;//启动定时器1
  581.    ES = 1; //启动串口中断
  582.    */
  583.    EA=1;//使能总中断

  584.    //启动完成提示音
  585.    vSoundOnOff(ON,200);
  586.    vSoundOnOff(OFF,0);

  587. }

  588. /*
  589. //计算运行方向及目标楼层
  590. UCHAR ucGetElevatorUpTarget()
  591. {
  592.     UCHAR i,ucTargetFl;
  593.     ucTargetFl = FL_MAX;
  594.     if(ucElevatorFL<FLOOR_MAX)
  595.     {
  596.         for (i=ucElevatorFL+1;i<FL_MAX;i++) //查找是否有上行呼叫
  597.         {
  598.            if (ucFLLedUp[i]==LED_ON)
  599.            {
  600.               ucTargetFl=i;
  601.               break;
  602.            }
  603.         }
  604.     }
  605.     return ucTargetFl;
  606. }

  607. //计算运行方向及目标楼层
  608. UCHAR ucGetElevatorDownTarget()
  609. {
  610.     UCHAR i,ucTargetFl;
  611.     ucTargetFl = FL_MAX;
  612.     if(ucElevatorFL>FLOOR_MIN+1)
  613.     {
  614.         for (i=ucElevatorFL-1;i>FL_1;i--) //查找是否有下行呼叫
  615.         {
  616.            if (ucFLLedDown[i]==LED_ON)
  617.            {
  618.                ucTargetFl=i;
  619.                break;
  620.            }
  621.         }
  622.     }
  623.     return ucTargetFl;
  624. }
  625. */

  626. //计算运行方向及目标楼层
  627. UCHAR ucGetDirection()
  628. {
  629.     UCHAR i,ucTemp;
  630.     UCHAR ucDirection;

  631.     if (ucFCLLen==0)
  632.     {
  633.         return ESL_STANDBY;
  634.     }
  635.     ucDirection = ESL_MAX;
  636.     //ucDirection = ucElevatorState;
  637.     ucElevatorTargetFL = FCL_MAX;
  638.     if (ucElevatorFL == FLOOR_MIN) //电梯停留在1楼
  639.     {
  640.         for(i=0;i<ucFCLLen;i++)
  641.         {
  642.             if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
  643.             {
  644.                 ucDirection = ESL_UP;
  645.                 ucCallElevatorState = ESL_UP;
  646.                 ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  647.                 if (ucElevatorTargetFL==FCL_MAX)
  648.                 {
  649.                     ucElevatorTargetFL = ucTemp;
  650.                     ucElevatorTargetFLListID = i;
  651.                 }
  652.                 else if (ucElevatorTargetFL>ucTemp)
  653.                 {
  654.                     ucElevatorTargetFL  = ucTemp;
  655.                     ucElevatorTargetFLListID = i;
  656.                 }
  657.                 //break;
  658.             }
  659.         }
  660.         if (ucDirection == ESL_MAX)
  661.         {
  662.             for(i=0;i<ucFCLLen;i++)
  663.             {
  664.                 if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
  665.                 {
  666.                     ucDirection = ESL_UP;
  667.                     ucCallElevatorState = ESL_DOWN;
  668.                     ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  669.                     if (ucElevatorTargetFL==FCL_MAX)
  670.                     {
  671.                         ucElevatorTargetFL = ucTemp;
  672.                         ucElevatorTargetFLListID = i;
  673.                     }
  674.                     else if (ucElevatorTargetFL<ucTemp)
  675.                     {
  676.                         ucElevatorTargetFL  = ucTemp;
  677.                         ucElevatorTargetFLListID = i;
  678.                     }
  679.                 }
  680.             }

  681.             //ucDirection = ESL_UP;
  682.             //ucCallElevatorState = ESL_DOWN;
  683.         }
  684.     }
  685.     else if ((ucElevatorFL > FLOOR_MIN)&&(ucElevatorFL < FLOOR_MAX)) //中间楼层
  686.     {
  687.         if (ucElevatorState==ESL_STANDBY)
  688.         {
  689.             #if 1
  690.             if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  691.             {
  692.                ucCallElevatorState = ESL_UP;
  693.                ucDirection = ESL_UP;

  694.                for(i=0;i<ucFCLLen;i++)
  695.                {
  696.                    if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
  697.                    {
  698.                        ucCallElevatorState = ESL_UP;
  699.                        ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  700.                        if (ucElevatorTargetFL==FCL_MAX)
  701.                        {
  702.                            ucElevatorTargetFL = ucTemp;
  703.                            ucElevatorTargetFLListID = i;
  704.                        }
  705.                        else if (ucElevatorTargetFL>ucTemp)
  706.                        {
  707.                            ucElevatorTargetFL  = ucTemp;
  708.                            ucElevatorTargetFLListID = i;
  709.                        }
  710.                        //break;
  711.                    }
  712.                }

  713.                //ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
  714.                //ucElevatorTargetFL = ucTemp;
  715.                //ucElevatorTargetFLListID = 0;
  716.                if (ucElevatorFL<ucElevatorTargetFL)
  717.                {
  718.                   ucDirection = ESL_UP;
  719.                }
  720.                else
  721.                {
  722.                   ucDirection = ESL_DOWN;
  723.                }
  724.             }
  725.             else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  726.             {
  727.                ucCallElevatorState = ESL_DOWN;

  728.                for(i=0;i<ucFCLLen;i++)
  729.                {
  730.                    if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
  731.                    {
  732.                        ucDirection = ESL_UP;
  733.                        ucCallElevatorState = ESL_DOWN;
  734.                        ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  735.                        if (ucElevatorTargetFL==FCL_MAX)
  736.                        {
  737.                            ucElevatorTargetFL = ucTemp;
  738.                            ucElevatorTargetFLListID = i;
  739.                        }
  740.                        else if (ucElevatorTargetFL<ucTemp)
  741.                        {
  742.                            ucElevatorTargetFL  = ucTemp;
  743.                            ucElevatorTargetFLListID = i;
  744.                        }
  745.                    }
  746.                }


  747.                //ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
  748.                //ucElevatorTargetFL = ucTemp;
  749.                //ucElevatorTargetFLListID = 0;
  750.                if (ucElevatorFL<ucElevatorTargetFL)
  751.                {
  752.                   ucDirection = ESL_UP;
  753.                }
  754.                else
  755.                {
  756.                   ucDirection = ESL_DOWN;
  757.                }
  758.             }
  759.             #else
  760.             if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  761.             {
  762.                ucCallElevatorState = ESL_UP;
  763.                ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
  764.                ucElevatorTargetFL = ucTemp;
  765.                ucElevatorTargetFLListID = 0;
  766.                if (ucElevatorFL<ucTemp)
  767.                {
  768.                   ucDirection = ESL_UP;
  769.                }
  770.                else
  771.                {
  772.                   ucDirection = ESL_DOWN;
  773.                }
  774.             }
  775.             else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  776.             {
  777.                ucCallElevatorState = ESL_DOWN;
  778.                ucTemp = ucGetFloorByFCL(ucFloorCallList[0]);
  779.                ucElevatorTargetFL = ucTemp;
  780.                ucElevatorTargetFLListID = 0;
  781.                if (ucElevatorFL<ucTemp)
  782.                {
  783.                   ucDirection = ESL_UP;
  784.                }
  785.                else
  786.                {
  787.                   ucDirection = ESL_DOWN;
  788.                }
  789.             }
  790.             #endif
  791.         }
  792.         else if (ucElevatorState==ESL_UP)
  793.         {
  794.             for(i=0;i<ucFCLLen;i++)
  795.             {
  796.                 ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  797.                 if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX)
  798.                     &&(ucElevatorFL<ucTemp))
  799.                 {
  800.                     ucDirection = ESL_UP;
  801.                     ucCallElevatorState = ESL_UP;

  802.                     if (ucElevatorTargetFL==FCL_MAX)
  803.                     {
  804.                         ucElevatorTargetFL = ucTemp;
  805.                         ucElevatorTargetFLListID = i;
  806.                     }
  807.                     else if (ucElevatorTargetFL>ucTemp)
  808.                     {
  809.                         ucElevatorTargetFL  = ucTemp;
  810.                         ucElevatorTargetFLListID = i;
  811.                     }
  812.                     //break;
  813.                 }
  814.             }
  815.             #if 0
  816.             if (ucDirection == ESL_MAX)
  817.             {
  818.                 ucDirection = ESL_STANDBY;
  819.                 /*
  820.                 if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  821.                 {
  822.                    ucCallElevatorState = ESL_UP;
  823.                    if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
  824.                    {
  825.                       ucDirection = ESL_UP;
  826.                    }
  827.                    else
  828.                    {
  829.                       ucDirection = ESL_DOWN;
  830.                    }
  831.                 }
  832.                 else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  833.                 {
  834.                    ucCallElevatorState = ESL_DOWN;
  835.                    if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
  836.                    {
  837.                       ucDirection = ESL_UP;
  838.                    }
  839.                    else
  840.                    {
  841.                       ucDirection = ESL_DOWN;
  842.                    }
  843.                 }
  844.                 */
  845.             }
  846.             #endif
  847.         }
  848.         else if (ucElevatorState==ESL_DOWN)
  849.         {
  850.             ucElevatorTargetFL= FCL_MAX;
  851.             for(i=0;i<ucFCLLen;i++)
  852.             {
  853.                 ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  854.                 if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX)
  855.                     &&(ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i])))
  856.                 {
  857.                     ucDirection = ESL_DOWN;
  858.                     ucCallElevatorState = ESL_DOWN;
  859.                     if (ucElevatorTargetFL==FCL_MAX)
  860.                     {
  861.                         ucElevatorTargetFL = ucTemp;
  862.                         ucElevatorTargetFLListID = i;
  863.                     }
  864.                     else if (ucElevatorTargetFL<ucTemp)
  865.                     {
  866.                         ucElevatorTargetFL  = ucTemp;
  867.                         ucElevatorTargetFLListID = i;
  868.                     }
  869.                 }
  870.             }
  871.             #if 0
  872.             if (ucDirection == ESL_MAX)
  873.             {
  874.                ucDirection = ESL_STANDBY;
  875.                 /*
  876.                 if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  877.                 {
  878.                    ucCallElevatorState = ESL_UP;
  879.                    if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
  880.                    {
  881.                       ucDirection = ESL_UP;
  882.                    }
  883.                    else
  884.                    {
  885.                       ucDirection = ESL_DOWN;
  886.                    }
  887.                 }
  888.                 else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  889.                 {
  890.                    ucCallElevatorState = ESL_DOWN;
  891.                    if (ucElevatorFL<ucGetFloorByFCL(ucFloorCallList[i]))
  892.                    {
  893.                       ucDirection = ESL_UP;
  894.                    }
  895.                    else
  896.                    {
  897.                       ucDirection = ESL_DOWN;
  898.                    }
  899.                 }
  900.                 */
  901.             }
  902.             #endif
  903.         }
  904.     }
  905.     else if (ucElevatorFL == FLOOR_MAX)
  906.     {
  907.         #if 1
  908.         ucDirection = ESL_MAX;
  909.         //优先查找下行呼叫
  910.         for(i=0;i<ucFCLLen;i++)
  911.         {
  912.             ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  913.             if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
  914.             {
  915.                 ucDirection = ESL_DOWN;
  916.                 ucCallElevatorState = ESL_DOWN;
  917.                 if (ucElevatorTargetFL==FCL_MAX)
  918.                 {
  919.                     ucElevatorTargetFL = ucTemp;
  920.                     ucElevatorTargetFLListID = i;
  921.                 }
  922.                 else if (ucElevatorTargetFL<ucTemp)
  923.                 {
  924.                     ucElevatorTargetFL  = ucTemp;
  925.                     ucElevatorTargetFLListID = i;
  926.                 }
  927.             }
  928.         }
  929.         //无下行呼叫开始查找上行呼叫
  930.         if (ucDirection == ESL_MAX)
  931.         {

  932.             for(i=0;i<ucFCLLen;i++)
  933.             {
  934.                 ucTemp = ucGetFloorByFCL(ucFloorCallList[i]);
  935.                 if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
  936.                 {
  937.                     ucDirection = ESL_DOWN;
  938.                     ucCallElevatorState = ESL_UP;
  939.                     if (ucElevatorTargetFL==FCL_MAX)
  940.                     {
  941.                         ucElevatorTargetFL = ucTemp;
  942.                         ucElevatorTargetFLListID = i;
  943.                     }
  944.                     else if (ucElevatorTargetFL>ucTemp)
  945.                     {
  946.                         ucElevatorTargetFL  = ucTemp;
  947.                         ucElevatorTargetFLListID = i;
  948.                     }
  949.                 }
  950.             }
  951.         }
  952.         #else
  953.         for(i=0;i<ucFCLLen;i++)
  954.         {
  955.             if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
  956.             {
  957.                 ucDirection = ESL_DOWN;
  958.                 ucCallElevatorState = ESL_DOWN;
  959.                 break;
  960.             }
  961.         }
  962.         if (ucDirection == ESL_MAX)
  963.         {
  964.             ucDirection = ESL_DOWN;
  965.             ucCallElevatorState = ESL_UP;
  966.         }
  967.         #endif
  968.     }
  969.     return ucDirection;
  970. }

  971. //电梯运行
  972. //规则
  973. //1.电梯停留在最底层时上行优先
  974. //2.电梯停留在中间层时,先按键的楼层呼叫优先
  975. //3.电梯停留在最顶层时,下行优先
  976. //4.与电梯运行方向相同的呼叫优先
  977. //5.电梯到达楼层蜂鸣器提示
  978. //6.电梯当前停留的楼层上行、下行按键均不作用


  979. #if 1
  980. void vElevatorState()
  981. {
  982.     UCHAR i;
  983.     if (ucFCLLen==0)
  984.     {
  985.         return ;
  986.     }

  987.     if (ucElevatorState==ESL_STANDBY) //电梯处于静止待机状态
  988.     {
  989.         ucElevatorState = ucGetDirection();
  990.         if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
  991.         {
  992.             if (ucElevatorState == ESL_UP)
  993.             {
  994.                 vSetElevatorLed(SEL_UP);
  995.             }
  996.             else
  997.             {
  998.                 vSetElevatorLed(SEL_DOWN);
  999.             }
  1000.             bFlashShowArrow = 1;
  1001.             ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1002.             ucElevatorTimeCount = 0;

  1003.         }
  1004.         else
  1005.         {
  1006.             ucElevatorState = ESL_STANDBY;
  1007.             vSetElevatorLed(SEL_NONE);
  1008.         }
  1009.     }
  1010.     else if (ucElevatorState==ESL_UP)
  1011.     {
  1012.         if (ucElevatorTimeCount>=ucElevatorTimeOut)
  1013.         {
  1014.             if (ucElevatorFL<FLOOR_MAX)
  1015.             {
  1016.                 ucElevatorFL ++;
  1017.                 DisBuffer = ucElevatorFL+1;
  1018.                 P1= LED_DISP_NUM[ucElevatorFL+1];
  1019.             }
  1020.             //DelayMS(1000);
  1021.             //P1= LED_DISP_NUM[ucElevatorTargetFL+1]; //test
  1022.             //DelayMS(1000);

  1023.             if (ucElevatorTargetFL == ucElevatorFL)
  1024.             {
  1025.                 if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_UP_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_UP_MAX))
  1026.                 {
  1027.                     vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1028.                 }
  1029.                 else if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_DOWN_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_DOWN_MAX))
  1030.                 {
  1031.                     vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1032.                 }
  1033.                 vDelFCLItem(ucElevatorTargetFLListID);
  1034.                 vSoundOnOff(ON,50);
  1035.                 vSoundOnOff(OFF,50);
  1036.                 vSoundOnOff(ON,50);
  1037.                 vSoundOnOff(OFF,0);
  1038.                 //此层上行及下行按钮均按下了且目前只有此层有呼叫
  1039.                 if (ucFCLLen==1)
  1040.                 {
  1041.                     if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[0]))
  1042.                     {
  1043.                         if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  1044.                         {
  1045.                             vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1046.                         }
  1047.                         else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  1048.                         {
  1049.                             vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1050.                         }
  1051.                         vDelFCLItem(0);
  1052.                     }
  1053.                 }
  1054.             }

  1055.             //已经到达最顶层
  1056.             if (ucElevatorFL==FLOOR_MAX)
  1057.             {
  1058.                 for(i=0;i<ucFCLLen;i++)
  1059.                 {
  1060.                     if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[i]))
  1061.                     {
  1062.                        if ((ucFloorCallList[i]>=FCL_UP_MIN)&&(ucFloorCallList[i]<=FCL_UP_MAX))
  1063.                        {
  1064.                             vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1065.                        }
  1066.                        else if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX))
  1067.                        {
  1068.                             vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1069.                        }
  1070.                        //vDelFCLItem(ucFloorCallList[i]);
  1071.                        //vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1072.                        vSoundOnOff(ON,50);
  1073.                        vSoundOnOff(OFF,50);
  1074.                        vSoundOnOff(ON,50);
  1075.                        vSoundOnOff(OFF,0);
  1076.                        break;
  1077.                     }
  1078.                 }
  1079.             }

  1080.             //计算接下来的方向及楼层
  1081.             ucElevatorState = ucGetDirection();

  1082.             //P1= LED_DISP_NUM[ucElevatorTargetFL+1]; //test
  1083.             //DelayMS(1000);

  1084.             if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
  1085.             {
  1086.                 if (ucElevatorState == ESL_UP)
  1087.                 {
  1088.                     vSetElevatorLed(SEL_UP);
  1089.                 }
  1090.                 else
  1091.                 {
  1092.                     vSetElevatorLed(SEL_DOWN);
  1093.                 }
  1094.                 bFlashShowArrow = 1;
  1095.             }
  1096.             else
  1097.             {
  1098.                 ucElevatorState = ESL_STANDBY;
  1099.                 /*
  1100.                 if (ucElevatorTargetFL = ucElevatorFL)
  1101.                 {
  1102.                     vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1103.                     vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1104.                 }
  1105.                 */
  1106.                 vSetElevatorLed(SEL_NONE);
  1107.             }
  1108.             ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1109.             ucElevatorTimeCount = 0;
  1110.         }
  1111.     }
  1112.     else if (ucElevatorState==ESL_DOWN)
  1113.     {
  1114.         if (ucElevatorTimeCount>=ucElevatorTimeOut)
  1115.         {
  1116.             if (ucElevatorFL>FLOOR_MIN)
  1117.             {
  1118.                 ucElevatorFL --;
  1119.                 DisBuffer = ucElevatorFL+1;
  1120.                 P1= LED_DISP_NUM[ucElevatorFL+1];
  1121.             }

  1122.             if (ucElevatorTargetFL == ucElevatorFL)
  1123.             {
  1124.                 if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_UP_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_UP_MAX))
  1125.                 {
  1126.                     vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1127.                 }
  1128.                 else if ((ucFloorCallList[ucElevatorTargetFLListID]>=FCL_DOWN_MIN)&&(ucFloorCallList[ucElevatorTargetFLListID]<=FCL_DOWN_MAX))
  1129.                 {
  1130.                     vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1131.                 }
  1132.                 //vDelFCLItem(ucFloorCallList[ucElevatorTargetFLListID]);
  1133.                 vDelFCLItem(ucElevatorTargetFLListID);
  1134.                 //vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);

  1135.                 vSoundOnOff(ON,50);
  1136.                 vSoundOnOff(OFF,50);
  1137.                 vSoundOnOff(ON,50);
  1138.                 vSoundOnOff(OFF,0);
  1139.                 //此层上行及下行按钮均按下了且目前只有此层有呼叫
  1140.                 if (ucFCLLen==1)
  1141.                 {
  1142.                     if (ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[0]))
  1143.                     {
  1144.                         if ((ucFloorCallList[0]>=FCL_UP_MIN)&&(ucFloorCallList[0]<=FCL_UP_MAX))
  1145.                         {
  1146.                             vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1147.                         }
  1148.                         else if ((ucFloorCallList[0]>=FCL_DOWN_MIN)&&(ucFloorCallList[0]<=FCL_DOWN_MAX))
  1149.                         {
  1150.                             vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1151.                         }
  1152.                         vDelFCLItem(0);
  1153.                     }
  1154.                 }

  1155.             }
  1156.             /*
  1157.             for(i=0;i<ucFCLLen;i++)
  1158.             {
  1159.                 if ((ucFloorCallList[i]>=FCL_DOWN_MIN)&&(ucFloorCallList[i]<=FCL_DOWN_MAX)
  1160.                     &&(ucElevatorFL==ucGetFloorByFCL(ucFloorCallList[i]))
  1161.                     )
  1162.                 {
  1163.                    vDelFCLItem(ucFloorCallList[i]);
  1164.                    vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1165.                    vSoundOnOff(ON,50);
  1166.                    vSoundOnOff(OFF,50);
  1167.                    vSoundOnOff(ON,50);
  1168.                    vSoundOnOff(OFF,0);
  1169.                    break;
  1170.                 }
  1171.             }
  1172.             */
  1173.             ucElevatorState = ucGetDirection();
  1174.             if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
  1175.             {
  1176.                 if (ucElevatorState == ESL_UP)
  1177.                 {
  1178.                     vSetElevatorLed(SEL_UP);
  1179.                 }
  1180.                 else
  1181.                 {
  1182.                     vSetElevatorLed(SEL_DOWN);
  1183.                 }
  1184.                 bFlashShowArrow = 1;
  1185.             }
  1186.             else
  1187.             {
  1188.                 ucElevatorState = ESL_STANDBY;
  1189.                 if (ucElevatorTargetFL == ucElevatorFL)
  1190.                 {
  1191.                     vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1192.                     vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1193.                 }
  1194.                 vSetElevatorLed(SEL_NONE);
  1195.             }
  1196.             ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1197.             ucElevatorTimeCount = 0;
  1198.         }
  1199.     }

  1200. }



  1201. #else
  1202. void vElevatorState()
  1203. {
  1204.     UCHAR i,ucTargetFl;
  1205.     if (ucElevatorState==ESL_STANDBY) //电梯处于静止待机状态
  1206.     {
  1207.         ucTargetFl = ucGetElevatorUpTarget();
  1208.         if (ucTargetFl!=FL_MAX)
  1209.         {
  1210.             ucElevatorTargetFL = ucTargetFl;
  1211.             ucElevatorState = ESL_UP;
  1212.             vSetElevatorLed(SEL_UP);
  1213.             bFlashShowArrow = 1;
  1214.             ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1215.             ucElevatorTimeCount = 0;
  1216.         }
  1217.         else
  1218.         {
  1219.             ucTargetFl = ucGetElevatorDownTarget();
  1220.             if (ucTargetFl!=FL_MAX)
  1221.             {
  1222.                 ucElevatorTargetFL = ucTargetFl;
  1223.                 ucElevatorState = ESL_DOWN;
  1224.                 vSetElevatorLed(SEL_DOWN);
  1225.                 bFlashShowArrow = 1;
  1226.                 ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1227.                 ucElevatorTimeCount = 0;
  1228.             }
  1229.         }
  1230.     }
  1231.     else if (ucElevatorState==ESL_UP) //电梯处于向上运行状态
  1232.     {
  1233.         if (ucElevatorTimeCount>=ucElevatorTimeOut)
  1234.         {
  1235.             if (ucElevatorFL<FLOOR_MAX)
  1236.             {
  1237.                 ucElevatorFL ++;
  1238.                 DisBuffer = ucElevatorFL+1;
  1239.                 P1= LED_DISP_NUM[ucElevatorFL+1];
  1240.             }
  1241.             if (ucElevatorFL==ucElevatorTargetFL)
  1242.             {
  1243.                 vSetFloorLed(ucElevatorFL,CEL_UP,LED_OFF);
  1244.                 vSoundOnOff(ON,50);
  1245.                 vSoundOnOff(OFF,50);
  1246.                 vSoundOnOff(ON,50);
  1247.                 vSoundOnOff(OFF,0);
  1248.             }
  1249.             if (ucElevatorFL <FLOOR_MAX)
  1250.             {
  1251.                 ucTargetFl = ucGetElevatorUpTarget();

  1252.                 if (ucTargetFl!=FL_MAX)
  1253.                 {
  1254.                     ucElevatorTargetFL = ucTargetFl;
  1255.                     ucElevatorState = ESL_UP;
  1256.                     vSetElevatorLed(SEL_UP);
  1257.                     bFlashShowArrow = 1;
  1258.                     ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1259.                     ucElevatorTimeCount = 0;
  1260.                 }
  1261.                 else
  1262.                 {
  1263.                     ucTargetFl = ucGetElevatorDownTarget();
  1264.                     if (ucTargetFl!=FL_MAX)
  1265.                     {
  1266.                         ucElevatorTargetFL = ucTargetFl;
  1267.                         ucElevatorState = ESL_DOWN;
  1268.                         vSetElevatorLed(SEL_DOWN);
  1269.                         bFlashShowArrow = 1;
  1270.                         ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1271.                         ucElevatorTimeCount = 0;
  1272.                     }
  1273.                     else
  1274.                     {
  1275.                         ucElevatorState = ESL_STANDBY;
  1276.                         vSetElevatorLed(SEL_NONE);
  1277.                     }
  1278.                 }
  1279.             }
  1280.             else
  1281.             {
  1282.                 vSetElevatorLed(SEL_NONE);
  1283.             }
  1284.             ucElevatorTimeCount = 0;
  1285.         }
  1286.     }
  1287.     else if (ucElevatorState==ESL_DOWN) //电梯处于向下运行状态
  1288.     {
  1289.         if (ucElevatorTimeCount>=ucElevatorTimeOut)
  1290.         {
  1291.             if (ucElevatorFL>FLOOR_MIN)
  1292.             {
  1293.                 ucElevatorFL --;
  1294.                 DisBuffer = ucElevatorFL+1;
  1295.                 P1= LED_DISP_NUM[ucElevatorFL+1];
  1296.             }
  1297.             if (ucElevatorFL==ucElevatorTargetFL)
  1298.             {
  1299.                 vSetFloorLed(ucElevatorFL,CEL_DOWN,LED_OFF);
  1300.                 vSoundOnOff(ON,50);
  1301.                 vSoundOnOff(OFF,50);
  1302.                 vSoundOnOff(ON,50);
  1303.                 vSoundOnOff(OFF,0);
  1304.             }
  1305.             if (ucElevatorFL >FLOOR_MIN)
  1306.             {
  1307.                 ucTargetFl = ucGetElevatorDownTarget();

  1308.                 if (ucTargetFl!=FL_MAX)
  1309.                 {
  1310.                     ucElevatorTargetFL = ucTargetFl;
  1311.                     ucElevatorState = ESL_DOWN;
  1312.                     vSetElevatorLed(SEL_DOWN);
  1313.                     bFlashShowArrow = 1;
  1314.                     ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1315.                     ucElevatorTimeCount = 0;
  1316.                 }
  1317.                 else
  1318.                 {
  1319.                     ucTargetFl = ucGetElevatorUpTarget();
  1320.                     if (ucTargetFl!=FL_MAX)
  1321.                     {
  1322.                         ucElevatorTargetFL = ucTargetFl;
  1323.                         ucElevatorState = ESL_UP;
  1324.                         vSetElevatorLed(SEL_UP);
  1325.                         bFlashShowArrow = 1;
  1326.                         ucElevatorTimeOut = TIME_ELEVATOR_FLOOR_SPEED;
  1327.                         ucElevatorTimeCount = 0;
  1328.                     }
  1329.                     else
  1330.                     {
  1331.                         ucElevatorState = ESL_STANDBY;
  1332.                         vSetElevatorLed(SEL_NONE);
  1333.                     }
  1334.                 }
  1335.             }
  1336.             else
  1337.             {
  1338.                 vSetElevatorLed(SEL_NONE);
  1339.             }
  1340.             ucElevatorTimeCount = 0;
  1341.         }
  1342.     }
  1343. }
  1344. #endif

  1345. //LED状态灯控制
  1346. void vLedState()
  1347. {

  1348. }

  1349. //箭头闪烁控制
  1350. void vFlahArrow()
  1351. {
  1352.    if ((ucElevatorState!=ESL_UP)&&(ucElevatorState!=ESL_DOWN))
  1353.    {
  1354.        return ;
  1355.    }
  1356.    if (ucFlashArrowTimeCount>=TIME_FLASH_ARROW_COUNT)
  1357.    {
  1358.        if ((bFlashShowArrow)) //当前显示的是内容
  1359.        {
  1360.            vSetElevatorLed(SEL_NONE);
  1361.            bFlashShowArrow = 0;
  1362.        }
  1363.        else //当前显示的是空白
  1364.        {
  1365.            if (ucElevatorState== ESL_UP)
  1366.            {
  1367.                vSetElevatorLed(SEL_UP);
  1368.            }
  1369.            else if (ucElevatorState == ESL_DOWN)
  1370.            {
  1371.                vSetElevatorLed(SEL_DOWN);
  1372.            }
  1373.            bFlashShowArrow = 1;
  1374.        }
  1375.        ucFlashArrowTimeCount= 0;
  1376.    }
  1377. }

  1378. //字符闪烁控制
  1379. void vFlashChar()
  1380. {

  1381.    if (ucFlashTimeCount>=TIME_FLASH_FREQ_COUNT)
  1382.    {
  1383.        if ((bFlashShowBlanking)||(bKeyRepeated)) //当前显示的是空白,按键连续动作时取消闪烁
  1384.        {

  1385.             bFlashShowBlanking = 0;
  1386.        }
  1387.        else //当前显示的是内容
  1388.        {

  1389.             bFlashShowBlanking = 1;
  1390.        }
  1391.        ucFlashTimeCount = 0;
  1392.    }
  1393. }


  1394. //读取按键及处理
  1395. void vReadKey()
  1396. {
  1397.     if (!bKeyReaded)
  1398.         {
  1399.             return ;
  1400.         }

  1401.     switch(ucKeyDet)
  1402.         {
  1403.             
  1404.             default:
  1405.             break;
  1406.     }
  1407.     bKeyReaded = 0;
  1408.     ucKeyDet = KEY_MAX;
  1409. }

  1410. //主函数
  1411. main()
  1412. {
  1413.     //软硬件初始化
  1414.     vInit();

  1415.     while (1)
  1416.     {
  1417.         //键盘处理

  1418.         //LED状态灯
  1419.                 vLedState();
  1420.                 //字符闪烁控制
  1421.                 vFlashChar();

  1422.             //电梯运行
  1423.         vElevatorState();

  1424.             //箭头闪烁控制
  1425.         vFlahArrow();
  1426.     }   
  1427. }                        


  1428. //时钟中断处理函数(含显示及按键检测)
  1429. void vTimeStateMachine() interrupt 1
  1430. {
  1431.         //T0为10ms中断
  1432.         //UCHAR ucKeyDecode;
  1433.         TH0 = SEQ_TIMER0_H;  
  1434.         TL0 = SEQ_TIMER0_L;

  1435.         ucBaseTimeCount ++;

  1436.         if (ucBaseTimeCount>=TIME_50MS_COUNT) //50ms计数
  1437.         {
  1438.            ucBaseTimeCount = 0;
  1439.            //按键状态计数
  1440.            uiKeyTimeCount ++;

  1441.            //按键按下延时检测
  1442.            if (ucKeyDownCount<TIME_KEY_REPEAT_COUNT)
  1443.            {
  1444.               ucKeyDownCount ++;
  1445.            }
  1446.            //电梯运行计数
  1447.            if ((ucElevatorState==ESL_UP)||(ucElevatorState==ESL_DOWN))
  1448.            {
  1449.                if (ucElevatorTimeCount<ucElevatorTimeOut)
  1450.                {
  1451.                   ucElevatorTimeCount ++;
  1452.                }

  1453.                if (ucFlashArrowTimeCount<TIME_FLASH_ARROW_COUNT)
  1454.                {
  1455.                   ucFlashArrowTimeCount ++;
  1456.                }

  1457.            }

  1458.         }

  1459.         //按键检测
  1460.         //上行
  1461.         if ((sbL1KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_1))
  1462.         {
  1463.             vSetFloorLed(FL_1,CEL_UP,LED_ON);
  1464.             vAdd2FCL(FCL_FL1_UP);
  1465.         }
  1466.         if ((sbL2KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_2))
  1467.         {
  1468.             vSetFloorLed(FL_2,CEL_UP,LED_ON);
  1469.             vAdd2FCL(FCL_FL2_UP);
  1470.         }
  1471.         if ((sbL3KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_3))
  1472.         {
  1473.             vSetFloorLed(FL_3,CEL_UP,LED_ON);
  1474.             vAdd2FCL(FCL_FL3_UP);
  1475.         }
  1476.         if ((sbL4KeyUp==KEY_DOWN)&&(ucElevatorFL!=FL_4))
  1477.         {
  1478.             vSetFloorLed(FL_4,CEL_UP,LED_ON);
  1479.             vAdd2FCL(FCL_FL4_UP);
  1480.         }
  1481.         //下行
  1482.         if ((sbL2KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_2))
  1483.         {
  1484.             vSetFloorLed(FL_2,CEL_DOWN,LED_ON);
  1485.             vAdd2FCL(FCL_FL2_DOWN);
  1486.         }
  1487.         if ((sbL3KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_3))
  1488.         {
  1489.             vSetFloorLed(FL_3,CEL_DOWN,LED_ON);
  1490.             vAdd2FCL(FCL_FL3_DOWN);
  1491.         }
  1492.         if ((sbL4KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_4))
  1493.         {
  1494.             vSetFloorLed(FL_4,CEL_DOWN,LED_ON);
  1495.             vAdd2FCL(FCL_FL4_DOWN);
  1496.         }
  1497.         if ((sbL5KeyDown==KEY_DOWN)&&(ucElevatorFL!=FL_5))
  1498.         {
  1499.             vSetFloorLed(FL_5,CEL_DOWN,LED_ON);
  1500.             vAdd2FCL(FCL_FL5_DOWN);
  1501.         }
  1502.                 }
复制代码
0.png
全部资料51hei下载地址:
11.zip (129.92 KB, 下载次数: 8)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

gemxie 发表于 2019-5-16 17:34 | 显示全部楼层
谢谢楼主的无限奉献了,可以好哈学习一波
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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