第一章单片机软件实验.docx
《第一章单片机软件实验.docx》由会员分享,可在线阅读,更多相关《第一章单片机软件实验.docx(33页珍藏版)》请在冰豆网上搜索。
第一章单片机软件实验
软件实验一
一、实验目的
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窗口各