1、微型计算机原理与接口技术实验报告学院:计算机科学与技术学院行政班级:2013 级信息安全 1 班学号:姓名: 实验一一、 实验内容及要求1.将代码输入到 HQFC 中,将笑脸显示到屏幕上2.自己编写代码显示全部的控制符以及积分符、希腊字母等3.编写代码:根据键入的数字求得平方值,并在屏幕上输出二、关键代码及调试情况和完成过程1、输出笑脸的程序PROG SEGMENTASSUME CS:PROG1START: MOV DL,1 ;将笑脸的 ASCII 码送入 DLMOV AH,2 ;将功能号 02 送入 AHINT 21H ;显示笑脸MOV AX,4C00HINT 21H ;返回 dosPROG
2、1 ENDSEND START2、输出全部的控制符以及积分符、希腊字母等的程序CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV BL,00H ;设置初始值为 0MOV CX,256 ;设置循环次数为 256PP: MOV DL,BL ;送入 DL 等待输出MOV AH,2 ;调用功能号 02INT BX ;自增 1,以待输出下一个码的字符LOOP BX ;循环MOV AX,4C00HINT 21HCODE ENDSEND START3、查表求平方值并输出的程序DATAS SEGMENTBUFFF DB 0AH,$TABLE DB 0,1,4,9,16,25
3、,36,49,64,81BUF DB PLEASE INPUT A NUMBER(09):,0DH,0AH,$BUFF DB 0AH,ERROR,0AH,$DATAS ENDCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATAS ;设置数据段MOV DS,AXRE:MOV DX,OFFSET BUF ;取提示信息的偏移地址MOV AH,09H ;调用功能号为 9 的功能INT 21HMOV AH,01H ;DOS 的 1 号功能调用,等待键入字符INT 21H ;AL键入数字的 ASCII 码CMP AL,2FH ;判断是否在范围内JG
4、RE2 ;若在范围内便跳转ER: MOV DX,OFFSET BUFF ;调用功能号 9 提示错误信息MOV AH,09HINT 21HJMP RERE2: CMP AL,39H ;判断是否在范围内JG ER ;大于 9 则跳转提示错误信息并要求重新输入AND AL,0FH ;AL 高 4 位清 0MOV BX,OFFSET TABLE ;查表转换MOV AH,0MOV BX,AXMOV AL,BXMOV BL,0AH ;将除数 10 放入 BLDIV BL ;AX 的数做被除数除以 BL 里面的数MOV DL,AL ;将商送入 DL(十位数)OR DL,30H ;变为 ASCII 码MOV
5、BH,AH ;暂存 AH 里面的数MOV AH,02H ;调用功能号 输出INT 21HMOV DL,BH ;输出个位数OR DL,30H ;变为 ASCII 码MOV AH,02HINT 21HMOV AH,4CHINT 21HCODES ENDSEND START调试过程中并没有出现大问题,只是在第三个程序中判断输入的数是否符合范围的时候出现了问题,解决之后运行完美。三、问题及修改过程在第 3 个程序中,判断输入的数是否在 09 的范围内时出现了问题,即下限(在这里用 ASCII 码表示)应为 2FH 而不是 30H,如果不修改,则无法输出 0 的平方值,修改之后程序可以将 0 的平方值输
6、出。四、心得体会本次实验主要体会汇编语言的执行过程和编程方法,不需要与硬件相连接,减少了实验难度,通过本次实验的编程的过程,我比较细致地体会了编程的方法和技巧,对汇编语言有了初步的理解。实验二一、实验内容及要求1.利用 8255 实现拨动开关体现在 LED 灯上。2.利用 8255 编写程序,实现跑马灯3.修改程序为跑马灯加上控制键二、关键代码及调试情况和完成过程以上为课本的理论实验图,以下为实际的实验电路图。1、实现开关控制 LED 灯的程序CODE SEGMENTASSUME CS:CODESTART:MOV DX,283H ;控制字寄存器MOV AL,1001000B ;写入控制字,A
7、口和 B 工作于方式 0,A 口输入,B 口输出OUT DX,AL TEST_IT:MOV DX,280H ;指向 A 口 IN AL,DX ;读入 A 口数据状态MOV DX,281H ;指向 B 口OUT DX,AL ;将从 A 口读入的值从 B 口输出MOV CX,65535 ;软延时DELAY:LOOP DELAYJMP TEST_IT ;循环检测该程序CODE ENDSEND START2、对 8255 编程实现跑马灯CODE SEGMENT ASSUME CS:CODESTART:MOV DX,283H ;指向控制字寄存器MOV AX,90H ;输出控制字OUT DX,AL MOV
8、 DX,281H ;指向 B 口并向 B 口输出状态 MOV AL,1H XUN:OUT DX,ALROL AL,1 ;进行循环左移以实现跑马灯MOV BX,20H ;软延时DELAY1: ;双层嵌套循环MOV CX,65535 LOOP1:LOOP LOOP1DEC BXJNZ DELAY1JMP XUN ;循环此程序CODE ENDSEND START 3、对跑马灯加入控制键以实现开关控制跑马灯CODE SEGMENTASSUME CS:CODESTART:MOV AL,90H ;写入控制字MOV DX,283HOUT DX,ALMOV AL,01H ;对 AL 赋初值MOV AH,AL
9、;将 AL 中的值咱存在 AH 中T111:MOV DX,280H ;读入 A 口状态IN AL,DXCMP AL,01H ;AL 和 1 相比较JNZ T111 ;如果开关打开(即 PA0 为高电平则继续进行,否则继续循环检测)MOV AL,AH ;将咱存在 AH 中的值读入到 AL 中MOV DX,281H ;对 B 口输出状态OUT DX,ALROL AL,1 ;AL 中的值循环左移MOV BX,20H ;软延时DELAY1: ;双层嵌套循环MOV CX,65535 LOOP1:LOOP LOOP1DEC BXJNZ DELAY1MOV AH,AL ;将 AL 中的值暂存在 AHJMP
10、T111 ;循环此程序CODE ENDSEND START在调试中除有根线无法通讯以外未出现其他问题,换线之后无问题.完成过程:将 8255 的片选信号连入地址口之后,将八路开关与 A 口相连,八个 LED 灯与 B 口相连,输入程序之后运行即可。三、问题及修改过程在编写第三个程序的时候,出现问题,原因是在检测开关状态时,AL 中的值被改变,如果在这之前不将 AL 中的值暂存在其他寄存器中则无法继续跑马灯的运行。修改方法,将 AL 中的值暂存在 AH 中,检测开关后再将 AH 中的值输入到 AL 中。修改之后程序没有问题,运行情况良好。四、心得体会本次实验是初次对芯片进行编程,通过对 8255
11、 的编程,本人初步掌握了对 8255 的编程方法,即先写控制字然后进行操作,通过对代码的调试实现了软件和硬件搭配运行完美的结果,收获颇多。实验三一、 实验内容及要求1.对 8253 编程,采用级联的方式实现 LED 灯 1 秒亮 1 秒灭。2.对 8253 编程,验证方式 03.8253 与 8255 相结合,实现跑马灯,其中延时由 8253 提供。二、关键代码及调试情况和完成过程1.对 8253 编程实现 LED 灯一秒亮一秒灭CODE SEGMENTASSUME CS:CODESTART:MOV AL,00110101B ;写控制字,选定通道 0,先读/写计数器低字节,后读/写计数器高字M
12、OV DX,283H ;节,选定方式 2,采用 BCD 计数方式OUT DX,ALMOV AL,00HMOV DX,280HOUT DX,ALMOV AL,50H ;输出计数初值,5000,则 OUT0 的输出频率为 2MHZ5000=400HZOUT DX,ALMOV AL,01110111B ;写控制字,选定通道 1, 先读/写计数器低字节,后读/写计数器高字MOV DX,283H ;节,选定方式 3,采用 BCD 计数方式MOV AL,00HMOV DX,281HOUT DX,ALMOV AL,04H ;输出计数初值,400,则 OUT1 的输出频率为 400HZ400=1HZ,即为 1
13、 秒OUT DX,AL ; 的周期CODE ENDSEND START2.验证方式 0由于此电路图较简单直接将 OUT0 接到 LED 灯上即可,不再画电路图.CODE SEGMENTASSUME CS:CODESTART:MOV AL,00110001BMOV DX,283HOUT DX,ALMOV DX,280HMOV AL,00HOUT DX,ALMOV AL,90HOUT DX,ALCODE ENDSEND START3.8253 作为延时给 8255 的跑马灯提供延时CODE SEGMENTASSUME CS:CODESTART:MOV AL,90H ;对 8255 初始化,A 口输
14、入,B 口输出MOV DX,293HOUT DX,ALMOV AL,01HMOV BL,ALMOV AL,00110101B ;对 8253 初始化,方式 2 级联输出到 PA0MOV DX,283H ;两个计数值初值均为 1010HOUT DX,ALMOV DX,280HMOV AL,10HOUT DX,ALOUT DX,ALMOV DX,283HMOV DX,01110101BOUT DX,ALMOV DX,281HMOV AL,10HOUT DX,ALOUT DX,ALT111: ;跑马灯程序开始MOV DX,290H ;读入 8253 的 OUT1 状态IN AL,DX TEST AL
15、,00000001B ;看是否为高电平,如果是高电平则继续循环,不是高电JNZ T111 ;平则继续运行TES:MOV DX,290H ;读入开关状态IN AL,DXTEST AL,00000010B ;开关关闭则继续运行,打开则继续循环停止运行JNZ TESMOV AL,BL ;将暂存在 BL 中的数输出到 AL 中MOV DX,291H ;将 AL 中的数输出到 B 口OUT DX,ALROL AL,1 ;左移一位MOV BL,AL ;将 AL 中的值暂存在 BL 中JMP T111 ;循环本程序CODE ENDSEND START调试过程中,8255 无法运行,更换实验箱后方能运行。三、
16、问题及修改过程在本实验中,主要问题为无法用 8253 实现延时,出现该问题的原因主要是对方式 2 和方式 3 的理解不够透彻,以及在实验中对方式 2 的现象不够清晰以至于实验一直处于停滞不前的状态,后经改正编程,可以正常运行。错误 1:采用方式 2 和方式 3 级联,以方式 3 输出较难实现延时错误 2:对开关和 8253 的 OUT1 同时检测易出现错误。修改过程:将方式 2 和方式 3 级联改为两个方式 2 级联并修改为合适的延时参数,除此之外,对开关和 OUT1 的检测采用分开检测的方式,以避免出现混乱的情况。四、心得体会本实验相比前两次实验较复杂一些需要透彻理解 8253 的几种工作方
17、式以及级联的参数设置才能顺利运行,虽然过程有些艰辛,但经过探索结果是正确的,更充分理解了级联的作用以及方式 2 和方式 3 的区别与联系。实验四一、 实验内容及要求1.使用 0809 实现模数的转换(与 8255 结合) ,并将转换结果体现在 LED 灯上。2.使用 0832 输出三角波,上限 5V,下限 0V,并且体现在直流电机上。二、关键代码及调试情况和完成过程1. 使用 0809 实现模数的转换(与 8255 结合) ,并将转换结果体现在 LED 灯上。CODE SEGMENTASSUME CS:CODESTART:MOV DX,290H ;8255 初始化,方式选择控制字,A 口工作于
18、方式 0 输入,B 口工作于方式 0 输出MOV AL,10011001BOUT DX,ALAA: MOV DX,280H ;虚写,启动转换NEXT:OUT DX,AL NO:MOV DX,290H ;读入 A 口的 EOC 状态IN AL,DXTEST AL,01H ;不是高电平则继续检测JZ NOMOV DX,280H ;读入转换后的数据IN AL,DXMOV DX,291H ;将转换后的数据从 B 口输出OUT DX,ALJMP AA ;循环本程序CODE ENDSEND START2.使用 0832 输出三角波,上限 5V,下限 0V,并且体现在直流电机上。CODE SEGMENTAS
19、SUME CS:CODESTART:MOV AL,00HUP:MOV DX,280H ;向端口输出值OUT DX,ALMOV BX,0010H ;软延时INC AL ;AL 加 1LOOP2:MOV CX,65535LOOP1:LOOP LOOP1DEC BXCMP BX,0001H JNZ LOOP2CMP AL,255 ;判断是否到达上限值 JNZ UP ;没有到达则循环DEC AL ;到达则减数DOWN: MOV DX,280H ;向端口输出值OUT DX,ALDEC AL ;AL 减 1MOV BX,0010HLOOP3:MOV CX,65535 ;软延时LOOP4:LOOP LOOP
20、4DEC BXCMP BX,0001HJNZ LOOP3CMP AL,00H ;判断是否低于下限JNZ DOWN ;不低于则继续循环减少JMP STARTCODE ENDSEND START 调试过程中没有出现问题,完成情况良好。三、问题及修改过程本实验中,仅第一个实验出现问题,即主要有两个问题,一个是机器转换速度太快,无法检测EOC 信号变低的过程,二是对 0809 芯片了解不透彻,需将通道的值读入到 AL 中,然后从 B 口输出状态。解决方法:1.只检测 EOC 信号是否变高,变高则继续运行,否则循环检测2.从 0809 的端口中读出转换后的数据然后通过 8255 的口输出到灯上。四、心得体会本实验相比第三个实验较简单,但需要与前面的内容相结合,本实验使我更深刻地体会到了芯片相互结合的作用,收获颇多。