单片机原理及应用
实验指导书
2012年12月
目 录
1一、
实验环境介绍
11.1
Keil集成开发环境介绍
101.2
G2010+实验箱介绍
111.3
EasyProbe 8052F仿真器介绍
12二、
实验内容
12实验一
练习使用集成调试软件
13实验二
汇编语言程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
14实验三
简单输入/输出实验
16实验四
外部中断实验
18实验五
定时器/计数器应用实验
21实验六
串行口应用实验
24实验七
C51编程实验
25实验八
交通灯控制综合实验
26三、
附录
1、 实验环境介绍
1.1 Keil集成开发环境介绍
Keil集成开发环境是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编语言、PLM语言、C语言的程序设计,界面友好,易学易用。
(1) 建立工作文件夹
在
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
的盘符建立一个以自己学号命名的文件夹,作为工作文件夹,将日后实验所有的文件都存放在该文件夹中。
(2) 进入集成开发环境
双击桌面图标,进入uVision2集成开发环境。
(3) 新建工程
选择菜单“工程—新建工程”,弹出“新建工程”对话框;
在“保存在”下拉列表中选择自己的工作文件夹,在“文件名”文本框中键入工程名(不需要键入扩展名,扩展名默认为 .uv2),单击“保存”按钮,关闭“新建工程”对话框,弹出“为目标‘target 1’选择设备”对话框,选择目标芯片型号;
选择Atmel公司的89C52芯片,单击“确定”按钮,关闭对话框,完成新建工程。
(4) 选择调试方式
单击“目标选项”按钮,弹出“目标’Target 1’属性”对话框;单击“调试”标签,选择调试方式。
若使用软件模拟方式,则选中“S 使用仿真器”,其他选项保持默认状态,不要随意更改;若使用硬件仿真器调试,则选中“U 使用”,并在其后的下拉列表中选择“Micetek Driver”,再选中“启动时加载程序”和“运行到main()”,其他选项保持默认状态,不要随意更改。单击“确定”按钮,关闭该窗口。
(5) 新建源程序
单击“新建文件”按钮,在弹出的文本窗口中输入汇编语言源程序;
输入完毕后,单击“保存”按钮,弹出“另存”对话框;
确认“保存在”为自己的工作文件夹,在“文件名”文本框中键入源程序文件名和扩展名(一定要输入扩展名,汇编语言源程序的扩展名为 .ASM);单击“保存”按钮,关闭对话框,保存源程序。
(6) 将源程序添加到工程中
右键单击“工程窗口”中的“Source Group 1”,在弹出的菜单中选择“增加文件到组”;(注:软件汉化有误)
弹出“增加文件到组”对话框;
在“文件类型”下拉列表中选择“Asm源文件”;
选中欲添加的源程序,单击“Add”按钮,源程序添加到工程中。但是,该对话框并不关闭,等待用户继续添加其他程序。添加完毕后,单击“关闭”按钮,关闭对话框。“工程窗口”中,“Source Group 1”下将出现该源程序文件名。
若对同一个文件二次添加,则会弹出如下警告框。
(7) 构造
单击“构造所有目标文件夹”按钮,对原程序进行编译和连接,构造结果将在“构造”窗口中显示。如果程序有语法错误,则会指出错误类型及所在行。修改后,重新构造,直至没有任何语法错误。
(8) 开始调试
单击“开始/停止调试”按钮,进入调试状态。
在调试状态下,“构造工具栏”变为“调试工具栏”。通过单步运行,查看寄存器、存储器的值,判断程序是否运行正确。若不正确,找出问题所在,单击“开始/停止调试”按钮,停止调试,进入编辑状态,修改程序,重新构造、调试。
(9) 查看寄存器
进入调试状态后,“工程窗口”变为“寄存器窗口”,可以查看各寄存器的值。
(10) 查看存储器
单击“存储器窗口”按钮,打开存储器窗口;该窗口共有4个标签,可显示4块存储器空间。单击一个标签,按如下格式在地址栏中键入要查看的存储器单元的类型和地址。
片内数据存储器
I : 地址
片外数据存储器
X : 地址
程序存储器
C : 地址
例如:要查看片内数据存储器30H单元的值,则键入I:30H
若要人为修改某存储单元的值,可右键单击该单元,在弹出的菜单中选择“更新存储器”,在弹出的文本框中输入该单元的新值,单击“确定”即可。
(11) 单步运行
在调试状态下,源程序的左边有一个黄色的箭头,指示当前程序执行的位置,即将要执行的指令。单击“单步”按钮,程序执行一条指令,黄色箭头下移一行。寄存器和存储器的值的变化情况显示在相应位置。执行过的指令左边用一绿色方块标记。
(12) 运行到光标行
若想快速、连续执行若干条指令,可将光标定位在这些指令的最后一条指令处,单击“运行到光标行”按钮。
(13) 全速运行
对于有些程序,只有全速运行才能实现其功能,这时只需单击“运行”按钮即可;若要暂停运行,单击“暂停”按钮。
(14) 程序复位
若要重新开始执行程序,可单击复位按钮,使PC=0。
(15) 将源程序从工程中删除
一个程序调试成功后,若要调试另一个程序,可不必新建工程,只需新建一个源程序,添加到原有的工程中,同时,要将前一个源程序从工程中删除。
在“工程窗口”中,单击要删除的源程序名,按“Delete”键,在弹出的对话框中选择“确定”即可。
对于初学者,一个工程中一般只包含一个源程序,应将多余的源程序删除。
1.2 G2010+实验箱介绍
SICElab-G2010+实验箱是一个开放式综合实验/仿真系统,具有如下个模块。
新型实用模块:
(1)LCD液晶实验
(2)点阵LED广告屏
(3)DS12887实时时钟
(4)红外线发送、接收
(5)直流电机恒速控制
(6)电子琴模拟实验
(7)串行ROM / I2C ROM / 看门狗
(8)步进电机调速
传感器模块:
(1)温度传感器
(2)压力传感器
(3)霍尔传感器
(4)红外传感器
传统实验模块:
(1)模数转换器A/D0809
(2)数模转换器D/A0832
(3)8155控制键盘/显示
(4)V/F转换器LM331
(5)串口通讯MAX232
(6)音响电路LM386
(7)EPROM27C256扩展
(8)RAM6264扩展
(9)微型打印机接口
(10)PWM模块
通用实验模块:
(1)模拟信号发生器
(2)开关量发生器
(3)发光二极管组
(4)信号发生器
(5)74LS138译码器
(6)分频器电路
(7)LED6位数码管
(8)20个键盘组
(9)逻辑笔
(10)门电路
自由实验模块:
由DIP40锁紧插座及240个插孔组成,CPU所有信号均以插孔方式引出,还设计了常用门电路、晶振源、电源插孔等,可以完成以上实验模块的组合实验以及由实验者自行命题和新器件、新
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
的实验,使得实验方式和内容不受限制。
1.3 EasyProbe 8052F仿真器介绍
EasyProbe 8052F仿真器是单片机专业用仿真器,具有高性能仿真存储区,实时硬件断点,实时追踪记录功能,支持标准8031/32/51/52/54/58微控制器。
系统性能
* 双CPU架构,全开放设计
* 完全实时仿真,最高速度可达40MHz
* 轻巧实用,可以不使用仿真电缆而直接插入用户仿真系统,便于现场调试
* 以115200bps通过RS232串口与主机通信
* 支持8XC31/32/51/52/58及78C31/32/51/52/54/58等 51系列内核的CPU
* 尺寸:9.0cm 宽:6.5 cm 高:3.0 cm, 重:125g
高性能仿真存储区
* 128K仿真存储区,包括64K程序存储区和64K数据存储区
* 可按下列属性进行映射:
- Overlay(Internal):内部
- Target(External): 外部
* 目标处理器可完整保留自身的存储区和I/O空间
* 全空间64K个实时硬件断点
原始程序级开发功能
(( 64K硬件执行断点,支持所有程序空间
(( 可对原始程序或C语言进行单步操作 ( Step Into / Over )
(( 循环单步操作 ( Cycle ) 后可显示地址总线、数据总线、周期状态、介面状态及外部追踪位状态资讯
单机执行功能
(( 内建Flash,可下载程序至仿真器中,下载后可单机执行程序,不须连接PC
2、 实验内容
实验1 练习使用集成调试软件
1. 实验目的
(1) 练习使用Keil集成调试软件;
(2) 熟悉汇编语言指令。
2. 实验内容
按照实验指导书的说明,结合附录中的例子,练习使用Keil集成调试软件,为以后的实验打下基础。
3. 实验器材
计算机1台
4. 实验步骤
(1) 新建工程;
(2) 输入源程序;
(3) 将源程序添加到工程中;
(4) 构造;
(5) 运行程序;
(6) 观察记录运行过程和结果。
5. 实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
要求
(1) 列出源程序,并加以注释;
(2) 结构复杂的程序,画出
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图;
(3) 对实验过程和结果进行分析;
(4) 写出心得体会。
实验2 汇编语言程序设计
1. 实验目的
(1) 进一步熟悉汇编语言指令的功能。
(2) 掌握各种结构汇编程序设计方法。
2. 实验内容
(1) 编写程序,计算30H、31H单元和32H、33H单元中两个4位BCD码的和,结果存放到34H、35H单元;
(2) 编写程序,将30H、31H、32H单元中的3个数按从小到大的顺序排列,结果仍存放在这3个单元。
(3) 编写程序,查找30H~39H单元10个数中奇数的个数,结果存放到40H单元;
(4) 编写程序,查表得到两个数的乘积。
3. 实验器材
计算机1台
4. 实验步骤
(1) 新建工程
(2) 输入源程序
(3) 将源程序添加到工程中
(4) 构造
(5) 运行程序
(6) 观察、记录程序运行的过程和结果
实验3 简单输入/输出实验
1. 实验目的
(1) 进一步理解I/O口的工作原理
(2) 掌握输入/输出程序的设计方法
2. 实验内容
编写程序,实现开关控制发光二极管的亮、灭。
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 硬件连线
开关 ( P1.0
P1.1 ( 发光二极管
5. 实验程序
程序1
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
C, P1.0
MOV
P1.1, C
SJMP
MAIN
END
程序2
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
JB
P1.0, LEDON
CLR
P1.1
SJMP
DONE
LEDON:
SETB
P1.1
DONE:
SJMP
MAIN
END
6. 实验步骤
(1) 关闭实验箱电源,按题目要求接线;
(2) 打开实验箱电源,注意确认电源指示灯正常点亮;
(3) 进入集成开发环境,新建工程,注意必须使用硬件仿真器调试方式;
(4) 输入程序,构造,单步运行,检查系统是否工作正常;
(5) 全速运行程序,拨动开关,控制发光二极管的亮、灭;
(6) 停止运行程序,退出调试状态,关闭实验箱电源,改变接线,做其他实验。
7. 思考与发挥
(1) 如何实现多个开关控制多个发光二极管?
(2) 如何实现8个发光二极管循环点亮?
实验4 外部中断实验
1. 实验目的
(1) 进一步了解外部中断的结构和工作原理;
(2) 掌握外部中断的应用程序设计方法。
2. 实验内容
编写程序,利用脉冲按钮产生中断,观察外部中断的响应、处理及返回过程。
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 硬件连线
脉冲输出 ( EQ \* jc0 \* "Font:Times New Roman" \* hps10 \o(\s\up 9(_________),INT0) (P3.2) 引脚
5. 实验程序
ORG
0000H
LJMP
MAIN
ORG
0003H
LJMP
INT0_SERVE
ORG
0030H
MAIN:
SETB
EX0
SETB
IT0
SETB
EA
LOOP:
MOV
A, #01H
MOV
A, #02H
MOV
A, #03H
SJMP
LOOP
INT0_SERVE:
MOV
30H, A
RETI
END
6. 实验方法
将光标定位在
LJMP
INT0_SERVE
指令处,按下“运行到光标行”按钮,程序全速运行,等待外部中断。
按动脉冲按钮,产生下降沿,程序将中断运行,返回监控状态。
继续单步执行程序,观察中断程序的执行及中断返回过程。查看累加器A或30H单元的值,可知主程序的中断位置。
重复进行实验,中断位置会不同。
7. 思考与发挥
(1) 设计一个实验,按动按钮,LED灯亮一段时间。
(2) 如何通过实验验证外部中断低电平触发方式?
实验5 定时器/计数器应用实验
定时器应用
1. 实验目的
(1) 进一步了解定时器的结构和工作原理;
(2) 掌握定时器的应用程序设计方法。
2. 实验内容
编写定时程序,利用音响电路产生不同频率的声音
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 硬件连线
P1.0 ( 音响输入
5. 实验程序
查询方式(TIM0_JNB.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
TMOD, #00000010B
MOV
TH0, #80H
MOV
TL0, #80H
SETB
TR0
LOOP:
JNB
TF0, $
CLR
TF0
CPL
P1.0
SJMP
LOOP
END
中断方式(TIM0_INT.ASM)
ORG
0000H
LJMP
MAIN
ORG
000BH
LJMP
TIM0
ORG
0030H
MAIN:
MOV
TMOD, #00000010B
MOV
TH0, #80H
MOV
TL0, #80H
SETB
TR0
SETB
ET0
SETB
EA
SJMP
$
TIM0:
CPL
P1.0
RETI
END
6. 实验方法
全速运行程序,从喇叭中发出一定频率的声音。
7. 思考与发挥
(1) 如何改变声音频率?
(2) 计数初值变大,声音频率将如何变化?
(3) 如何延长定时时间,使发光二极管闪亮?
计数器应用
1. 实验目的
(1) 进一步了解计数器的结构和工作原理;
(2) 掌握计数器的应用程序设计方法。
2. 实验内容
编写计数程序,记录按键次数。
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 硬件连线
脉冲输出
( T0 (P3.4) 引脚
P1.0
( 发光二极管
5. 实验程序
ORG
0000H
LJMP
MAIN
ORG
000BH
LJMP
CNT0
ORG
0030H
MAIN:
MOV
TMOD, #00000101B
MOV
TH0, #0FFH
MOV
TL0, #0FDH
SETB
TR0
SETB
ET0
SETB
EA
SJMP
$
CNT0:
CPL
P1.0
MOV
TH0, #0FFH
MOV
TL0, #0FDH
RETI
END
6. 实验方法
全速运行程序,按动脉冲按钮,每发出3个脉冲,发光二极管改变一次状态。
7. 思考与发挥
(1) 若要求每发出5个脉冲,发光二极管改变一次状态,如何修改程序?
(2) 如果改为用计数器1计数,接线和程序要如何修改?
实验6 串行口应用实验
1. 实验目的
(1) 进一步了解串行口的结构和工作原理;
(2) 掌握串行口的应用程序设计方法。
2. 实验内容
利用单片机串行口,实现两个实验台之间的串行通讯。
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 硬件连线
方案一:
单片机
MAX232
P3.0 ——
RXD
P3.1 ——
TXD
两台实验箱用通讯电缆连接
方案二:
甲机
乙机
TXD (P3.1)
—— RXD (P3.0)
RXD (P3.0)
—— TXD (P3.1)
GND
—— GND
5. 实验程序
发送程序(查询方式)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
SCON, #10000000B
MOV
A, #12H
MOV
SBUF, A
JNB
TI, $
CLR
TI
SJMP
$
END
发送程序(中断方式)
ORG
0000H
LJMP
MAIN
ORG
0023H
LJMP
SEND
ORG
0030H
MAIN:
MOV
SCON, #10000000B
MOV
A, #12H
MOV
SBUF, A
SETB
ES
SETB
EA
SJMP
$
SEND:
CLR
TI
RETI
END
接收程序(查询方式)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
SCON, #10010000B
JNB
RI, $
CLR
RI
MOV
A, SBUF
SJMP
$
END
接收程序(中断方式)
ORG
0000H
LJMP
MAIN
ORG
0023H
LJMP
RECEIVE
ORG
0030H
MAIN:
MOV
SCON, #10010000B
SETB
ES
SETB
EA
SJMP
$
RECEIVE:
CLR
RI
MOV
A, SBUF
RETI
END
6. 实验方法
接收方先运行,把光标定位在
MOV
A, SBUF
指令的下一条指令处,按“运行到光标行”按钮等待接收数据。
发送方后运行,把光标定位在
CLR
TI
指令处,按“运行到光标行”按钮,程序很快运行结束,数据发送完毕。
接收方接收到数据后,程序中断运行,返回监控状态,查看累加器A中的内容是否为发送方发送的数据。
7. 思考与发挥
(1) 发送方是否可以先运行?
(2) 编写程序发送一组数据。
(3) 设计一个实验,用甲机的开关控制乙机的LED灯。
实验7 C51编程实验
1. 实验目的
初步掌握C51程序设计方法。
2. 实验内容
编写并调试出一个C51实验程序。
3. 实验器材
(1)计算机1台 (2)仿真器1台 (3)实验箱1台
4. 实验程序
main()
{
int
x, y, z;
x = 10;
y = 20;
z = x + y;
x++;
y--;
while (1);
}
本例中main是主函数名,要执行的主函数的内容称为主函数体,主函数体用大括号{ }括起来。函数体中包含若干条将被执行的程序语句,每条语句都必须以分号为结束符。
5. 实验方法
保存源程序时,输入扩展名.C ;
使用观察窗口查看变量的值。按“查看调用堆栈窗口”按钮打开观察窗口;在“局部”标签中显示出变量的值;或者,右键单击程序中的变量名,在弹出的菜单中选择“增加到观察窗口”—“#1”或“#2”。
6. 思考与发挥
用C51语言编写一个数据排序程序。
实验8 交通灯控制综合实验
自行设计实验步骤,模拟实现十字路口交通信号灯。
方案一:
东西方向
红灯10s
绿灯15s
南北方向
绿灯10s
红灯15s
方案二:
东西方向
红灯10s
绿灯12s 黄灯3s
南北方向
绿灯7s
黄灯3s
红灯15s
方案三:
增加一个外部中断,模拟紧急情况。按下按钮后四个方向全部红灯,10s后恢复正常。
方案四:
增加计数功能,一个方向通过10辆车后状态转换。
3、 附录
注:下划线表示该数据可以随意更换。
1. 数据交换
交换片内数据存储器30H和31H单元的内容。
源程序:(XCH.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #12H
MOV
31H, #34H
MOV
A, 30H
MOV
30H, 31H
MOV
31H, A
SJMP
$
END
2. 片外数据交换
交换片外数据存储器0030H和0031H单元的内容。
源程序:(MOVX.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
DPTR, #0030H
MOV
A, #12H
MOVX
@DPTR, A
MOV
DPTR, #0031H
MOV
A, #34H
MOVX
@DPTR, A
MOV
DPTR, #0030H
MOVX
A, @DPTR
MOV
B, A
MOV
DPTR, #0031H
MOVX
A, @DPTR
MOV
DPTR, #0030H
MOVX
@DPTR, A
MOV
DPTR, #0031H
MOV
A, B
MOVX
@DPTR, A
SJMP
$
END
3. 查表程序
程序存储器从0050H单元开始存放有10位学生的成绩,根据累加器A中的学号,查出该学生的成绩。
源程序:(MOVC.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
DPTR, #CJTAB
MOV
A, #05H
MOVC
A, @A+DPTR
SJMP
$
ORG
0050H
CJTAB:
DB
98H, 74H, 83H, 85H, 77H
DB
65H, 92H, 68H, 84H, 70H
END
注意观察程序存储器中成绩表的存放情况。
4. 双字节数加法
片内数据存储器30H(高8位)、31H(低8位)单元和32H、33H单元存放有两个双字节无符号数,将其相加,和存放在30H、31H单元中。
源程序:(ADD_W.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #12H
MOV
31H, #34H
MOV
32H, #0ABH
MOV
33H, #0CDH
MOV
A, 31H
ADD
A, 33H
MOV
31H, A
MOV
A, 30H
ADDC
A, 32H
MOV
30H, A
SJMP
$
END
思考与发挥:
如何实现双字节数减法?
5. 双字节数加一
将30H(高8位)、31H(低8位)单元双字节数加一。
源程序:(INC_W.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
A, 31H
ADD
A, #01H
MOV
31H, A
MOV
A, 30H
ADDC
A, #00H
MOV
30H, A
SJMP
MAIN
END
该程序为循环结构,可连续单步运行。
思考与发挥:
如果为BCD码加一,程序将如何修改?
6. 双字节数左移
将30H、31H单元双字节数左移一位。
源程序:(RLC_W.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #12H
MOV
31H, #88H
LOOP:
MOV
A, 31H
CLR
C
RLC
A
MOV
31H, A
MOV
A, 30H
RLC
A
MOV
30H, A
SJMP
LOOP
END
该程序为循环结构,可连续单步运行。
思考与发挥:
如果要右移一位,程序将如何修改?
7. 比较大小
比较片内数据存储器30H和31H单元的两个无符号数的大小,将较大者存入32H单元。
源程序:(MAX_2.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #12H
MOV
31H, #34H
MOV
A, 30H
CJNE
A, 31H, COMP
COMP:
JNC
BIG
MOV
A, 31H
BIG:
MOV
32H, A
SJMP
$
END
思考与发挥:
若要存放较小数,程序将如何修改?
8. 寻找最大值
片内数据存储器30H~39H单元中存放有10个无符号数,找出其中最大数存放到40H单元中。
源程序:(MAX_10.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #82H
MOV
31H, #23H
MOV
32H, #98H
┇
┇
MOV
39H, #33H
MOV
A, 30H
MOV
R0, #31H
MOV
R7, #09H
LOOP:
MOV
B, @R0
CJNE
A, B, COMP
COMP:
JNC
NEXT
MOV
A, B
NEXT:
INC
R0
DJNZ
R7, LOOP
MOV
40H, A
SJMP
$
END
思考与发挥:
若要寻找最小值,程序将如何修改?
9. 单字节BIN码(BCD码
将累加器A中的二进制码转换为BCD码,结果存放在片内数据存储器30H(百位)、31H(十位)、32H(个位)单元中。
源程序:(BIN2BCD.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
A, #0BAH
MOV
B, #64H
DIV
AB
MOV
30H, A
MOV
A, B
MOV
B, #0AH
DIV
AB
MOV
31H, A
MOV
32H, B
SJMP
$
END
10. 单字节BCD码(BIN码
将累加器A中的压缩BCD码转换为二进制码。
源程序:(BCD2BIN.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
A, #26H
PUSH
ACC
ANL
A, #0F0H
SWAP
A
MOV
B, #0AH
MUL
AB
MOV
B, A
POP
ACC
ANL
A, #0FH
ADD
A, B
SJMP
$
END
11. 子程序
片内数据存储器30H、31H单元存有两个无符号数a和b,编程计算a2+b2,将结果存取32H单元。由子程序求数的平方。设结果为单字节数。
源程序:(SUBROUT.ASM)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
30H, #2
MOV
31H, #3
MOV
A, 30H
LCALL
SQR
MOV
32H, A
MOV
A, 31H
LCALL
SQR
ADD
A, 32H
MOV
32H, A
SJMP
$
SQR:
MOV
B, A
MUL
AB
RET
END
实验方法:
单步执行程序,注意观察程序的执行顺序。