微机课程设计任务书Word格式.docx
《微机课程设计任务书Word格式.docx》由会员分享,可在线阅读,更多相关《微机课程设计任务书Word格式.docx(32页珍藏版)》请在冰点文库上搜索。
对C口按位复位命令字可对C口的每一位实现置位或复位。
A组控制电路控制A口和C口上半部,B组控制电路控制B口和C口下半部。
(4)读写控制逻辑:
用来控制把CPU输出的控制字或数据送至相应端口,也由它来控制把状态信息或输入数据通过相应的端口送到CPU。
2.2.2芯片8255的引脚
8255A的引脚如图2-2所示,分为数据线、地址线、读/写控制线、输入/输出端口线和电源线。
D7~D0(数据线):
三态、双向数据线,与CPU数据总线连接,用来传送数据。
CS:
片选信号线,低电平有效时,芯片被选中。
A1,A0(portaddress):
地址线,用来选择内部端口。
RD:
读出信号线,低电平有效时,允许数据读出。
WR:
写入信号线,低电平有效时,允许数据写入。
RESET:
复位信号线,高电平有效时,将所有内部寄存器清0。
PA7~PA0(端口A):
A口输入/输出信号线。
PB7~PB0(端口B):
B口输入/输出信号线。
PC7~PC0(端口C):
C口输入/输出信号线。
VCC:
+5V电源。
GND:
电源地线。
图2-2芯片8255引脚图
2.2.3芯片8255的工作方式
芯片8255A主要有三种工作方式
方式0---基本输入输出方式;
方式1---选通输入输出方式;
方式2---双向选通输入输出方式。
2.3设计思路和电路原理图
2.3.1设计思路
设有一个十字路口,1、3为南,北方向,2、4为东西方向,初始态为4个路口的红灯全亮;
之后,1、3路口的绿灯亮,2、4路口的红灯亮,1、3路口方向通车。
延迟30秒后,1、3路口的绿灯熄灭,而1,3路口的黄灯开始闪烁。
闪烁3次后,1、3路口的红灯亮,同时2、4路口的绿灯亮,2、4路口方向开始通车。
延迟30秒时间后,2、4路口的绿灯熄灭,而黄灯开始闪烁。
闪烁3次后,再切换到1、3路口方向;
之后,重复上述过程。
交通灯系统如图2-3所示。
图2-3十字路口交通灯系统示意图
通过8254计数,每1ms刷新一次,CX计数不为零,计数值减1,刷新1000次,持续一秒钟;
使用8254实现了PA7~PA0控制二极管的亮灭,PB7~PA0控制数码管的显示。
通过设置控制字,使8255的C口高四位输出,低四位输入,PC4和PC5对数码管进行位控,让两位十进制数同时显示。
2.3.2红黄绿灯的表示
在设计的过程中我们采用了六个灯,但是需要连接了8根线,所以做了如下的规定:
R表示红灯,G表示绿灯,Y表示黄灯,E表示方向东,W表示方向西,S表示方向南,N表示方向北。
所以在设计中采用如下的规定:
A7~A5分别代表东西方向红黄绿灯,A4~A2分别代表南北方向红黄绿灯,A1~A0无意义。
2.3.3硬件电路的接线图
整个系统硬件电路的接线图如图2-4所示。
图2-4系统硬件电路接线图
8255连接说明如下:
8255数据端口连接系统总线数据段D0~D7
8255RD连接系统IOR
8255WD连接系统IOW
8255CS连接IOY3
8255寄存器地址输入信号A0A1连接系统总线A0A1
8255PA端连接外设二极管(PA端A7~A2对应二极管D7~D2),作为输出
8255PB端连接外设LED,作为输出
8255PC端低位输入高位输出C0连接8254OUT端作为输入;
C4~C5连接X1~X2作为输出,控制LED显示十位个位
8254连接说明如下:
8254数据端口连接系统总线数据段D0~D7
8254RD连接系统IOR
8254WD连接系统IOW
8254CS连接IOY2
8254寄存器地址输入信号A0A1连接系统总线A0A1
8254CLK0连接1KHZ
8254GATE0连接+5V
8254OUT0连接8255C0端
.3软件编程模拟交通灯控制系统
3.1编程软件MF2KP
本次编写程序用到的主要是老师给我们的那个小程序,也就是MF2KP,这个软件里面本身也有一些经典的程序,我在编写程序之前先是看了一下这些程序,感觉里面的一些程序模块也是挺有用的,有的也可以借鉴一下;
此软件编写程序之后,运行之前需要先看一下程序中出错的地方,按照下面的提示将错误的地方改正过来,这样才能生成相应的文件,否则根本无法调试运行,此软件使用起来比较方便,但是存储容量比较小,有一些比较大的程序不能够在里面运行,这是该软件的缺点。
3.2程序流程图
本次软件编程的程序流程图如图3-1所示。
N
图3-1程序流程图
3.3编程技巧与主要知识点
本次用汇编语言进行编程,下面是编写过程中主要涉及的知识点:
1、视频显示程序设计:
一般由DOS或BIOS调用来完成。
有关显示输出的DOS功能调用不多,而BIOS调用的功能很强,主要包括设置显示方式、光标大小和位置、设置调色板号、显示字符、显示图形等。
用INT10H即可建立某种显示方式。
用DOS功能调用显示技术,把系统功能调用号送至AH,把程序段规定的入口参数,送至指定的寄存器,然后由中断指令INT21H来实现调用。
2、键盘扫描程序设计:
检测键盘状态,有无输入,并检测输入各值。
例:
利用DOS系统功能调用的01号功能,接受从键盘输入的字符到AL寄存器。
3、定时器中断处理程序:
在此中断处理程序中,计数器中断的次数记录在计数单元count中,由于定时中断的引发速率是每秒18.2次,即计数一次为55ms,当count计数值为18时,sec计数单元加一(为1秒)。
在系统定时中断处理程序中,有一条中断指令INT1CH指令,在ROMBIOS中,1CH的处理仅一条IRET指令,实际上它并没有做任何工作而只是为用户提供了一个软中断类型号,所以INT1CH指令每秒也将执行18.2次,设计中可用这个定时周期性工作的处理程序来代替原有的1CH程序,实现定时。
4、显示时间子程序:
将计时单元的二进制转换为十进制数加以显示。
3.4源程序清单
STACKSEGMENTSTACK
DW64DUP(?
)
STACKENDS
SHOWLINEMACROSTR,STA,LEN,POS,COL;
显示字符串宏
PUSHDX
PUSHBX
PUSHAX
MOVBP,OFFSETSTR;
显示起始位置
ADDBP,STA;
第几个开始
MOVDX,POS;
位置
MOVCX,LEN;
长度
MOVBX,COL;
颜色
MOVAX,1301H;
字符串显示中断
INT10H
POPAX
POPBX
POPDX
ENDM
TIMEBUF0MACROTIME,BUF;
PUSHBX
MOVDI,OFFSETBUF
MOVAL,TIME
MOVBL,0AH
MOVAH,00H
DIVBL
ADDAL,30H
ADDAH,30H
MOV[DI],AL
INCDI
MOV[DI],AH
DELAYMACRO;
延时一秒
LOCALDLOOP;
利用INT1AH/00H取得中断次数(DX),
PUSHAX
MOVAH,00H;
BIOS调用
INT1AH;
55ms引起一次中断,作为定时信号。
ADDDL,18;
定时1S,需要18个定时单位
MOVBL,DL
INCBL
DLOOP:
MOVAH,00H
INT1AH
CMPDL,BL;
是否累计到1S
JNZDLOOP;
没到,继续读
POPDX
POPAX
DATASEGMENT
TIME_YDB2
TIMEDB10
TIME0DB7
TIME_GDB30
TIME_RDB33
BUF0DB0FH
BUF_XDB'
00'
;
定义交通路口
BUF_YDB'
BUFDB'
TABLE01DB'
'
TABLE02DB'
‘
TABLE03DB
TABLE04DB'
0B3H,'
|'
TABLE05DB'
TABLE06DB'
TABLE07DB'
N'
TABLE08DB'
TABLE09DB'
TABLE10DB13DUP(0C4h),0D9h,'
0C0h,11DUP(0c4h),'
|
TABLE11DB'
TABLE12DB'
0FH,'
TABLE13DB'
TABLE14DB'
----E--'
--W---|---------------------------------------------------------------'
TABLE15DB'
TABLE16DB'
TABLE17DB'
TABLE18DB13DUP(0C4H),0BFh,'
0DAH,11DUP(0C4H),'
TABLE19DB'
TABLE20DB'
|---------------------------------------------------------'
TABLE21DB'
S'
TABLE22DB'
|
TABLE23DB'
TABLE24DB'
STRDB'
PleaseinputtimesR:
G:
Y:
[Y/N]'
STR1DB'
CHANGETIME'
STR2DB'
DOBY'
STR3DB'
NIGHT'
STR4DB'
Quitsystem[Q]'
STR5DB'
NORMAL'
STR6DB'
1.Quitsystem[Q]'
STR7DB'
2.BacktoNORMAL[B]'
STR8DB'
EMERGEN'
STR9DB'
X--G,Y--R:
[X];
X--R,Y--G:
[Y]'
STRCLDB'
STR10DB'
:
'
FLGDB0
FLG0DB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVES,AX
FUNCT:
MOVAH,01H;
清除光标
MOVCX,2000H
INT10H
CALLINITIAL
N1:
CALLSHOWTIME
CALLGETCHAR
CMPAL,'
C'
调整时间
JNELOOP1
CALLCHANGTIME
JMPFUNCT
LOOP1:
D'
手动/自动控制状态
CALLDOBY
LOOP4:
Q'
退出
JNEN1
ESC:
MOVAH,4CH
INT21H
DOBYPROCNEAR;
开关子函数
MOVFLG,0
OP:
CALLDO
OP4:
CALLGETCHAR;
调用输入控制字符
Y'
手动控制下开
JNEOP1
MOVFLG,1
JMPOP
OP1:
X'
手动控制下关
JNEOP2
MOVFLG,2
OP2:
JNEOP3;
JMPESC
OP3:
B'
JNEOP4;
手动/自动控制
JMPFUNCT
RET
DOBYENDP
DOPROCNEAR;
CMPFLG,0
JADO0;
SHOWLINEBUF,0,2,0A12H,000EH;
黄灯
SHOWLINEBUF,0,2,1212H,000EH;
SHOWLINEBUF,0,2,0E0CH,000EH;
黄灯
SHOWLINEBUF,0,2,0E18H,000EH;
JMPDO2
DO0:
CMPFLG,1
JNEDO1
SHOWLINEBUF,0,2,0A12H,0002H;
SHOWLINEBUF,0,2,1212H,0002H;
SHOWLINEBUF,0,2,0E0CH,0004H;
SHOWLINEBUF,0,2,0E18H,0004H;
DO1:
SHOWLINEBUF,0,2,0A12H,0004H;
SHOWLINEBUF,0,2,1212H,0004H;
SHOWLINEBUF,0,2,0E0CH,0002H;
SHOWLINEBUF,0,2,0E18H,0002H;
SHOWLINEBUF0,0,1,0C12H,0004H
SHOWLINEBUF0,0,1,1013H,0004H
SHOWLINEBUF0,0,1,0E0FH,0002H
SHOWLINEBUF0,0,1,0E16H,0002H
JMPDO3
DO2:
JNEDO4
SHOWLINEBUF0,0,1,0C12H,000EH
SHOWLINEBUF0,0,1,1013H,000EH
SHOWLINEBUF0,0,1,0E0FH,000EH
SHOWLINEBUF0,0,1,0E16H,000EH
DO4:
CMPFLG,1
JNEDO3
SHOWLINEBUF0,0,1,0C12H,0002H
SHOWLINEBUF0,0,1,1013H,0002H
SHOWLINEBUF0,0,1,0E0FH,0004H
SHOWLINEBUF0,0,1,0E16H,0004H
DO3:
SHOWLINESTR9,0,30,112AH,000FH;
SHOWLINESTR2,0,10,1038H,000FH;
SHOWLINESTR6,0,25,122CH,000FH;
SHOWLINESTR7,0,25,132CH,000FH;
DOENDP
CHANGTIMEPROCNEAR
CALLCHAN
SHOWLINESTR10,0,1,113AH,000FH
MOVAH,01H
INT21H
SUBAL,30H;
将输入时间值转化成
MOVBL,10;
输出十进制值
MULBL
MOVTIME_R,AL
SUBAL,30H
ADDTIME_R,AL
SHOWLINESTR10,0,1,113FH,000FH
MOVTIME_G,AL
ADDTIME_G,AL
SHOWLINESTR10,0,1,1144H,000FH
MOVTIME_Y,AL
ADDTIME_Y,AL
CH1:
JECH2
N'
JNECH1
MOVBL,10
MOVTIME_R,BL
MOVBL,5
MOVTIME_G,BL
MOVBL,4
MOVTIME_Y,BL
CH2:
CHANGTIMEENDP
CHANPROCNEAR
SHOWLINESTR,0,40,1126H,000FH
SHOWLINESTR1,0,10,1038H,000FH
SHOWLINETABLE17,0,25,122CH,000FH
CHANENDP
SHOWTIMEPROCNEAR
XORAL,AL
MOVFLG,AL
MOVFLG0,AL
MOVAL,TIME_R
MOVTIME,AL
MOVAL,TIME_G
MOVTIME0,AL
S1:
INT16H
JNZS3
DELAY;
延时一秒
DECTIME
CMPTIME,-1
JNES2;
不等于-1,显示,否则·
·
CMPFLG,2
JES
CMPFLG,1
JES0