
实现的功能:此单片机模拟电梯用绿色发光二极管组成的箭头来指示电梯当前是处于上升状态还是下降状态,用数码管显示当前是处于哪一层,用红色发光二极管指示电梯走到哪一层会停电源接通后,若没有人按下停止按键,它就以每层2秒的速度一直上下运行,若有人按下某一层的停止按键,它就会在相应的那一层停止4秒钟,并伴有开门和关门的声音提示。
程序初始化1
tcount航天4ch
航天4dh曾
0000h丙
ljmp开始
000bh丙
ljmp int0x
0030h丙
;;;;;;;;;;;;初始化;;;;;;;;;;;;;;;;;
启动:mov tmod,# 1小时
mov th0,# 3针
mov tl0,# 0 B0H;50毫秒
mov ie,#小时
setb tr0
mov tcount,4号
CLR F0
mov 20h,# 0
mov r0、# 30小时
mov r1,# 30
清:mov @r0,# 00 H
公司r0
djnz r1、清;把30H到4DH这30个单元清0
并打动,# 6小时
mov p3,# 0 F8H
2主程序调用
小熏:简森-巴顿p10,一
lcall ys10ms
简森-巴顿p10,一个,判断一层的停止按键是否按下
clr p20;若按下则把对应的红色发光二极管点亮
一:简森-巴顿p11,两个
lcall ys10ms
简森-巴顿p11,两个,判断二层的停止按键是否按下
clr p21;若按下则把对应的红色发光二极管点亮
二:简森-巴顿p12、射孔
lcall ys10ms
简森-巴顿p12、射孔
clr p22
各段:简森-巴顿p13,精打细算
lcall ys10ms
简森-巴顿p13,精打细算,
clr p23
台北县:简森-巴顿p14,FIV的猫咪
lcall ys10ms
简森-巴顿p14,FIV的猫咪
clr p24
FIV的猫咪:简森-巴顿p15、共六人
lcall ys10ms
简森-巴顿p15、六
clr p25
六:简森-巴顿p16,SEV
lcall ys10ms
简森-巴顿p16,SEV
clr p26
SEV:简森-巴顿p17、训
lcall ys10ms
简森-巴顿p17、训
clr p27
ljmp鲁迅
中断程序调用3
INT0X:mov th0,# 3针
mov tl0,# 0 B0H
公司tcount
mov,TCOUNT
cjne,5 #,ZHUAN2;50毫秒= 250 5女士
mov tcount,# 00 H
简森-巴顿f0,《左传》
ljmp zhuan1
《左传》:ljmp虾酱
ZHUAN1:mov p3,# 0 F8H;上升的箭头
mov,蹭
cjne,# 00 H、社里
并打动,# 06 h,显示
简森-巴顿p20,SS1_1
公司30h
mov,30小时
cjne,# 1、SSX1_1
clr p34;一层门开的声音开
SSX1_1:cjne,2号,SSX1_2
setb p34;一层门开的声音关
SSX1_2:cjne,# 16,SSX1_3
clr p34;一层门关的声音开
SSX1_3:cjne,17号,ZHUAN2;16 250毫秒= 4 S(总共次,但实际在这里停止的时间只有次MS)
mov 30h,# 0
setb p34;一层门关的声音关
setb p20;熄灭对应的红色发光二极管
SS1_1:公司31h
mov,31 H
cjne,# 9,ZHUAN2;8 250毫秒= 2秒(总共次,但实际上升一层只用次MS)
mov 31h,# 0
公司曾
社里:mov,蹭
cjne,# 1小时,SS3
并打动,5 # BH,显示
简森-巴顿p21,SS2_1
公司32h
mov一个32小时
cjne,# 1、SSX2_1
clr p34;二层门开的声音开
SSX2_1:cjne,2号,SSX2_2
setb p34;二层门开的声音关
SSX2_2:cjne,# 16,SSX2_3
clr p34;二层门关的声音开
SSX2_3:cjne,17号,ZHUAN2;16 250毫秒= 4 S(总共次,但实际在这里停止的时间只有次MS)
mov 32h,# 0
setb p34;二层门关的声音关
setb p21;熄灭对应的红色发光二极管
SS2_1:公司33h
mov,33 H
cjne,# 9,ZHUAN2;8 250毫秒= 2秒,但实际上升一层只用次MS(总共次吗
mov 33h,# 0
ljmp zhuan3
现在写好了,也调试了,自我感觉很好,觉得可以移植到真电梯上去了哦哈哈
为了简单,分配了1到9层另外也没加入有几人同时按,不过那样也不难,再分配10个每层的变量,随机按再处理,是先向上还是直接向下不过那倒真的可以用到真的上了
#include <stdioh>
#include <dosh>
#include <ctypeh>
#define ON 1
#define OFF 0
main(){
int power,i;
char oldkey,key ;
struct date today;
struct time now;
getdate(&today); /把系统当前日期存入today所指向的date结构中/
gettime(&now);
gotoxy(25,3);
printf("Today's date is %d-%d-%d\n",todayda_year,todayda_mon,todayda_day);
gotoxy(25,6);
printf("Current time is %02d:%02d:%02d\n",nowti_hour,nowti_min,nowti_sec);
if( nowti_hour>=8||(nowti_hour<=23&&nowti_min<59)){
power=ON;
printf("\n\n\nLift power is onLift stop in 1 floor");
}
else {
power=OFF;
printf("Lift power is off");
}
oldkey=0;
while(power==ON) {
printf("\n\n\nFloor");
for(i=1;i<10;i++)
printf("\n %d",i);
printf("\nPress floor number or q to shut down power :");
if( nowti_hour>=8||(nowti_hour<=23&&nowti_min<59))
power=ON;
else
power=OFF;
key=bioskey(0);
key=key&0x00ff;
system("cls");
if(key=='0'){
power=OFF;
printf("\n\n Lift Power off");
sleep(1);
break;
}
if(key>oldkey)
printf(" %c Go up!",24);
if(key<oldkey)
printf(" %c Go down!",25);
if(key==oldkey)
printf(" %c ok you are here",22);
sleep(2);
system("cls");
printf("\n\n ");
switch(key){
case '1':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '2':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '3':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '4':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '5':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '6':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '7':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '8':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
case '9':
if(key==oldkey)
printf(" %c ok you are here",22);
else if(key>oldkey)
printf("%c Go up!stop in %c floor",24,key);
else
printf("%c Go down!stop in %c floor",25,key);
oldkey=key;
break;
}
}
getch();
}
多级反馈队列调度算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX *** 作系统采取的便是这种调度算法。 多级反馈队列调度算法即能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。 多级(假设为N级)反馈队列调度算法可以如下原理: 1、设有N个队列(Q1,Q2QN),其中各个队列对于处理机的优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。 2、对于某个特定的队列来说,里面是遵循时间片轮转法。也就是说,位于队列Q2中有N个作业,它们的运行时间是通过Q2这个队列所设定的时间片来确定的(为了便于理解,我们也可以认为特定队列中的作业的优先级是按照FCFS来调度的)。 3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最高的队列)的时间片一般很大(不需要考虑这个问题)。 多级反馈队列调度算法描述: 1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。 2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,只有在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。 3、对于同一个队列中的各个进程,按照时间片轮转法调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。 4、在低优先级的队列中的进程在运行时,又有新到达的作业,那么在运行完这个时间片后,CPU马上分配给新到达的作业(抢占式)。 我们来看一下该算法是如何运作的: 假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 现在有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。 1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。 2、时刻1 J2到达。 由于时间片仍然由J1掌控,于是等待。 J1在运行了1个时间片后,已经完成了在Q1中的 2个时间片的限制,于是J1置于Q2等待被调度。现在处理机分配给J2。 3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。 4、时刻3 J3到达,由于J2的时间片未到,故J3在Q1等待调度,J1也在Q2等待调度。 5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。 6、时刻5 J3经过1个时间片,完成。 7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 8、时刻7 J1再经过一个时间片,完成了任务。于是整个调度过程结束。
电梯模拟设计·序 在大二时自学了C++编程语言,且在《C++编程经典》这本书上看到了一个实例“电梯模拟”,不过那上面只实现了两层楼,一个电梯的功能,当时我就想:我应该写一个能实现多层楼的,还是多电梯的,不过那时只是尽力去看上面的实例是怎样实现的。当时没有电脑,于是就不了了之。在这个假期,一个人在学校了过春节,自由时间比较多,于是想起写这个程序来,在经过十多天的时间,终于完成了所有功能,但是由于时间和能力有限,现在完成的有些算法不是很合理。·模拟过程说明电梯的运行过程是根据时间和人的需要执行的。而我这里模拟,是了更好的了解及实现电梯运行过程的模拟,因此我采用 *** 作员按键来控制电梯,根据键盘接受来实现不同的需要(如:电梯运行,楼层生成人,菜单帮助,推出)。这个程序是对电梯的模拟,每次的开始电梯都停在最底层楼,也就是0层。之后由 *** 作员(也就是程序运行的人) *** 作,你可以按回车键由楼层产生人,在楼层有人之后,人会按上下键去选择他们的去向,之后在 *** 作员输入空格键的时候,电梯会一层一层的运动到所需楼层载人; 你可以选择空格键,这使得电梯运行到要求的下一层,当系统检测到这层楼有人要出去,或是要进来,那么电梯停止、开门,等候出去的人出完,进来的人进来(当然,这是不允许超载的)。 你也可以选择H或是h来查看帮助菜单。最后你可以选择esc退出。·概要设计 在开始之前会让用户输入楼层数及电梯数,程序根据数据构造整个建筑。楼层中有等候的地方有两个按钮,是等待人按的上下键。建筑中有电梯,可以不只一个,电梯中有开关门键,还有数字键,供人按键决定去向;这些键当被按下时,键就呈亮色,因此键里有灯。当电梯到达某一楼层,有人要出电梯或是进电梯,电梯的门会开,然后关门,并且电梯里的铃就会响。介此,根据要求设计类如下: Bell ——————————铃(电梯里的铃) Lignt ——————————灯(按钮里的灯) Button ——————————按钮(上下键,数字键,开关门键) Door ——————————门(电梯的门) People ——————————人(楼层里生产人,之后进电梯,出电梯之后消除人) Floor ——————————楼层(建筑有多个楼层) Elevator ——————————电梯(楼层里的电梯) Building ——————————建筑 Time ——————————时间类(当某一楼层既有人上,也有人下,而且电梯在次楼层,此时电梯就会选择该上还是下,于是会根据时间来上下人的最早时间来定·详细设计1、状态变量的设计(1)Elevator::runline的设计 runline的数据定义:这是电梯的引导变量,因此要确定几个参数:①是否有人出——OUT;②有人进且上楼——UP;③有人进且下楼——DOWN。当到某一楼的时候可能既有人出且有人上、有人出且有人下、有人上也有人下、还有没有人等情况。于是设置参数的二进制如下:OUT——001,DOWN——010,UP——100根据这几个基数可以组合:TT——0(000)(初始时都设置为TT)UP_DOWN——6(110:UP | DOWN)OUT_DOWN——3(011:OUT | DOWN)OUT_UP——5(101:OUT | UP)OUT_UP_DOWN——7(111:OUT | UP | DOWN)这样做的好处是在提供判断时特别方便,考虑满足哪一种条件时直接和其取与(&)就可以判断了,还有就是在判断时是先判断是否有人出于是只需要与OUT做与(&) *** 作就可以判断是否有人出了。因此这是整个程序设计中很精彩的一部分。电梯的运行全有此数据引导,当生成人的时候,根据人所在的楼层,然后搜索最快能到达此楼层满足人去向的电梯,然后改变runline的值;当人走出电梯之后又再次改变runline,使得正常引导电梯……(2)Elevator::status设计在判断电梯的运动状态时根据此变量判断。由于电梯的状态只有停、上、下三个状态,这里我分别用0、-1、1来表示。其实为了保持一致性,可以用runline中的TT、UP、DOWN来表示,但是在计算中,不需要runline与status的计算,因此可以不和runline一致。而这里定义为0、-1、1有一个特大的好处就是计算电梯所到达的楼层,当电梯为上运动时,电梯所到的楼层只需+1(即是+status),当电梯为下运动时,电梯所到的楼层只需-1(还是+status),当停止时不需要加减,此时+0(即+status)不会影响到原来的值。于是在就是电梯所到楼层时,不管电梯的运行状态,都可以直接+status就可以了, (3)Elevator::pList ( list<People > pList ) 电梯中人的存储链表,由于电梯中的人数只有上限,但随时可以不一样,因此采用动态存储结构来存储较好,为了方便使用类库的 *** 作,于是定义为list存储结构,存储为People的指针,而不是对象,这样使得人在转移过程中(从楼层进入电梯)只是改变了人的位置,而不是先拷贝进入电梯,之后再删掉楼层中人的对象,这与实际不符合,还浪费时间、空间。按照这样设计,人从楼层中产生起一直存在,直到走出电梯。只是引出他的对象不一样而已。 (3)Elevator::numberButton ( vector<Button > numberButton ) 电梯中数字按钮:在构造电梯时,就会构造数字按钮,而此时数字按钮的个数是确定的,以后不会再改变其存储大小即值,于是这里采用动态数组来存储。 (4)同理,建筑中的电梯,建筑中的楼层,在构造建筑的过程中都应该构造完成,是确定的数量,因此这里都采用动态数组来存储。(5)Floor::pList 楼层中等待的人为了方便区分楼层中等待的人是上还是下,于是将等待上可下的人分别存储。楼层中的人进入电梯时,只需根据电梯的运行状态来确定是谁应该进电梯。 (6)程序中定义了一个全局变量bfloors,是建筑的楼层数,因为在很多几个类中都需要用的这个变量,因此,将其定义全局变量我认为可以减少内存开销。
package bean;public class dianti {int on=1;//定义一个初始化楼层 初始化是在1层
//先从简单的开始 我们先写两个方法 一个是在电梯外面方法 一个是在电梯内部的方法
public void wai(int num)//外部方法
{
if(num==thison)
{
Systemoutprintln("停留在本层 直接开门");
}
else if(num>thison)
{
Thread th = new Thread();
for(int i=thison;i<=num;i++)
{
if(i==num)
{
Systemoutprintln("电梯到达~开门请进···");
thison=num;
}
else
{
Systemoutprintln("电梯在"+i+"层 马上就到,请等待····");
try {
thsleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
else if(num>0&&num<thison)
{
Systemoutprintln("进来了" +num+" "+thison);
Thread th1 = new Thread();
for(int u=thison;u>=num;u--)
{
if(u==num)
{
Systemoutprintln("电梯到达~开门请进···");
thison=num;
}
else
{
Systemoutprintln("电梯在"+u+"层 马上就到,请等待····");
try {
th1sleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
else
{
Systemoutprintln("1111111111111");
}
}
//内部方法
public void nei(int num)
{
Systemoutprintln("进来了~当前楼层是"+thison+" 我们的目标是"+num+"层");
if(num==thison)
{
Systemoutprintln("您就在本层 开门");
}
else if(num>0&&num<11&&num<thison)
{
for(int y=thison;y>=num;y--)
{
Thread th1 = new Thread();
if(y==num)
{
Systemoutprintln("电梯到达~欢迎下次在做···");
thison=num;
}
else
{
Systemoutprintln("电梯在"+y+"层 马上就到,请等待····");
try {
th1sleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
else if(num>0&&num<11&&num>thison)
{
for(int y=thison;y<=num;y++)
{
Thread th1 = new Thread();
if(y==num)
{
Systemoutprintln("电梯到达~欢迎下次在做····");
thison=num;
}
else
{
Systemoutprintln("电梯在"+y+"层 马上就到,请等待····");
try {
th1sleep(1000);
} catch (InterruptedException e) {
eprintStackTrace();
}
}
}
}
}
public static void main(String[] args) {
dianti d = new dianti();
//模拟开始 初始化是1层 首先我们去10层
dwai(1);//传进去的1表示我们是在1层按电梯准备上
dnei(10);//表示电梯到了 我们选择了10层开始上升 现在电梯停留在10层
dwai(5);//在电梯还在10层停留的时候 5层有人使用
dnei(1);//目标是一层
//这个其实不完整 还需要加上很多判断的 必然经过每层的时候判断是否有顺路下的
//还有就是电梯在上升的时候经过了2层到了3层 此时2层有人按 又该如何 自己试着去想一想解决方法}}
电梯系统需要以下几个程序功能:
(1)处理电梯呼叫:乘客呼叫电梯、电梯按钮明灭、电梯控制器处理电梯呼叫、处理按钮信息更新等
(2)处理楼层呼叫:包括乘客选择楼层、楼层按钮明灭、电梯控制器处理楼层呼叫、处理按钮信息更新等
(3)移动停止电梯:包括驱动速度的改变、停止的判定、电梯的运动方向驱动
(4)标志移动方向:让乘客知道电梯目前运动方向、决定是否进入电梯
(5)标志电梯位置:让乘客知道乘客的目的层是否到达。决定是否离开电梯
(6)开关门:乘客进出电梯,电梯应该开关门。应包括电梯正关闭而乘客想进入时乘客可以使电梯门打开
(7)触发紧急处理器:电梯有安全机制确定一个不安全的状态不是瞬时产生的
以上就是关于小弟要做电梯模拟设计,下面代码不懂,求高手帮翻译每一行是代码是什么意思。(我把金币都给你,重谢!)全部的内容,包括:小弟要做电梯模拟设计,下面代码不懂,求高手帮翻译每一行是代码是什么意思。(我把金币都给你,重谢!)、求模拟10层的可以运行的电梯控制程序(C/C++)、 *** 作系统模拟电梯调度算法C语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)