电梯控制系统C语言程序
电梯模拟c语言课程设计
电梯模拟c语言课程设计一、课程目标知识目标:1. 让学生掌握C语言的基本语法,包括变量定义、数据类型、运算符和表达式。
2. 使学生了解电梯运行原理,运用C语言实现电梯的模拟控制。
3. 帮助学生掌握程序流程控制,包括顺序结构、分支结构和循环结构。
技能目标:1. 培养学生运用C语言编写程序的能力,实现电梯的楼层显示、上下行控制等功能。
2. 提高学生分析问题、解决问题的能力,通过编程解决电梯运行中的实际问题。
3. 培养学生团队合作精神,共同完成课程设计任务。
情感态度价值观目标:1. 激发学生对计算机编程的兴趣,提高学习积极性。
2. 培养学生严谨、细致的学习态度,养成良好的编程习惯。
3. 增强学生对电梯等现代交通工具的原理认识,提高科技创新意识。
本课程针对高中年级学生,结合C语言课程内容,以电梯模拟为载体,使学生将所学知识应用于实际场景。
课程注重培养学生的编程能力和实际问题解决能力,同时注重团队合作和情感态度的培养,使学生在知识、技能和情感态度价值观方面取得全面发展。
通过本课程的学习,学生将能够独立完成电梯模拟程序的设计与实现,为后续学习打下坚实基础。
二、教学内容1. C语言基础回顾:变量定义、数据类型、运算符和表达式。
2. 程序流程控制:顺序结构、分支结构(if语句、switch语句)、循环结构(for循环、while循环)。
3. 电梯运行原理:电梯的基本结构、运行模式、楼层显示、上下行控制。
4. 函数与模块化编程:函数定义、调用、参数传递;模块化编程思想。
5. 数组与字符串:一维数组、二维数组;字符串的基本操作。
6. 指针与动态内存分配:指针的概念、使用方法;动态内存分配函数。
7. 结构体与文件操作:结构体的定义、使用;文件读写操作。
教学内容安排和进度:1. 第一周:C语言基础回顾,程序流程控制。
2. 第二周:电梯运行原理,函数与模块化编程。
3. 第三周:数组与字符串,指针与动态内存分配。
4. 第四周:结构体与文件操作,综合实践。
电梯控制课程设计c语言
电梯控制课程设计c语言一、教学目标本课程的教学目标是使学生掌握电梯控制的基本原理,学会使用C语言进行电梯控制程序的编写。
具体分为三个部分:1.知识目标:使学生了解电梯的工作原理、结构及其控制系统,掌握C语言的基本语法和编程方法。
2.技能目标:培养学生运用C语言进行程序设计的能力,能够独立完成简单的电梯控制程序。
3.情感态度价值观目标:培养学生对编程工作的热爱,提高其动手能力和创新精神,使其认识到科技对生活的改变。
二、教学内容教学内容主要包括三个部分:1.电梯的基本原理和工作方式:包括电梯的分类、结构、控制系统等。
2.C语言基础知识:包括数据类型、运算符、控制结构、函数等。
3.电梯控制程序设计:利用C语言编写电梯的控制程序,包括电梯的运行逻辑、楼层检测、呼叫响应等。
三、教学方法为了达到上述教学目标,将采用以下教学方法:1.讲授法:讲解电梯的基本原理、C语言基础知识以及程序设计方法。
2.案例分析法:分析典型的电梯控制程序,使学生更好地理解电梯控制原理和编程方法。
3.实验法:让学生动手编写电梯控制程序,培养其实际操作能力和创新精神。
四、教学资源为了支持教学内容和教学方法的实施,将准备以下教学资源:1.教材:《C语言程序设计》、《电梯原理与控制》等。
2.参考书:提供相关的技术资料和论文,供学生深入研究。
3.多媒体资料:制作课件、视频等,帮助学生更好地理解教学内容。
4.实验设备:计算机、编程环境、电梯模型等,用于实践教学。
五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:评估学生在课堂上的参与度、提问回答等情况,占比20%。
2.作业:评估学生完成的编程练习和课后作业,占比30%。
3.考试成绩:包括期中考试和期末考试,占比50%。
以上评估方式客观、公正,能够全面反映学生的学习成果。
六、教学安排本课程的教学安排如下:1.教学进度:按照教材的章节顺序进行教学,确保完成所有教学内容。
2.教学时间:每周安排2课时,共16周,确保在有限的时间内完成教学任务。
C语言电梯驱动程序 实现加速-匀速-减速功能
#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define KeyPort P3sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;/*----------------1-2相励磁时序-----------------*/#define Coil_A1 {A1=0;B1=1;C1=1;D1=1;}//AC相导通#define Coil_B1 {A1=0;B1=0;C1=1;D1=1;}//AC、BC相导通#define Coil_C1 {A1=1;B1=0;C1=1;D1=1;}//BC相通电#define Coil_D1 {A1=1;B1=0;C1=0;D1=1;}//BC、~AC导通#define Coil_E1 {A1=1;B1=1;C1=0;D1=1;}//~AC导通#define Coil_F1 {A1=1;B1=1;C1=0;D1=0;}//~AC、~BC导通#define Coil_J1 {A1=1;B1=1;C1=1;D1=0;}//~BC导通#define Coil_H1 {A1=0;B1=1;C1=1;D1=0;}//~BC、AC相导通#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电void kongzhi(void);uchar rate=60;//速率uchar flat=0;void Timer0_isr(void);void Timer0_isr1(void);unsigned char KeyScan();void DelayUs2x(unsigned char t){while(--t);}void DelayMs(unsigned char t){while(t--)//大致延时1mS{DelayUs2x(245);DelayUs2x(245);}}void delay(uint sp) //用于控制速度sp*1ms{uint i,j;for(i=sp;i>0;i--)for(j=100;j>0;j--);}/*------------加速、匀速、减速运行------------------------*/ void kongzhi(void){uint count;for(rate=84;rate>22;rate=rate-6) //加速{Timer0_isr();}for(count=130;count>0;count--) //匀速{Timer0_isr();}for(rate=22;rate<84;rate=rate+6) //减速{Timer0_isr();}}/*------------------------------------------------主函数------------------------------------------------*/main(){uchar num;Coil_OFF ;while(1){num=KeyScan(); //循环调用按键扫描if(num==5){flat=1;kongzhi();}if(num==6){flat=2;kongzhi();}else{Coil_OFF;}}}/*---------------正反转程序-----------------------------*/ void Timer0_isr(void){static unsigned char i=0;if(flat==1){switch(i){case 0:Coil_A1;delay(rate);i++;case 1:Coil_B1;delay(rate);i++;case 2:Coil_C1;delay(rate);i++;case 3:Coil_D1;delay(rate);i++;case 4:Coil_E1;delay(rate);i++;case 5:Coil_F1;delay(rate);i++;case 6:Coil_J1;delay(rate);i++;case 7:Coil_H1;delay(rate);i++;case 8:i=0;}}else if(flat==2){switch(i){case 0:Coil_H1;delay(rate);i++;case 1:Coil_J1;delay(rate);i++;case 2:Coil_F1;delay(rate);i++;case 3:Coil_E1;delay(rate);i++;case 4:Coil_D1;delay(rate);i++;case 5:Coil_C1;delay(rate);i++;case 6:Coil_B1;delay(rate);i++;case 7:Coil_A1;delay(rate);i++;case 8:i=0;}}}/*------------------------------------------------按键扫描函数,返回扫描键值------------------------------------------------*/unsigned char KeyScan(){unsigned char keyvalue;if(KeyPort!=0xff){DelayMs(10);if(KeyPort!=0xff){keyvalue=KeyPort;while(KeyPort!=0xff);switch(keyvalue){case 0xfe:return 1;break; ///???case 0xfd:return 2;break;case 0xfb:return 3;break;case 0xf7:return 4;break;case 0xef:return 5;break;case 0xdf:return 6;break;case 0xbf:return 7;break;case 0x7f:return 8;break;default:return 0;break;}}}return 0;}。
电梯控制程序源代码(带流程图-功能分解、源代码)
电梯控制程序源代码(带流程图-功能分解、源代码)《综合电子创新训练》研究报告研究题目:CTS1600-1控制技术综合试验院系名称:专业名称:学生姓名:指导教师:xxxx年 xx月 xx日xxxxxxxxxx目录第一章绪论 (1)1.1课题背景与目的 (1)1.2课题研究方法 (1)第二章电梯模型硬件设备 (2)2.1 实验单片机模型与接口定义 (2)2.1.1 实验用单片机 (2)2.1.2 单片机接口定义 (3)2.1.3 I/O接口DATA控制命令表 (4)2.2 电梯控制命令说明 (6)2.3 实验用电梯模型 (8)第三章与电梯模型相关的实验程序 (10)3.1数码管连续显示 (10)3.1.1 程序流程图 (10)3.1.2 功能简介 (10)3.1.3 功能实现过程 (11)3.1.4 问题的解决及收获 (11)3.2 外部按键灯连续闪烁 (12)3.2.1 程序流程图 (12)3.2.2 功能简介 (12)3.2.3 功能实现过程 (12)3.2.4 问题的解决及收获 (13)3.3 键、灯、数码管 (14)3.3.2 功能简介 (14)3.3.3 功能实现过程 (14)3.3.4 问题的解决及收获 (15)3.4 外部按键上下行 (16)3.4.1 程序流程图 (16)3.4.2 功能简介 (16)3.4.3 功能实现过程 (17)3.4.4 问题的解决及收获 (18)3.5 计算器 (19)3.5.1 程序流程图 (19)3.5.2 功能简介 (21)3.5.3 功能实现过程 (21)3.5.4 问题的解决及收获 (22)3.6 密码锁 (23)3.6.1程序流程图 (23)3.6.2功能简介 (23)3.6.3实现功能过程 (24)3.6.4问题的解决及收获 (24)3.7逐层停自动开关门循环 (25)3.7.1程序流程图 (25)3.7.2功能简介 (27)3.7.3实现功能过程 (27)3.7.4问题的解决及收获 (27)3.8 可记录顺序逐层停自动开关门 (28) 3.8.2功能简介 (28)3.8.3实现功能过程 (29)3.8.4问题的解决及收获 (29)3.9 外部按键电梯 (30)3.9.1 主程序 (30)3.9.2 开关门模块 (31)3.9.3 上下行模块 (32)3.9.4 LED模块 (34)第四章电梯模型完整控制程序 (36)4.1 完整控制程序(main函数) (36)4.1.1 功能说明 (36)4.1.2 功能实现过程 (37)4.1.3 问题的解决及收获 (37)4.2 按键扫描模块(getto函数) (37)4.2.1功能简介 (38)4.2.2 问题的解决及收获 (38)4.3 当前层判断模块(getat函数) (38)4.3.1 功能简介 (38)4.3.2 问题的解决及收获 (38)4.4 电梯门的选通、禁止模块(DoorEnable函数) (38) 4.4.1 功能简介 (38)4.4.2 问题的解决及收获 (38)4.5 电梯开关门模块(openandclose函数) (39)4.5.2 功能实现过程 (39)4.5.3 问题的解决及收获 (39)第五章总结与致谢 (41)5.1 总结 (41)5.2 致谢 (41)附录控制电梯模型相关程序 (42)附录一数码管连续显示 (42)附录二外部按键灯连续闪烁 (43)附录三外部按键逐个亮灭 (45)附录四键、灯、数码管 (47)附录五外部按键上下行 (49)附录六计算器 (51)附录七密码锁 (56)附录八逐层停开关门循环 (59)附录九可记录顺序逐层停自动开关门 (64)附录十外部按键电梯 (70)附录十一完整电梯程序 (77)图目录Figure 1 凌阳单片机 (2)Figure 2 凌阳单片机接口定义 (3)Figure 3 实验用电梯模型 (9)Figure 4 数码管连续显示流程图 (10)Figure 5 外部按键灯连续闪烁流程图 (12)Figure 6 LED1to7流程图 (13)Figure 7 键、灯、数码管流程图 (14)Figure 8 外部按键上下行流程图 (16)Figure 9 计算器数字扫描函数流程图 (19)Figure 10 计算器主函数流程图 (20)Figure 11 密码锁流程图 (23)Figure 12 逐层停自动开关门循环main函数 (25)Figure 13 逐层停自动开关门循环AtAndTo函数 (26) Figure 14 逐层停自动开关门循环OpenAndClose函数 (26) Figure 15 可记录顺序逐层停自动开关门 (28)Figure 16 外部按键电梯主函数流程图 (30)Figure 17 外部按键电梯开关门函数流程图 (31)Figure 18 外部按键电梯上下行函数流程图 (32)Figure 19 外部按键电梯LED函数流程图 (34)Figure 20 外部按键电梯btLED函数流程图 (35)Figure 21 电梯完整程序主函数 (36)Figure 22 电梯完整程序openandclose函数流程图 (39)第一章绪论1.1课题背景与目的现代社会中,电梯已经成为不可缺少的运输设备。
c语言模拟电梯程序
c语言模拟电梯程序我们需要定义电梯的状态。
电梯可以处于静止、上升或下降三种状态中的一种。
我们可以使用一个整型变量来表示电梯的状态,0表示静止,1表示上升,-1表示下降。
接下来,我们需要定义电梯的位置。
电梯可以停在不同的楼层,我们可以使用一个整型变量来表示电梯当前所在的楼层。
我们需要定义一个数组来记录每一层楼的乘客请求。
数组的每一个元素表示该楼层的请求状态,0表示无请求,1表示有上升请求,-1表示有下降请求。
在主程序中,我们可以使用一个循环来模拟电梯的运行过程。
在每一次循环中,我们首先检查电梯当前所在的楼层是否有乘客请求。
如果有请求,我们根据电梯的状态和乘客的请求来确定电梯下一步的动作。
如果电梯处于静止状态,我们可以根据乘客的请求来确定电梯的状态。
如果有上升请求,我们将电梯的状态设为上升;如果有下降请求,我们将电梯的状态设为下降。
如果电梯处于上升状态,我们需要找到最接近电梯当前位置且有上升请求的楼层,然后将电梯移动到该楼层。
如果没有找到符合条件的楼层,则将电梯状态设为静止。
如果电梯处于下降状态,我们需要找到最接近电梯当前位置且有下降请求的楼层,然后将电梯移动到该楼层。
如果没有找到符合条件的楼层,则将电梯状态设为静止。
在每一次循环结束时,我们将输出电梯的状态和位置,以及每一层楼的乘客请求状态。
这样可以让用户清楚地了解电梯的运行过程。
通过以上的步骤,我们可以完成一个简单的电梯模拟程序。
当然,实际的电梯系统要复杂得多,包括更多的功能和安全性考虑。
但是通过这个简单的模拟程序,我们可以初步了解电梯的运行原理和编程实现。
总结一下,本文介绍了如何使用C语言编写一个简单的电梯模拟程序。
通过定义电梯的状态和位置,以及乘客的请求状态,我们可以模拟电梯的运行过程。
通过循环判断电梯的状态和乘客的请求,我们可以确定电梯下一步的动作。
最后,我们输出电梯的状态和位置,以及每一层楼的乘客请求状态,以展示电梯的运行过程。
希望本文对读者理解电梯的工作原理和使用C语言实现电梯模拟程序有所帮助。
电梯控制系统程序
{cf=i;return;}
for(i=nf-1;i>=1;i--)
AIC23#include<reg51.h> 头文件
#include<INTRINS.H> 头文件
#define MAXFLOOR 4 宏定义 令MAXFLOOR=4
#define MOTOR_UP MOTOR_L=0, MOTOR_R=0; 宏定义 MOTOR_UP,令 MOTOR_L=0, MOTOR_R=0
{ if(timer1==20)
{
timer1=0;
if(dir==1)
nf++;
else
{nf--;
}
flag=0;
TR0=0;
P0=LED_CODES[nf];
if(cf==nf)
{TR0=0;ledu=ledd=1;stop=1;return;}
if(call_floor[i]||call_floorup[i])
{cf=i;return;}
for(i=nf+1;i<=MAXFLOOR;i++)
if(call_floor[i]||call_floordown[i])
}
}
void time0_int() interrupt 1 设置定时中断方式1 (当满足一定的条件时,就进入此定时计数器进行定时计数)
{
TH0=0x3C;
TL0=0xB0;
办公楼电梯运行系统C代码
办公楼电梯运行系统C代码#include "stdafx.h"#include#include "大楼.h"#include "Timer1.h"Building building;void display(void *sink,time_t t);void OnEnterBuilding(void *sink,time_t t){int n=NewPersons();int i;for(i=0;i<n;i++)< p="">{PersonNode *p=(PersonNode *)malloc(sizeof(PersonNode)); building.totalPeople+=1;EnterBuilding(p);}}void initBuilder(){int i;building.ptookStair=0;building.totalPeople=0;for(i=0;i<maxelevs;i++)< p="">{building.elevators[i].elevNumber=i;building.elevators[i].floorNumber=0;building.elevators[i].runing=false;building.elevators[i].dir=NODIRECTION;building.elevators[i].inList=0;building.elevators[i].timerID=0;}for(i=0;i<maxfloors;i++)< p="">{building.floors[i].pInFloor=0;building.floors[i].pWaiting=0;}building.timerID=setTimer(0,2000,OnEnterBuilding);setTimer(0,1000,display);}void waitElev(bool wait,PersonNode* one){int floor=one->floorNowOn;if(wait){PushFloorButton(one);building.floors[floor].pWaiting=addPerson(building.floors[fl oor].pWaiting,one);int i;for(i=0;i<maxelevs;i++)< p="">{if( !building.elevators[i].runing && building.elevators[i].floorNumber==floor){ //电梯已停在此,通知等候乘客OnElevtCome(&building.elevators[i],building.floors[floor].p Waiting);}}}else{building.floors[floor].pWaiting=delPerson(building.floors[fl oor].pWaiting,one);}}void PushFloorButton(PersonNode* one){assert(one->state==waitingForElev);int floor=one->floorNowOn;assert(one->destination != floor);if(one->destination>floor)building.floors[floor].up=true;elsebuilding.floors[floor].down=true;}void intoOffice(bool work ,PersonNode *one){int floor=one->floorNowOn;PersonNode *head=building.floors[floor].pInFloor;if(work)building.floors[floor].pInFloor=addPerson(head,one);elsebuilding.floors[floor].pInFloor=delPerson(head,one);}void display(void *sink,time_t t){int i;char s[1000];char szNum[10];HANDLE handle;sprintf(s,"\t\t\t《办公楼电梯运行系统》\n"); strcat(s,"Floor");for(i=0;i<maxelevs;i++)< p="">{ //当前电梯所在楼层strcat(s,"\t");int f=building.elevators[i].floorNumber;sprintf(szNum,"%d",f);strcat(s,szNum);}for( i=MAXFLOORS-1;i>=0;i--){strcat(s,"\n");sprintf(szNum,"%d",i);strcat(s,szNum);// strcat(s,":");if(building.floors[i].up)strcat(s,"U");elsestrcat(s,"-");if(building.floors[i].down)strcat(s,"D");elsestrcat(s,"-");int n=getPersonNum(building.floors[i].pWaiting); if(n==0)sprintf(szNum," ");elsesprintf(szNum,"%d",n);strcat(s,szNum);strcat(s,"\t");for(int j=0;j<maxelevs;j++)< p="">{if(building.elevators[j].floorNumber<="">strcat(s,":\t");elseif(building.elevators[j].floorNumber==i)//elevS[j]->floorNu mber==i){if(building.elevators[j].dir==UP) //elevS[j]->dir==UP)strcat(s,"Up");else if(building.elevators[j].dir==DOWN)strcat(s,"Dn");elsestrcat(s," ");int pn=getPersonNum(building.elevators[j].inList);sprintf(szNum,"%d",pn);strcat(s,szNum);strcat(s,"\t");}else{strcat(s,"\t");}}}strcat(s,"\n");strcat(s," 楼内总人数:");sprintf(szNum,"%d",building.totalPeople);strcat(s,szNum);strcat(s," 走楼梯人数:");int n=getPersonNum(building.ptookStair);sprintf(szNum,"%d",n);strcat(s,szNum);strcat(s," 电梯平均人数:");int k;n=0;for(k=0;k<maxelevs;k++)< p="">{n+=getPersonNum(building.elevators[k].inList);}sprintf(szNum,"%d\n",n/MAXELEVS);strcat(s,szNum);strcat(s," 按任意键结束.");handle=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos={0,0};SetConsoleCursorPosition(handle,pos);DWORD dw;WriteConsole(handle,s,strlen(s),&dw,0);}bool IntoElev(bool in,PersonNode *one,Elevator *elev) { if(in){ //进入电梯// int floor=one->floorNowOn;elev->inList=addPerson(elev->inList,one);elev->buttons[one->destination]=true; //按目标层return true;}else{ //出电梯elev->inList=delPerson(elev->inList,one);return true;}}void takeStair(bool go,PersonNode *one){// int floor=one->floorNowOn;if(go){ //走楼building.ptookStair=addPerson(building.ptookStair,one); }else{ //到达building.ptookStair=delPerson(building.ptookStair,one); }}</maxelevs;k++)<></maxelevs;j++)<></maxelevs;i++)<></maxelevs;i++)<></maxfloors;i++)<></maxelevs;i++)<></n;i++)<>。
C语言电梯程序全部
while(!flag);
flag=0;
}
if(floorin>floorstay & upin_flag==1) //判断内部楼层升降
{
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:num=5;
downin_flag=1;
if(floorin<floorstay & downin_flag==1 )//判断内部楼层下降
uchar num,num1,floorin,floorout,floorstay,temp;
uint downin_flag,upout_flag,downout_flag,upin_flag,flag;
uchar code table[]={
0x06,0x5b,0x4f,
0x66,0x6d,0x7d};
upout_flag=1;
downout_flag=1;
floorout=2;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
void timer0() interrupt 1
{ TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num1++;
P0=table[floorstay-1];
if(num1==20)
电梯控制系统C语言程序
{
TR1=1;
step_down();
TR1=0;
}
}
}
void main()
uint circle;
uchar table_up[]={0x06,0x0c,0x09,0x03}; //步进电机上楼
uchar table_down[]={0x03,0x09,0x0c,0x06}; //步进电机下楼
uchar const lightopen[]={0x00,0x18,0x3c,0x7e,0xff};//流水灯指示电梯门打开
befnum=num;
}
}
befnum=num;
delay(10);
kaimen();
}
///////////////////////////////////下 楼///////////////////////////////////////////
uchar select[]={0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
uchar i,j,num,aa,befnum,lightnum,dnum,abcd,uplay,a,key,define,loop,lable;
{ P0=shuma[dnum/10];
P2=select[0];
delay(1);
P0=shuma[dnum%10];
P2=select[1];
delay(1);
}
void delay2(uint cnt) //延时
h=P3&0x0f;
C语言电梯模拟程序
C语言电梯模拟程序一直以来我对电梯很感兴趣,起初认为用C语言不可能实现电梯模拟,需要多线程的支持,因此一直以来也没有想着做。
最近数据结构习题书的这道题引起了我的注意,通过几天的努力终于实现了,先将程序的实现与大家分享出来。
在这个程序关键是处理好电梯运行状态转换与乘客进出的同步进行。
好在题目要求每次输入时要输入下一个乘客到来的时间,使得程序变简单了。
通过一个模拟时钟,根据模拟时钟判断该运行哪个函数。
以下是模拟时钟的代码。
[cpp]view plaincopy1.void DoTime(){2.//此函数用于模拟时钟3.while(1){4.if(Time>MaxTime)5.return;6. TestPeople();//两个始终都会被调用的函数7. Controler();8.struct Activity* p=activity.next;9.if(p==NULL){10. Time=MaxTime;11. }12.if(p&&Time>=p->time){//取出活动队头的,检测定时是否到了13. activity.next=p->next;14. p->fn();15. free(p);16. }17. Time++;18. }19.}在这个先不管TestPeople()、Controler()是什么,其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。
以下是Activity的具体定义。
[cpp]view plaincopy1.typedef struct Activity{2.int time;3.void(*fn)(void);4.struct Activity* next;5.}Activity;以及全局变量activity[cpp]view plaincopy1.Activity activity={0,NULL,NULL};下面的代码用于将一个函数加入activity链表,这是根据时钟值从小到大插入activity的。
TMS320f2812芯片中的CAN口C语言通信编程
page 2
union CANMDRL - REG { Uint 32 all ; struct CANMDRH - B ITS bit ; struct MBOX { }; union CANMID - REG MID ; union CANMCF - REG MCF ; }; 然后在 CMD 文件中将这些寄存器变量定位 到相应的存储器中即可直接使用 。 实现 TMS320f2812 中 CAN 通信口开发的流 程如图 1 所示 。 4 结 语 SHCAN2000 系统在升级换代的过程中采用 C 语言对 CAN 控制器进行开发 ,其开 发与调试周 期缩短 ,排除故障的能力大大增强 。C 语言良好 的可维护性和纠错性以及 TM S320f2812 芯片本 身的良好性能共同作用 , 必将使升级后的这套系 统在过程控制的 基础上 , 更广泛应用到运动控制 http://www.cnki.net 图1 实现 TM320f2812 中 CAN 通信开发的流程图 1 ) CAN 口初始化 初始化包括使能 CAN 1994-2010 China Academic Journal Electronic Publishing House. All rig hts reserved. ·1 7 0 · 领域中 。 参考文献 : 控 11 卷 制 工 程 第 [2 ] 阳宪惠 . 现场总线技术及应用 [ M ] . 北京 : 清华大 学出版社 , 1 999. [ 3 ] 邬宽明 . CAN 总线原理和应用系统设计 [ M ] . 北 京 : 北京航空航 天大学出版社 , 1996. [ 4 ] 刘辉林 , 张海峰 , 郝培锋 . 鞍钢冷轧薄板厂 CIM S 与底层设备通讯研究 [J ] . 控制工程同 2002 ,9 ( 3 ) : 38241. [ 1 ] 杨乐 平 , 李海涛 , 肖相生 , 等 . LabV IEW 程序设计 与应用 [ M ] . 北京 : 电子工 业出版社 , 2001. [2 ] 武嘉澍 ,陆劲昆 . LabV IEW 图形编程 [ M ] . 北京 : 北京大学出版社 , 2002. [ 3 ] 张宁 , 等 . MC68332 单片机结构与应用 [ M ] . 北 京 : 北京航空航天大学出版社 , 1996. [ 4 ] 周建斌 . 基于 32 位 MCU M C68376 和 16 位定点 DSP TMS320L F2407 的双机式 N GH 电梯控制主 [ 1 ] 张雄伟 , 等 . DSP 集成开发与应用实例 [ M ] . 北 京 : 电子工业 出版社 , 2002. Communication Program of CAN Port of TMS320f2812 Chip (11 Shcool of Electricity and Information , Dalian Railway Institute , Dalian 116028 , China ; 21 Tri2union Instrument corporation ,Dalian Rail way Institute , Dalian 116028 , China) Abstract : For t he sake of making smart device applied to control fi eld which have higher demands of realtime property such as motion control ,SHCAN2000 fieldbus control system selects t he most resent TI chip of TMS 320f2812 which has 32 - bit data line during t he process of t he upgrade. Field Smart devices interlinkage wit h CANBus to accomplish communication function in t he system. Because t he virtue of C language itself takes m any benefits to development of t his CAN system , it is introduced how to use C to develop CAN controller in TMS320f2812 chip . The development and testing period is deduced ,t he ability of fault avoidence is increased. I t can be widy used in motion control proplems. Key words : SHCAN2000 ; TMS 320f2812 ; mailbox ( 上接第 126 页) 该测试系统投入使用以来 ,运行稳定 ,并对多 块相同接口的主板进行了检测 , 很好地满足了客 户的需求 , 至今还未出现较大的2 TMS320f2812 中 CAN 控制器硬件特点 TMS320f2812 中的 CAN 控制器集成了 CAN 总线的物理层和数据链路层 , 它支持 CAN 总线 210A 和 210B 协议 ,CAN 的可 靠的错误检测以及 处理功能都是由控制器的链路层自动完成 。通过 连 接 一 个 3 13 V 的 CAN 收 发 器 可 以 使 TMS320f2812 直接接入 CAN 总线网络 。 TMS320C 2812 中 CAN 控制器的最大优点 就是有 32 个可以逐位屏蔽并带有超时监视和传 送 动态优先级的邮箱 。这 32 个邮箱共有 512 个 字节的存储空间来存放要发送或接收 到的数据 。 要完成通信功能 , 主要就是对这些邮箱的管理 。 由于每个邮箱都是 1 个 I/ O 通道 , 所以使用者可 http://www.cnki.net 第 2 期 李 杨等 : TMS320f2812 芯片中的 CAN 口 C 语言通信 编程 以根据自己的情况合理地分配这些邮箱的功能来 简化原来用复杂程序控制一个 通道所实现的通信 功能 。这使得程序简单 ,控制灵活 。 eCAN 本身与 SCC 模式相兼容 , 并且增加了 ·1 6 9 · 模块的时钟 、 配置 CAN 管脚 、 初始化 MC 寄存器 、 清除中断标志位 、 配置位定时参数和配置接收屏 蔽等工作 。 例 :SysCtrlRegs. PCL KCR. all = 0x4000 ; EcanaRegs. CANB TC. all = 0X1021A ; 低功率模式 , 在这种模式下 CAN 控制器内部只 有唤醒逻辑存在 , 其他的 CA N 的时钟均被关闭 , 只要设定 MC 寄存器中的 WUBA 位 ,当侦测到任 何总线活动的 时候 , 模块都会自动退出低功率模 式 ,在没有总线通信的时候可以采用此种模式来 节省电力耗费 。另外 CAN 的收发器使用 313 V 的电源供给 , 降低了功耗 , 减少 了系统耗费 , 增加 了系统的可靠性 。 2) 配置邮箱的传送方式 邮箱有两种传送 方式 ,接收和发送 。将标识符 、 数据长度和要发送 的数据装入邮箱的相应位 即完成发送邮箱的配 置 。如果为接收邮箱的话 , 需要对相应的接收屏 蔽进行编程 并判断接收到的数据是否需要被保护 来进行相应的编程 。 3) 配置中断并且安装中 断矢量 CAN 有两 种中断类型 ,一种是邮箱对象中断 ,另一种是系统 中断 。它有 高 ( IO EN ) ,低 ( I1 EN ) 两个中断级别 , 配置中断需要配置相应的中断屏蔽以 及中断级别 并且使能这两条中断线 。 例 : PieVect Table. ECANO IN TA = ISR ; PieCtrlRegs. PIECR TL . bit . EN PIE = 1 ; IER | = 0x0100 ; &eC ANO IN T - 3 CAN 口的 C 语言编程实现 使用 C 语言可以直接对处理器内部的寄存 器进行访问 。C 语言的形式能使使 用者更清楚地 了解内部寄存器的使用 。通过使用结构体或者联 合体的形式来定义芯 片中的各种寄存器 , 然后将 这些变量定位在相应的存储器中就可以实现这种 功能 。 首先在头文件中定义这些寄存器 。 例 :struct CANMDRL - B ITS { Uint16 Uint16 LOW - WORD :16 ; HI - WORD :16 ; 4) 启动传送或接收 当配置为发送邮箱时 , 以邮箱 1 为例 , 设定相应邮箱的传送请求标志 ( TRS) 为 1 ,当相应邮箱的传 送应答标志 ( TA ) 被 设定时 ,表明已经成功传送了数据 。这时为了下 一次的传送 必须清除 TA 位 。 当配置为接收邮箱时 , 每一个邮箱成功接收 数据后 ,邮箱的接 收信息悬挂寄存器 ( RM P) 中相 应的位都会为 1 并且初始化一个中断 ,在 CPU 从 邮箱读取数据之前 ,需要清除 RM P 位 。 5) 中断的处理 中断处理主要就是调 度这 些不同的邮箱完成各自的功能 。当传送或接收完 成产生中断时 , 判断相应的 全局中断标志寄存器 ( GIF0/ 1) 中的位可以找到中断源来做相应的处 理 ,如果是邮 箱中断 , 可以通过 GIF 寄存器中的 M IV 位来找到产生中断的邮箱来处理 。 };
基于51单片机的六层电梯控制系统c语言程序
{
timer1=0;
//定时值 1 赋值为 0
if(DIRECTION) //如果电梯为向上方向运行
{
CURFLOOR++;
//当前楼层自加
CALLFLOORUP[CURFLOOR]=0; //楼层向上请求赋值为 0
}
else
//否则,楼层为向下方向运行
{
CURFLOOR--;
//楼层数自减
CALLFLOORDOWN[CURFLOOR]=0; //楼层向下请求赋值为 0
unsigned char CALLFLOORDOWN[7]={0,0,0,0,0,0,0}; //呼叫楼层下对应的数组,存储每层楼的信
息,1 为有人呼叫或者有人前往
unsigned char CALLFLOOR[7]={0,0,0,0,0,0,0}; //呼叫楼层对应的数组,存储每层楼的信息,
1 为有人呼叫或者有人前往
sbit FLOOR4DOWN=P1^4; //4 楼下对应的 P1^4,IO 口
sbit FLOOR3UP=P1^5; //3 楼上对应的 P1^5,IO 口
sbit FLOOR3DOWN=P1^6; //3 楼下对应的 P1^6,IO 口
sbit FLOOR2UP=P1^7; //2 楼上对应的 P1^7,IO 口
sbit FLOOR6=P2^7;
//6 楼对应的 P2^7IO 口
/*********************电梯上下运行指示灯************************/
sbit LEDUP=P3^6; //LED 上对应的 P3^6IO 口
sbit LEDDOWN=P3^7;
//LED 下对应的 P3^7IO 口
电梯模拟C语言数据结构中国地质大学改进版
数据结构课程设计学生姓名:庞晓健学号:***********院(系):计算机学院专业:信息安全2014年 3月21日题目:电梯模拟1、问题描述:模拟某校九层教学楼的电梯系统。
该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。
电梯一共有七个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、减速(Decelerate)。
乘客可随机地进出于任何层。
对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。
模拟时钟从0开始,时间单位为0.1秒。
人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如:有人进出时,电梯每隔40t测试一次,若无人进出,则关门;关门和开门各需要20t;每个人进出电梯均需要25t;电梯加速需要15t;上升时,每一层需要51t,减速需要14t;下降时,每一层需要61t,减速需要23t;如果电梯在某层静止时间超过300t,则驶回1层候命。
#include<stdio.h>#include<time.h>#include<stdlib.h>#include<malloc.h>#define MaxSize 5 //电梯所能承载的最大人数#define N 5typedef enum{Up,Down,Free} StateofElevator; //电梯的状态typedef struct //************************** 乘客结构体{int FloorofPerson; //乘客所在楼层int GoFloor; //乘客要去楼层int WaitingTime; //乘客的最大容忍等待时间int Direction; //方向int InorOut; //乘客是否已出电梯int Leave; //乘客是否离去int WaitedTime; //乘客已经等待的时间}Person;typedef struct //******************************电梯结构体{int Floor; //所在楼层StateofElevator State; //运行方向状态int NumberofPerson; //装载乘客人数}Elevator;Person Passenger[9][N]; //全局结构体二维数组保存整栋楼的乘客的相关信息Person PassengerInElevator[MaxSize]; //在电梯中的乘客的相关信息存储在结构体一维数组中int b[9]; //每层楼的人数int InCount[9]; //每层楼进入电梯的实际人数int OutCount[9]; //每层楼走出电梯的实际人数int tclock=0; //电梯运行时的全局软时钟int InTime[9]; //每层楼乘客进入电梯的时间int OutTime[9]; //每层楼乘客出电梯的时间int In(int y,int x,StateofElevator State1) //乘客进入电梯,每次乘客进入电梯后将该层的乘客重新排序( y表示电梯当前人数;x表示楼层){int m=y; //保存电梯当前人数int p,q,l,v=0,et;int d =1;if(State1==Up) // 电梯当前运行方向d =1;if(State1==Down)d =0;for(p=0;p<b[x];p++){if(Passenger[x][p].Direction==d &&Passenger[x][p].Leave==0)//该x层乘客p的方向与电梯方向一致且未离开,若电梯未满,则进电梯{if(m ==MaxSize){printf("电梯现在已经超载,请您等待片刻!\n");break; //该楼层的其他乘客等待一段时间}m ++; //电梯内人数增加for(q=0;q<MaxSize;q++){if(PassengerInElevator[q].InorOut==0)//如果电梯内乘客q已出电梯,则乘客p入电梯{PassengerInElevator[q]=Passenger[x][p];//乘客正式进入电梯PassengerInElevator[q].InorOut=1;//乘客已经进入电梯PassengerInElevator[q].Leave=1;PassengerInElevator[q].WaitedTime=0;PassengerInElevator[q].WaitingTime=0;Passenger[x][p].Direction=-2;Passenger[x][p].FloorofPerson=-2;Passenger[x][p].InorOut=-2;Passenger[x][p].Leave=-2;//printf("目标楼层:", Passenger[x][p].GoFloor);Passenger[x][p].WaitedTime=0;Passenger[x][p].WaitingTime=0;//进了电梯表明乘客即可到达目的地从而离开系统break;}}}}InCount[x]=m-y; //每层楼进入电梯的实际人数/*将本楼层的乘客信息重新排列,将该层剩余乘客信息放入全局结构体二维数组*/ Person *temp=(Person *)malloc((b[x]-InCount[x])*sizeof(Person)); //临时数组for(et=0;et<(b[x]-InCount[x]);et++)//电梯外剩余乘客{Passenger[x][et]=temp[et];}b[x]=b[x]-InCount[x];InTime[x]=InCount[x]*25;tclock+=InTime[x];printf("在%dt时刻第%d楼层有%d个人进入电梯!\n",tclock,x,(m-y));//printf("目标楼层\n", )return m;}int Out(int floor,int number) //乘客出电梯,每次乘客出电梯将全局数组中的乘客信息重新修改,floor表示楼层,number表示电梯内人数{int i;int k=number;//电梯内剩余的人for(i=0;i<MaxSize;i++){if(PassengerInElevator[i].GoFloor==floor&&PassengerInElevator[i].InorOut==1&&Passeng erInElevator[i].Leave==1){k--;PassengerInElevator[i].InorOut=0; //到站的乘客出电梯}}OutCount[floor]=number-k;OutTime[floor]=OutCount[floor]*25;tclock+=OutTime[floor];printf("在%dt时刻第%d楼层有%d个人已经到达地!\n",tclock,floor,OutCount[floor]);return k;}void Open() //电梯开门{tclock+=20;printf("电梯的门正在打开,请您稍候\n");printf("在%dt时刻电梯的门已经打开!\n",tclock);}void Close() //电梯关门{tclock+=20;printf("电梯的门正在关闭,请您稍候\n");printf("在%dt时刻电梯的门已经关闭!\n",tclock);}int Go(Elevator *ele) //电梯正在运行{Elevator *e=ele;if(e->State==Up){printf("电梯正在向上运行\n");printf("\n");e->Floor++;}if(e->State==Down){e->Floor--;printf("电梯正在向下运行\n");printf("\n");}tclock+=10;return (e->Floor);}int Initialize() //系统最开始的初始化{int i,j,k,m,n,s,c,u,v=0;srand(time(0)); //获取时间种子for(i=0;i<=8;i++) //每层楼的人数随机初始化b[i]=rand()%N;for(m=0;m<b[0];m++) //最底层楼的乘客信息初始化Passenger[0][m].Direction=1;Passenger[8][m].GoFloor=1+rand()%7;for(c=0;c<b[8];c++) //最高层的乘客信息初始化Passenger[8][c].Direction=0;Passenger[8][c].GoFloor=-1+rand()%8;for(n=1;n<=7;n++) //每层楼每个乘客方向初始化for(s=0;s<b[n];s++)Passenger[n][s].Direction=rand()%2;for(j=0;j<=8;j++) //每层楼的乘客的相关信息随机初始化for(k=0;k<b[j];k++){Passenger[j][k].FloorofPerson=j;Passenger[j][k].WaitingTime=100+rand()%100;Passenger[j][k].InorOut=0; //电梯外Passenger[j][k].Leave=0; //未离开Passenger[j][k].WaitedTime=0;if(Passenger[j][k].Direction==1)Passenger[j][k].GoFloor=(j+1)+rand()%(8-j);if(Passenger[j][k].Direction==0&&j!=1)Passenger[j][k].GoFloor=rand()%(j-1);if(Passenger[j][k].Direction==0&&j==1)Passenger[j][k].GoFloor=0;}for(u=0;u<=8;u++) // 遍历整栋楼,有人则返回1,没人返回0;if(b[u]==0)v++;if(v==9)return 0;elsereturn 1;}int Test() // 考查整栋楼有无请求,无返回0,有返回1;{int cs,cf=0;for(cs=0;cs<9;cs++)if(b[cs]==0)cf++;if(cf==9)return 0;elsereturn 1;}void OnFree(){printf("电梯现在在第一楼!电梯正处于空闲状态!!\n");}void Run(Elevator *left){Elevator *ts=left;int floor=ts->Floor; //保存电梯当前的所在楼层数int number=ts->NumberofPerson; //保存电梯当前的人数int ps,ms,ns,bs=0,ls=0,pt,yt;int loop=0;//循环次数while(loop!=15 ){if(Test()==0) //考查整栋楼有无请求,无返回0,有返回1;{OnFree(); //输出电梯现在在第一楼!电梯正处于空闲状态!}else{bs=0;printf("在%dt时刻电梯正在第%d层!\n",tclock,floor);for(ns=0;ns<number;ns++)if(PassengerInElevator[ns].GoFloor!=floor)bs++;if(b[floor]==0&&bs==number) //电梯外没人,没人下{//电梯不开门,继续上升或下降if(number!=0) //电梯里有人{if(PassengerInElevator[0].Direction==1&&floor<8)//往上{ts->State=Up;floor=Go(ts); //电梯移动if(floor==9){printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor);Open();number=Out(floor,number); //乘客出电梯OutTime[floor]=OutCount[floor]*25; //乘客出电梯的耗时ts->State=Down;number=In(number,floor,ts->State);InTime[floor]=InCount[floor]*25; //乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps<=9;ps++)for(ms=0;ms<b[ps];ms++){if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]);}if(number==0)floor=Go(ts);}}if(PassengerInElevator[0].Direction==0&&floor>0) //往下{ts->State=Down;floor=Go(ts);if(floor==0){printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor);Open();number=Out(floor,number); //乘客出电梯OutTime[floor]=OutCount[floor]*25; //乘客出电梯的耗时ts->State=Up;number=In(number,floor,ts->State);InTime[floor]=InCount[floor]*25; //乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps<=9;ps++)for(ms=0;ms<b[ps];ms++){if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]);}floor=Go(ts);}}}else //电梯里没有人{if(ts->State==Up){if(floor==8)ts->State=Down;elsefloor=Go(ts);}if(ts->State==Down){if(floor==0)ts->State=Up;elsefloor=Go(ts);}}for(pt=0;pt<=9;pt++)for(yt=0;yt<b[pt];yt++){if(Passenger[pt][yt].InorOut==0&&Passenger[pt][yt].Leave==0)Passenger[pt][yt].WaitedTime+=10;}}else{Open();number=Out(floor,number); //乘客出电梯OutTime[floor]=OutCount[floor]*25; //乘客出电梯的耗时number=In(number,floor,ts->State);InTime[floor]=InCount[floor]*25; //乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps<=9;ps++)for(ms=0;ms<b[ps];ms++){if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]);}/*服务完本层,电梯正式运行*/ if(PassengerInElevator[0].Direction==1&&floor<9){ts->State=Up;floor=Go(ts);if(floor==9){printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor);Open();number=Out(floor,number); //乘客出电梯OutTime[floor]=OutCount[floor]*25; //乘客出电梯的耗时ts->State=Down;number=In(number,floor,ts->State);InTime[floor]=InCount[floor]*25; //乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps<=9;ps++)for(ms=0;ms<b[ps];ms++){if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]);}if(number==0)floor=Go(ts);}}if(PassengerInElevator[0].Direction==0&&floor>0){ts->State=Down;floor=Go(ts);if(floor==0){printf("在%dt时刻电梯正在%d楼层!\n",tclock,floor);Open();number=Out(floor,number); //乘客出电梯OutTime[floor]=OutCount[floor]*25; //乘客出电梯的耗时ts->State=Up;number=In(number,floor,ts->State);InTime[floor]=InCount[floor]*25; //乘客进入电梯的耗时Close();/*重新计算每层楼的正在等待的乘客的需等待时间*/for(ps=0;ps<=9;ps++)for(ms=0;ms<b[ps];ms++){if(Passenger[ps][ms].InorOut==0&&Passenger[ps][ms].Leave==0)Passenger[ps][ms].WaitedTime+=(50+OutTime[floor]+InTime[floor]);}floor=Go(ts);}}}}//乘客向电梯请求loop++;}}//主函数int main(){int number,floor,state;Elevator left;left.State=Free; //电梯初始化left.Floor=1;left.NumberofPerson=0;for(number=0;number<MaxSize;number++) //电梯内乘客信息初始化{PassengerInElevator[number].InorOut=0;PassengerInElevator[number].Direction=-1;PassengerInElevator[number].FloorofPerson=-1;PassengerInElevator[number].Leave=0;PassengerInElevator[number].GoFloor=rand;PassengerInElevator[number].WaitedTime=0;PassengerInElevator[number].WaitingTime=0;}for(floor=0;floor<=8;floor++){InCount[floor]=0;OutCount[floor]=0;InTime[floor]=0;OutTime[floor]=0;}state=Initialize();if(state==0)OnFree();else // 判断电梯最初运行方向{if(b[1]==0) // 1楼没人,而整栋楼有人{left.State=Up;Run(&left);}else{if(Passenger[1][0].Direction==1){left.State=Up;Run(&left);}if(Passenger[1][0].Direction==0){left.State=Down;Run(&left);}}}}。
C++作业(电梯控制)
面向对象程序设计摘要:面向对象的程序设计更适合对现实生活中的描述,更加体现了软件的工业化的精神,所以现在大部分的软件开发工作都围绕OOP的思想来进行的。
在高层建筑中,电梯是不可或缺的重要设备,本篇文章以电梯程序开发为例,介绍如何对实际问题进行分析和设计。
关键词:面向对象程序设计电梯程序软件开发一.需求分析电梯的基本功能,如上升和下降,开门和关门,以及承载乘客。
假设电梯在一栋大楼的第一到第N层运行,第一层是大厅。
电梯里有每一层对应的按钮,除了第一层和第N层外,每一层都有两个按钮,第一层的大厅只有一个上行的按钮。
当电梯停在某一层时,电梯开门,电梯的指示灯表明当前电梯运行的方向,这样乘客知道当前电梯运行的方向。
电梯在两个楼层间快速移动时,电梯的门是紧闭的,而且电梯能提前减速到达目的地。
为保证电梯系统的安全,在任何不安全的因素下,紧急制动就会促发,电梯被强制停止。
电梯到达一个楼层时,它会重置电梯按钮,并响铃(继承到电梯内部)进入电梯,然后电梯向楼层发布已经到达的信号。
作为响应,楼层会重置楼层按钮,并显示电梯已经到达指定楼层。
然后,电梯门开,注意楼层上对应的门随电梯门一起自动打开。
随后,电梯内的乘客离开电梯,正在等待电梯的人进入电梯。
一个人进入电梯内后,按下电梯按钮,电梯内的指示灯会亮。
另外,等电梯到达另一楼层并重置电梯按钮后,灯就熄灭。
接着,电梯向指定楼层移动,电梯到达指定楼层后,如果没有人进入电梯,而且楼层上的楼层按钮没有被按下的话,就等待电梯门关闭,直到楼层按钮被按下。
二.系统分析与设计:对于上面的电梯问题,很明显有两个类:即电梯类和乘客类(从所设计到的对象描述可以观察到,但是有的问题即使这一步也要仔细分析)。
电梯类应该反映所有关于电梯状态和行为的信息,而乘客类也应该反映这些信息。
综合上面问题的表述,现在将分析结果整理如下:乘客类:Cpassenger{bool bInLift; //是否在电梯里bool bSignal; //发出请求标志bool bStart; //仿真启动标志(false标志仿真结束)Cstring flag; //标识每个人得序号以及需求层数Int iAtFloor; //所在楼层Int iToFloor; //要去的楼层Int iLifts; //已经乘坐电梯的次数了Int number; //乘客的序号}电梯类:Celevator{bool bStart; //仿真开始标志int iAtFloor; //当前所处的层数得起点int iToFloor; //即将去的层数int iPassengers; //电梯里的人数bool bStop; //电梯停止标志bool bIsEmptyOperation; //电梯是否空载运行CArray<CPassenger,CPassenger&> m_passengers; //存放载处于电梯里面得乘客}其中,CArray<CPassenger,CPassenger&>是MFC里面的一个模板集合类,第一个参数表示该集合所存储的类别,第二个参数表示对该集合里面的元素所采取的访问方式,这里采用的是引用的访问方式,这种方式通过传递32位指针来进行访问,它同时兼有地址访问(效率高)和值传递的双重优势,现在一般对大的对象的存取一般提倡使用这种方式。
c语言课程设计 电梯
#include<stdio.h>#include<graphics.h>#define MAXSIZE 100int aim=1;int cmd[MAXSIZE];int top=-1;void InstallGraph(){int grdriver=DETECT;int grmode=0;int i,errorcode;char *errormsg;registerbgidriver(EGAVGA_driver);initgraph(&grdriver,&grmode,"");errorcode=graphresult();errormsg=grapherrormsg(errorcode);if(errorcode!=grOk){printf("Graphics error:%s\n",errormsg);printf("Press any key to exit.\n");getch();exit(1);}cleardevice();settextstyle(4,0,10);setviewport(40,30,600,440,1);setfillstyle(1,DARKGRAY);bar(0,0,640,480);setfillstyle(1,LIGHTGRAY);rectangle(20,20,540,390);floodfill(70,70,WHITE);setfillstyle(1,WHITE);rectangle(70,79,170,361);floodfill(71,81,WHITE);line(360,60,360,360);line(370,50,520,50);line(50,50,350,50);rectangle(220,90,240,110);for(i=1;i<6;i++){rectangle(205,90+i*40,225,110+i*40);rectangle(235,90+i*40,255,110+i*40);}rectangle(220,330,240,350);for(i=0;i<4;i++){setcolor(WHITE);setfillstyle(1,YELLOW);circle(450,100+i*30,7);circle(470,100+i*30,7);floodfill(450,100+i*30,WHITE);floodfill(470,100+i*30,WHITE);}setcolor(WHITE);rectangle(448,225,478,240);outtextxy(452,230,"ESC");setfillstyle(1,RED);bar(72,322,168,358);setcolor(BLACK);outtextxy(223,97,"U\x19");outtextxy(208,137,"Y\x18");outtextxy(238,137,"A\x19");outtextxy(208,177,"T\x18");outtextxy(238,177,"S\x19");outtextxy(208,217,"R\x18");outtextxy(238,217,"D\x19");outtextxy(208,257,"E\x18");outtextxy(238,257,"F\x19");outtextxy(208,297,"W\x18");outtextxy(238,297,"H\x19");outtextxy(223,337,"Q\x18");outtextxy(447,97,"1"); outtextxy(467,97,"2");outtextxy(447,127,"3"); outtextxy(467,127,"4");outtextxy(447,157,"5"); outtextxy(467,157,"6");outtextxy(447,187,"7"); outtextxy(467,187,"G");setcolor(BLUE);outtextxy(400,320,"MADE BY :");outtextxy(420,330,"class 0812");outtextxy(400,340,"FANTASTIC THREE"); /*初始化界面*/}void changeaim(int y){int i;int z;if(aim>7) z=14-y;else z=y;if(top==-1);elseif(top==0) {aim=cmd[0];return; }else for(i=top;i>=1;i--){if(z<=cmd[0]){aim=cmd[0];break;}else if(cmd[i-1]<z<cmd[i]){ /*更改目标*/aim=cmd[i]; break;}}}int m;void move(){void stadus(int);char push();void *buf;int i,j,z,size;int x=71;static int y=320; char n;size=imagesize(71,320,169,360);buf=(void *)malloc(size);getimage(71,y,169,y+40,buf);if(y%40==0) changeaim((360-y)/40);if(aim>7) z=14-aim;else z=aim;if(y>360-40*z){putimage(x,--y,buf,COPY_PUT);delay(20000);/*将图像上移或者下移一个单位*/}if(y<360-40*z){putimage(x,++y,buf,COPY_PUT);delay(20000);}m=y;if(y==360-40*z&&top!=-1){for(i=0;i<=5;i++){n=push();if(n=='g'||n=='G'){ /*判断是否有GO命令同时保证在睡眠时也能接收命令*/setcolor(WHITE);outtextxy(467,187,"G");sleep(1) ;break;}sleep(1);}setcolor(BLACK);outtextxy(467,187,"G");stadus(aim);/*熄灭完成目标的指示灯*/if(aim==cmd[top]){cmd[top]=0;top--;}else for(i=top;i>=0;i--){if(cmd[i]==aim){for(j=i;j<top;j++){cmd[j]=cmd[j+1];/*完成目标后将目标从目标数组中删除*/}top--;}}}if (aim>7&&y%10==0&&top!=-1) setcolor(RED);else setcolor (LIGHTGRAY); /*方向指示灯*/outtextxy(425,155,"\x19");if (aim<=7&&y%10==0&&top!=-1)setcolor(RED);else setcolor (LIGHTGRAY);outtextxy(425,145,"\x18");free(buf);}void stadus(int y){switch(y){case 1: setcolor(BLACK); outtextxy(223,337,"Q\x18");outtextxy(447,97,"1"); break;case 2: setcolor(BLACK); outtextxy(208,297,"W\x18");outtextxy(467,97,"2"); break;case 3: setcolor(BLACK); outtextxy(208,257,"E\x18");outtextxy(447,127,"3"); break;case 4: setcolor(BLACK); outtextxy(208,217,"R\x18");outtextxy(467,127,"4"); break; /*熄灭指示灯的函数*/case 5: setcolor(BLACK); outtextxy(208,177,"T\x18");outtextxy(447,157,"5"); break;case 6: setcolor(BLACK); outtextxy(208,137,"Y\x18");outtextxy(467,157,"6"); break;case 7: setcolor(BLACK); outtextxy(223,97,"U\x19");outtextxy(447,187,"7"); break;case 8: setcolor(BLACK); outtextxy(238,137,"A\x19");outtextxy(467,157,"6"); break;case 9: setcolor(BLACK); outtextxy(238,177,"S\x19");outtextxy(447,157,"5"); break;case 10: setcolor(BLACK); outtextxy(238,217,"D\x19");outtextxy(467,127,"4");break;case 11: setcolor(BLACK); outtextxy(238,257,"F\x19");outtextxy(447,127,"3"); break;case 12: setcolor(BLACK); outtextxy(238,297,"H\x19");outtextxy(467,97,"2"); break;case 13: setcolor(BLACK); outtextxy(447,97,"1"); break;}}char push(){ int i,j,k,value=0; char v;if(bioskey(1)!=0){i=bioskey(0);v=(char)(i & 0x00ff);}switch(v){case 'q':case 'Q':value=1;setcolor(WHITE);outtextxy(223,337,"Q\x18");break;case 'w':case 'W':value=2;setcolor(WHITE);outtextxy(208,297,"W\x18");break;case 'e':case 'E':value=3;setcolor(WHITE);outtextxy(208,257,"E\x18");break;case 'r':case 'R':value=4;setcolor(WHITE);outtextxy(208,217,"R\x18");break;case 't':case 'T':value=5;setcolor(WHITE);outtextxy(208,177,"T\x18");break;case 'y':case 'Y':value=6;setcolor(WHITE);outtextxy(208,137,"Y\x18");break;case 'u': /*键盘扫描并把合法命令存入目标数组并排序*/case 'U':value=7;setcolor(WHITE);outtextxy(223,97,"U\x19"); break;case 'A':case 'a':value=8;setcolor(WHITE);outtextxy(238,137,"A\x19");break;case 's':case 'S':value=9;setcolor(WHITE);outtextxy(238,177,"S\x19");break;case 'D':case 'd':value=10;setcolor(WHITE);outtextxy(238,217,"D\x19");break;case 'f':case 'F':value=11;setcolor(WHITE);outtextxy(238,257,"F\x19");break;case 'h':case 'H':value=12;setcolor(WHITE);outtextxy(238,297,"H\x19");break;case '1':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(447,97,"1"); break;case '2':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(467,97,"2"); break;case '3':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(447,127,"3"); break;case '4':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(467,127,"4"); break;case '5':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(447,157,"5"); break;case '6':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE); outtextxy(467,157,"6"); break;case '7':if(aim>7||(aim==7&&m==80)) value=14-(v-48);else value=(v-48);setcolor(WHITE);outtextxy(447,187,"7"); break;}if(value!=0){if(top==-1){top++;cmd[top]=value;}else if(top==0){if(value>cmd[0])cmd[++top]=value;else if(value<cmd[0]){cmd[++top]=cmd[0];cmd[0]=value;}}else for(k=top;k>=1;k--){if(value<cmd[0]){for(j=top;j>=0;j--){cmd[j+1]=cmd[j];}top++;cmd[0]=value;break;}else if(value>cmd[top]){cmd[++top]=value;break;}else if(cmd[k-1]<value<cmd[k]){for(j=top;j>=k;j--){cmd[j+1]=cmd[j];}top++;cmd[k]=value;break;}}}return v;}main(){InstallGraph();do{push();move();}while(bioskey(1)!=0x11b);closegraph();}。
升降机中将采用C语言控制系统
升降机中将采用C语言控制系统一、定义:C语言是一种计算机程序设计语言,它不但具有高级语言的特点,又具有汇编语言的特点。
它由美国贝尔研究所的D.M.Ritchie于1972年推出,在1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,目前C语言已经开始用于升降机行业。
二、突破:利用传统的汇编语言开发升降机系统虽然具有代码紧凑,实时性好等优点,但缺点也十分突出:程序可读性、可移植性差,不易进行复杂的逻辑数学运算,大程序的软件开发周期长等。
而C语言则是一种针对升降机的软件开发工具,为用户利用C语言来开发升降机提供了支撑环境。
三、创新:C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
C语言具有功能丰富的库函数,编译效率高,有完善的模块程序结构以及良好的可移植性。
可以直接实现对系统硬件的控制,在编程中对升降机的寄存器和存储器的分配均可由编译器实现自动管理,使用户摆脱与硬件无必要的接触。
利用C语言开发升降机系统,不但可以使编程工作量大为减少,而且使软件维护、修改亦变得非常方便。
四、应用以剪叉式升降机控制装置为例,介绍C语言在升降机开发中的应用。
硬件构成剪叉式升降机是建筑施工中常用的机械之一。
它的作用是将物料和施工人员在地面和各楼层间输送,所以需要在各层进行平层就位。
我们的解决方案是在驱动电机输出轴上安装脉冲计数装置用以检测转数,间接地检测了吊笼的离地高度,将该数值与某一楼层的预置值作比较,便可决定吊笼的上下或停止。
控制装置的电气原理:整个系统由脉冲检测,脉冲计数,层选,比较判断,输出执行,预置以及手动升降等部分组成。
脉冲检测由装在高速轴上的接近开关或红外开关完成,并通过光电偶合进入控制单元,输出执行部分:控制单元送出的控制信号经光电偶合器驱动继电器和接触器来控制吊笼的运动。
预置部分完成。
通过脉冲计数,层选和比较判断等由单片机械与电子机完成。
采用中断方法计数达到正能化控制效果。
电梯调度算法(源代码)
#include <stdio.h> #include <stdlib.h>#include <string.h>#include <conio.h>typedef struct _proc{char name[32];/*定义进程名称*/int team;/*定义柱面号*/int ci;/*定义磁道面号*/int rec;/*定义记录号*/struct _proc *prior;struct _proc *next;}PROC;PROC *g_head=NULL,*g_curr=NULL,*local;int record=0;int yi=1;void init(){PROC *p;*/g_head = (PROC*)malloc(sizeof(PROC));g_head->next = NULL;g_head->prior = NULL;p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P1");p->team=100;p->ci=10;p->rec=1;p->next = NULL;p->prior = g_head;g_head->next = p;g_curr=g_head->next;p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P2");p->team=30;p->ci=5;/*初始化链表(初始I/O表)p->rec=5;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p = (PROC*)malloc(sizeof(PROC));strcpy(p->name, "P3");p->team=40;p->ci=2;p->rec=4;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P4");p->team=85;p->ci=7;p->rec=3;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=p;p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P5");p->team=60;p->ci=8;p->rec=4;p->next = NULL;p->prior = g_curr;g_curr->next = p;g_curr=g_head->next;local = (PROC*)malloc(sizeof(PROC)); strcpy(local->name, "P0");local->team=0;/*选中进程*/local->ci=0;local->rec=0;local->next=NULL;local->prior=NULL;}void PrintInit()/*打印I/O表*/{PROC *t = g_head->next;printf("-------------------------------------\n"); printf("---------I/O LIST---------\n"); printf(" processteamcirec\n");while(t!=NULL){printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec );t = t->next;}printf("\n\nCurrent process is :\n");printf("------------------------------\n\n");printf(" processteamcirec\n");printf("%4s %8d %8d %5d\n", local->name, local->team, local->ci, local->rec ); switch(yi){case 1:{printf("current direction is UP\n");break;}case 0:{printf("current direction is down\n");break;}}}void acceptreq()/*接受请求函数*/{PROC *p;p = (PROC*)malloc(sizeof(PROC));printf("pleaseinputtheinformationofprocess\nprocess-name:\nprocess-team\nprocess-ci\nprocess-rec\n"); printf("\n");scanf("%s",p->name);printf("2.team 0-199\n");thenewscanf("%d",&p->team);/*输入请求进程信息*/ printf("3.ci 0-19\n");scanf("%d",&p->ci);printf("4.rec 0-7\n");scanf("%d",&p->rec);getchar();g_curr=g_head;/*将此节点链入I/O请求表*/while(g_curr->next!=NULL)g_curr=g_curr->next;p->next=NULL;p->prior=g_curr;g_curr->next=p;g_curr=g_head->next;printf("NEW I/O LIST\n\n");PrintInit();/*将新的I/O请求表输出*/}void qddd()/*驱动调度函数*/{PROC *out;int min;int max=g_head->next->team;if (g_head->next==NULL);/*若已全部调度,则空操作*/else{switch (yi){case 1:{min=g_head->next->team;out=g_head->next;/*选出最小的team进程,模拟启动此进程*/strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (g_curr->team > record){ min = g_curr->team;break;}}for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (min>=g_curr->team&&g_curr->team>record){min=g_curr->team;out=g_curr;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;}}printf("\n-----------------------\n");printf("the process choosed :\n");printf(" processteamcirec\n");printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec ); record = local->team;printf("%d",record);for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (max<g_curr->team)max=g_curr->team;}if(max==record){yi=0;record=1000;break;}break;}/*case 1*/case 0:/*case 1的对称过程*/{max=g_head->next->team;out=g_head->next;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) {if (g_curr->team < record){ max = g_curr->team;break;}}for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) {if (max<=g_curr->team&&g_curr->team<record){max=g_curr->team;out=g_curr;strcpy(local->name,out->name);local->team=out->team;local->ci=out->ci;local->rec=out->rec;}}printf("\n-----------------------\n");printf("the process choosed :\n");printf(" processteamcirec\n");printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec ); min=g_head->next->team;for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next){if (min>g_curr->team)min=g_curr->team;}record = local->team;if(min==record)yi=1;record=0;break;}break;}default : return -1;}/*switch*/if (out->next==NULL){out->prior->next=NULL;free(out);}else{out->prior->next=out->next;out->next->prior=out->prior;free(out);}/*将选中的进程从I/O请求表中删除*/ }/*else*/void acceptnum()/*通过输入0~1选择‘驱动调度’或是‘接受请求’*/{float num;char c;while(1){printf("----------------------------------------------\n");printf("pleaseinputanumberbetween0and1\nnum<=0.5:acceptrequest\nnum>0. 5:qudongdiaodu\n\nnum==2:I/O LIST\n\nnum=?\n");scanf("%f",&num);getchar();while((num<0||num>1)&&num!=2)/*过滤不合法数据注意:本程序其他输入数据可能未过滤*/{printf("number ERROR!Input again please!\nnum=?\n ");scanf("%f",&num);getchar();}if(num>0.5&&num!=2)/*驱动调度*/{if (g_head->next==NULL)printf("\n\n");printf("---------------------\n");printf("I/O list is empty!!!\n");/*请求表为空无需调度*/ }else{printf("qudong diaodu\n");qddd();/*调用函数进行调度*/}}else if (num<=0.5)/*接受请求*/{printf("accept request\n\n");acceptreq();}else if (num==2)/*通过输入2显示当前请求I/O表*/{ printf("I/O LIST;");printf("-------------------\n");PrintInit();printf("\n");}printf("-----------------------\n");printf("choose 'n' to quit else to continue\n");if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0) {//clrscr();printf("\n\n\n\n\n\n");printf("thank you for testing my program!\n");printf("---by01\n");sleep(2);printf("\n\nBYEbye!!");sleep(2);return -1;}else{//clrscr();}}}main ()/*主程序*//*输入n离开本程序*/ {init();PrintInit();acceptnum();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case 0x77:num=1;break;
case 0xb7:num=2;break;
case 0xd7:num=3;break;
case 0xe7:num=1;break;
case 0x7b:num=5;break;
case 0xbb:num=6;break;
cas
{
P1=lightclose[lightnum];
delay(100);
}
}
///...............................
void kaimen()
{
for(lightnum=0;lightnum<5;lightnum++) //流水灯开门提示
{
T
H1=(65536-25000)/256;
TL1=(65536-25000)%256;
if(num>befnum&num<5) dnum=befnum+a; //上楼
{
uint h,l,key;
P3=0x0f;
h=P3&0x0f;
while(h!=0x0f)
{
delay(10); //去抖动
while(h!=0x0f)
{
h=P3&0x0f;
P3=h|0xf0;
l=P3&0xf0;
key=l+h;
switch(key)
}
}
void timer0(void) interrupt 1 //定时器0中断
{
TH0=(65536-22500)/256;
TL0=(65536-22500)%256;
display();
}
void timer1() interrupt 3 //定时器1中断
{
num=2;
}
aa=num;
///////////////////////// 上 楼 ///////////////////////////////////////////////////
if(num>befnum&num<5)
{ //define=0;
{
guanmen();
for(a=1;a<befnum+1-num;a++)//步进电机反转
{ TR1=1;
step_down();
TR1=0;
lable:scankey();
if(num==9)
{
num=aa;
goto lable;
}
while(num==6&a==befnum-2)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define DIGI P0 //宏定义,将P1口定义为数码管
void delay(uint z) //延时函数
{uint x,y;
for(x=250;x>0;x--)
for(y=z;y>0;y--);
}
//...................................
void display() //数码管显示函数
uchar select[]={0xbf,0x7f}; //选择数码管数组,依次选择1,2,..,8
uchar i,j,num,aa,befnum,lightnum,dnum,abcd,uplay,a,key,define,loop,lable;
{
TR1=1;
step_up();
TR1=0;
}
}
}
void d2()
{
kaimen();
num=aa;
delay(150);
scankey();
if(num<befnum&num>0)
{
guanmen();
for(a=2;a<befnum+1-num;a++)
}
///................................
void step_up() //步进电机上启动
{for(circle=100;circle>0;circle--)
{
for(abcd=0;abcd<4;abcd++)
{
TR1=1;
step_down();
TR1=0;
}
}
}
void main()
{
befnum=1;
dnum=1;
TMOD |=0x01; //初始化定时器
TH0=(65536-22500)/256;
TL0=(65536-22500)%256;
EA=1;
ET0=1;
#define SELECT P2 //宏定义,将P2定义为数码管选择口
uchar const shuma[]={0x28,0x7e,0x0a2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60}; //数码显示0-9
{
P1=lightopen[lightnum];
delay(150);
}
}
///.........................................................
uchar scankey(void) //按键扫描
TR0=1;
//.............................
TMOD |=0x01;
TH1=(65536-50000)/256;
TL1=(65536-520000)%256;
EA=1;
ET1=1;
while(1)
{
scankey();
if(num==5|num==6)
{
d2();
befnum=num;
}
num=aa;
}
befnum=num;
delay2(10);
kaimen();
}
//////////////////////////////////////////////////////////////////////////////////
e 0xdb:num=3;break;
case 0x7d:num=9;break;
}
return(num);
}
}
}
///.......................................................
if(num<befnum&num>0) dnum=befnum-a; //下楼
}
uint circle;
uchar table_up[]={0x06,0x0c,0x09,0x03}; //步进电机上楼
uchar table_down[]={0x03,0x09,0x0c,0x06}; //步进电机下楼
uchar const lightopen[]={0x00,0x18,0x3c,0x7e,0xff};//流水灯指示电梯门打开
uchar const lightclose[]={0x7e,0x3c,0x18,0x00,0x00,0xff,0x00};//流水灯指示电梯门关闭
char code SST516[3] _at_ 0x003b; //仿真器插入函数
//...................................
guanmen();
for(a=1;a<num-befnum+1;a++)//步进电机正转
{
TR1=1;
step_up();
TR1=0;
loop:scankey();
if(num==9)
{ num=aa;
goto loop;
}
while(num==5&a==2)
{
d1();
befnum=num;
}
}
befnum=num;
delay(10);
kaimen();
}
///////////////////////////////////下 楼///////////////////////////////////////////
if(num<befnum&num>0)
ห้องสมุดไป่ตู้{
P1=table_down[abcd];
delay2(500);
}
}
}
///...............................
void guanmen()
{
for(lightnum=0;lightnum<7;lightnum++) //流水灯关闭电梯门
void d1()
{ kaimen();
num=aa;