文档介绍:该【2025年度C语言程序设计报告书 】是由【读书百遍】上传分享,文档一共【28】页,该文档可以免费在线阅读,需要了解更多关于【2025年度C语言程序设计报告书 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。《C語言程序设计》试验设计汇报 学院:_机电工程专业班级:自动化31班学生姓名:王刘鄞 学号:指导老师:段江涛 设计題目::三层电梯状态机 3前期只考虑了三层电梯模型,由此产生了(版本一)后期对电梯程序进行了修改,适应多楼层(版本二): (版本一),适应多楼层(版本二): :状态图图二: 17测试一:电梯内楼层按键的使用及演示(目前基于三层)测试二:楼层外上下按键的使用及演示测试三:开关门按钮的使用及演示测试四:自动到一楼综合测试分析以上测试成果对于版本一及版本二都合用,实测对的。 26设计題目:三层电梯状态机課程设计设计方案:版本一:以每个楼层也許的状况判断分析---穷举法通过设计多种状态的翻转,运用状态机模型,来实現电梯的正常运转,首先对所有也許发生的事件进行罗列,并进行归类,抵达一种好的状态分析。根据平常经验分析,我采用的是把电梯的运动进行归类,把门分為四种状态,门开(Dooropen),门正在关(DoorClosing),电梯上升(Movingup),下降(Movingdown),而把什么都不做视為第一状态(Idle,以及在里面判断与否有外部事件的发生),在这状态下,可以实現向其他四状态的跳转。版本二:只对事件不对楼层判断----一般化在版本一上进行了,代码的改善,使用静态检测对楼层进行了一般化的处理,:参照图二:详细条件判断状态图(插图) 一:初始化二:移动下降模块上升模块三:开关门开门模块关门模块也許发生的Events:E1:门内开门按钮(OpenDoorLight)E2:门内关门按钮(CloseDoorLight)E3:门内楼层按钮(PanelFloorLight)目前使用三个按钮(1,2,3)E4:门外up呼喊按钮(CallLight)E5:门外down呼喊按钮(CallLight):状态机重要函数及自已发挥部分/*****************************************************************************/voidIdlestate(int*state);//初始化函数voidmovingup(int*state);//向上升函数voidmovingdown(int*state);//下降函数voidDooropen(int*state);//开门函数voidDoorclosing(int*state)//门关闭函数初始化函数根据条件跳转上升下降及开门函数;上升下降函数根据条件跳转开门函数;门开函数根据条件调用门关闭函数;门关闭根据条件调用初始化及门开;三层电梯使用到的函数/*******************************************************************///系统与否运行boolIsElevatorRunning();//电梯门外Up/Down呼喊按钮灯(CallLight)boolGetPanelFloorLight(intfloor);voidSetCallLight(intfloor,boolup,bools);//电梯门内楼层按钮灯(PanelFloorLight)boolGetPanelFloorLight(intfloor);//IdleWhatFloorToGoTo()等函数中用voidSetPanelFloorLight(intfloor,bools);//电梯门内开关门按钮灯boolGetOpenDoorLight();voidSetOpenDoorLight(bools);boolGetCloseDoorLight();voidSetCloseDoorLight(bools);//电梯箱体门boolIsDoorOpen(intfloor);boolIsDoorClosed(intfloor);voidSetDoor(intfloor,boolopen);//设置电机功率,power=1,全速上升;-1,全速下降;0,停止voidSetMotorPower(doublepower);//一定期间无动作,自动到1楼externvoidAutoTo1Floor();//取消自动到1楼externvoidCancelTo1Floor();//获取电梯箱体目前所在楼层doubleGetFloor();//浮点数,,表达电梯箱体处在1层到2层的中间intGetNearestFloor();//GetFloor()函数的四舍五入值if(fabs(GetFloor()-GetNearestFloor())<Lib_FloorTolerance){抵达GetNearestFloor()层}//静态监测,电梯处在空闲状态,确定下一步的运动方向和所到楼层(目的楼层)intIdleWhatFloorToGoTo(bool*up);intfloor;boolup;floor=IdleWhatFloorToGoTo(&up);//动态监测,电梯正在上升時,检测将要抵达停止的近来楼层(目的楼层)intGoingUpToFloor();//动态监测,电梯正在下降時,检测将要抵达停止的近来楼层(目的楼层)intGoingDownToFloor();/*******************************************************************/,电梯停止在某楼层,门是关闭的,处在静止状态,等待有关事件的发生,从而转换到下一种状态。(S1)检查E3、E4、E5事件。静态检测,boolup;目的楼层=IdleWhatFloorToGoTo(&up);关闭本层门外up按钮,SetCallLight();既消费门外up按钮,防止下一周期反复处理此按钮行為。(S2)同(S1),消费门外down按钮。1层以上,一定期间无动作,自动下降到1楼。AutoTo1Floor();[其他 状态, 取消此功能,CancelTo1Floor()](S3)检查E1事件,开门,消费开门按钮;上升(up&&E4事件),开门,消费门外up按钮下降(!up&&E5事件),开门,消费门外down按钮(S4)检查E2事件,此時门应当是关闭的,因此仅读取关门灯,并关闭关门灯,既消费按键行為,防止下一周期反复处理该按钮的行為。if(GetCloseDoorLight()){SetCloseDoorLight(false);return;}Moving状态:MovingUp/MovingDown跳转到DoorOpen(S5)检查E3、E4、E5事件。动态检测,目的楼层floor=GoingUpToFloor();if(fabs(GetFloor()-floor)<Lib_FloorTolerance)抵达目的楼层,停止,开门消费门外up按钮;到了最高层Lib_FloorNum,消费门外down按钮。消费门内楼层按钮。(D)检查E1、E2事件,无动作,消费开/关门按钮。(S6)检查E3、E4、E5事件。动态检测,目的楼层=GoingDownToFloor();其他与 (S5)类似。DoorOpen状态:电梯门打开跳转到àDoorClosing(S7)检查E2事件,转而关门,GetCloseDoorLight(),SetDoor();消费关门按钮。开门結束后,自动进入关门状态。IsDoorOpen();SetDoor();检查E1事件,无动作,消费开门按钮。DoorClosing状态:正在关门跳转到àDoorOpen(S8)检查E1事件,转而开门。GetOpenDoorLight();SetDoor();消费关门按钮。检查E2事件,无动作,消费关门按钮。DoorClosing状态:正在关门àIdle(S9)关门結束后,进入Idle状态。IsDoorClosed();,1层以上,一定期间无动作,自动下降到1楼。AutoTo1Floor();[其他状态,取消此功能,CancelTo1Floor()分别在某一层也許发生的事件进行判断,并进行对应的处理。没有使用部分函数代码及注解分析如下:floor=GetNearestFloor(); up=1;//up这里只是充当数值上或者下switch(floor)//到了每一层进行判断各层会发生的状况 { case1: if(GetCallLight(1,up))//在第一楼向上的按了 { *state=DoorOpen; //开门 printf("Transition:fromIdlestatetoDoorOpen.\n"); return; } //假如在2,3层或者是按楼层键 if(GetPanelFloorLight(2)|GetCallLight(2,up)|GetCallLight(2,0)| GetPanelFloorLight(3)|GetCallLight(3,0)) { *state=MovingUp;//上升状态 printf("Transition:fromIdlestatetoMovingUp.\n"); return; } //开关门判断 if(GetOpenDoorLight())//假如开门按钮打开 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; } break; case2: //在第二层 if(GetPanelFloorLight(3)|GetCallLight(3,0)|GetCallLight(3,up)) //第三层出現按键有用 { *state=MovingUp; //上升 printf("Transition:fromIdlestatetoMovingUp.\n"); return; } if(GetPanelFloorLight(1)|GetCallLight(1,0)|GetCallLight(1,up))//第一层按键 { *state=MovingDown;//下降 SetCallLight(floor,0,false); printf("Transition:fromIdlestatetoMovingDown.\n"); return; } if(GetOpenDoorLight())//假如开门按钮打开 { SetDoor(floor,true);//开门 SetOpenDoorLight(false); *state=DoorOpen; return; } if(GetCloseDoorLight())//有关门按键就关门 { SetDoor(floor,false); SetCloseDoorLight(false); *state=DoorClosing; return; }AutoTo1Floor();//自动到一楼 break; case3: //第三层碰到的状况