单片机原理实验报告 本文关键词:单片机,原理,实验,报告
单片机原理实验报告 本文简介:实验报告01_排序程序实验目的1.熟悉MCS-51指令系统,掌握程序设计方法。2.掌握控制转移指令的功能,以及冒泡排序法原理。3.熟悉51单片机汇编语言编程环境。实验要求设30H开始的10个存储单元中,存放的是无符号数,编写程序实现:将它们排序,并存放到50H开始的单元中。实验原理冒泡算法的思想
单片机原理实验报告 本文内容:
实验报告01_排序程序
实验目的
1.
熟悉MCS-51指令系统,掌握程序设计方法。
2.
掌握控制转移指令的功能,以及冒泡排序法原理。
3.
熟悉51单片机汇编语言编程环境。
实验要求
设30H开始的10个存储单元中,存放的是无符号数,编写程序实现:将它们排序,并存放到50H开始的单元中。
实验原理
冒泡算法的思想为,每次取相邻单元的两个数比较,判断是否需要交换数据的位置。第一次循环,比较N-1次,取到数据表的最大值;第二次循环,比较N-2次,取到次大值;……第N-1次循环,比较一次,排序结束。
流程框图
开始
R4?外循环次数
R3?内循环次数
R0?缓冲区首地址
R0?缓冲区首地址
B?((R0))
A?((R0)+1)
(A)>(B)?
((R0))?
à((R0)+1)
R0?(R0)+1
(R3)-1=0?
(R4)-1=0?
结束
实验程序及调试仿真:
实验程序如下:
N
EQU
10
TAB
EQU
30H
TAC
EQU
50H
ORG
0000H
SORT:
MOV
R4,#N-1
LOOP1:
MOV
A,R4
MOV
R3,A
MOV
R0,#TAB
LOOP2:
MOV
A,@R0
MOV
B,A
INC
R0
MOV
A,@R0
CLR
C
SUBB
A,B
JNC
UNEXCH
MOV
A,@R0
DEC
R0
XCH
A,@R0
INC
R0
MOV
@R0,A
UNEXCH:
DJNZ
R3,LOOP2
DJNZ
R4,LOOP1
MOV
R1,#TAB
MOV
R7,#N
MOV
R0,#TAC
AGAIN:
MOV
A,@R1
MOV
@R0,A
INC
R1
INC
R0
DJNZ
R7,AGAIN
SJMP
$
END
程序调试及运行结果
实验结论
通过本实验,我对冒泡排序法的原理有了更深入的理解,同时在掌握此算法思想的基础上能够用汇编语言进行编程,并学会在Keil
μVersion4调试界面的Memory窗口中查看内存地址的内容,从而验证设计的源程序的正确性,提高了自己解决问题的能力。
实验报告02_
外部中断实验
实验目的
学会使用Keil
μVersion4和Proteus软件进行单片机汇编语言和C语言程序设计与开发;了解和掌握MCS-51单片机的中断组成、中断控制工作原理、中断处理过程、外部中断的中断触发方式,掌握中断功能的编程方法。
实验要求
单片机的P1.0引脚连接LED指示灯D0;单片机的P3.2引脚(INT0)连接按键开关K,作为中断源,每次按键都会触发INT0中断;在INT0中断服务程序中将P1.0端口的信号取反,使LED指示灯D0在点亮和熄灭两种状态间切换,产生LED指示灯按键开关K控制的效果。
实验原理
本实验采用外部中断0。中断请求信号由按键BUTTON来实现,由引脚INT0(P3.2)引入;通过按键可以控制P1.0所接的LED灯的点亮熄灭。其中中断请求信号设置为边沿触发方式。当按键按下,INT0出现负跳变,发出中断请求信号。CPU响应中断,停止其他工作,跳转到INT0中断入口地址0003H单元,转入EX_INT0执行中断服务程序,当执行到中断返回指令RETI时,使CPU返回断点处,继续处理其他工作。
中断处理流程图示:
INT0中断入口
计数加一
保护现场
恢复现场
中断返回
开始
设置有关中断控制寄存器开外中断INT0、INT1
设置P1.0~
3初始状态
显示循环等待中断
主程序框图
INT0中断处理程序框图
实验电路原理图
实验程序及调试仿真
ORG
0000H
AJMP
MAIN
ORG
0003H
AJMP
EX_INT0
ORG
0100H
MAIN:
MOV
SP,#40H
SETB
IT0
SETB
EA
SETB
EX0
HERE:
SJMP
HERE
ORG
0200H
EX_INT0:
CPL
P1.0
RETI
END
Proteus仿真
按键为按下时:
按键按下后
实验结论
本实验通过Keil
μVersion4的中断程序汇编语言设计和Proteus软件的仿真,成功实现了按键对信号灯的熄灭点亮控制。通过实验,也加深了我对51单片机中断系统的认识。
实验03_定时器实验
实验目的
了解MCS-51单片机中定时器、计数器的基本结构、工作原理和工作方式,掌握工作在定时器模式下的编程方法。
实验要求
设单片机的晶振频率fosc=12MHZ,使用T0定时100ms,在P1.2引脚产生周期为200ms的方波信号,并通过示波器观察P1.2输出的波形。
实验原理
定时器/计数器是单片机应用系统中经常使用的部件之一。根据工作要求及实际需要,选择合适的工作方式。如果有定时要求,就选择定时功能;如果要求检测外部脉冲信号个数,就选择计数功能。对定时器工作方式选择一般考虑定时时间和计数值的长度。若定时时间长则选用方式1,;若定时时间短则选择方式2.门控选择主要考虑是否要求外部信号来控制定时器/计数器的启动。
要实现更长时间的定时,一般有两种方式:一是采用两个定时/计数器串联使用,一个定时并输出定时脉冲,另一个计数定时脉冲;二是采用一个定时/计数器定时工作,再加一个软件计数器记录溢出的次数。
实验设计
按定时要求,可选择T0为定时功能并工作在方式1,用定时器T0定时100ms,则计数初值X计算如下:
X=216-(t
fosc)/12=216-(100103
12*
106)/12=10000H-100000
由于X小于0,说明定时时间过长,因此需要采用实验原理中所述的两种方法之一实现实验要求。本实验采用方法二,即采用一个定时/计数器定时工作,再加一个软件计数器记录溢出的次数。
具体实现为:用T0定时50ms,工作在工作方式1,然后在定时器中断服务子程序中由软件计数器(寄存器R2)对定时中断的次数进行统计,达到2次即输出周期为200ms的方波,此时模式字是01H。
程序框图
实验程序:
ORG
0000H
AJMP
START
ORG
000BH
AJMP
INT_T0
ORG
0100H
START:
MOV
SP,#60H
MOV
TMOD,#01H
MOV
TL0,#0B0H
MOV
TH0,#3CH
MOV
R2,#02H
SETB
ET0
SETB
EA
SETB
TR0
HERE:SJMP
HERE
ORG
0200H
INT_T0:
MOV
TL0,#0B0H
MOV
TH0,#3CH
DJNZ
R2,LOOP
MOV
R2,#02H
CPL
P1.2
LOOP:
RETI
END
Proteus仿真电路
示波器显示周期为200ms的方波:
实验结论
通过本实验,我对51单片机中定时器、计数器的基本结构、工作方式以及工作原理有了更深入的认识,同时发现可以运用定时器和计数器来产生方波。不仅如此,本实验的给定参数还使我意识到当定时时间过长使初值为负超出范围时,需要使用计数器来帮助实现功能。本实验巩固了我所学的理论知识,在设计实验时又使我注意到了许多细节,增强了我设计实验、排查错误的能力。
实验04_两个单片机之间双向通信实验
实验目的
了解MCS-51单片机串行口(UART)的结构、工作方式,了解串行通信的原理和数据交换过程,掌握单片机之间进行串行通信的编程方法。
实验要求
将甲、乙两台MCS-51单片机串行口连接,即甲机的TXD与乙机的RXD相连;甲机的RXD与乙机的TXD相连;并实现双机共地。整个系统实现双向通信。具体是:
(1)
甲机的K1按键可通过串行口分别控制乙机的LED1点亮;LED2点亮;LED1和LED2全亮或全灭。
(2)
乙机的K2按键可通过串行口向甲机发送数字,甲机将接收到的数字显示在其P0端口的LED数码管显示器上。
实验原理
CPU与外界的信息交换称为通信。当数据的各位同时传送时,称为并行通信;当数据一位接一位顺序传送时,则称为串行通信。其中,串行数据通信分为同步通信和异步通信两种形式。MCS-51单片机内部有一个全双工的串行通信口,即串行接收和发送缓冲器(SBUF),
这两个在物理上独立的接受发送器,既可以接受数据也可以发送数据。但接收缓冲器只能读出不能写入,而发送缓冲器只能写入不能读出,它们的地址为99H。串行通信控制寄存器(SCON)是一个8位的专用寄存器,用于串行数据的通信控制,电源管理寄存器PCON主要是为CHMOS型单片机的电源控制而设置的专用寄存器,可以设置波特率。
串行工作口有四种工作方式,分别为工作方式0,工作方式1,工作方式2,工作方式3。串行通信只使用方式1、2、3。发送数据时,TI位置0,发送完毕时TI置位。接收数据时,RI位置0,接收完毕时置位RI。
实验设计
题(1):按键接甲机P1.1口,通过计数按键次数发送不同指令。乙机的P1.0,P1.1分别接两盏灯,接受甲机的指令从而实现乙机的灯的亮暗。甲机的按键接地,因此按下时P1.1应赋值为0。没按下一次,计数值加1,因为题目中两灯共出现四种情况,四种状态可设置分别为01,02,03,04,通过在四种状态下分别给乙机P1.0和P1.1口置1或置0(通过SETB和CLR实现),可以实现甲机对乙机灯的控制。本实验可采用查询方式也可采用中断方式。
题(2):按键接乙机的P3.2口,即INT0口,LED数码管接甲机的P0端口,程序采用中断方式。乙机发送指令,通过按键次数控制甲机数码管上显示的数字,具体控制情况为,乙机按键按一次,甲机数码管显示“1”,按键按两下,数码管显示“2”,按键按三下,数码管显示“3”,按键按四下,数码管显示“4”。只需通过计数按键按下次数,没按下一次,计数值加1,同时启动一次发送即可。甲机没启动一次接受,子程序中就将需要显示的数字所对应的相应值传送给P0端口的数码管即可。
程序框图
N
Y
Y
N
返
回
清标志位RI、TI
取数并显示
串行口中断
按键松开?
按键次数加一,
计算编号
按键按下?
关中断,发编号
开中断
开
始
实验程序
题(1)采用查询方式:
甲机(按键控制)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:MOV
SCON,#40H
MOV
PCON,#00H
MOV
TMOD,#20H
MOV
TL1,#0F4H
MOV
TH1,#0F4H
SETB
TR1
NEXT:JNB
P1.1,L1
SJMP
NEXT
NEXT1:JNB
P1.1,L2
SJMP
NEXT1
NEXT2:JNB
P1.1,L3
SJMP
NEXT2
NEXT3:JNB
P1.1,L4
SJMP
NEXT3
L1:MOV
A,#00H
MOV
SBUF,A
WAIT1:JBC
TI,NEXT1
SJMP
WAIT1
L2:MOV
A,#01H
MOV
SBUF,A
WAIT2:JBC
TI,NEXT2
SJMP
WAIT2
L3:MOV
A,#02H
MOV
SBUF,A
WAIT3:JBC
TI,NEXT3
SJMP
WAIT3
L4:MOV
A,#03H
MOV
SBUF,A
WAIT4:JBC
TI,NEXT
SJMP
WAIT4
END
乙机(接受程序,实现灯的亮暗)
ORG
0000H
LJMP
MAIN
ORG
0080H
MAIN:MOV
SCON,#50H
MOV
PCON,#00H
MOV
TMOD,#20H
MOV
TL1,#0F4H
MOV
TH1,#0F4H
SETB
TR1
WAIT:JBC
RI,NEXT
SJMP
WAIT
NEXT:MOV
A,SBUF
CJNE
A,#00H,L2
SETB
P1.0
CLR
P1.1
SJMP
WAIT
L2:CJNE
A,#01H,L3
SETB
P1.1
CLR
P1.0
SJMP
WAIT
L3:CJNE
A,#02H,L4
SETB
P1.0
SETB
P1.1
SJMP
WAIT
L4:CJNE
A,#03H,WAIT
CLR
P1.0
CLR
P1.1
SJMP
WAIT
END
题(1)采用中断方式
甲机(按键控制)
ORG
0000H
LJMP
MAIN
ORG
0003H
LJMP
L1
ORG
0030H
MAIN:
MOV
SCON,#40H
MOV
PCON,#00H
MOV
TMOD,#20H
MOV
TH1,#0F4H
MOV
TL1,#0F4H
SETB
TR1
MOV
SP,#40H
SETB
IT0
SETB
EA
SETB
EX0
L2:
SJMP
L2
ORG
0200H
L1:
MOV
A,P1
MOV
SBUF,A
WAIT:
JBC
TI,NEXT
SJMP
WAIT
NEXT:
RETI
END
乙机(接受程序,实现灯的亮暗)
ORG
0000H
LJMP
MAIN
ORG
0030H
MAIN:
MOV
SCON,#50H
MOV
PCON,#00H
MOV
TMOD,#20H
MOV
TH1,#0F4H
MOV
TL1,#0F4H
SETB
TR1
MOV
R1,#00H
MOV
P1,#0FFH
WAIT:
JBC
RI,NEXT
SJMP
WAIT
NEXT:
MOV
A,SBUF
INC
R1
SJMP
L1
L1:
MOV
A,R1
SUBB
A,#01H
JZ
L2
MOV
A,R1
SUBB
A,#02H
JZ
L3
MOV
A,R1
SUBB
A,#03H
JZ
L4
MOV
A,R1
SUBB
A,#04H
JZ
L5
L2:
CLR
P1.0
SETB
P1.1
CLR
RI
SJMP
WAIT
L3:
CLR
P1.1
SETB
P1.0
CLR
RI
SJMP
WAIT
L4:
CLR
P1.0
CLR
P1.1
CLR
RI
SJMP
WAIT
L5:
SETB
P1.0
SETB
P1.1
CLR
RI
MOV
R1,#00H
SJMP
WAIT
END
Proteus仿真电路
题(1)采用查询程序的仿真
甲机P1.1口按键按下第一次,亮灯全亮
甲机按键按下第二次,两灯全灭:
甲机按键按下第三次,D1灯灭,D2灯亮:
甲机按键按下第四次,D1灯亮,D2灯灭:
可以看出,甲机通过按键实现了对乙机所接的两灯亮灭的控制。
题(2)采用中断程序设计的程序
乙机按键控制甲机数码管程序(采用中断方式)
org
0000h
ajmp
send
org
0003h
ajmp
e_int
org
0023h
ajmp
trani
org
0030h
send:mov
scon,#090h
mov
pcon,#80h
setb
ea
setb
es
setb
ex0
setb
it0
mov
a,#0fh
add
a,#01h
mov
c,p
mov
tb8,c
mov
sbuf,a
sjmp
$
trani:jbc
ti,loop2
jbc
ri,loop3
loop3:mov
a,sbuf
cjne
a,#10h,loop5
mov
r0,#00h
loop5:cjne
a,#11h,loop6
mov
r0,#01h
loop6:cjne
a,#12h,loop7
mov
r0,#02h
loop7:cjne
a,#13h,loop4
mov
r0,#03h
loop4:
mov
P1,r0
reti
e_int:cjne
a,#13h,loop1
mov
a,#0fh
loop1:
add
a,#01h
mov
c,p
mov
tb8,c
mov
sbuf,a
loop2:
reti
end
甲机接收程序
org
0000h
ajmp
send
org
0003h
ajmp
e_int
org
0023h
ajmp
trani
send:
mov
scon,#090h
mov
pcon,#80h
mov
p0,#0ffh
mov
p2,#01h
setb
ea
setb
es
setb
ex0
setb
it0
mov
a,#0fh
add
a,#01h
mov
c,p
mov
tb8,c
mov
sbuf,a
loop4:
mov
p0,r0
sjmp
loop4
trani:jbc
ti,loop2
jbc
ri,loop3
loop3:mov
a,sbuf
cjne
a,#10h,loop5
mov
r0,#0f9h
loop5:cjne
a,#11h,loop6
mov
r0,#0a4h
loop6:cjne
a,#12h,loop7
mov
r0,#0b0h
loop7:cjne
a,#13h,loop8
mov
r0,#099h
loop8:
reti
e_int:cjne
a,#13h,loop1
mov
a,#0fh
loop1:
add
a,#01h
mov
c,p
mov
tb8,c
mov
sbuf,a
loop2:reti
end
题(2)仿真结果
按下按键第一次,甲机数码管显示’1’
按下按键第二次,数码管显示‘2’
按键按下第三次,数码管显示‘3’
按键按下第四次,数码管显示‘4’
可以看出,乙机通过按键实现了对甲机LED数码管上数字的控制。
实验结论
本实验通过对甲、乙两台51单片机的发送、接收程序的汇编语言编写,以及在Proteus中电路仿真,将甲、乙机的串行口相连,并进行电路的连接,最终仿真实现了双机的串口通信,即甲机通过按键实现了对乙机两端口所接LED灯亮暗的控制,而乙机通过按键实现了对甲机LED数码管显示数字的控制。通过本实验,我学会了串口通信发送、接受程序的编写,并且掌握了查询、中断方式编写改程序的不同思路,加深了对理论内容的学习。
实验05_数码管显示4x4键盘矩阵按键实验
实验目的
熟悉和掌握矩阵式键盘的工作原理、电路设计和软件编程方法;熟悉和掌握矩阵式键盘的行扫描法和行反转法两种键盘扫描识别方法;掌握键盘延时消抖的软件方法;掌握LED静态扫描显示方式。
实验要求
4x4键盘矩阵的行线连接单片机的P1.0~P1.3端口,列线连接P1.4~P1.7端口;一位LED数码管连接单片机的P0口。编程实现:当按下任意一个按键时,LED数码管显示它在4x4键盘矩阵上的序号0~F。
实验原理
矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
确定矩阵式键盘上何键被按下主要有两种方法,分别为行扫描法和行反转法。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,介绍过程如下:
1、判断键盘中有无键按下
将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置
在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
另一种方法是高低电平翻转法。过程如下:
首先让P1口高四位为1,低四位为0,。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置;
然后让P1口高四位为0,低四位为1,。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。
最后将上述两者进行或运算即可确定被按下的键的位置。
实验流程图
键盘扫描开始
有键闭合?
软件延时10mS
有键闭合?
确定按键位置
闭合键释放?
A?按键值
结束
实验程序
ORG
0000H
LJMP
START
ORG
0100H
START:
MOV
SP,#60H
KEY0:
MOV
P1,#0EFH
JNB
P1.0,K0
JNB
P1.1,K4
JNB
P1.2,K8
JB
P1.3,NEXT1
LJMP
K12
NEXT1:
MOV
P1,#0DFH
JNB
P1.0,K1
JNB
P1.1,K5
JNB
P1.2,K9
JB
P1.3,NEXT2
LJMP
K13
NEXT2:
MOV
P1,#0BFH
JNB
P1.0,K2
JNB
P1.1,K6
JNB
P1.2,K10
JB
P1.3,NEXT3
LJMP
K14
NEXT3:
MOV
P1,#07FH
JNB
P1.0,K3
JNB
P1.1,K7
JNB
P1.2,K11
JNB
P1.3,K15
LJMP
KEY0
K0:
MOV
P0,#0C0H
LCALL
DELAY
JMP
KEY0
K1:
MOV
P0,#0F9H
LCALL
DELAY
JMP
KEY0
K2:
MOV
P0,#0A4H
LCALL
DELAY
JMP
KEY0
K3:
MOV
P0,#0B0H
LCALL
DELAY
JMP
KEY0
K4:
MOV
P0,#99H
LCALL
DELAY
JMP
KEY0
K5:
MOV
P0,#92H
LCALL
DELAY
JMP
KEY0
K6:
MOV
P0,#82H
LCALL
DELAY
JMP
KEY0
K7:
MOV
P0,#0F8H
LCALL
DELAY
JMP
KEY0
K8:
MOV
P0,#80H
LCALL
DELAY
JMP
KEY0
K9:
MOV
P0,#90H
LCALL
DELAY
JMP
KEY0
K10:
MOV
P0,#88H
LCALL
DELAY
JMP
KEY0
K11:
MOV
P0,#83H
LCALL
DELAY
JMP
KEY0
K12:
MOV
P0,#0C6H
LCALL
DELAY
JMP
KEY0
K13:
MOV
P0,#0A1H
LCALL
DELAY
JMP
KEY0
K14:
MOV
P0,#86H
LCALL
DELAY
JMP
KEY0
K15:
MOV
P0,#8EH
LCALL
DELAY
JMP
KEY0
DELAY:
MOV
R3,#06H
LP:
MOV
R4,#0A8H
LP1:MOV
R5,#0A8H
LP2:DJNZ
R5,LP2
DJNZ
R4,LP1
DJNZ
R3,LP
RET
END
PROTEUS仿真
当按下相应按键,LED数码管显示它在4x4键盘矩阵上的序号0-F。
下图列出一些仿真结果
实验结论
本实验通过对数码管显示矩阵键盘按键的源程序编写及Proteus仿真,我掌握了:1)矩阵键盘行扫描法和行反转法两种键盘扫描识别方法,以及实现该算法的汇编语言;2)键盘延时消抖的软件方法;3)LED静态扫描显示方式。矩阵式键盘是大型系统设计中不可或缺的一部分,因此,掌握它的原理及其重要。