单片机实验讲义.docx
《单片机实验讲义.docx》由会员分享,可在线阅读,更多相关《单片机实验讲义.docx(48页珍藏版)》请在冰豆网上搜索。
单片机实验讲义
单片机实验讲义
电信学院
第一章单片机软件实验
实验一存储器块清零
一、实验目的
1.掌握存储器读写方法
2.了解存储器块的操作方法
二、实验说明
本实验指定某块存储器的起始地址和长度,要求能将其内容清零。
通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件(KEIL软件使用见附录一),软件设置为模拟调试状态。
在所建的Project文件中添加TH1.ASM源程序进行编译,编译无误后,打开数据窗口,选择外部数据存储器窗口XDATA,观察8000H(MEMORY#2窗口输入X:
8000H后回车)起始的256个字节单元的内容,若全为0,则点击各单元,用键盘输入不为0的值。
按程序提示设置断点,执行程序,点击全速执行快捷按钮,点击暂停按钮,观察存储块数据变化情况,256个字节全部清零(红色)。
点击复位按钮,可再次运行程序。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.源程序
ORG0000H
STARTEQU8000H
MOVDPTR,#START;起始地址
MOVR0,#0;设置256字节计数值
CLRA
Loop:
MOVX@DPTR,A
INCDPTR;指向下一个地址
DJNZR0,Loop;计数值减一
NOP
LJMP$
END
2.流程图
五、思考题
如何将存储器块的内容置成某固定值(例全填充为0FFH)?
请用户修改程序,完成此操作。
实验二二进制BCD码转换
一、实验目的
1.掌握简单的数值转换算法
2.基本了解数值的各种表达方法
二、实验说明
单片机中的数值有各种表达方式,这是单片机的基础。
掌握各种数制之间的转换是一种基本功。
我们将给定的一字节二进制数,转换成二十进制(BCD)码。
将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH2.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA)(在MEMORY#1中输入D:
30H回车),点击暂停按钮,观察地址30H、31H、32H的数据变化,30H更新为01,31H更新为02,32H更新为03。
用键盘输入改变地址30H、31H、32H的值,点击复位按钮后,可再次运行程序,观察其实验效果。
修改源程序中给累加器A的赋值,重复实验,观察实验效果。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.源程序
RESULTEQU30H
ORG0000H
LJMPSTART
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
LJMP$
END
2.流程图
实验三二进制ASCII码转换
一、实验目的
1.了解BCD值和ASCII值的区别
2.掌握用查表的方法将BCD值转换成ASCII值
二、实验说明
此实验主要让学生了解数值的BCD码和ASCII码的区别,利用查表方法可以快速地进行数值转换。
进一步掌握数值的各种表达方式。
现在我们给出一个BCD数,将其转换成ASCII值。
如下:
将累加器A的值拆为二个ASCII码,并存入Result开始的二个单元,例程A赋值#1AH。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH3.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA)(在MEMORY#1中输入D:
30H回车),点击暂停按钮,观察地址30H、31H的数据变化,30H更新为31,31H更新为41。
用键盘输入改变地址30H、31H的值,点击复位按钮后,可再次运行程序,观察其实验效果。
修改源程序中给累加器A的赋值,重复实验,观察实验效果。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.源程序
RESULTEQU30H
ORG0
LJMPSTART
ASCIITAB:
DB‘0123456789ABCDEF';定义数字对应的ASCII表
BINTOHEX:
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
CALLBINTOHEX
LJMP$
END
2.流程图
实验四程序跳转表
一、实验目的
1.了解程序的多分支结构
2.掌握多分支结构程序的编程方法
二、实验说明
多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。
若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH4.ASM源程序进行编译,编译无误后,全速运行程序,打开数据窗口(DATA)(在MEMORY#1中输入D:
30H回车),点击暂停按钮,观察地址30H、31H、32H、33H的数据变化,30H更新为0,31H更新为1,32H更新为2,33H更新为3。
用键盘输入改变地址30H、31H、32H、33H的值,点击复位按钮后,可再次运行程序,观察其实验效果。
修改源程序中给30H~33H的赋值,重复实验,观察实验效果。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.流程图
2.源程序
ORG0
LJMPSTART
FUNC0:
MOV30H,#0
RET
FUNC1:
MOV31H,#1
RET
FUNC2:
MOV32H,#2
RET
FUNC3:
MOV33H,#3
RET
FUNCENTER:
ADDA,ACC;AJMP为二字节指令,调用号×2
MOVDPTR,#FUNCTAB
JMP@A+DPTR
FUNCTAB:
AJMPFUNC0
AJMPFUNC1
AJMPFUNC2
AJMPFUNC3
START:
MOVA,#0
CALLFUNCENTER
MOVA,#1
CALLFUNCENTER
MOVA,#2
CALLFUNCENTER
MOVA,#3
CALLFUNCENTER
LJMP$
END
实验五内存块移动
一、实验目的
1.了解内存块的移动方法
2.加深对存储器读写的认识
二、实验说明
块移动是单片机常用操作之一,多用于大量的数据复制和图象操作。
本程序是给出起始地址,用地址加一方法移动块,将指定源地址和长度的存储块移到指定目标地址为起始地址的单元中去。
移动3000H-->4000H,256字节。
三、实验内容及步骤
1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿真头插到模块的单片机插座中,打开模块电源,插上仿真器电源插头(USB线)。
2.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加“TH5.ASM”源程序进行编译,编译无误后,打开数据窗口(XDATA),观察地址3000H(MEMORY#2窗口输入X:
3000H难后回车),起始256个字节存储块和4000H(MEMORY#2窗口输入X:
4000H难后回车),起始的256个字节存储块,若各单元内数据对应相同,则用键盘输入改变其中一块的数据,全速运行程序。
点击暂停按钮,观察两个存储块的数据,可以看到两块数据已相同,说明存储块已移动。
3.打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化,可以看到程序执行的过程,加深对实验的了解。
四、流程图及源程序(见光盘中的程序文件夹)
1.源程序
ORG0
MOVR0,#30H
MOVR1,#00H
MOVR2,#40H
MOVR3,#00H
MOVR7,#0
LOOP:
MOVDPH,R0
MOVDPL,R1
MOVXA,@DPTR
MOVDPH,R2
MOVDPL,R3
MOVX@DPTR,A
INCR1
INCR3
DJNZR7,LOOP
LJMP$
END
2.流程图
否
是
五、思考题
1.若源块地址和目标块地址有重叠,该如何避免?
2.请思考给出块结束地址,用地址减一方法移动块的算法。
实验六数据排序
一、实验目的
掌握排序程序的设计方法。
二、实验内容
本例程采用交换排序法将内部RAM中的50~59H单元中的10个单字节无符号二进制数按从小到大的次序排列,并将这一列排序后的数据从小到大依次存贮到外部RAM1000H开始处。
三、实验步骤
1.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH6.ASM文件,打开TH6.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2.在VIEW菜单中打开MEMORYWINDOW数据窗口,分别观察50H(在MEMORY#1中输入D:
50H)、1000H(MEMORY#2窗口输入X:
1000H)。
3.可在程序指令NOP处设置断点,在第一个断点处可观察50~59H单元内容是否为10个任意排列原始数据。
4.在第二个断点处可观察每次排序的结果。
5.可单步执行程序观察排序过程。
四、实验参考程序(见光盘中的程序文件夹)
ORG0000H
JMPMAIN
ORG0100H
MAIN:
MOVR0,#50H
MOV@R0,#5FH
INCR0
MOV@R0,#56H
INCR0
MOV@R0,#5AH
INCR0
MOV@R0,#5EH
INCR0
MOV@R0,#51H
INCR0
MOV@R0,#5BH
INCR0
MOV@R0,#53H
INCR0
MOV@R0,#58H
INCR0
MOV@R0,#57H
INCR0
MOV@R0,#55H;将10个随机数送入内部RAM的50~59H单元
NOP;可在此处设置断点
ACALLQUE;调用排序子程序
OUT:
MOVR0,#50H
MOVDPTR,#1000H
MOVR7,#10
OUT1:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR7,OUT1
HERE:
AJMPHERE
NOP;可在此处设置断点,观察每次排序结果
QUE:
CLR00H;清交换标志
MOVR1,#50H
MOVR6,#09H
I3:
MOVA,R6
MOVR7,A
MOVA,R1
MOVR0,A
MOVA,@R0
I2:
INCR0
MOVR2,A
SUBBA,@R0
MOVA,R2
JCI1
SETB00H
XCHA,@R0
I1:
DJNZR7,I2
JNB00H,STOP
MOV@R1,A
INCR1
DJNZR6,I3
RET
END
实验七拆字/拼字实验
一、实验目的:
掌握汇编语言设计和调试方法。
二、实验内容:
1、将片外RAM中地址为7000H中的内容拆开,高位送7001H低位,低位送7002H低位。
2、将片外RAM中地址为7000H、7001H中的内容拼入7002H(7000H低位送7002H高位,7001H低位送7002H低位)。
三、实验程序流程图及参考程序:
org0000h
ajmpstart
org0040h
start:
movdptr,#7000h
movxa,@dptr
anla,#0fh
swapa
movr2,a
incdptr
movxa,@dptr
anla,#0fh
adda,r2
incdptr
movx@dptr,a
sjmp$
end
4、拆字
org0000h
ajmpstart
org0040h
start:
movdptr,#7000h
movxa,@dptr
movr2,a
anla,#0f0h
swapa
incdptr
movx@dptr,a
mova,r2
anla,#0fh
incdptr
movx@dptr,a
sjmp$
end
四、实验步骤:
1.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH7.ASM文件,打开TH7.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2.在VIEW菜单中打开MEMORYWINDOW数据窗口,分别观察7000H、7001H、7002H(在MEMORY#1中输入X:
7000H)。
3.察看拼字/拆字结果。
4.可单步执行程序观察每个过程。
实验八数据排序
一、实验目的:
熟悉80C51单片机的指令系统和程序设计方法。
二、实验内容:
编写并调试一个排序程序,其功能为用起泡排序将内部RAM中首地址为30H中的10个无符号数,按从小到大的顺序排列。
三、实验程序流程图:
四、实验步骤:
1.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH8.ASM文件,打开TH8.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2.在VIEW菜单中打开MEMORYWINDOW数据窗口,分别观察30H~3FH(在MEMORY#1中输入D:
30H)。
3.察看排序结果。
4.可单步执行程序观察排序过程。
排序
org0000h
ajmpstart
org0040h
start:
acallchushi
movr6,#09h
ss0:
mova,r6
movr7,a
setbf0
movr0,#30h
movr1,#31h
ss1:
mova,@r0
clrc
subba,@r1
jcnext
clrf0
mova,@r0
xcha,@r1
mov@r0,a
next:
incr0
incr1
djnzr7,ss1
jbf0,exit
djnzr6,ss0
exit:
sjmp$
chushi:
movr0,#30h
movdptr,#array
movr7,#0ah
ss2:
clra
movca,@a+dptr
mov@r0,a
incr0
incdptr
djnzr7,ss2
ret
array:
db2,8,4,7,5,1,0,9,3,6
end
实验九数据查找
一、实验目的:
熟悉汇编程序设计。
二、实验内容:
在7000H~700FH中查出有几个字节为零,并统计零的个数放到内部RAM的30H单元中。
三、实验程序流程图:
四、实验步骤:
1.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH9.ASM文件,打开TH9.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2.在VIEW菜单中打开MEMORYWINDOW数据窗口,分别观察30H(在MEMORY#1中输入D:
30H)。
3.察看“0”的个数。
4.可单步执行程序观察查找过程。
数据查找
org0000h
ajmpmain
org0040h
main:
acallchushi
mov30h,#00h
movdptr,#7000h
movr7,#10h
ss1:
movxa,@dptr
jnzss2
inc30h
ss2:
incdptr
djnzr7,ss1
sjmp$
chushi:
movdptr,#7000h
movr7,#10h
clra
next:
movx@dptr,a
cpla
incdptr
djnzr7,next
ret
end
实验十无符号双字节乘法
一、实验目的:
掌握80C51单片机汇编程序设计方法。
二、实验内容:
编写程序利用单字节乘法指令,实现双字节乘法运算(R2R3)*(R6R7)—〉(30H~33H)。
三、实验程序流程图:
四、实验步骤:
1.启动PC机,打开KEIL软件,软件设置为模拟调试状态。
在所建的Project文件中添加TH10.ASM文件,打开TH10.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2.在VIEW菜单中打开MEMORYWINDOW数据窗口,分别观察30H~33H(在MEMORY#1中输入D:
30H)。
3.察看“0”的个数。
4.可单步执行程序观察每个过程。
16位无符号乘法:
org0000h
ajmpmain
org0040h
main:
acallchushi
mov30h,#00h
mov31h,#00h
mov32h,#00h
mov33h,#00h
mova,r3
movb,r7
mulab
mov33h,a
mov32h,b
mova,r2
movb,r7
mulab
adda,32h
mov32h,a
mova,b
addca,31h
mov31h,a
mova,r3
movb,r6
mulab
adda,32h
mov32h,a
mova,b
addca,31h
mov31h,a
clra
addca,30h
mov30h,a
mova,r2
movb,r6
mulab
adda,31h
mov31h,a
mova,b
addca,30h
mov30h,a
sjmp$
chushi:
movr2,#12h
movr3,#34h
movr6,#56h
movr7,#78h
ret
end
第二章单片机基础实验
实验一P1口输入、输出实验
一、实验目的
1.学习P1口的使用方法
2.学习延时子程序的编写和使用
二、实验说明
P1口是准双向口,它作为输出口时与一般的双向口使用方法相同。
由准双向口结构可知当P1口用作输入口时,必须先对口的锁存器写“1”,若不先对它写“1”,读入的数据是不正确的。
三、实验内容及步骤
实验
(一):
本实验需要用到单片机最小应用系统(F1区)和十六位逻辑电平显示模块(I4区)。
用P1口做输出口,接十六位逻辑电平显示,程序功能使发光二极管从右到左轮流循环点亮。
1.使用单片机最小应用系统。
用扁平数据线连接单片机P1口JD1F与十六位逻辑电平显示模块JD2I,打开相关模块电源。
2.用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:
缺口朝上。
3.打开KeiluVision2仿真软件,首先建立本实验的项目文件,接着添加“TH7_P1A.ASM”源程序,进行编译,直到编译无误。
4.进行软件设置,选择硬件仿真,选择串行口,设置波特率为38400。
5.打开模块电源和总电源,点击开始调试按钮,点击RUN按钮运行程序,观察发光二极管显示情况。
发光二极管单只从右到左轮流循环点亮。
实验
(二):
本实验需要用到单片机最小应用系统(F1区)、十六位逻辑电平显示模块(I4区)以及八位逻辑电平输出模块(B1区)。
用P1.0、P1.1作输入接两个拨断开关,P1.2、P1.3作输出接两个发光二极管。
程序读取开关状态,并在发光二极管上显示出来。
1.用导线分别把单片机最小应用系统的P1.0、P1.1连接到两个拨断开关(B1区)K0、K1,P1.2、P1.3连接到两个发光二极管(I4区)L0、L1。
2.打开“TH7_P1B.ASM”源程序,编译无误后,全速运行程序,拨动拨断开关,观察发光二极管的亮灭情况。
向上拨为熄灭,向下拨为点亮。
3.也可以把源程序编译成可执行文件,把可执行文件用ISP烧录器烧录到89S52/89S51芯片中运行。
(ISP烧录器的使用查看附录二)
注:
在做完实验时记得养成一个好习惯:
把相应单元的短路帽和电源开关还原到原来的位置!
以下将不再重述。
四、流程图及源程序
1.流程图
(B)P1口输入输出程序框图
(A)P1口循环点灯程序框图
2.实验参考程序(见光盘中的程序文件夹)
五、思考题
(1)对于本实验延时子程序
Delay:
MOVR6,0
MOVR7,0
DelayLoop:
DJNZR6,DelayLoop
DJNZR7,DelayLoop
RET
本模块使用12MHz晶振,粗略计算此程序的执行时间为多少?
六、电路图