
微机原理课程设计
报 告 书
课 题 名(硬件) 交通灯控制系统
课 题 名(软件)_______计算器________________
班 级____建筑电气______________
姓 名___________________
学 号 ___________
指导教师
日 期 2011.6.11 ~ 2012.6.21
一、硬件设计题
一、设计目的
1.利用8253定时, 8255设计电路,实现十字路口交通灯模拟控制。
2.实现能自动控制和手动应急控制。(◆)
3.实现能随时可以调整自动模式的绿灯和红灯时间。(☆)
二、设计原理与硬件图
8255的PA端口输出数码管计时显示数值所对应的段码。
8255的PB,PC端口控制发光二极管,即红、黄、绿的亮灭。
8253的3个计时器同时工作,计时器0和1工作于方式3,计时器2工作于方式0,计时器0输入1MHZ时钟信号,输出1KHZ到计时器1的时钟端,计时器输出1HZ到计时器2,利用分频作用实现。
三、程序流程图
四、程序代码
DATA SEGMENT
BUF1 DB 09H,11H,21H,12H,0CH,4AH,H,49H
BUF2 DB 0C5H,0A3H,95H,93H,95H,13H,15H,23H,0H
DATA ENDS
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA
AL,10010000B
DX,AL
AL,0
DX,AL
DX,AL
AAA1: MOV CH,[BX]
AAA4: MOV DX,A_PORT
AL,00000001B
AL,00000000B
AL,00001001B
DX,AL
AL,10010000B
DX,AL
AAA7: MOV DX,A_PORT
AL,00000010B
AL,00000000B
AL,0
AAA5: DEC CL
AAA6: MOV DX,A_PORT
AL,00000010B
AL,00000010B
SHOW1 PROC
DX,AL
SHOW1 ENDP
SHOW2 PROC
AL,CH
DX,AL
RET
SHOW2 ENDP
PLAY PROC
AL,00110111B
DX,AL
DX,AL
AL,AH
DX,AL
AL,01110111B
DX,AL
DX,AL
AL,AH
DX,AL
PLAY ENDP
DELAY PROC
0F5FH
LOOP1: LOOP LOOP1
DELAY ENDP
CODE ENDS
END START
五、程序及硬件系统调试情况
二、软件程序设计题
一、设计目的
编辑程序可以实现键盘输入数据与运算符,进行“加减乘除”运算。(提示:先输入数据与运算符,保存,再按照运算符选择对应的子程序;输入的数据是用字符表示的,需要转换;要有良好的界面(提示信息))(字符逐行提示型 ▲)(字符表达式交互型 ◆)(图形交互型 ★☆)
二、设计原理与硬件图
观察ASCII字符码表,可发现“+、-、*”等的ASCII码由28H到2FH,而“0~9”ASCII码由30H到39H,因此只需观察是否在28H~39H这个范围内,可区分输入表达式是否合法。其流程图为:
要进行数值ASCII码到补码,首先就得判断输入字符是数值还是符号。根据“+、-、*”等的ASCII码由28H到2FH,而“0~9”ASCII码由30H到39H,因此只需观察是否在28H~39H这个范围内,只需比较是否小于等于2FH(或小于30H)即可判断是否为符号,否则为数值。
把一个ASCII码数值转换为二进制补码形式,只需对其减去30H即可实现。但如果输入为多位,列如123,那么计算获得的是31H、32H、33H三字节,分别减去30H,只获得1、2、3三数而已。实际可利用加权方法合并几个数:123=1*100+2*10+3*1.流程图为:
三、程序流程图
四、程序代码
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA SEGMENT
OPS DB ?
OPD DB ?
OPER DB ?
TIT DB' _________________________________ ' ,0DH,0AH
代表回车
DB'| + - * / |' ,0DH,0AH ;0AH代表换行
DB'| Y,y:continue |' ,0DH,0AH
DB'| N,n: quit |' ,0DH,0AH
Tip1 DB 'Input the first operator (0---9):$',0DH,0AH
Tip2 DB 'Please input the oper (+,- ,*,/) :$',0DH,0AH
Error DB 'Error! Plese input the oper again:$',0DH,0AH
Tip3 DB 'Input the second operator (0---9):$',0DH,0AH
Result DB '--------------->the result is:$',0DH,0AH
Quit DB 'Choose repeat or quit? (Y/y/N/n) :$',0DH,0AH
Tsave DB ?
CODE SEGMENT
MOV AX,DATA ;初始化 DS:DX
MOV DS,AX
Remain:
MOV BL,0 ;Oper(恢复)初始状态
MOV OPS,BL
MOV OPER,BL
MOV OPD,BL
LEA SI,OPS ;OPS的偏移地址送给SI
LEA DI,OPD ;OPD的偏移地址送给DI
LEA DX,TIT
MOV AH,9
INT 21H
CALL Input1 ;调用输入第一个操作数
CALL Operat ;调用输入操作符
CALL Input2 ;调用输入第二个操作数
CALL Calculate ;调用计算方法
CALL StrQuit ;调用判断程序再次执行
MOV AH,1
INT 21H
CMP AL,'Y'
JE Remain
CMP AL,'y' ;选择Y返回Remain继续执行
JE Remain
CMP AL,'N'
JE EXIT
CMP AL,'n'
JE EXIT
EXIT:MOV AH,4CH ;若不是Y则结束
INT 21H
;输入操作数子程序---------------------------------------------------------
Input1 PROC NEAR
LEA DX,Tip1 ;输入第一个操作数提示----------
MOV AH,9
INT 21H ;十进制输入提示
BCDin1:
MOV AH,1
INT 21H
CMP AL,0DH
JE EndBCDin1 ;等于回车则返回继续输入运算符
CMP AL,30H
JB BCDin1 ; <0时转exitinD 退出
CMP AL,39H
JA BCDin1 ; >9时转exitinD 退出
AND AL,0FH ;清除高位
MOV [SI],AL
INC SI
LOOP BCDin1
CALL Enter ;回车换行
Input1 ENDP
Input2 PROC NEAR
LEA DX,Tip3 ;输入第二个操作数提示----------
MOV AH,9
INT 21H ;十进制输入提示
BCDin2:
MOV AH,1
INT 21H
CMP AL,0DH
JE EndBCDin2 ;等于回车则返回继续输入运算符
CMP AL,30H
JB BCDin1 ; <0时转exitinD 退出
CMP AL,39H
JA BCDin1 ; >9时转exitinD 退出
AND AL,0FH ;清除高位
MOV [SI],AL
INC SI
LOOP BCDin2
CALL Enter ;回车换行
Input2 ENDP
;输入操作符子程序-------------------------------------------------------
Operat PROC NEAR
ReOperat:
LEA DX,Tip2 ;输入操作符提示
MOV AH,9
INT 21H
MOV AH,1
INT 21H
CMP AL,'+'
JE OperSave ;若为"+则存在oper
CMP AL,'-'
JE OperSave
CMP AL,'*'
JE OperSave
CMP AL,'/'
JE OperSave
JMP OperError
OperError:
LEA DX,Error ;输入操作符的错误提示
MOV AH,9
INT 21H
JMP ReOperat
OperSave:
MOV OPER,AL
Operat ENDP
;计算方法子程序-----------------------------------------------------
Calculate PROC NEAR
CALL Enter ;回车换行
MOV BL,OPER
CMP BL,'+'
JZ ADCProc ;若为加法,则转到adcProc
CMP BL,'-'
JZ SUBProc
CMP BL,'*'
JZ MULProc
CMP BL,'/'
JZ DIVProc
ADCProc:
CALL StrResult ;加法
MOV AL,OPS
ADC AL,OPD
JMP endCalculate
S减法
MOV AL,OPS
SUB AL,OPD
JMP endCalculate
M乘法
MOV AL,OPD
MUL OPS
JMP endCalculate
D除法
MOV AH,0
MOV AL,OPS
DIV OPD
JMP endCalculate
endCalculate:
Calculate ENDP
MOV Tsave,AL
MOV AH,0
MOV AL,Tsave
MOV BL,100
DIV BL ;除以100
CALL Output ;显示百位数
MOV AL,AH
MOV AH,0
MOV BL,10
DIV BL ;除以10
CALL Output ;显示十位数
MOV AL,AH
CALL Output ;显示个位数
StrResult PROC NEAR
LEA DX,Result
MOV AH,9
INT 21H
RET
StrResult ENDP
O十进制输出
ADD AL,30H ;将AL中的十进制数变成ASCII码
MOV DL,AL
MOV AH,2
INT 21H
POP AX
Output ENDP
;回车换行子程序--------------------------------------------------
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
Enter ENDP
;判断程序再次执行子程序-----------------------------------------------
StrQuit PROC NEAR
CALL Enter ;回车换行
LEA DX,Quit
MOV AH,9
INT 21H
CODE ENDS
END START
五、程序及硬件系统调试情况
用计算器实现了2*4=8计算,选择y则继续,选择n则停止
实验总体设计总结与体会
通过本次实验设计,我们熟悉了芯片8253,8255功能和应用,学会了用汇编语言设计实现具体功能程序的方法。在设计中,我们充分学会利用书籍、网络等各种渠道,来了解芯片功能,实现方法。本次实验我们分组进行小组准备,我们先进行流程图设计,然后进行程序的编写和硬件图的设计。每个人负责一部分进行实现,然后进行整体连接和仿真效果的检验。虽然刚开始出现各种错误,但最终集思广益问题迎刃而解。这次实验不但使我们体会到设计的过程和方法,而且也使我们了解到了团队协作的重要性。
