实验三 七段数码显示器

1.实验内容

使用MCS-51汇编语言编写程序,完成以下功能:

1. 使用三个数码管显示十进制数值

2. 每隔0.1秒,该数值自动增一,到999后归零继续

3. 当开关S1按下时,暂停计数;S1松开时,恢复计数

2.显示

本开发平台有3个数码管,使用串行方式连接在一起,具体电路参见实验原理。要想输出一个字形码,就需要从高位到低位依次向移位寄存器输出8个比特。移位寄存器的数据线和时钟线分别接到单片机的P4.5和P4.4管脚,可以使用MCS-51里面的位操作指令进行输出。连续输出3个字形,24个bit之后,欲显示的字形将稳定地显示在数码管上,程序可以转而执行其他工作。 七段字形的编码方式需要通过实验获得。这些编码作为程序中的常数,使用DB命令存放。在程序中,需要将数值转换为相应的字形编码,可以使用MOVC指令来完成。

3.时间

本实验要求的按时间显示数值,直接通过软件延时来实现,也就是若干次空循环来完成,不需要使用单片机内部的定时器等硬件资源。由于在后面的实验中也要使用软件的延时子程序,因此这里预先做准备。 本单片机使用12MHz主频的晶振,结合MCS51的体系结构和指令时序,可以计算每条指令的运行时间,也可以通过Keil环境的调试功能来检查程序片段的执行时间。当然,最后可以通过程序执行的总体运行结果来调整时间。希望同学能够通过这个过程,得出一段能够精确到1ms的子程序,重复调用100次,从而达到定时0.1s的效果。从而完成实验要求2。

4.开关

在本实验板上设置了两个开关S1和S2,分布接入到8031的P3.6和P3.7,开关按下时,输入0,松开时,输入1。利用这个开关完成实验要求3。

5.实验原理

本实验采用3个74HC164级联控制三个数码管的显示,具体实验原理如下图所示。其中使用单片机P4.5作为模拟串口数据,使用P4.4模拟串口时钟,CLR端接高电平。使用上一个74HC164的Q7作为下一个74HC164的输入端。

P4 EQU 0C0H

MOV P4.4, C

SETB P4.4

74HC164是高速CMOS 器件。74HC164是8位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(A或B)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。

时钟 (CLK) 每次由低变高时,数据右移一位,输入到Q0,Q0 是两个数据输入端(A和B)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。

主复位(CLR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。

 

汇编程序:

ORG 0000H ;复位起始地址
LJMP START ;中间地址保留给中断向量表
ORG 0050H ;程序实际起始地址

START:
P4 EQU 0C0H
P4SW EQU 0BBH ;
CLK EQU P4.4 ;时钟线
DAT EQU P4.5 ;数据线
SW EQU P3.6
MOV DPTR,#TAB
MOV P4SW,#70H
LP:
MOV R6,#0 ;计数
MOV R5,#0
MOV R4,#0
LOOP:
MOV A,R6 ;加入累加器
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表指令
LCALL SHOW

MOV A,R5 ;加入累加器
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表指令
LCALL SHOW

MOV A,R4 ;加入累加器
MOV DPTR,#TAB
MOVC A,@A+DPTR ;查表指令
LCALL SHOW

LCALL DELAY

PAUSE:
NOP
JNB SW,PAUSE ;按下S1,暂停

 

INC R6 ;每次计数+1
CJNE R6,#10,LOOP ;进位
INC R5
MOV R6,#0
CJNE R5,#10,LOOP ;比较两个操作数是否相等,如果不相等则转移
INC R4
MOV R5,#0
CJNE R4,#10,LOOP
MOV R4,#0
LJMP LOOP; ;跳回循环计数
SHOW:
MOV R0,#8
SLP:
CLR CLK ;时钟线输出低电平
RLC A ;累加器A,将A中欲显示的字符码右移一位,最低位存入C中
MOV DAT,C
SETB CLK ;时钟线高电平
DJNZ R0,SLP ;减一不为0转到,继续输出字符码
RET
DELAY:
MOV R2,#199 ;外循环 0.1s;[1 + 2 × 250] × 1us = 501us
LOOPS:MOV B, #250 ;内循环 [1 + (501 + 2)×199] = 1000.98ms
LOOPR:DJNZ B, LOOPR

DJNZ R2,LOOPS
RET
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END

 

posted @ 2015-04-29 21:17  PitBull  阅读(1408)  评论(0编辑  收藏  举报