内容正文:
项目七 玩转数码管
任务一 静态计数数码显示
任务二 动态计数数码显示
任务三 串行 LED 显示电路设计
返回
1
任务一 静态计数数码显示
一、任务描述
单片机上电,当按键按下时,单片机计数,同时将记下的按键次数用 P0 口输出,经数据缓冲驱动后进行显示。数据显示方式为静态显示,显示的位数是 1 位(即只能显示 0 ~ 9 , A 、B 、…、 F ,要求按键按下的次数不能超过 16 ,否则显示不正确)。
二、基础知识
1. 七段 LED 数码管
七段 LED 数码管是由 8 只发光二极管组成的用于显示字段的数码型显示器件。 LED 数码管在使用的过程中具有显示清晰、组成灵活、成本低廉等特点,经常使用于家用电器和工业控制上。
下一页
返回
任务一 静态计数数码显示
2. 单位数码管静态显示硬件电路及测试程序
该任务利用接于 P3.2 引脚的按键 S7 作为外部计数输入端,采用 LED 数码管 L5 作为计数显示输出。字形译码要采用软件方式,数码管 8 个字段连接缓冲器 8 个输出口,输入口接单片机 P0 口,数码管 COM 端由 P2.5 输出控制,单片机控制 P2.5 始终输出为 0 ,则数码管显示采用静态显示方式。
按照电路图焊接电路板,检测电路焊接无误后,再通过测试程序检测电路。测试程序:
ORG 0000H ;开始
CLR P2.5
上一页
下一页
返回
任务一 静态计数数码显示
START: MOV P0,#0FFH ;数码管所有字段灭
LCALL DELAY ;调用延时子程序
MOV P0,#00H ;数码管显示所有字段
LCALL DELAY ;调用延时子程序
AJMP START ;转到开始
DELAY: MOV R7,#100 ;延时子程序
DL1: MOV R6,#50
DL2: MOV R5,#20
DJNZ R5,$
上一页
下一页
返回
任务一 静态计数数码显示
DJNZ R6,DL2
DJNZ R7,DL1
RET ;子程序调用返回
END ;程序结束
测试程序编译后下载到单片机中运行,结果是 LED 数码管按一定的时间间隔亮、灭运行。若测试结果中某段显示不正确,需检查硬件电路或器件的好坏。
三、数码管静态显示数据的控制程序设计
1. 编程思路
初始化部分,定义外部中断 0 触发方式、设置数码管初始状态、初始化显示单元和计数单元。
上一页
下一页
返回
任务一 静态计数数码显示
在主程序中不断检测计数次数和显示的数据可否一致,一致则继续循环,不一致则送显示数据显示然后再循环。按键的计数处理部分在外部中断 0 处理程序中,按键 S7 按下一次,CPU 中断一次,计数一次。程序中还利用“ CLR P2.5 ”指令使 P2.5 始终保持低电平,则控制 PNP 型三极管饱和导通,使 LED 数码管 COM 端始终接高电平,数码管静态显示。在字形译码时,采用软件查表的方式将要显示的次数转换成字形码,再由 P0 口输出,经缓冲器驱动显示。
2. 程序清单
1 位数码管静态显示程序
DISPLAY1.ASM
ORG 0000H ;开始
上一页
下一页
返回
任务一 静态计数数码显示
LJMP START
ORG 0003H ;INT0 中断服务程序入口地址
LJMP INT_COUNT
START: CLR EA ;关闭 CPU 中断
CLR P2.5 ;控制 P2.5 输出 0,使数码管的 COM 始终接 V CC
MOV 60H,#00H ;显示内容初始化
MOV 61H,#00H ;计数次数初始化
MOV P0,#0C0H ;初始,数码管显示数据“0”
SETB IT0 ;定义 INT0 为边沿触发方式
SETB EX0 ;开外部中断 0
上一页
下一页
返回
任务一 静态计数数码显示
SETB EA ;开 CPU 中断
MAIN: MOV A,61H
CJNE A,60H,DISP ;显示的数据与计数值不同则送显示
AJMP MAIN
DISP: MOV 60H,A
MOV DPTR,#TABLE
MOV A,60H
MOVC A,@A+DPTR ;查表,找出要显示的字形码
MOV P0,A
上一页
下一页
返回
任务一 静态计数数码显示
LJMP MAIN
TABLE: DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH
INT_COUNT:
CLR EX0
PUSH A ;A 压入堆栈,保护 A 中数据
INC 61H ;按键次数加一
MOV A,61H
上一页
下一页
返回
任务一 静态计数数码显示
CLR C
SUBB A,#10H
JC INT_END
MOV 61H,#00H;比较当按键次数大于 15 次(0FH 次)时清零,重新计数
INT_END:POP A ;A 出栈
SETB EX0
RETI ;中断返回
END
上一页
下一页
返回
任务一 静态计数数码显示
3. 程序分析
该程序执行的结果是:单片机上电,当没有按键按下时,数码管显示 0 ,当按键 S7 按下时,数码显示按键按下的次数,次数显示范围是 0 ~ 9 , A ( 10 ), B ( 11 ), C ( 12 ), D ( 13 ),E ( 14 ), F ( 15 )。
( 1 ) ORG 0000H:表示程序从 0000H 地址开始执行;
ORG 0003H:表示外部中断 0 中断时,CPU 程序指针跳入的地址,即该中断服务程序入口地址。
( 2 ) MAIN:MOV A,61H
CJNE A,60H,DISP
上一页
下一页
返回
任务一 静态计数数码显示
AJMP MAIN
61H 中存放按键 S7 按下的次数, 60H 为数码管要显示的数据。该项目主程序很简单,就是比较按键按下的次数和显示数据是否一致,不一致则送显示,一致则继续循环。
( 3 ) MOV DPTR,#TABLE
MOV A,60H
MOVC A,@A+DPTR
利用软件查表的方式完成显示数据和字形码之间的转换。
上一页
下一页
返回
任务一 静态计数数码显示
假设按键按下的次数是 6 ,在60H 内存单元中存着,将次数送入累加器 A ,则 A 中数据为“ 6 ”, DPTR 中的内容是 TABLE的首地址,则 @A+DPTR 指向的地址是 TABLE+6 ,由表可得地址 TABLE+6 中的数据为 82H ,正好是“ 6 ”的字形码,从表中取出放在累加器 A 中,然后输出到接口上即可驱动数码显示,执行的指令是“ MOV P0 , A ”。
( 4 ) CLR C
SUBB A,#10H
JC INT_END
上一页
下一页
返回
任务一 静态计数数码显示
SUBB 指令完成的功能是带借位的减法,并且该指令执行完后影响状态寄存器 PSW 中 C的状态:执行减法时有借位则 C 为 1 ,无借位时 C 为 0 。
JC 指令功能是判断状态寄存器 PSW 中 C 的状态,若为 1 时则跳转,为 0 时则向下顺序执行指令。
这些指令完成的功能是判断累加器 A 中值是否大于 15 ,若不大于( C=1 )则跳转到INT_END ,大于( C=0 )则顺序执行指令。
上一页
返回
任务二 动态计数数码显示
一、任务描述
单片机内部定时 / 计数器 0 进行定时产生时钟信号小时、分钟和秒,用单片机 P0 口输出驱动 6 位数码管进行动态显示时钟信息,其中小时占两位数码管,分钟占两位数码管,秒占两位数码管。通过本任务掌握数码的动态显示方法,了解单片机产生时钟信号的原理。
二、基础知识
1. 6 位数码管动态显示控制硬件电路及测试程序
硬件原理图如图 7 − 2 所示。由图可知, 6 位数码管的各个不同的字段并不是用 P0 口直接驱动的,而是在数码管和单片机接口之间加数据缓冲器,起到缓冲和驱动的作用。
下一页
返回
任务二 动态计数数码显示
6 位数码管的 COM 端分别受 P2.0 、 P2.1 、 P2.2 、 P2.3 、 P2.4 、 P2.5 控制。按照原理图焊接线路板,并检测电路焊接无误后,再通过测试程序检测电路。测试程序如下:
FLAG1 BIT 38H ;内存位地址 27H.0,显示 L0 数码管标志
FLAG2 BIT 39H ;内存位地址 27H.1,显示 L1 数码管标志
FLAG3 BIT 3AH ;内存位地址 27H.2,显示 L2 数码管标志
FLAG4 BIT 3BH ;内存位地址 27H.3,显示 L3 数码管标志
FLAG5 BIT 3CH ;内存位地址 27H.4,显示 L4 数码管标志
FLAG6 BIT 3DH ;内存位地址 27H.5,显示 L5 数码管标志
LED_CON EQU 60H ;数码管要显示的字段
上一页
下一页
返回
任务二 动态计数数码显示
ORG 0000H ;开始
LJMP START
ORG 001BH
LJMP INT_T1
ORG 0030H
START: MOV TMOD,#00010000B ;设置定时器 1 工作方式
MOV TH1,#0F2H ;设置定时器初始值为 F2FBH
MOV TL1,#0FBH
SETB TR1 ;启动定时器 1
上一页
下一页
返回
任务二 动态计数数码显示
SETB EA ;开中断
SETB ET1 ;允许定时器 1 中断
MOV 27H,#00000001B ;FLAG1 为 1
MAIN: MOV LED_CON,#0H ;全亮字段
CALL CON_DISP
CALL DELAY
CALL DELAY
MOV LED_CON,#0FFH
CALL CON_DISP
上一页
下一页
返回
任务二 动态计数数码显示
CALL DELAY
CALL DELAY
AJMP MAIN ;转到 MAIN
CON_DISP: MOV R1,#6 ;LED_CON 送到 50H~55H 中等待显示
MOV R0,#50H
MOV A,LED_CON
DISP1: MOV @R0,A
INC R0
DJNZ R1,DISP1
上一页
下一页
返回
任务二 动态计数数码显示
RET
DELAY: MOV R7,#100 ;延时子程序
DL1: MOV R6,#50
DL2: MOV R5,#20
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL1
RET ;子程序调用返回
INT_T1: MOV TH1,#0F2H ;设置定时器初始值为 F2FBH
上一页
下一页
返回
任务二 动态计数数码显示
MOV TL1,#0FBH
JB FLAG1,INT_LED1
JB FLAG2,INT_LED2
JB FLAG3,INT_LED3
JB FLAG4,INT_LED4
JB FLAG5,INT_LED5
JB FLAG6,INT_LED6
INT_END: RETI
INT_LED1: MOV P0,#0FFH
上一页
下一页
返回
任务二 动态计数数码显示
SETB P2.5
MOV P0,50H
CLR P2.0
CLR FLAG1
SETB FLAG2
AJMP INT_END
INT_LED2: MOV P0,#0FFH
SETB P2.0
MOV P0,51H
上一页
下一页
返回
任务二 动态计数数码显示
CLR P2.1
CLR FLAG2
SETB FLAG3
AJMP INT_END
INT_LED3: MOV P0,#0FFH
SETB P2.1
MOV P0,52H
CLR P2.2
CLR FLAG3
上一页
下一页
返回
任务二 动态计数数码显示
SETB FLAG4
AJMP INT_END
INT_LED4: MOV P0,#0FFH
SETB P2.2
MOV P0,53H
CLR P2.3
CLR FLAG4
SETB FLAG5
AJMP INT_END
上一页
下一页
返回
任务二 动态计数数码显示
INT_LED5: MOV P0,#0FFH
SETB P2.3
MOV P0,54H
CLR P2.4
CLR FLAG5
SETB FLAG6
AJMP INT_END
INT_LED6: MOV P0,0FFH
SETB P2.4
上一页
下一页
返回
任务二 动态计数数码显示
MOV P0,55H
CLR P2.5
CLR FLAG6
SETB FLAG1
AJMP INT_END
END ;程序结束
2. 测试程序分析
测试程序编译后下载到单片机中运行,结果是 6 位 LED 数码管按一定的时间间隔全亮(显示“ 8 ”)、全灭运行。若测试结果不是,需检查硬件电路或器件好坏。
上一页
下一页
返回
任务二 动态计数数码显示
下面简单讲解一下该程序动态显示 6 位数码的设计思路和编程思路:
6 位数码管轮流显示,设置 6 个标志位( FLAG1 ~ FLAG6 ),标志位若为 1 ,表示显示该位数码管,为 0 表示不该显示该位。利用人眼的视觉滞留效应,设置在 1 秒钟内所有的位循环显示 300 次,则显示 1 次的周期是 1 s/300=3.3 ms ,利用 51 单片机内部定时 / 计数器 1 ,定义中断时间为 3.3 ms ,中断时判断所有显示位的标志位,并跳入标志位为 1 的位,关闭上一位的显示,送出显示数据,打开该位的显示,同时清该位数码管的标志位,置需要显示的下一位的标志位。
上一页
下一页
返回
任务二 动态计数数码显示
要使定时器 T1 中断时间为 40 ms ,定时器 T1 的初始值计算过程如下:
因为设置定时器 T1 的工作方式为方式 1 ,设初始值为 X,则中断时间为(2 16 −X )×12/ f osc =40(ms)取 f osc =12 MHz求解方程得出 X =063C0H 。
三、数码管动态显示数据的控制程序设计
1. 编程思路
利用 51 单片机内部定时 / 计数器 0 进行定时,产生时钟信号秒、分钟、小时,并分别用 2位数码管进行显示,即秒占用 2 位,分钟占用 2 位,小时占用 2 位共 6 位数码管进行显示。
上一页
下一页
返回
任务二 动态计数数码显示
设置 50H ~ 55H 共 6 个字节单元存放要显示数据的字形码, 40H ~ 45H 共 6 个字节单元存放要显示的十进制数, 56H 、 57H 、 58H 三个单元分别装二进制秒、分钟、小时数据。 6 位数码管的动态显示的设计思路及编程思路同测试程序。
2. 程序清单
FLAG1 BIT 38H ;内存位地址 27H.0
FLAG2 BIT 39H ;内存位地址 27H.1
FLAG3 BIT 3AH ;内存位地址 27H.2
FLAG4 BIT 3BH ;内存位地址 27H.3
FLAG5 BIT 3CH ;内存位地址 27H.4
上一页
下一页
返回
任务二 动态计数数码显示
FLAG6 BIT 3DH ;内存位地址 27H.5
SEC EQU 56H
MIN EQU 57H
HOUR EQU 58H
MSEC EQU 59H
ORG 0000H ;开始
LJMP START
ORG 000BH ;定时器 T0 中断入口地址
LJMP INT_T0
上一页
下一页
返回
任务二 动态计数数码显示
ORG 001BH ;定时器 1 中断入口地址
LJMP INT_T1
ORG 0030H
START: MOV TMOD,#00010001B ;设置定时器 T0 和定时器 T1 的工作方式
MOV TH1,#0F2H ;设置定时器 T1 的初始值
MOV TL1,#0FBH
MOV TH0,#3CH ;设置定时器 T0 的初始值
MOV TL0,#0B0H
上一页
下一页
返回
任务二 动态计数数码显示
SETB TR0 ;启动定时器 T0
SETB TR1 ;启动定时器 T1
MOV R0,#20H ;内存 20H~59H 共 58 个字节单元清零
MOV R1,#58
START1: MOV @R0,#00H
INC R0
DJNZ R1,START1
MOV 27H,#00000001B ;设置数码管从 L1 位开始显示
MOV MSEC,#20
上一页
下一页
返回
任务二 动态计数数码显示
SETB EA ;开中断
SETB ET0 ;允许定时器 T0 中断
SETB ET1 ;允许定时器 T1 中断
MAIN: MOV A,SEC ;二进制秒数转化成十进制秒数
MOV R0,#40H
CALL BIN_DEX
MOV A,MIN ;二进制分钟数转化成十进制分钟数
MOV R0,#42H
CALL BIN_DEX
上一页
下一页
返回
任务二 动态计数数码显示
MOV A,HOUR ;二进制小时数转化成十进制小时数
MOV R0,#44H
CALL BIN_DEX
MOV R2,#6 ;查表,十进制数转化成字形码
MOV R1,#40H
MOV R0,#50H
MOV DPTR,#TABLE
MIAN1: MOV A,@R1
MOVC A,@A+DPTR
上一页
下一页
返回
任务二 动态计数数码显示
MOV @R0,A
INC R1
INC R0
DJNE R2,MAIN1
JMP MAIN
BIN_DEX: MOV B,#10
DIV AB
MOV @R0,B
INC R0
上一页
下一页
返回
任务二 动态计数数码显示
MOV @R0,A
RET
INT_T1: MOV TH1,#0F2H ;设置定时器 T1 的初始值
MOV TL1,#0FBH
JB FLAG1,INT_LED1 ;定时器 T1 中断中处理数码管显示
JB FLAG2,INT_LED2
JB FLAG3,INT_LED3
JB FLAG4,INT_LED4
JB FLAG5,INT_LED5
上一页
下一页
返回
任务二 动态计数数码显示
JB FLAG6,INT_LED6
INT_END: RETI
INT_LED1: MOV P0,#0FFH ;显示 L1 数码管处理程序
MOV P2,#0FFH
MOV P0,50H
CLR P2.0
CLR FLAG1 ;显示后更换显示标志位,以便下一周期显示下一位
SETB FLAG2
AJMP INT_END
上一页
下一页
返回
任务二 动态计数数码显示
INT_LED2: MOV P0,#0FFH ;显示 L2 数码管处理程序
MOV P2,#0FFH
MOV P0,51H
CLR P2.1
CLR FLAG2
SETB FLAG3
AJMP INT_END
INT_LED3: MOV P0,#0FFH ;显示 L3 数码管处理程序
MOV P2,#0FFH
上一页
下一页
返回
任务二 动态计数数码显示
MOV P0,52H
CLR P2.2
CLR FLAG3
SETB FLAG4
AJMP INT_END
INT_LED4: MOV P0,#0FFH ;显示 L4 数码管处理程序
MOV P2,#0FFH
MOV P0,53H
CLR P2.3
上一页
下一页
返回
任务二 动态计数数码显示
CLR FLAG4
SETB FLAG5
AJMP INT_END
INT_LED5: MOV P0,#0FFH ;显示 L5 数码管处理程序
MOV P2,#0FFH
MOV P0,54H
CLR P2.4
CLR FLAG5
SETB FLAG6
上一页
下一页
返回
任务二 动态计数数码显示
AJMP INT_END
INT_LED6: MOV P0,#0FFH ;显示 L6 数码管处理程序
MOV P2,#0FFH
MOV P0,55H
CLR P2.5
CLR FLAG6
SETB FLAG1 ;循环到数码管 L1 标志位
AJMP INT_END
INT_T0: PUSH PSW ;定时器 T0 定时中断产生时钟信号
上一页
下一页
返回
任务二 动态计数数码显示
PUSH ACC
MOV TH0,#3CH ;设置定时器 T0 的初始值
MOV TL0,#0B0H
DJNE MSEC,INT_T0_END
MOV MSEC,#20
INC SEC
MOV A,SEC
CLR C
SUBB A,#60
上一页
下一页
返回
任务二 动态计数数码显示
JC INT_T0_END
INC MIN
MOV SEC,#0
MOV A,MIN
CLR C
SUBB A,#60
JC INT_T0_END
INC HOUR
MOV MIN,#0
上一页
下一页
返回
任务二 动态计数数码显示
MOV A,HOUR
CLR C
SUBB A,#24
JC INT_T0_END
MOV HOUR,#0
INT_T0_END: POP ACC
POP PSW
RETI
TABLE: DB 0C0H,0F9H,0A4H,0B0H
上一页
下一页
返回
任务二 动态计数数码显示
DB 99H,92H,82H,0F8H,80H,90H
END ;程序结束
3. 程序分析
该程序执行的结果是:单片机上电, 6 位数码管显示时间,前两位显示小时,中间两位显示分钟,后两位显示秒。当 60 秒到时分钟数自动加 1 ,秒数清零;当 60 分钟到时,小时数自动加 1 ,分钟数清零;当 24 小时到时,小时数自动清零。
上一页
返回
任务三 串行 LED 显示电路设计
一、任务描述
在单片机系统设计中, LED 显示方式由于具有使用方便、价格低廉等优点而得到广泛应用。在采用并行显示方式时,显示电路的段码与位控码要占用单片机的较多口线,不能满足大型控制系统的要求。采用串行显示方式则只需占用 2 ~ 3 根口线,节约单片机大量的 I/O 线,且使用效果很好。本任务利用 74HC595A 实现多位 LED 串行显示。
二、电路设计
1. 74HC595A 工作原理
74HC595 具有 8 位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器有相互独立的时钟。
下一页
返回
任务三 串行 LED 显示电路设计
74HC595A 内部含有 8 位移位寄存器和 8 位 D 锁存器,其引脚及内部结构如图 7 − 3 所示。
串行移位寄存器接收外部输入的串行数据,一方面可进行串行数据输出,同时向锁存器提供 8 位并行输入数据,并具有异步复位功能; 8 位锁存器可三态输出并行数据。该芯片具有串行输入、并行输出两个独立的时钟信号。表 7 − 2 为该芯片的逻辑功能表。
输入数据在串行移位时钟 SRCLK 的上升沿,由串行输入端 SER 输入到芯片内部的串行移位寄存器中,同时由 SQH 端串行输出;在锁存时钟信号 RCLK 上升沿到来时,芯片将内部串行移位寄存器 8 位数据并行输出。正常工作时,应将复位端 SRCLR 与使能端 RCLK 分别接高电平、低电平。
上一页
下一页
返回
任务三 串行 LED 显示电路设计
2. 应用电路设计
图 7 − 4 为 12 位 LED 显示应用电路。该方案利用三片 74HC595A 芯片实现 12 位串行 LED显示控制。在串行时钟的控制下,可将显示器位控码与段控码逐位串行输入至三个芯片中,然后利用锁存信号实现并行输出,完成 12 位数码显示更新。利用此显示方式仅占用单片机三根口线,极大节约单片机口线资源。
三、程序设计
1. 位控码形成
初始位控码设定为显示第一位数码管(共阴极),见表 7 − 3 第一行位控码。
上一页
下一页
返回
任务三 串行 LED 显示电路设计
每显示完一位,需要改变位控码以显示下一位,表 7 − 3 反映了位控码的变化情况。 1 区寄存器 R6 、 R7 用于存放处理位控码。
2. 形成 20 位串行代码
利用 R3 、 R4 、 R5 将段码与位控码组装成 20 位串行输出码。以显示第 1 位数码管 L1 为例,设 R3 中存放显示缓冲区数据为 0 (段码为 3F ), R4 中为位控码 07H , R5 中为位控码 0FFH ,见表 7 − 4 中第一行数据。经过变换,合成为 20 位串行输出码,见表中第二行。工作时逐位输出 20 位位控码与段码, 20 位数据输出后,单片机发出锁存信号,于是相应数码管更新显示字符。
无效码 20 位有效码( 8 位段码 ,12 位位控码)
上一页
下一页
返回
任务三 串行 LED 显示电路设计
3. 显示程序工作方式
本程序采用定时方式控制显示器工作。 12 位显示器采用动态扫描显示,每位显示器显示时间大约为 1.67 ms ,由定时器 T0 控制。 T0 定时时间到产生显示中断时,进入显示中断程序显示下一位数据。这种显示方式可提高 CPU 的工作效率,可准确控制显示器的刷新速度。
4. 中断显示子程序应用
编制一程序,在 12 位数码管上依次显示 0 、 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 、 10 、 11 。
上一页
返回
图 7 - 2
返回
图 7 - 3
返回
表 7 - 2
返回
图 7 - 4
返回
表 7 - 3
返回
表 7 - 4
返回
$$