2023年11月26日发(作者:)
重赏之下心有勇夫^_^
;汇编时钟程序。4位共阳管。P0口段码,P2.0~P2.3位码。显示毫秒和秒。三个按键一个
控制时钟开始走,一个控制暂停和继续。。。一个按键清0
;12M晶振 2011 04 20 调试完成
STRT EQU P3.2
STP EQU P3.3
CLRR EQU P3.5
ORG 00H
SJMP MAIN
ORG 0BH
AJMP T0INT
ORG 30H
MAIN: MOV SP,#60H
MOV R3,#10
MOV R4,#20
MOV TMOD,#01H ;定时器T0工作方式1
MOV TH0,#0D8H ;10MS定时初值
MOV TL0,#0F0H
SETB ET0
SETB EA
CLR F0 ;如无此条,暂停后,不是按继续键,而是按开始键继续走时,下次按暂停键时,
不能暂停
AJMP K1
SS: CPL F0
JNB F0,START
STOP: CLR TR0
AJMP K2
CLEAR: CLR TR0
MOV A,#0
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV 24H,A
MOV 25H,A
AJMP K3
ACALL DLY
CLR P2.5
MOV A,22H ;S个位
DB 0A4H;2
2
STRT EQU P1.0
CLRR EQU P1.1
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0INT0
ORG 30H
MAIN:
MOV SP,#60H
MOV R4,#20
MOV TMOD,#01H
MOV TH0,#3CH;12M晶振时定时初值取#3CB0H,还可细调如 TL=#0B7H,可以更准
MOV TL0,#0B0H
SETB ET0
CPL TR0
AJMP K1
K2:
JB CLRR,K1
ACALL DISP
JNB CLRR,$-2
MOV A,#0
CLR TR0
MOV 26H,A
MOV 27H,A
MOV 28H,A
AJMP K2
DISP:
MOV A,26H
MOV B,#10
DIV AB
MOV 20H,B ;余数(百分秒位数)
MOV 21H,A ;商(十分秒位数)
MOV A,27H
CLR P2.2
ACALL DLY
SETB P2.2
DISP1:
MOV A,22H ;秒个位
ACALL SEG7
MOV P0,A
SETB P0.7
CLR P2.1
ACALL DLY
SETB P2.1
MOV A,23H ;秒十位
ACALL SEG7
MOV P0,A
CLR P2.0
ACALL DLY
SETB P2.0
RET
T0INT0:
MOV TH0,#3CH; ;定时中断子程序。重装定时常数
MOV TL0,#0B0H;
INC 26H ;0.01S秒存储单元内数+1
MOV A,26H
CJNE A,#100,T0INTR ;未1S,跳出中断。
MOV 26H,#0
INC 27H ;秒+1
CPL 7FH
MOV A,27H
DJNZ R3,D0
RET
DLY:
MOV R7,#2
D1:
MOV R6,#40
DJNZ R6,$
DJNZ R7,D1
RET
SEG7:
INC A
MOVC A,@A+PC
RET
DB 03FH ;0 共阴
DB 006H ;1
DB 05BH ;2
DB 04FH ;3
DB 066H ;4
DB 06DH ;5
DB 07DH ;6
DB 007H ;7
DB 07FH ;8
DB 06FH ;9
END
数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴
数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电
平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。共阴数码管内部
连接如图3所示。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳
数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相
应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阳数码管内部连接如图
2所示。
图2:共阳数码管内部连接图 图3:共阴数码管内部连接图
数码管的显示方式
数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数
字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
① 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之
一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每
个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机
输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取
决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打
开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的
COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码
管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各
位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,
不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗
更低。
②静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由
一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态
驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示
则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),
实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
前面我们学习了数码管的基础知识,现在马上来看看S51增强型实验板的数码管吧(图
4),S51实验板上有5位高亮度共阳数码管DG1~DG5,可以用来做计数器(最大计数值
99999)、温度显示、电子钟等显示实验,掌握数码管的静态显示驱动和动态显示驱动。
图4
S51增强型实验板的数码管驱动原理图如下图5所示。
图5
从原理图可以看出,S51增强型实验板中数码管的段码a,b,c,d,e,f,g,dp分别与单片机的
P0.0~P0.7相连,控制数码管中显示的字形;数码管的位选通由5个PNP三极管控制,分
别接到单片机的P2.0、P2.1、P2.2、P2.3、P2.4端口上,程序中通过控制P2.0~P2.4端口的
输出电平就可以控制数码管的显示与关闭。如P2.0输出低电平时,三极管T1导通,+5V电
源加到第一个数码管的COM端,那么第一个数码管DG1就会显示出相应的数字,显示的
数字由单片机P0.0~P0.7输出段码决定,当P2.0输出高电平时,三极管T1截止,数码管
DG1就不显示,从而实现数码管位选通控制。同理,当P2.1输出低电平时,则数码管DG2
显示。。。
单片机驱动数码管的静态显示编程
上面我们学习了一大堆的理论知识,对数码管已经有了较全面的认识,是否跃跃欲试了
呀!马上动手编一个简单的程序验证一下理论吧,现在我们编程让实验板上的第一个数码管
DG1显示数字“6”,最终的实验效果见上面图4所示。
启动Keil C51单片机集成开发环境,新建一个工程,工程命名为2,(不懂如何
建立新工程的初学者请看网页 手把手教你建立Keil工程),打开一个文本编辑窗,在文本
编辑窗中输入如下代码:
;********** 下面是数码管显示"6"的程序 **********
MAIN:CLR P0.0;P0.0输出低电平,点亮数码管段码"a"
SETBP0.1;P0.1输出高电平,熄灭数码管段码"b"
CLR P0.2;P0.2输出低电平,点亮数码管段码"c"
CLR P0.3;P0.3输出低电平,点亮数码管段码"d"
CLR P0.4;P0.4输出低电平,点亮数码管段码"e"
CLR P0.5;P0.5输出低电平,点亮数码管段码"f"
CLR P0.6;P0.6输出低电平,点亮数码管段码"g"
SETBP0.7;P0.7输出高电平,熄灭数码管小数点段码"dp"
CLR P2.0;P2.0输出低电平,选通数码管DG1
SETBP2.1;P2.1输出高电平,不选通数码管DG2
SETBP2.2;P2.2输出高电平,不选通数码管DG3
SETBP2.3 ;P2.3输出高电平,不选通数码管DG4
SETBP2.4;P2.4输出高电平,不选通数码管DG5
AJMPMAIN;跳转到开始重新进行
END ;程序结束
注:程序中分号“;”后面的中文为每一行程序的注释,是方便我们阅读程序的,可以
不输入。
上面的源程序输入完毕后,保存为"",然后添加到工程2中,最后源程
序经过编译得到目标文件""(见下面的图6所示),不熟悉Keil工程建立、设置及
源程序编译等详细操作的初学者请参考网页 >>> 手把手教你建立Keil工程。>>>
图6:点击放大该图
现在让我们把目标文件""烧写到单片机中去,看看实际的效果吧,将ISP编程
器硬件连接好(见下图7)。
图7:ISP
将产品配套光盘中的“ISP编程器驱动软件”文件夹复制到你电脑硬盘的D盘根目录下,
并将其目录下的所有文件的只读属性去掉,具体操作如下:全选文件夹中的文件,鼠标右键
单击出现文件属性对话框,单击“只读”属性前面复选框中的勾,使其只读属性去掉即可。
然后双击文件夹中的“ISP编程器驱动软件.exe”启动编程软件,点击"文件",在打开文件
的对话框中找到工程文件夹中的目标文件""打开即可,然后点击“AUTORUN”将
程序烧写到单片机内部(如下图8)。
图8:将程序烧写到单片机内部
烧写完成了,把单片机从编程器中取出,然后插到S51增强型实验板上,插上USB电
源,看看显示效果是不是和上面图4显示一样,是否有一点点的成就感呀!初学者也许会问:
数码管显示一个数字“6”就要15行程序,太复杂了?的确有点复杂了,在上面程序中为了
显示数字“6”,数码管的段码"b"、段码"dp"输出的是高电平,其它引脚输出的是低电平,
实际上从单片机的P0.0~P0.7输出的是二进制码“10000010”,转换成十六进制为82H。因
此,我们只要把所有要显示的数字和字符的段码根据硬件连接编制一个字形表,显示时直接
把相应的字形码送到P0口就可以了。
共阳LED数码管字形(段码)表
显示数
P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
二进制代十六进制
字
"dp" "g" "f" "e" "d" "c" "b" "a"
码 代码
(字符)
0 1 1 0 0 0 0 0 0 11000000 C0H
1 1 1 1 1 1 0 0 1 11111001 F9H
2 1 0 1 0 0 1 0 0 10100100 A4H
3 1 0 1 1 0 0 0 0 10110000 B0H
4 1 0 0 1 1 0 0 1 10011001 99H
5 1 0 0 1 0 1 1 0 10010110 92H
6 1 0 0 0 0 0 1 0 10000010 82H
7 1 1 1 1 1 0 0 0 11111000 F8H
8 1 0 0 0 0 0 0 0 10000000 80H
9 1 0 0 1 0 0 0 0 10010000 90H
A 1 0 0 0 1 0 0 0 10001000 88H
B 1 0 0 0 0 0 1 1 10000011 83H
C 1 1 0 0 0 1 1 0 11000110 C6H
D 1 0 1 0 0 0 0 1 10100001 A1H
E 1 0 0 0 0 1 1 0 10000110 86H
F 1 0 0 0 1 1 1 0 10001110 8EH
H 1 0 0 0 1 0 0 1 10001001 89H
O 1 1 0 0 0 0 0 0 11000000 A3H
P 1 0 0 0 0 1 0 0 10000100 8CH
N 1 1 0 0 1 0 0 0 11001000 C8H
从上面表格中可以看到,显示“6”的十六进制段码值为"82H",因此我们把刚才的程序
修改一下,修改后的完整程序如下:
MAIN:MOV P0,#82H ;将数字"6"的段码输出到P0口
MOV P2,#0FEH;从P2口输出数码管选通代码,即输出二进制
“11111110”
AJMPMAIN;跳转到开始重新进行
END ;程序结束
看看修改后的程序将变得更加简洁,直观了,程序代码从原来的15行减少到仅4行,
一样实现了相同的功能。这也就是我们要学习的编程技巧哦!在编程中尽量用最少的代码实
现相同的功能。程序第1行的功能是将要显示的数字“6”的十六进制段码"82H"送到P0口,
程序第2行的功能就是将数码管的选通代码#0FEH(即二进制"11111110")送到P2口,从而
控制第一位数码管显示,其它数码管熄灭。把修改过的程序编译后的目标文件写到单片机上
看到显示效果是一样的。程序中用一行代码 MOVP0,#82H 就输出了字形,因此我们要
显示其它字形时只要从上面的数码管段码表中查出对应的十六进制字形码,用同样的方法把
段码输出到P0口就可以了。比如我们要显示一个数字“8”, 只需将程序中的 MOV
P0,#82H 语句改成 MOVP0,#80H 即可,至此,我们终于可以随心所欲地控制数码管要
显示的字形了,是不是很简单呀 :) 。
另外,如果想让第二位数码管DG2显示,其它熄灭怎么办呢?其实很简单,只要把对
应数码管的选通端口输出低电平就可以使该位数码管显示了,如指令 CLR P2.1 就可以让
第二个数码管显示。。。程序中如果使P2.0~P2.4都输出低电平,那么实验板上的5个数码
管都会被选通,显示出相同的字形,即显示“66666”。下面就是5位数码管显示出“66666”
的程序,初学者可以实验一下,以加深对数码管显示位选通(使能)控制的理解。
MAIN:MOV P0,#82H ;将数字"6"的段码输出到P0口
MOV P2,#0E0H;从P2口输出数码管选通代码,使5位数码管均选通,
即输出二进制“11100000”
AJMPMAIN;跳转到开始重新进行
END ;程序结束
单片机驱动数码管的动态显示编程
上面我们已经学习了数码管静态显示,接下来我们就学习数码管动态显示编程,编程让
实验板上的数码管显示“89C51”。从原理图中(图5)我们可以看到,5个数码管的8个显
示笔划"a,b,c,d,e,f,g,dp"的同名端是2连在一起的,那么当程序从P0口输出字形码时,在同
一个时间所有数码管都会接收到相同的字形码。你一定会问,这样不是5个数码管都显示相
同的数字了吗?如何显示出5个不同的字符“89C51”呢?因此,就要使用动态扫描了,在
程序中,首先显示一个数,然后关掉;然后显示第二个数,又关掉,显示第三个数,又关掉。。。
直到所有要显示的5个数完成,再从头开始扫描。轮流点亮扫描过程中,每位显示器的点亮
时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际
上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数
据,不会有闪烁感。
数码管显示“89C51”的具体编程思路如下:第一位数码管显示“8” → 延时1ms →
关闭所有数码管显示 → 第二位数码管显示“9” → 延时1ms → 关闭所有数码管显示 →
第三位数码管显示“C” → 延时1ms → 关闭所有数码管显示 → 第四位数码管显示“5”
→ 延时1ms → 关闭所有数码管显示 → 第五位数码管显示“1” → 延时1ms → 关闭所
有数码管显示 → 返回到第一步重新进行新一轮扫描过程。下面就是根据该思路编出来的源
程序,初学者可以把该程序粘贴到Keil工程中,编译得到目标文件,然后烧写到单片机验
证一下。
; *********** 在数码管上动态显示"89C51" *************
MAIN: MOV P0,#80H;第1位数码管显示“8”
CLR P2.0 ;允许第1位数码管显示
ACALL DELAY;显示延时一段时间
MOV P0,#0FFH ;清除P0口字形码
MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示
MOV P0,#90H;第2位数码管显示“9”
CLR P2.1 ;允许第2位数码管显示
ACALL DELAY;显示延时一段时间
MOV P0,#0FFH ;清除P0口字形码
MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示
MOV P0,#0C6H ;第3位数码管显示“C”
CLR P2.2 ;允许第3位数码管显示
ACALL DELAY;显示延时一段时间
MOV P0,#0FFH ;清除P0口字形码
MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示
MOV P0,#92H;第4位数码管显示“5”
CLR P2.3 ;允许第4位数码管显示
ACALL DELAY;显示延时一段时间
MOV P0,#0FFH ;清除P0口字形码
MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示
MOV P0,#0F9H ;第5位数码管显示“1”
CLR P2.4 ;允许第5位数码管显示
ACALL DELAY;显示延时一段时间
MOV P0,#0FFH ;清除P0口字形码
MOV P2,#0FFH ;停止所有数码管显示选通,关闭所有显示
AJMPMAIN ;跳转到开始重新进行
;******** 延时子程序 ********
DELAY:MOV R1,#10
Y1: MOV R2,#100
DJNZR2,$
DJNZR1,Y1
RET
END
【总结】
至此,我们已经较全面地学习了数码管的工作原理和使用方法,相信你对数码管的静态
显示、动态显示有了新的认识,掌握了数码管的这两种使用方法,你就可以根据你自己的意
愿及要求来编写各种各样的数字显示程序了,如电子温度计、时钟、秒表、频率计、计数器
的制作等等,可以充分发挥你的想象达到你所需要的各种显示效果。我们附带的配套软件资
料光盘配有相关的实验例程、实验视频录像、单片机多媒体教程、实用电子图书资料、单片
机开发软件及编程器、仿真器的全部驱动程序,供大家学习使用,以帮助初学者快速入门。


发布评论