第一章单片机软件实验.docx

上传人:b****4 文档编号:24858124 上传时间:2023-06-02 格式:DOCX 页数:33 大小:149.87KB
下载 相关 举报
第一章单片机软件实验.docx_第1页
第1页 / 共33页
第一章单片机软件实验.docx_第2页
第2页 / 共33页
第一章单片机软件实验.docx_第3页
第3页 / 共33页
第一章单片机软件实验.docx_第4页
第4页 / 共33页
第一章单片机软件实验.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

第一章单片机软件实验.docx

《第一章单片机软件实验.docx》由会员分享,可在线阅读,更多相关《第一章单片机软件实验.docx(33页珍藏版)》请在冰豆网上搜索。

第一章单片机软件实验.docx

第一章单片机软件实验

软件实验一

一、实验目的

1.熟悉软件实验的基本步骤和汇编程序的调试方法;

2.了解内存块的移动方法;

3.了解将十六进制数转换成ASCII值的方法。

二、实验说明

1、实验例程1给定某块存储器的起始地址和长度,要求能将其内容清零。

通过该例程让学生可以了解单片机读写存储器的方法,同时可以了解单片机的编程、调试方法。

2、块移动是单片机常用操作之一,多用于大量的数据复制和图象操作。

实验例程2是外部RAM之间的数据块移动。

将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去,用地址+1方法移动。

移动3000H起始的256个字节到4000H起始的256个字节。

三、实验内容及步骤

例程1:

1、启动PC机,打开KEIL软件(KEIL软件使用见附录一),软件设置为模拟调试状态。

在所建的Project文件中添加例程1的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。

2、打开CPU窗口,观察CPU窗口各寄存器的变化。

打开View菜单中的MemoryWindow,可以观察内部RAM、外部RAM的数据和程序存储器中的程序。

在Address窗口输入X:

8000H后回车,观察8000H-800FF起始的256个字节单元的内容,可以发现这256个字节的内容都为1。

3、软件的调试过程,可以看到程序执行的过程和各寄存器的变化情况,加深对实验的了解,用户也可改变A的值,那输出的内容也会改变。

例程2:

1、新建一个Project文件,添加例程2的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。

2、打开View菜单中的MemoryWindow,在Address窗口的Memory#1输入X:

3000H后回车,点击运行按钮后,在Memory#2输入X:

4000H后回车,通过比较,可观察到3000H起始的256个字节存储块与4000H起始的256个字节存储块各单元内数据对应相同,说明存储块已移动。

3、在单步或跟踪执行方式运行程序时,可以观察CPU窗口各寄存器的变化,看到程序执行的过程,加深对实验的了解。

四、流程图和源程序

例程1:

1.说明:

给外部RAM8000~80FFH的256个单元的内容赋值,赋值的内容取决于程序中A的赋值。

2.流程图

 

3.源程序:

ORG0000H

STARTEQU8000H

MAIN:

MOVDPTR,#START;起始地址

MOVR0,#0;设置256字节计数值

MOVA,#1H

Loop:

MOVX@DPTR,A

INCDPTR;指向下一个地址

DJNZR0,Loop;计数值减1

NOP

SJMP$

END

4.运行结果:

外部RAM8000H~80FFH的内容都为1。

例程2:

1.说明:

将3000H起始的256个字节存储块移动到4000H起始的256个字节存储块;

2.流程图:

 

 

3.源程序:

ORG0000H

MOVDPTR,#3000H

MOVA,#01H

MOVR5,#O

LOOP:

MOVX@DPTR,A

INCDPTR

DJNZR5,LOOP

MOVR0,#30H

MOVR1,#00H

MOVR2,#40H

MOVR3,#00H

MOVR7,#0

LOOP1:

MOVDPH,R0

MOVDPL,R1

MOVXA,@DPTR

MOVDPH,R2

MOVDPL,R3

MOVX@DPTR,A

INCR1

INCR3

DJNZR7,LOOP1

SJMP$

END

4.运行结果:

3000H起始的256个字节存储块与4000H起始的256个字节存储块各单元内数据对应相同。

五、实验内容

1、将片内30H~3FH单元的内容复制到片外1030H~103FH中。

源程序:

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVDPTR,#1030H

MOVR0,#30H

MOVR1,#10H

MOVA,@R0

LOOP:

MOVX@DPTR,A;将30H~3FH单元中的内容拷贝到1030H~103FH中

INCR0

INCDPTR

MOVA,@R0

DJNZR1,LOOP

SJMP$

END

结果:

30H~3FH单元中的数据(源程序中为30H~3FH赋值的程序没写上)

1030H~103FH单元中的数据

2、将30H、31H单元中的十六进制数,转换成ASCII码,存放到40H开始的4个单元中。

源程序:

MOVR0,#30H

MOVR1,#40H

MOVR2,#02H

LOOP:

MOVA,@R0;把@R0中存放的16进制数转换成ASCII码

ANLA,#0FH;取低半字节进行转换

CJNEA,#0AH,AA

AA:

JCZM

ADDA,#37H

JMPJG

ZM:

ADDA,#30H

JG:

MOV@R1,A

INCR1

MOVA,@R0

ANLA,#0F0H;取高半字节进行转换

SWAPA

CJNEA,#0AH,AA1

AA1:

JCZM1

ADDA,#37H

JMPJG1

ZM1:

ADDA,#30H

JG1:

MOV@R1,A

INCR1

INCR0

DJNZR2,LOOP

JMP$

END

结果:

30H和31H单元中内容分别为2AH和E8H(源程序中为30H和31H单元赋值的程序没写上)

转换后40H~43H单元中的内容

3、试求内部RAM30H—37H单元中8个无符号数的算术和,2字节结果存入38H(低字节),39H(高字节)单元中。

如8个无符号数分别为:

25H,36H,4AH,65H,7FH,82H,9BH,1DH。

则计算结果为:

02C3H

源程序:

MOVR0,#07H

MOVR1,#31H

MOVA,30H

MOVR2,#00H

LOOP:

ADDA,@R1

INCR1

PUSHACC

MOVA,R2

ADDCA,#00H

MOVR2,A

POPACC

DJNZR0,LOOP

MOV38H,A

MOV39H,R2

JMP$

END

结果:

30H~37H中的内容(源程序中为30H~37H单元赋值的程序没写上)

计算结果存在38H(低字节)和39H(高半字节)中

六、思考题

1、如何将存储器块的内容置成某固定值(例全填充为0FFH)?

请用户修改程序,完成此操作。

源程序:

ORG0000H

LJMP0100H

ORG0100H

MOVDPTR,#DATA1

MOVR1,#DATA2

MOVA,#DATA3

LOOP:

MOVX@DPTR,A

INCDPTR

DJNZR1,LOOP

SJMP$

END

结果:

假设DATA1=2000H、DATA2=80H、DATA3=0FFH,则运行完毕2000H~207FH中的内容都被置成FFH

2、若源块地址和目标块地址有重叠,程序该如何设计(用地址减1方法移动块)?

假设源块地址2000H,目标块地址2050H,移动块长度80H。

源程序:

ORG0000H

LJMP0100H

ORG0100H

MOVDPH,#20H

MOVR0,#0CFH

MOVR1,#7FH

MOVR2,#80H

LOOP:

MOVDPL,R1

MOVXA,@DPTR

MOVDPL,R0

MOVX@DPTR,A

DECR0

DECR1

DJNZR2,LOOP

SJMP$

END

结果:

初始化2000H~207FH中的内容为30H~AFH(给这部分单元赋值的程序段未写在这里)

运行后2050H~20CFH中的内容

软件实验二

一、实验目的

1、熟悉软件实验的基本步骤和汇编程序的调试方法;

2、掌握简单的数值算法;

3、掌握多分支结构程序的编程方法。

二、实验说明

单片机中的数值有各种表达方式,这是单片机的基础。

掌握各种数制之间的转换是一种基本功。

我们将给定的一字节二进制数,转换成十进制(BCD)码。

将累加器A的值转换为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123=7BH。

三、实验及步骤

1、启动PC机,打开KEIL软件,软件设置为模拟调试状态。

在所建的Project文件中添加例程的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。

2、打开CPU窗口,观察CPU窗口各寄存器的变化。

打开View菜单中的MemoryWindow,在Address窗口输入D:

30H后回车,点击运行按钮,观察地址30H、31H、32H的数据变化,30H内容将更新为01,31H更新为02,32H更新为03。

3、在单步或跟踪执行方式运行程序时,可以观察CPU窗口各寄存器的变化,看到程序执行的过程,加深对实验的了解。

用户也可改变A的值,重复实验,观察实验效果。

四、例程流程图和源程序

1.例程说明:

将A的值转换为十进制数,存放在30H~32H中。

2.流程图:

 

3.源程序:

RESULTEQU30H

ORG0000H

SJMPSTART

BINTOBCD:

MOVB,#100

DIVAB

MOVRESULT,A;除以100得百位数

MOVA,B

MOVB,#10

DIVAB

MOVRESULT+1,A;余数除以10得十位数

MOVRESULT+2,B;余数为个位数

RET

START:

MOVSP,#40H

MOVA,#123

CALLBINTOBCD

SJMP$

END

4.运行结果:

30H~32H的内容分别为01,02,03

五、实验内容

1、无符号多字节二进制数据减法。

被减数放在30H开始的4个单元中(从低字节到高字节),减数放在40H开始的4个单元中(从低字节到高字节),差放入30H开始处(从低字节到高字节)。

例如:

输入(33H)=0x58,(32H)=0xA2,(31H)=0x34,(30H)=0x7E

(43H)=0x07,(42H)=0x68,(41H)=0x85,(40H)=0x3B

输出(33H)=0x51,(32H)=0x39,(31H)=0xAF,(30H)=0x43

源程序:

ORG0000H

LJMP0100H

ORG0100H

CLRC

MOV30H,#7EH

MOV31H,#34H

MOV32H,#0A2H

MOV33H,#58H

MOV40H,#3BH

MOV41H,#85H

MOV42H,#68H

MOV43H,#07H

MOVR0,#30H

MOVR1,#40H

MOVR2,#04H

LOOP:

MOVA,@R0

SUBBA,@R1

MOV@R0,A

INCR0

INCR1

DJNZR2,LOOP

JMP$

END

结果:

运算前地址块中的内容

进行运算后地址块中的内容

2、多字节BCD码加法运算。

两个4字节长的BCD码加数分别存放在外部RAM0100H和0110H开始的单元中(从低字节到高字节),计算两数之和,结果保存在0120H开始的9个单元中。

例如:

输入(0100H)=0x10,(0101H)=0x32,(0102H)=0x54,(0103H)=0x76

(0110H)=0x78,(0111H)=0x56,(0112H)=0x34,(0113H)=0x92

则输出(0120)=0x88,(0121)=0x88,(0122)=0x88,(0123)=0x68,(0124)=0x01

 

源程序:

ORG0000H

LJMP0100H

ORG0100H

MOVDPH,#01H

MOVR0,#00H

MOVR1,#10H

MOVR2,#20H

MOVR3,#04H

CLRC

LOOP:

MOVDPL,R0

MOVXA,@DPTR

MOVB,A

MOVDPL,R1

MOVXA,@DPTR

ADDCA,B

DAA

MOVDPL,R2

MOVX@DPTR,A

INCR0

INCR1

INCR2

DJNZR3,LOOP

CLRA

ADDCA,#00H

MOVDPL,R2

MOVX@DPTR,A

SJMP$

END

 

结果:

输入(0100H)=0x10,(0101H)=0x32,(0102H)=0x54,(0103H)=0x76

(0110H)=0x78,(0111H)=0x56,(0112H)=0x34,(0113H)=0x92

(输入的程序段在源程序中省去)

输出(0120)=0x88,(0121)=0x88,(0122)=0x88,(0123)=0x68,(0124)=0x01

3、分别用近程查表指令和远程查表指令,查找R3内容的平方值。

R3内容小于等于0FH。

1)近程查表指令

源程序:

ORG0000H

LJMPMAIN

ORG2000H

MAIN:

MOVR3,#DATA

PFEQUR3

MOVA,PF

ADDA,#03H

MOVCA,@A+PC

LJMPHH

TABLE:

DB0H,1H,4H,9H,10H,19H,24H,31H,40H,51H

HH:

SJMP$

END

结果:

以DATA=08H为例

 

六、思考题

BCD码转换成二进制数的算法是什么?

例如:

(91)BCD对应的二进制数是多少?

源程序:

(假设BCD码存放在内部RAM30H单元中,转化结果放在40H中)

ORG0000H

LJMP0100H

ORG0100H

MOVA,30H

ANLA,#0F0H

MOVB,#0AH

SWAPA

MULAB

MOVB,A

MOVA,30H

ANLA,#0FH

ADDA,B

MOVB,#10H

DIVAB

SWAPA

ADDA,B

MOV40H,A

SJMP$

END

结果:

转换前30H和40H中的内容

转换后30H和40H中的内容

所以,(91)BCD=5BH

软件实验三

一、实验目的

1、熟悉软件实验的基本步骤和汇编程序的调试方法;

2、掌握数值的加减运算;

3、掌握用查表的方法将BCD值转换成ASCII值。

二、实验说明

此实验主要让学生了解数值的BCD码和ASCII码的区别,利用查表方法可以快速地进行数值转换。

进一步掌握数值的各种表达方式。

现在我们给出一个BCD数,将其转换成ASCII值。

如下:

将累加器A的值转换为二个ASCII码,并存入Result开始的二个单元,例程A赋值#1AH。

三、实验及步骤

1、启动PC机,打开KEIL软件,软件设置为模拟调试状态。

在所建的Project文件中添加例程的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。

2、打开CPU窗口,观察CPU窗口各寄存器的变化,打开View菜单中的MemoryWindow,在Address窗口输入D:

30H后回车,点击运行按钮,观察地址30H、31H的数据变化,30H更新为31,31H更新为41。

3、在单步或跟踪执行方式运行程序时,可以观察CPU窗口各寄存器的变化,看到程序执行的过程,加深对实验的了解。

用户也可改变A的值,重复实验,观察实验效果。

四、例程流程图和源程序

1.例程说明:

将A的值转换为对应的ASCII值,存放在30H、31H单元中。

2.流程图:

 

3.源程序:

RESULTEQU30H

ORG0000H

SJMPSTART

ASCIITAB:

DB‘0123456789ABCDEF';定义数字对应的ASCII表

BCDTOHEX:

MOVDPTR,#ASCIITAB

MOVB,A;暂存A

SWAPA

ANLA,#0FH;取高四位

MOVCA,@A+DPTR;查ASCII表

MOVRESULT,A

MOVA,B;恢复A

ANLA,#0FH;取低四位

MOVCA,@A+DPTR;查ASCII表

MOVRESULT+1,A

RET

START:

MOVSP,#40H

MOVA,#1AH

CALLBCDTOHEX

SJMP$

END

4.运行结果:

30H、31H单元的结果分别为31,41。

五、实验内容

1、查找关键字节(1字节),要查找的字节在R3中,一串字节存放在30H开始的20个单元中,查找结果放入A,若查找不到,则将FFH放入A.。

源程序:

ORG0000H

LJMPMAIN

ORG2000H

MAIN:

MOVR2,#20

MOVR0,#30H

LOOP:

CLRC

MOVA,R3

SUBBA,@R0;比较法查找相关结果

JZHH

INCR0

DJNZR2,LOOP;没查到,也没查完,继续查

MOVA,0FFH;没查到,将FFH单元中内容放入A中

LJMPLP

HH:

MOVA,R3;查到,将结果放入A中

LP:

SJMP$

END

结果:

R3中的内容为ABH

1)35H里面的内容也为ABH,其他单元里面的内容都不等于ABH,运行程序后A中内容为

ABH

2)从30H开始的20个单元里面的内容都不为ABH,FFH单元中内容为CDH,运行程序后A中内容为CDH

2、

在内部RAM的30H单元开始,有一串带符号数据块,其长度在10H单元中。

编程求其中正数与负数的和,并分别存入2FH与2EH开始的2个单元中。

(负数存放形式为补码)。

请分别在30H单元开始写入5个正数、11个负数和9个正数、7个负数的情况,记录程序运行结果。

例如:

输入-69H,65H,-7H,-25H,-47H,56H,-3H,17H,6H,-5H,-45H,-1H,-57H,23H,-5H,-13H。

结果应为:

正数的和FBH,负数的和-199H

源程序:

输入如题中例子

ORG0000H

LJMPMAIN

ORG1000H

MAIN:

MOVR0,#30H;在30H开始的单元输入题中例子的数据

MOV30H,#-69H

MOV31H,#65H

MOV32H,#-7H

MOV33H,#-25H

MOV34H,#-47H

MOV35H,#56H

MOV36H,#-3H

MOV37H,#17H

MOV38H,#6H

MOV39H,#-5H

MOV3AH,#-45H

MOV3BH,#-1H

MOV3CH,#-57H

MOV3DH,#23H

MOV3EH,#-5H

MOV3FH,#-13H

MOV2FH,#0H

MOV10H,#16

LOOP:

MOVA,@R0

JBACC.7,FU;判断数据的正负性

ZHENG:

MOVA,@R0;若数据为正

ADDA,2CH

MOV2CH,A;正数和低位放入2CH单元中

MOVA,2DH

ADDCA,#00H

MOV2DH,A;正数和高位放入2DH单元中

LJMPHH

FU:

MOVA,@R0;若数据为负

ADDA,2EH

MOV2EH,A;负数和低位放入2EH单元中

MOVA,2FH

ADDCA,#0FFH

MOV2FH,A;负数和高位放入2FDH单元中

HH:

INCR0

DJNZ10H,LOOP

SJMP$

END

结果:

2CH中内容为FBH,2DH中内容为00H,即正数和为FBH;2EH中内容为67H,2F中

内容为FEH,即负数和为FE67H=-199H

3、要求同上。

请分别求出这一串数据块中正数、负数和零的个数,存入2FH、2EH和2DH单元中。

请分别在30H单元开始写入5个正数、8个负数、3个零和9个正数、5个负数、2个零的情况,记录程序运行结果。

例如:

输入61H,-19H,12H,0,78,3,-13H,0,17H,-79H,-5H,-14H,-31H,-43H,-67H,0

则2FH、2EH、2DH单元的值分别为5,8,3

源程序:

ORG0000H

LJMPMAIN

ORG1000H

MAIN:

MOVR0,#30H;在30H开始的(10H)单元中放入数据

MOV30H,#61H

MOV31H,#-19H

MOV32H,#12H

MOV33H,#0H

MOV34H,#78H

MOV35H,#3H

MOV36H,#-13H

MOV37H,#0H

MOV38H,#17H

MOV39H,#-79H

MOV3AH,#-5H

MOV3BH,#-14H

MOV3CH,#-31H

MOV3DH,#-43H

MOV3EH,#-67H

MOV3FH,#0H

MOV2EH,#0H

MOV2DH,#0H

MOV2FH,#0H

MOV10H,#16

LOOP:

MOVA,@R0

JNZHH

INC2DH;若为0,则2DH单元中内容即0的个数加1

LJMPLP

HH:

JBACC.7,HH1

INC2FH;若为正数,则2FH单元中内容即正数的个数加1

LJMPLP

HH1:

INC2EH;若为负数,则2FH单元中内容即负数的个数加1

LP:

INCR0

DJNZ10H,LOOP;控制循环次数

SJMP$

END

结果:

2DH中内容为03即有3个0,2EH中内容为08即有8个负数,2FH中内容为05即有5个正数

六、思考题

BCD码和ASCII码有哪些区别?

1)BCD码是用8位二进制数表示一个0~9的十进制数(压缩BCD码用四位表示),ASCII码用7位二进制数表示一个符号包括数字、字母和其他符号

2)BCD码只可以用来表示0~9的数字,而ASCII码则课用于表示多达128个各类的字符

软件实验四

一、实验目的

1、熟悉软件实验的基本步骤和汇编程序的调试方法;

2、了解简单的函数计算;

3、掌握程序的多分支结构。

二、实验说明

多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。

若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。

三、实验及步骤

1、启动PC机,打开KEIL软件,软件设置为模拟调试状态。

在所建的Project文件中添加例程的源程序进行编译,编译无误后可以选择单步或跟踪执行方式或全速运行程序。

2、打开CPU窗口,观察CPU窗口各寄存器的变化。

打开View菜单中的MemoryWindow,在Address窗口输入D:

30H后回车,点击运行按钮,观察地址30H、31H、32H、33H的数据变化,30H更新为0,31H更新为1,32H更新为2,33H更新为3

3、在单步或跟踪执行方式运行程序时,可以观察CPU窗口各

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 解决方案

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1