数码管动态扫描显示实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三定时器和中断实验
一、实验目的
1、学习51单片机内部定时器的使用方法。
2、掌握中断处理程序的方法。
3、掌握数码管与单片机的连接方法和简单显示编程方法。
4、学习和理解数码管动态扫描的工作原理。
二、实验内容
1、使用定时器T0,定时1秒,控制P1口发光管循环点亮。
2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。
3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
三、实验电路图
四、实验说明
1、数码管的基本概念
(1)段码
数码管中的每一段相当于一个发光二极管,8段数码管则具有8个发光二极管。
本次实验使用的是共阴数码管,公共端是1、6,公共端置0,则某段选线置1相应的段就亮。
公共端1控制左面的数码管;公共端6控制右面的数码管。
正面看数码管的引脚、段选线和数据线的对应关系为:
图1 数码管封装图图2 数据线与数码管管脚连接关系
段码是指在数码管显示某一数字或字符时,在数码管各段所对应的引脚上所加的高低电平按顺序排列所组成的一个数字,它与数码管的类型(共阴、共阳)
对应数据线D7 D6 D5 D4 D3 D2 D1 D0
对应显示段
e f DP g c d b a
显示数字段码
0 0CFH 1 1 0 0 1 1 1 1
1 03H 0 0 0 0 0 0 1 1
2 5DH 0 1 0 1 1 1 0 1
3 5BH 0 1 0 1 1 0 1 1
4 93H 1 0 0 1 0 0 1 1
5 0DAH 1 1 0 1 1 0 1 0
6 0DEH 1 1 0 1 1 1 1 0
7 43H 0 1 0 0 0 0 1 1
8 0DFH 1 1 0 1 1 1 1 1
9 0DBH 1 1 0 1 1 0 1 1 (2)位码
位码也叫位选,用于选中某一位数码管。
在实验图中要使第一个数码管显示数据,应在公共端1上加低电平,即使P2.7口为0,而公共端6上加高电平,即使P2.6口为1。
位码与段码一样和硬件连接有关。
(3)拉电流与灌电流
单片机的I/O 口与其他电路连接时,I/O 电流的流向有两种情况:一种是当该I/O 口为高电平时,电流从单片机往外流,称作拉电流;另一种是该I/O 口为低电平时,电流往单片机内流,称为灌电流。
一般I/O 的灌电流负载能力远大于拉电流负载能力,对于一般的51 单片机而言,拉电流最大4mA,灌电流为20mA。
一般在数码管显示电路中采用灌电流方式(用共阳数码管),可以得到更高的亮度。
本实验电路中采用拉电流方式(用共阴数码管)。
2、多位数码管的动态显示
在多位8段数码管显示时,为了简化硬件电路,通常将所有位的段选线相应地并联在一起,由一个单片机的8位I/O口控制,形成段选线的多路复用。
而各位数码管的共阳极或共阴极分别由单片机独立的I/O口线控制,顺序循环地点亮每位数码管,这样的数码管驱动方式就称为“动态扫描”。
在这种方式中,虽然每一时刻只选通一位数码管,但由于人眼具有一定的“视觉残留”,只要延时时间设置恰当,便会感觉到多位数码管同时被点亮了。
多位8段LED动态显示器电路,其中段选线占用一个8位I/O口,位选线占用一个8位I/O口,由于各位的段选线并联,段线码的输出对各位来说都是相同的。
因此,同一时刻,如果各位位选线都处于选通状态的话,8位LED将显示相同的字符。
若要各位LED能够显示出与本位相应的显示字符,就必须采用扫描显示方式,即在某一位的位选线处于选通状态时,其它各位的位选线处于关闭状态,这样,8位LED中只有选通的那一位显示出字符,而其它位则是熄灭的。
同样,在下一时刻,只让下一位的位选线处于选通状态,而其他的位选线处于关闭状态。
如此循环下去,就可以使各位“同时”显示出将要显示的字符。
由于人眼有视觉暂留现象,只要每位显示间隔足够短,则可造成多位同时亮的假象,达到显示的目的。
3、定时器
内部定时/计数器用作定时器时,是对机器周期计数。
每个机器周期的长度是12个振荡器周期。
当为定时工作方式1时,定时时间的计算公式为:(216—计数初值)╳晶振周期╳12或(216—计数初值)╳机器周期
因为实验系统的晶振12MHZ,机器周期等于1us。
最大定时时间为:(216—0)╳1/12╳10-6╳12=65536╳10-6(s)= 65.536ms。
所以需要配合软件记数。
如要延时1秒,T0取最大定时时间,则需要T0中断16次,所用时间为
65536*16=1048576μs≈1s
因此在T0中断处理程序中,要判断中断次数是否到16次,若不到16次,则只使中断次数加1,然后返回,若到了16次,定时1秒时间到。
如要延时1秒,T0取50ms定时时间,则需要T0中断20次,所用时间为
50ms*20=1000ms=1s
因此在T0中断处理程序中,要判断中断次数是否到20次,若不到20次,则只使中断次数加1,然后返回,若到了20次,定时1秒时间到。
五、参考程序框图及部分程序
1、使用定时器T1,定时1秒,控制P1口发光管循环点亮。
;循环点亮P1口接的八只发光二极管。
ORG 0000H
AJMP START
ORG 001BH ;T1中断入口地址
AJMP INT_T1
ORG 0030H
START: MOV SP,#60H
MOV TMOD,#10H ;置T1为方式1
MOV TL1,#0B0H ;延时50mS的时间常数
MOV TH1,#3CH
MOV R0,#0FEH
MOV R1,#20
SETB TR1;启动定时器1,开始定时
SETB ET1
SETB EA ;开中断
SJMP $
INT_T1:;T1中断服务子程序
PUSH ACC;保护现场
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1;关闭定时器1,停止定时
MOV TL1,#0B0H;定时50mS常数
MOV TH1,#3CH
DJNZ R1,EXIT
MOV R1,#20;延时一秒的常数
MOV A,R0;
MOV P1,A ;送P1口显示
SETB C
RLC A
MOV R0,A
EXIT: SETB TR1;启动定时器1,开始定时
POP DPH;恢复现场
POP DPL
POP PSW
POP ACC
RETI
END
2、使用定时器T0,定时1秒,控制1个数码管循环显示数字0~9,每秒钟数字加一。
ORG 0000H
AJMP START
ORG 000BH ;T0中断入口地址
AJMP INT_T0
ORG 0030H
START: MOV SP,#60H
MOV TMOD,#01H ;置T0为方式1
MOV TL0,#0B0H ;延时50mS的时间常数MOV TH0,#3CH
MOV R0,#00H ;数码管显示单元
MOV R1,#20 ;定时次数
SETB TR0;启动定时器1,开始定时
SETB ET0
SETB EA ;开中断
Slop: acall display
SJMP Slop
INT_T0:;T0中断服务子程序
PUSH ACC;保护现场
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR0;关闭定时器1,停止定时
MOV TL0,#0B0H;延时50mS常数
MOV TH0,#3CH
DJNZ R1,EXIT
MOV R1,#20;重置定时次数
MOV A,R0
INC A ;数码管显示单元内容加一
MOV R0,A
CJNE A,#10,EXIT
MOV R0,#00H ; 数码管显示单元清0 EXIT: SETB TR0;启动定时器0,开始定时POP DPH;恢复现场
POP DPL
POP PSW
POP ACC
RETI
;显示子程序
display: mov a,R0
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;得到段码
mov P0,a ; 段码送P0口
clr P2.7 ;送位码
acall delay1 ;延时10ms
setb P2.7
ret
;延时子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
(1)在设计过程中使用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数。
(2)对于秒计数单元中的数据要把它十位数和个数分开,方法一:采用对10整除和对10求余;方法二:采用分数、合数法。
(3)在数码管上显示数,通过查表的方式完成。
(4)一秒时间的产生采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。
方法一汇编源程序
;----------10毫秒延时子程序
DELY10ms: MOV R4,#20
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;-------主程序
Second EQU 30H
ORG 0
START: acall init
NEXT: acall display
Ljmp next
Init: MOV Second,#00H
ret
display: MOV R3,#50
dis2:MOV A,Second
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A ;送出十位数字的段码
CLR p2.7 ;送位码
Acall dely10ms
Setb p2.7
MOV A,B
MOVC A,@A+DPTR
MOV P0,A ;送出个位数字的段码
CLR p2.6
LCALL DELY10mS
Setb p2.6
djnz r3,dis2 ;20毫秒循环执行50次,时间约1秒
INC Second
MOV A,Second
CJNE A,#60,ret0
Mov Second,#00h
Ret0: ret
TABLE: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH END
方法二汇编程序:
temp equ 22h ;计数器个位和十位数值存放内存位置
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
;-------------------- 主程序 --------------------------- START: mov temp,#0 ;初始化计数器,从0开始
stlop: acall display ;调用显示子程序
acall add1 ;对计数器加1
mov a,temp
cjne a,#60H,next ;判断计数器是否满60?
mov temp,#0 ;满60就清零重新开始
next: ljmp stlop ;不满就循环执行
;显示子程序
display: mov r1,#50
dis1: mov a,temp ;将temp中的十六进制数转换成10进制anl a,#0Fh
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;查数字的段码
mov P0,a ;送出个位数字的段码
clr P2.7 ;送出位码
acall delay1 ;显示10ms
setb P2.7 ;关闭位选
mov a,temp;将temp中的十六进制数转换成10进制
anl a,#0F0h
swap a
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;查数字的段码
mov P0,a ;送出十位数字的段码
clr P2.6 ;送位码
acall delay1 ;显示10ms
setb P2.6
djnz r1,dis1
ret
;延时子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;加一子程序
add1: mov a,temp
inc a
da a
mov temp,a
ret
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
本题请大家参考前面的例题独立完成。
六、实验报告
1、说明实验目的和内容。
2、画出实验电路原理图,并简要分析电路的执行过程。
3、完成实验内容(4)的程序设计框图并说明编程思想,并给出程序清单。
4、根据实验内容,调式程序,观察、分析程序的运行过程。
5、给出实验结果并进行分析。
6、实验体会。
七、预习实验四。