蛋白质与酶工程
包埋法制备固定化微生物
预实验报告
[实验目的]
1 、考察PYD是否与麦芽汁培养基一样可发酵酵母。
2 、考察干酵母活化与酵母培养过夜活化固定后活力的异同。
[实验材料]
菌种 活性干酵母菌 1%Cacl2 PYD培养基 海藻酸钠 注射器 酵母膏 葡萄糖 麦芽汁 牛肉膏 均116°C 20min灭菌
[实验基本原理]
海藻酸钠溶解状态与菌混合包埋,注射器滴入1%Cacl2中生成海藻酸钙珠,钙还有交联作用.
[实验步骤]
1 活化酵母 称取4克活性干酵母加入2%蔗糖 25°C 5h 5%接入PYD中培养基过夜 离心收集细胞
2 将活化后的酵母与40°C 3%海藻酸钠20ml混合,用注射器吸取滴入1%Cacl2 ,成球,滴定用无菌水洗一次,在加入1%Cacl2中化2 h
3 将制备好的固定化细胞分别加入麦芽汁 PYD培养基中 28°C过夜,同时做固定化培养的对照实验
观察结果
1 固定化珠 :硬度适中 ,珠形, 球形较规整一致。
2 干酵母活化与培养后的酵母均能使麦芽汁发酵。
3 PYD培养基培养与麦芽汁培养一样可出现酵母生长产气变混的改变。
[结论]
为在7小时内完成实验,可以将活性干酵母加入2%蔗糖活化,不需培养。 为解决麦芽汁的制备困难,可以以PYD培养基代替麦芽汁,进行发酵试验。
薛胜平
2006,10,22
第二篇:微机原理预实验报告
一、题意分析及解决方案
1、题意需求分析
电梯运行的动力来自于电机运动,电梯控制要求电机以额定速度运行,电梯运行至相应楼层触发楼层感应开关,控制器记忆楼层信号,当其他相应楼层有请求信号触发时,控制器将请求信号比对,从而判定电机的下一步运行动作,应用STAR ES598PCI单板开发机设计一个电梯控制器,能实现对十层楼的5楼以上各楼层上下控制,同时根据操作动作显示电梯到达楼层。
2、解决问题的方法与思路
1)硬件部分
实验采用:
8279芯片,DAC0832芯片,七段LED显示器,4×4矩阵键盘,直流电机。
2)软件部分
① 首先要对8279进行初始化设计,设置8279的工作方式并确定8279的端口地址,实现电梯在5层、6层、7层、8层、9层、10层各种情况的处理;
② 扫描键盘并记录各楼层请求;
③ 将电梯各楼层请求在LED上显示出来;
④ 设计开门延时及运行延时程序方便在电梯运行的程序中调用;
⑤ 通过DAC0832数模转换器控制直流电机运转。
二、硬件设计
1、 可编程键盘显示器接口芯片8279
1) 8279在本设计中的作用
8279是可编程的键盘、显示接口芯片。它既具有按键处理功能,又具有自动显示功能。8279内部有键盘FIFO(先进先出堆栈)/传感器,双重功能的8*8=64BRAM,键盘控制部分可控制8*8阵列方式的传感器。该芯片能自动消抖并具有双键锁定保护功能。
2) 8279的功能分析
1、8279内部结构:
8279内部结构图如下:
图2-1 8279内部结构图
(1)数据缓冲器
它连接内、外总线,暂时CPU与8279芯片之间传送的命令、数据或状态。
(2)I/O控制
它用于控制信息的流向及区分信息的特征。CS=1时,由RO或WR控制从8279读出或向8279写入;A0=0时,选中数据寄存器,输入/输出均为数据。A0=1时,选中命令、状态寄存器,输入时位命令,输出时位状态。
(3)控制与定时寄存器
它用来寄存键盘和显示的工作方式,以及由CPU编程的其他操作方式,并通过译码产生
相应的控制信号,完成规定的控制功能。
(4)定时控制
它对外部时钟信号CLK分频至内部所需要的100kHz时钟。
(5)扫描计数器
它可根据编程命令按编码或译码方式工作。
编码方式:4位计数器按二进制计数,计数状态从扫描线SL0~SL3输出,经外部译码器译码后,为键盘和显示器提供16个扫描信号。
译码方式:扫描计数器最低两位被译码后从SL0~SL3输出,可直接作为键盘和显示器扫描信号。此时键盘矩阵为4×8,显示字符为4位。
(6)键盘去抖与控制
键盘去抖电路:在键盘扫描方式中,当有键闭合时,按命令指定方式去抖动后读入键值。
控制电路:按命令指定方式控制去抖电路的工作过程,以及对返回信号进行处理。
(7)返回缓冲器
它锁存来自RL0~RL7的回复信号,在键盘扫描方式中,返回线与键盘矩阵列线相连,在逐行扫描时搜寻一行中闭合键所在的列。当有键闭合时,经去抖动后经行、列编码和附近的移位、控制状态一起形成键盘数据送至FIFO存储器,供CPU读取。
D7 D6 D5 D4 D3 D2 D1 D0
表2-1 键盘数据格式
其中,控制和移位由两个独立的附加开关决定;SL2 SL1 SL0为按下键的行编码,来自扫描计数器的低3位;R2 R1 R0是根据返回信号确定的列编码。
(8)FIFO RAM
它是一个8×8RAM,在键盘输入方式时遵循先入先出(FIFO)原则。
(9)FIFO RAM的状态寄存器
它用来存放FIFO RAM的状态,例如RAM空、满等。当工作在键盘方式FIFO存储器不空时,将产生IRQ=1信号向CPU申请中断。
(10) 显示RAM、显示地址寄存器
显示RAM用来存储显示数据。容量为168位。在显示过程中,存储的显示数据轮流从显示寄存器输出。显示寄存器分别为A、B两组,OUTA0~3和OUTB0~3可以单独送数,也可以组成一个8位的字。显示寄存器的输出与显示扫描配合,不断从显示RAM中读出显示数据,同时轮流驱动被选中的显示器件,以达到多路复用的目的,使显示器件呈现稳定的显示状态。
显示地址寄存器用来寄存由CPU进行读/写显示RAM的地址,它可以由命令设定,也可以设置成每次读写或写入之后自动递减。
(11)显示寄存器
它存放显示内容。在显示过程中它与显示扫描配合,轮流从显示RAM中读出显示信息并依次驱动被选中的显示器件,循环不断地刷新显示字符编码,使显示器件呈现稳定的显示字符。8位显示寄存器分为A、B两组,OUTA0~3和OUTB0~3可以单独送树,显示4个字符也可以组成一个8位字符。
(12)显示地址寄存器
它寄存读/写显示RAM地址,即对应显示字符从哪一位开始。它由命令设定,并可设置成每次读出或写入之后自动加1。
B.芯片8279是一种具有40条引脚的双列直插式芯片,它的外部引脚如下图所示:
CS(片选):输入线,当CS=0时8279被选中,允许CPU对其读、写,否则被禁止。
D0~D7(数据总线):双向、三态总线,和系统数据总线相连;用于CPU和8279间的数据/命令传递。
A0:地址线,进行片内端口选择。为0时,选中数据寄存器;为1时选中命令/状态寄存器。
RD、WR(读、写信号):输入线。低电平有效,来自CPU的控制信号,控制8279的读、写操作。
CLK:系统时钟,为8279芯片提供内部定时。
RESET:复位线,高电平时复位8279到:16个字符显示(左进方式);编码扫描键盘(双键锁定);时钟设置为31。
IRQ(中断请求):输出线。高电平有效。
8279外部引脚图如下:
图2-2 8279外部引脚图
2、8279的方式控制字极格式
8279有三种工作方式:键盘工作方式、显示工作方式和传感器工作方式。
键盘工作方式:双键互锁和N键轮回。双键互锁是指当有两个以上按键同时按下时,只能识别最后一个被释放的按键,并把其键值送入内部FIFO RAM中。N键轮回是指当有多个按键同时按下时,所有按键的键值均可按扫描顺序依次存入FIFO RAM中。
显示工作方式:是指CPU输入至8279内部FIFO RAM的数据的输出格式,有8个字符左端入口显示、16个字符左端入口显示、8个字符右端入口显示、16个字符右端入口显示四种方式。
传感器方式:是指扫描传感器阵列时,一旦发现传感器的状态发生变化就置位INT向CPU申请中断。
选择不同的工作方式均是通过CPU对8279送入命令来进行控制。8279共有8种命令,命令寄存器为8位,其中D7~D5为命令特征位,D4~D0为命令的控制位。CPU对8279写入的命令数据为命令字,读出的数据为状态字。
8279共有八条命令,其功能及命令字格式分述如下。
(1)键盘/显示方式设置命令字
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 D D K K K
其中:D7、D6、D5=000为方式设置命令特征位。DD(D4、D3):用来设定显示方式,如表2-2所示。
表2-2 显示方式选择
所谓左入口 ,即显示位置从最左一位(最高位)开始,以后逐次输入的显示字符逐个向右顺序排列;所谓右入口,则是显示位置从最右一位(最低位)开始,以后逐次输入显示字符时,已有的显示字符依次向左移动。
KKK(D2、D1、D0):用来设定七种键盘/显示扫描方式,如表2-3所示。
表2-3 键盘/显示扫描方式
(2)时钟编程命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 P P P P P
其中:D7、D6、D5=001为时钟命令特征位。
PPPPP(D4、D3、D2、D1、D0)用来设定外部输入CLK时钟脉冲的分频系数N。N取值范围为2~31。如CLK输入时钟频率为2MHZ,PPPPP应被置为10100(N=20),才可获得8279内部要求的100KHZ的时钟频率。
(3)读FIFO/传感器RAM命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 AI X A A A
其中:D7、D6、D5=010为读FIFO/传感器RAM命令特征位。该命令字只在传感器方式时使用。在CPU读传感器RAM之前,必须用这条命令来设定所读传感器RAM中的地址。
AAA(D2、D1、D0)为传感器RAM中的八个字节地址。
AI(D4)为自动增量特征位。当AI=1时,每次读出传感器RAM后地址自动加1使地址指向下一个存储单元。这样,下一个数据便从下一个地址读出,而不必重新设置读FIFO/传感器RAM命令。
在键盘工作方式中,由于读出操作严格按照先入先出顺序,因此,不需使用这条命令。
(4)读显示RAM命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 1 1 AI A A A A
其中:D7、D6、D5=011为读显示RAM命令字的特征位。该命令字用来设定将要读出的显示RAM地址。
AAAA(D3、D2、D1、D0)用来寻址显示RAM中的存储单元。由于位显示RAM中有16个字节单元,故需要4位寻址。
AI(D4)为自动增量特征位。AI=1时,每次读出后地址自动加1,指向下一地址。
(5)写显示RAM命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
1 0 0 AI A A A A
其中:D7、D6、D5=100为写显示RAM命令字的特征位。在写显示RAM之前用这个命令字来设定将要写入的显示RAM地址。
AAAA(D3、D2、D1、D0)为将要写入的显示RAM中的存储单元地址。
AI(D4)为自动增量特征位。AI=1时,每次写入后地址自动加1,指向下一次写入地址。
(6)显示禁止写入/消隐命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
1 0 1 X IW/A IW/B BL/A BL/B
其中:D7、D6、D5=101为显示禁止写入/消隐命令特征位。
IW/A、IW/ B(D3、D2)为A、B组显示RAM写入屏蔽位。当A组的屏蔽位D3=1时,A组的显示RAM禁止写入。因此,从CPU写入显示器RAM数据时,不会影响A的显示。这种情况通常在采用双4位显示器时使用。因为两个四位显示器是相互独立的。为了给其中一个四位显示器输入数据而又不影响另一个四位显示器,因此必须对另一组的输入实行屏蔽。
BL/A、BL/ B(D1、D0)为消隐设置位。用于对两组显示输出消隐。若BL=1,对应组的显示输出被消隐。当BL=0,则恢复显示。
(7)清除命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
1 1 0 CD CD CD CF CA
其中:D7、D6、D5=110为清除命令特征位。清除显示RAM方式如表2-4所示。
表2-4 显示RAM清除方式
CF(D1)用来置空FIFO存储器,当CF=1时,执行清除命令后,FIFO RAM被置空,使INT输出线复位。同时,传感器RAM的读出地址也被置为0。
CA (D0)为总清的特征位。它兼有CD和CF的联合效能。在CF =1时,对显示的清除方式由D3、D2的编码决定。
显示RAM清除时间约需160us。在此期间状态字的最高位Du=1,表示显示无效。CPU不能向显示RAM写入数据。
(8)结束中断/错误方式设置命令
命令格式:
D7 D6 D5 D4 D3 D2 D1 D0
1 1 1 E X X X X
其中:D7、D6、D5=111为该命令的特征位。此命令有两种不同的作用。
①作为结束中断命令。在传感器工作方式中使用。每当传感器状态出现变化时,扫描检测电路就将其状态写入传感器RAM,并启动中断逻辑,使INT变高,向CPU 请求中断,并且禁止写入传感器RAM。此时,若传感器RAM 读出地址的自动递增特性没有置位(AI=0),则中断请求INT在CPU第一次从传感器RAM读出数据时就被清除。若自动递增特征已置位(AI=1),则CPU对传感器RAM 的读出并不能清除INT,而必须通过给8279写入结束中断/错误方式设置命令才能使INT变低。因此,在传感器工作方式中,此命令用来结束传感器RAM的中断请求。
②作为特定错误方式设置命令。在8279已被设定为键盘扫描N键轮回方式以后,如果CPU给8279又写入结束中断/错误方式设置命令(E=1),则8279将以一种特定的错误方式工作。这种方式的特点是:在8279的消抖周期内,如果发现多个按键同时按下,则FIFO状态字中的错误特征位S/E将置1,并产生中断请求信号和禁止写入FIFO RAM。
上述八种用于确定8279操作方式的命令字皆由D7D6D5特征位确定,输入8279后能自动寻址相应的命令寄存器。因此,写入命令字时唯一的要求是使数据选择信号A0 =1。
3、8279的状态字及格式
8279的FIFO状态字,主要用于键盘和选通工作方式,以指示FIFO RAM中的字符数和有无错误发生。其格式为:
D7 D6 D5 D4 D3 D2 D1 D0
DU S/E O U F N N N
其中:Du(D7)为显示无效特征位。当 Du=1表示显示无效。当显示RAM由于清除显示或全清命令尚未完成时,Du=1,此时不能对显示RAM写入。
S/E(D6)为传感器信号结束/错误特征位。该特征位在读出FIFO 状态字时被读出。而在执行CF =1的清除命令时被复位。当8279工作在传感器工作方式时,若S/E=1,表示传感器的最后一个传感器信号已进入传感器RAM;而当8279工作在特殊错误方式时,若S/E=1则表示出现了多键同时按下错误。
O、U(D5、D4)为超出、不足错误特征位。对FIFO RAM 的操作可能出现两种错误:超出或不足。当FIFO RAM 已经充满时,其它的键盘数据还企图写入FIFO RAM ,则出现超出错误,超出错误特征位O(D5)置1;当FIFO RAM已经置空时,CPU还企图读出,则出现不足错误,不足错误特征位U(D4)置1。
F(D3)表示FIFO RAM中是否已满标志,若F=1表示已满。
NNN(D2、D1、D0)表示FIFO RAM中的字符数据个数。
4、数据输入/输出格式
对8279输入/输出数据不仅要先确定数据地址口,而且数据存放也要按一定格式,其格式在键盘和传感器方式有所不同。
(1) 键盘扫描方式数据输入格式
键盘的行号、列号及控制键格式如下:
图2-3 键盘的行号、列号及控制键格式
控制键CNTL、SHIFT为单独的开关键。CNTL与其它键连用作特殊命令键,SHIFT可作上、下挡控制键。
(2)传感器方式数据输入格式
此种方式8位输入数据为RL0~RL7的状态。
格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
RL7 RL6 RL5 RL4 RL3 RL2 RL1 RL0
3)8279的技术参数
8279技术参数如下:
表2-5 8279主要技术参数
2、 DAC0832数模转换器
1) DAC0832在本设计中的作用
实验中通过DAC0832控制直流电机运转从而模拟电梯的运行和停止过程。需要将8086送来的8位数字量化成模拟电流量,在设计中将数字信号转换为模拟信号,故选取DAC0832数模转换器。
2) DAC0832的功能分析
DAC0832是8位数/模转换芯片,输入数字量具有双缓冲功能,可以工作在双缓冲,单缓冲或直接输入三种方式。直接输入方式是将8086送来的8位数据量直接送入数/模转换器,不进行锁存;单缓冲只锁存一次数据(即80856送来的数据量进行锁存);双缓冲方式的工作原理:输入寄存器经过总线收发器与数据总线连接,当ILE,和有效时,8位数据量被打入输入寄存器,当和有效时,输入寄存器中数据送至DAC寄存器并输出,则将这个数据锁存在DAC寄存器中,并开始转换。
DAC0832芯片采用CMOS工艺,四象限乘法型DAC与微机兼容,数据输入能与双缓冲,单缓冲或直接缓冲通过三种方式工作。
3)DAC0832的技术参数
主要参数如下:
表2-6 DAC0832主要技术参数
3、 七段LED显示器
1) 七段LED显示器在本设计中的作用
实验中用七段LED显示器显示对应楼层的请求,有相应按键请求对应LED显示器显示呼叫楼层,并能显示电梯当前运行状态及电梯当前运行楼层。
2) 七段LED显示器的功能分析及技术参数
物理构造:LED发光二级管,采用砷化镓、镓铝砷、和磷化镓等材料制成,其内部结构为一个PN结,具有单向导电性。当在发光二极管PN结上加正向电压时,PN结势垒降低,载流子的扩散运动大于漂移运动,致使P区的空穴注入到N区,N区的电子注入到P区,这样相互注入的空穴与电子相遇后会产生复合,复合时产生的能量大部分以光的形式出现。将七个发光管进行组合,排列成数字图形8,再根据需要控制七个管的亮与灭,即可显示出定义数字。有段选码和位选码确定数字1~8的输出并在延时程序中保持复位。它是一种当外加电压超过额定电压时发生击穿,并因此而产生可见光的器件。这种数码管是有7段或8段笔画显示器组成一个字符而形成的。
其结构图如下:
图2-4 LED结构图
LED数码管字形码表如下:
表2-7 LED数码管字形码表
4、4×4矩阵键盘的作用
1) 4×4矩阵键盘的作用
本设计中采用矩阵键盘模拟实现电梯运行过程中的对应楼层的呼叫请求。按下对应按键表明相应楼层有呼叫请求。
2) 4×4矩阵键盘的功能分析
通常使用的键盘是矩阵结构的。对于4×4=16个键的键盘,采用矩阵方式只要用8条引线和2个8位端口便完成键盘的连接。如图,这个矩阵分为4行4列,如果键5按下,则第1行和第1列线接通而形成通路。如果第1行线接低电平,则键5的闭合,会使第1列线也输出低电平。矩阵式键盘工作时,就是按行线和列线的电平来识别闭合键的。
图2-5 4×4键盘矩阵图
行扫描法识别按键的原理如下:先使第0行接低电平,其余行为高电平,然后看第0行是否有键闭合。这是通过检查列线电位来实现的,即在第0行接低电平时,看是否有哪条列线变成低电平。如果有某列线变为低电平,则表示第0行和此列线相交位置上的键被按下;如果没有任何一条列线为低电平,则说明第0行没有任何键被按下。此后,再将第1行接低电平,检测是否有变为低电平的列线。如此重复地扫描,直到最后一行。在扫描过程中,当发现某一行有键闭合时,也就是列线输入中有一位为0时,便退出扫描,通过组合行线和列线即可识别此刻按下的是哪一键。
实际应用中,一般先快速检查键盘中是否有键按下,然后再确定按键的具体位置。为此,先使所有行线为低,然后检查列线。这时如果列线有一位为0,则说明必有键被按下, 采用扫描法可进一步确定按键的具体位置。
5、硬件总逻辑图及其说明
连线说明:
F3:OUT —— F1:CTRL
CS —— A2:CS2
E5:CLK —— B2:2M
CS —— A3:CS1
A0 —— ES-PCI: A0
A —— G5:A
B —— G5:B
C —— G5:C
D —— G5:D
实验硬件总逻辑图如下:
图2-6 硬件总逻辑图
三、控制程序设计
1、 控制程序设计思路说明
电梯的运行基本过程是:由外部呼叫信号给出呼叫,控制系统判断电梯目前所处位置,并于呼叫楼层进行对照,同方向还是反方向。若反方向,则改变方向到呼叫层,若同方向,则直接运行到呼叫层。在方向上,以同方向呼叫优先。
要求电梯匀速运行,其运行动力来自于电动机,本实验中采用直流电机作为控制对象。
采用8279芯片对LED显示器及键盘控制。电梯在每一层的外部分别设置一个向上以及一个向下的呼叫按钮,当楼层发出呼叫信号,电梯根据当前运行方向做出判断是否响应该楼层呼叫,若与当前电梯运行方向一直,电梯运行至呼叫楼层暂停开门延时一段时间待乘客进入电梯选择目的楼层,关电梯门继续运行直至相应楼层,电梯运行过程中要继续判断运行方向上是否还有呼叫信号,并做出判断。
楼层指示及状态显示均通过LED七段数码管的显示来实现。每层楼的指示用到一个七段数码管,加上指示电梯当前运行楼层的七段数码管指示,以及显示电梯运行方向6(向上)9(向下)的七段数码管,一共用到五个LED七段数码管。
信号输入用到了4×4矩阵键盘,根据初始化定义1层向上、1层、2层向下、2层向上、2层、3层向下、3层分别用0到6七个按键表示,所以按照定义顺序1层向上、2层向上、2层向下、3层向下按键请求分别用0键、2键、3键、5键表示。
D/A转换器与直流电机相连,直流电机驱动电梯的运行,直流电机的匀速转动带动电梯匀速转动,直流电机的转动表示电梯处于运行状态,直流电机停止则表示电梯相应开门请求或者当前无请求。
下面对电梯运行过程做具体分析:
电梯正常运行时以每2 秒1层的速度上升或下降,当没有呼叫请求的情况下电梯总是自动保持静止状态在1楼,当外部有呼叫信号的时候,电梯运行。
设电梯当前停止在某一楼层(8个LED灯全灭)键入请求(仅为请求)
如键入的请求与当前电梯楼层相同,不发生任何动作,若不同,则相应楼层LED灯亮,再按运行键,电梯自动判别上下行方向,运行至相应楼层(八段显示码显示该楼层,相应LED灯灭)
设电梯当前正处于上行或下行,此时八段码显示楼层变化,LED指示希望到达楼层,键入新楼层则相应LED灯亮,对同方向请求未到楼层能到,对反方向请求楼层则是待电梯到达最高请求楼层之后调整方向再相应请求。
例如:
① 电梯当前状态为1层向上运行,LED显示请求在3层向下运行
此时按2上,则在2层停,再按运行键,电梯行运至3层停
此时按2下,则先运行至3层停,再按运行键向下运行至2层停
此时按3或3下,则直接运行至3层停
② 电梯当前状态为1层向上运行,LED显示请求在2层向上运行
此时按1上或1,电梯直接开门
此时按2上或2下或2,电梯运行至二楼停止
此时按3下或3,电梯先运行至2层再按运行键运行至3层
③ 电梯当前状态为2层向上运行,LED显示请求在3层向下运行
此时按2或2上,则在2层停,再按运行键,运行至3层停
此时按2下,则先运行至3层停,再按运行键,向下运行至2层停
此时按3下或3,则直接运行至3层停
此时按1或1上,则先运行至2层停,再按运行键向下运行至1层停
④ 电梯当前状态为2层向下运行,LED显示请求在1层向上运行
此时按2下或2,则在2层停,再按运行键,运行至1层停
此时按2上,则先运行至1层,再按运行键向上运行至2层停
此时按1或1上,则直接运行至1层停
此时按3或3下,则先运行至1层,再按运行键,向上运行至3层
⑤ 电梯当前状态为3层向下运行,LED显示请求在1层向上运行
此时按2下或2,则在2层停,再按运行键,运行至一层停
此时按2上,则先运行至1层停,再按运行键,向上运行至2层停
此时按1或1上,则直接运行至1层停
⑥ 电梯当前状态为3层向下运行,LED显示请求在2层向下运行
此时按1上或1,电梯先运行至2层再按运行键运行至1层
此时按2上或2下或2,电梯运行至2层停止
此时按3下或3,电梯直接开门
根据以上分析,电梯每运行到一层都先查看按键是否被按下,并进行相应判断。
首先进行此时状态判断,同时根据不同的按键操作进行不同的处理
2、 控制程序流程图
图 3-1 电梯位于一层程序流程图
图3-2 电梯二层上行程序流程图
图3-3 电梯二层下行程序流程图
图3-4 电梯位于三层程序流程图
3、 控制程序
.MODEL TINY
PCIBAR3 EQU 1CH ;8位I/O空间基地址(它就是实验仪的基地址,
;也为DMA & 32 BIT RAM板卡上的8237提供基地址)
Vendor_ID EQU 10EBH ;厂商ID号
Device_ID EQU 8376 ;设备ID号
.STACK 100
.DATA
IO_Bit8_BaseAddress DW ?
msg0 DB 'BIOS不支持访问PCI $'
msg1 DB '找不到Star PCI9052板卡 $'
msg2 DB '读8位I/O空间基地址时出错$'
KEYCOUNT DB ?
JILU db ?
UP_OR_DOWN DB 0
dangqian db 0
KEY_TAB DB 00000001B ;1层外部上行请求 01H
DB 00000010B ;1层内部请求 02H
DB 00000100B ;二层外部下行请求 04H
DB 00001000B ;二层外部上行请求 08H
DB 00010000B ;二层内部请求 10H
DB 00100000B ;三层外部下行请求 20H
DB 01000000B ;三层内部请求 40H
LED_TAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H ;共阳极选码
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH
DB 0FFH
CMD_8279 DW 00F1H ;8279命令字、状态字地址
DATA_8279 DW 00F0H ;8279读写数据口的地址
ADDR_0832 DW 00E0H ;0832的入口地址
.CODE
START: MOV AX,@DATA
MOV DS,AX
NOP
CALL InitPCI
CALL ModifyAddress ;根据PCI提供的基地址,将偏移地址转化为实地址
ms: CALL INIT8279 ;初始化8279子程序
CALL OPEN_DOOR
mov al,1
call disp ;显示当前在1层
mov UP_OR_DOWN,0
MOV JILU,0
s:
call Fscan ;按键扫描
jNC s
s1:
MOV AH,JILU
and al,0Fh ;al高四位清零
lea BX,KEY_TAB ;将请求信号记录
xlat
or AH,al
MOV JILU,AH
First_load:
call clear ;清显示
call dis8play ;显示所有楼层请求
mov al,1
MOV DANGQIAN,1
call disp ;显示单个数据
;==========当前电梯位于一层,判断接下来要去往哪层=========================
Test jilu,01H
JNZ First
Test jilu,02H
JZ Three
First: CALL open_delay ;开门延时
and jilu,0FCH ;将一层请求清空
call clear
jmp First_load ;若当前请求为一层,返回S
Three: Test jilu,40H ;查看有无三层请求
JNZ Second
Test jilu,20H
JNZ Second
Test jilu,10H ;查看有无二层请求
JNZ Second
Test jilu,08H
JNZ Second
Test jilu,04H
Jz ms
Second:
call clear
MOV UP_OR_DOWN,1
call dis8play;显示当前所有楼层信息
mov dangqian,1
mov al,dangqian
call disp ;显示单个信息
CALL dianji_delay ;向上运行电机
; CALL Two_loader_up ;呼唤二层子程序
jmp two_up_start
reload:
jmp First_load
;=====================二层向上行子程序===================================
Two_loader_up proc NEAR
two_up_start:
MOV UP_OR_DOWN,1
mov dangqian,2
CALL DISPLAY_DANGQIAN ;显示当前在二层及请求信息
Test jilu,10H ;有二层内部请求?
JNZ Two_hold1 ;有
Test jilu,08H ;判断有二层外部上行请求?
JZ Two_third_quest1 ;无,判断有无三层请求
Two_hold1:
CALL Open_delay ;在二层开门
and jilu,67H ;取消二层的请求
CALL DISPLAY_DANGQIAN ;显示当前所有信息
Two_third_quest1:
Test jilu,20H ;判断有无三层内部请求
JNZ Third_up_answer1 ;有,前往三层
Test jilu,40H ;判断有无三层外部下行请求
JZ Two_down_first_quest1;无,跳入1层请求信号判断
Third_up_answer1:
CALL dianji_delay ;运行转动电机,楼层转换延时操作
mov dangqian,3
call display_dangqian
jmp Third_loader ; 调用三层子程序
Two_down_first_quest1:
TEST jilu,04H ;判断有无二层下行请求信号
jmp two_down_start ;若有外部下行请求,则跳转至二层下行
Test jilu,02H ;判断有无一层内部请求信号
JNZ first_quest1 ;有,前往一层
Test jilu,01H ;判断有无一层向上请求信号
JNZ First_quest1 ;有,前往一层
JZ TIAOZHUAN ;所有请求均无,返回初始处
First_quest1:
mov up_or_down,2
call display_dangqian
CALL dianji_delay ;运行转动电机,楼层转换延时操作
jmp First_load
RET
Two_loader_up ENDP
;==============================================================
TIAOZHUAN:
JMP m
m:
call Fscan ;按键扫描
jNC m
s2:
MOV AH,JILU
and al,0Fh ;al高四位清零
lea BX,KEY_TAB ;将请求信号记录
xlat
or AH,al
MOV JILU,AH
jmp two_up_start
;=====================二层下行子程序=========================================
;Two_loader_down proc near
two_down_start:
MOV UP_OR_DOWN,2
MOV DANGQIAN,2
CALL DISPLAY_DANGQIAN
;显示当前在二层及请求信息
Test jilu,10H ;判断有无二层内部请求
JNZ Two_hold2 ;有
Test jilu,04H ;判断有二层外部下行请求?
JZ Two_first_quest2 ;无,判断有无三层请求
Two_hold2:
CALL Open_delay ;在二层开门,取消请求
and jilu,0EBH ;取消二楼的请求
CALL DISPLAY_DANGQIAN ;显示当前在二层及请求信息
Two_first_quest2:
Test jilu,02H ;判断有无一层内部请求信号
JNZ First_answer2 ;有,前往一层
Test jilu,01H ;判断有无一层外部上行请求信号
JZ Two_third_quest2 ;判断有无三层请求
First_answer2:
CALL DIANJI_DELAY
jmp First_load
Two_third_quest2:
Test jilu,20H ;判断有无三层内部请求
JNZ Third_answer2 ;有,前往三层
Test jilu,40H ;判断有无三层外部下行请求
JNZ Third_answer2
Test jilu,08H
JZ two_down_tiao
jmp two_up_start
Third_answer2:
CALL DIANJI_DELAY ;楼层转换延时操作
mov dangqian,3
CALL DISPLAY_DANGQIAN
JMP Third_loader
two_down_tiao:
call DISPLAY_DANGQIAN
jmp tiaozhuan
; RET
;Two_loader_down endp
;=============================================================
TIAOZHUAN2:
JMP n
n:
call Fscan ;按键扫描
jNC n
s3:
MOV AH,JILU
and al,0Fh ;al高四位清零
lea BX,KEY_TAB ;将请求信号记录
xlat
or AH,al
MOV JILU,AH
jmp third_loader
;========================三层向下子程序======================================
;Third_loader proc near
third_loader:
mov dangqian,3
mov up_or_down ,2
CALL DISPLAY_DANGQIAN ;显示当前在三层及请求信息
Test jilu,40H
JNZ Third_hold
Test jilu,20H
JZ Third_first_quest
Third_hold:
CALL Open_delay ;开门延时操作
and jilu,9FH ;取消三层的请求
CALL DISPLAY_DANGQIAN ;显示当前所有信息
Third_first_quest:
Test jilu,02H
JNZ Third_down_Two
Test jilu,01H
JNZ Third_down_Two
Third_two_quest:
Test jilu,10H
JNZ Third_down_Two
Test jilu,08H
JZ two_up_quest
Third_down_Two:
MOV UP_OR_DOWN,2
CALL dianji_delay ;电机转动运行至二层
jmp two_down_start
Two_up_quest:
Test jilu,04H
JZ TIAOZHUAN2
call dianji_delay
jmp Two_up_start
; RET
;Third_loader ENDP
;======================================================
Fscan proc near
FSCAN:
CALL IfExit
JZ FSCAN11
JMP Exit
FScan11:
MOV DX,CMD_8279 ;命令/状态口地址
IN AL,DX ;读取状态字
FREAD_FIFO: AND AL,7
JZ FNO_KEY
FREAD: MOV AL,40H ;读FIFO RAM命令
OUT DX,AL
MOV DX,DATA_8279
IN AL,DX
STC ;有键CF置1
FSCAN_END: ret
FNO_KEY: CLC ;无键按下,清CF
JMP Fscan_end ;没有按键
Fscan endp
;=============================开门延时=============================
OPEN_delay proc near
call open_door
mov cx,0FFFFH
;mov dx,200d
delay1:
; call clear
call scan
; CALL DISPLAY_DANGQIAN
; inc dx
; jnz delay1
; ret
loop delay1
RET
OPEN_DELAY endp
OPEN_DOOR PROC NEAR
MOV AX,0
MOV DX,ADDR_0832
OUT DX,AL
RET
OPEN_DOOR ENDP
;=============================电机延时================================
DIANJI_DELAY PROC NEAR
CALL START_DIANJI
; mov dx,3d
dianji:
delay2:
call scan
; CALL DISPLAY_DANGQIAN
loop delay2
; inc dx
; jnz dianji
ret
DIANJI_DELAY ENDP
START_DIANJI PROC NEAR
MOV AX,0FFh
mov dx,ADDR_0832
OUT DX,AL
RET
START_DIANJI ENDP
;==========扫描并记录===================
scan proc near
SCAN:
CALL IfExit
JZ SCAN11
JMP Exit
Scan11:
MOV DX,CMD_8279 ;命令/状态口地址
IN AL,DX ;读取状态字
READ_FIFO: AND AL,7
JZ NO_KEY
READ: MOV AL,40H ;读FIFO RAM命令
OUT DX,AL
MOV DX,DATA_8279
IN AL,DX
STC ;有键CF置1
jmp start2
NO_KEY: CLC ;无键按下,清CF
JMP scan_end ;没有按键
START2:
MOV AH,JILU
and al,0Fh
lea BX,KEY_TAB ; 将请求信号记录
xlat
or AH,al
MOV JILU,AH
SCAN_END: ret
scan endp
;=====================================================
DISPLAY_DANGQIAN PROC NEAR
CALL CLEAR
CALL DIS8PLAY
MOV AL,DANGQIAN
CALL DISP
RET
DISPLAY_DANGQIAN ENDP
;================显示当前有请求的楼层=======================
DIS8PLAY PROC NEAR
MOV AH,JILU
test JILU,01H
jnz load1 ;若无一层请求,跳转至二层断判
test JILU,02H
jz load2
load1: mov al,1H
call disp
load2:
mov al,10H
call disp
test jilu,04h
jnz load22
test jilu,10h
jnz load22
test jilu,08h
jz load3 ;若无二层请求,跳转至三层判断
load22: mov al,2H
call disp
load3:
mov al,10H
call disp
test jilu,20H ;若无三层请求,判断当前电梯处于上或下行
jnz load33
test jilu,40h
JZ UP_DOWN
load33: mov al,3
call disp
UP_DOWN:MOV AL,UP_OR_DOWN
CMP AL,1 ;判断是否为上行
JNZ DOWN ;不是,跳转判断是否为下行
MOV AL,6H
JMP DIS8EXIT
DOWN: cmp AL,2 ;判断是否为下行
JNZ DISPLAY_RET
mov al,9H
jmp dis8exit
DISPLAY_RET:
Mov al,10H
DIS8EXIT:
CALL disp
RET
Dis8play endp
;========================进行显示单个数据=========================
disp proc near
CALL KEY_NUM
LEA BX,LED_TAB
XLAT
CALL WRITE_DATA
RET
disp endp
KEY_NUM PROC NEAR
AND AL,3FH ;键值转化成键号,8位中的后6位
RET
KEY_NUM ENDP
WRITE_DATA PROC NEAR
MOV DX,DATA_8279
OUT DX,AL
RET
WRITE_DATA ENDP
;==============================================================
IfExit PROC NEAR
PUSH AX
PUSH DX
MOV AH,06H
MOV DL,0FFH
INT 21H
POP DX
POP AX
JZ IfExit1
JMP Exit
IfExit1: RET
IfExit ENDP
;==============================================================
InitPCI PROC NEAR
MOV AH,00H
MOV AL,03H
INT 10H ;清屏
MOV AH,0B1H
MOV AL,01H
INT 1AH
CMP AH,0
JZ InitPCI2
LEA DX,msg0
InitPCI1: MOV AH,09H
INT 21H
JMP Exit
InitPCI2: MOV AH,0B1H
MOV AL,02H
MOV DX,Vendor_ID
MOV CX,Device_ID
MOV SI,0
INT 1AH
JNC InitPCI3 ;是否存在Star PCI9052板卡
LEA DX,msg1
JMP InitPCI1
InitPCI3: MOV DI,PCIBAR3
MOV AH,0B1H
MOV AL,09H
INT 1AH ;读取该卡PCI9052基地址
JNC InitPCI4
LEA DX,msg2
JMP InitPCI1
InitPCI4: AND CX,0FFFCH
MOV IO_Bit8_BaseAddress,CX
RET
InitPCI ENDP
;=============================================================
ModifyAddress PROC NEAR
; MOV AX,IO_Bit8_BaseAddress
ADD CMD_8279,CX;偏移地址转化为实地址
ADD DATA_8279,CX
ADD ADDR_0832,CX
RET
ModifyAddress ENDP
;=============================================================
;8279初始化
INIT8279 PROC NEAR
MOV DX,CMD_8279 ;CMD_8279为写命令地址、读状地址
MOV AL,34H ;可编程时钟设置,设置分频系数(20分频)00110100
OUT DX,AL
MOV AL,10H;8*8字符显示,左边输入,外部译码
OUT DX,AL
CALL INIT8279_1
RET
INIT8279 ENDP
INIT8279_1 PROC NEAR
CALL CLEAR ;清显示
MOV AL,90H ;从第一个数码管开始移位显示
OUT DX,AL
RET
INIT8279_1 ENDP
;==============================================================
CLEAR PROC NEAR
MOV DX,CMD_8279
MOV AL,0DEH ; 清除命令
OUT DX,AL
WAIT1: IN AL,DX
TEST AL,80H
JNZ WAIT1 ; 显示RAM清除完毕吗?
RET
CLEAR ENDP
CLEAR_FIFO PROC NEAR
MOV DX,CMD_8279
MOV AL,0C2H ; 清除FIFO RAM命令
OUT DX,AL
RET
CLEAR_FIFO ENDP
;============================================================
Exit: MOV AH,4CH
INT 21H
END START