学院名称:计算机科学与工程学院
实验报告
姓名
班级
学号
2015
专业
计算机科学与技术
2015 级 2 班
实验项目
实验一: 汇编及 C51 语言基础
课程名称
实验时间
单片机
课程代码
0660226
2017 年 11 月 28 日 1、2 节
2017 年 12 月 1 日 中午、5、6 节
实验地点
软件实验室 7-215
软件实验室 7-220
实验目标结果
评价
20 分
■ 功能完善 20 分
■ 满足功能要求
15 分
■有小错误 10 分
■无法运行 0 分
实验成绩考核评定分析
程序设计规范
性评价
20 分
■ 程 序 易 读 性 好
15 分
■ 程 序 易 读 性 较
好 10 分
■ 程 序 易 读 性 较
差 5 分
**注:易读性要求
标 识 符 命 名 见 名
知意,程序编制采
用嵌套方式,层次
结构清晰可读,关
键 部 分 具 有 简 明
注释。
实验报告完整
性评价
30 分
■报告完整 30 分
■报告较完整 25
分
■ 报 告 内 容 一 般
20 分
■ 报 告 内 容 极 少
10 分
■无报告 0 分
**注:无报告者各
项考核内容均以 0
分评定,实验成绩
为 0 分。
实验报告雷同
情况分析
实验
成绩
凡 雷 同 学 生 将 不
六 项 评 价 分 数 之
再 评 价 前 六 项 考
和
(** 雷 同 学 生 另 算
**)
核内容,实验成绩
将 按 低 学 号 雷 同
学 生 成 绩 除 雷 同
人数计算而定。
标记为:
S 组号-人数(组分)
实验过程综合
评价
30 分
■ 实 验 过 程 认 真
专注,能独立完成
设计与任务 25 分
■实验过程认真,
能 较 好 完 成 设 计
20 分
■实验过程认真,
能完成设计 15 分
■ 实 验 过 程 态 度
较好,基本完成设
计任务 10 分
■ 实 验 过 程 态 度
欠端正,未完成设
计任务 0 分
实验目的:
1. 熟悉和掌握Keil进行汇编语言调试的常用指令;
2. 了解和掌握MOV指令在不同的寻址方式下的使用方法;
3. 了解和掌握加、减指令在程序设计中的用法;
4. 熟悉和掌握Keil进行C51语言编程和调试的常用指令;
5. 了解和掌握绝对地址访问方法;
6. 了解和掌握C51的程序结构。
实验内容:
1、简单程序调试
(1) 传送指令
将下述程序用 DEBUG 调试成功后,设置内部 RAM 的值,(30H)=40H, (40H)=10H,单步(F10)执行
第 1页 共 13页
下列程序,检查结果。
MOV R0,#30H
MOV A,@R0
MOV R1, A
MOV B, @R1
STOP: SJMP STOP
END
执行后:(R0)= 30H,(R1)=00H,(A)=00H,(B)=30H,(30H)=40H,(40H)=10H。
(2) 运算指令
MOV A, #0BFH
MOV A, #0BFH
MOV A, #0BFH
MOV A, #0BFH
MOV 20H, #85H
MOV
20H,
MOV 20H, #85H
MOV B, #85H
SETB C
#85H
SETB C
MUL AB
ADD A, 20H
SETB C
SUBB A, 20H
SJMP $
ADDC A, 20H
(A)=44H
(A)=45H
(A)=39H
(A)=3BH (B)=63H
CY=1
AC=1
CY=1
AC=1
CY=0
AC=0
OV=1
P=0
OV=1
P=1
OV=0
P=0
CY=0
OV=1
AC=0
P=1
单步
执行
结果
标志
(3)
预先对 R3 和 R4 赋值,然后执行下列程序,检查结果。
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:MOV A,R3
CLR C
ADD A,R4
JC
PP1
MOV
R3,#00H
SJMP
PP2
PP1:MOV
R3,#01H
PP2:MOV
R4,A
第 2页 共 13页
END
执行后:(R3)=00H,(R4)=07H,(A)=07H。
2、多字节十六进制数加法
被加数
加数
结果
低位
20H
21H
22H
23H
67
45
23
01
30H
31H
32H
33H
65
72
98
89
20H
21H
22H
23H
32
18
22
91
高位
图 1-2
4 字节十六进制数相加
两个 4 字节十六进制数 1234567 和 89987265 相加,将其按低位到高位存放在地址为 20-23H、30-33H
的 RAM 中,运算结果存放在 20-23H 的地址中,如上图示。
运算程序如下,ADD_BCD 为多字节十进制数加法子程序的首地址。分别按 “单步”和“全速”方式
调试程序。检查运算结果。在“ADD_BCD 子程序”的指令“ADDC”处设置断点,再用“全速”方式运
行,到达断点后,观察“A”的值,然后用“单步”运行,观察指令“ADDC”的功能。同时理解“断点”
方式调试程序的特点。
;;;;;;;;;;;;;;;;;;;主程序 ;;;;;;;;;;;;;;;;;;;;;
MOV R0, #20H
MOV R1, #30H
;置被加数首地址
;置加数首地址
MOV R2, #04H
;置被加数和加数的长度(字节数)
ACALL ADD_BCD
;调用多字节十进制数加法子程序 ADD_BCD
STOP:SJMP STOP
;停止
;;;;;;;;;; 多字节十进制数加法子程序 ;;;;;;;;;;
;入口: R0、R1 为被加数和加数的首地址,按低位到高位存放
;出口: R0 为运算结果的首地址,也按低位到高位存放
ADD_BCD:CLR C
;进位清零
LOOP: MOV A, @R0
;一字节的被加数→A
ADDC A, @R1
;一字节加
DA A
;十进制数调整
MOV @R0, A
;存一字节的运算结果
第 3页 共 13页
INC R0
INC R1
;被加数指向下一字节
;加数指向下一字节
DJNZ R2, LOOP
;循环控制
RET
END
;子程序返回
3、用 C51 实现绝对地址访问实验
(1)采用预定义宏
#include
#include
void main(void)
{
unsigned char a;
unsigned int b;
DBYTE[0x16]=a=3;
b=XWORD[0x2000]=8;
while(1);
查看程序执行前后相应内存的内容。
地址
0x16
0x4000
程序执行前
程序执行后
程序执行前
程序执行后
0x00H
0x03H
0x00H
0x16H
}
}
(2)采用扩展关键字_at_
#include
#define uchar unsigned char
uchar data text1[16] _at_ 0x60;
uchar xdata text2[16] _at_ 0x1000;
void main(void)
{
uchar i;
for(i=0;i<16;i++)
text1[i]=i;
for(i=0;i<16;i++)
text2[i]=text1[i];
while(1);
查看程序执行前后相应内存的内容。
实验要求:
第 4页 共 13页
1、读懂各程序;
2、预先给出运算结果,以便和实验结果比较;
3、回忆“跟踪”、“单步”和“断点”调试方式的特点。
实验步骤:(附截图)
1、简单程序调试
(1) 传送指令
将下述程序用 DEBUG 调试成功后,设置内部 RAM 的值,(30H)=40H, (40H)=10H,单步(F10)执行
下列程序,检查结果。
MOV R0,#30H
MOV A,@R0
MOV R1, A
MOV B, @R1
STOP: SJMP STOP
END
执行后:(R0)= 30H,(R1)=00H,(A)=00H,(B)=30H,(30H)=40H,(40H)=10H。
部分相关截图如下:
(1)设置内部 RAM 的值
(2)最终运行结果
第 5页 共 13页
(2) 运算指令
MOV A, #0BFH
MOV A, #0BFH
MOV A, #0BFH
MOV A, #0BFH
MOV 20H, #85H
MOV
20H,
MOV 20H, #85H
MOV B, #85H
SETB C
#85H
SETB C
MUL AB
ADD A, 20H
SETB C
SUBB A, 20H
SJMP $
ADDC A, 20H
(A)=44H
(A)=45H
(A)=39H
(A)=3BH (B)=63H
CY=1
AC=1
CY=1
AC=1
CY=0
AC=0
OV=1
P=0
OV=1
P=1
OV=0
P=0
CY=0
OV=1
AC=0
P=1
单步
执行
结果
标志
每个指令的运行结果截图如下:
①
②
第 6页 共 13页
③
④
(3)
预先对 R3 和 R4 赋值,然后执行下列程序,检查结果。
第 7页 共 13页
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:MOV A,R3
CLR C
ADD A,R4
JC
PP1
MOV
R3,#00H
SJMP
PP2
PP1:MOV
R3,#01H
PP2:MOV
R4,A
END
执行后:(R3)=00H,(R4)=07H,(A)=07H。
部分相关截图如下:(对 R3 赋值 10H,对 R4 赋值 20H)
2、多字节十六进制数加法
被加数
加数
结果
低位
20H
21H
22H
23H
67
45
23
01
30H
31H
32H
33H
65
72
98
89
第 8页 共 13页
20H
21H
22H
23H
32
18
22
91
高位