项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)

2024-07-10
| 56页
| 50人阅读
| 2人下载
普通

内容正文:

项目七 玩转数码管 任务一 静态计数数码显示 任务二 动态计数数码显示 任务三 串行 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 返回 $$

资源预览图

项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
1
项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
2
项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
3
项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
4
项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
5
项目七 玩转数码管(课件)-《单片机技术应用》同步教学(北理版)
6
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。