第九次课(共2学时)一、授课题目:数码管显示程序(上)二、教学目标和任务:1.掌握数码管动态显示原理:2.掌握PO控制段选、P2控制位选时的编程方法;3.掌握显示一串数字、一串字母时的编程技巧;三、教学重难点:重点:数码管动态显示原理、PO控制段选、P2控制位选时的编程方法。难点:显示一串数字、一串字母时的编程技巧。四、授课过程:回顾:简要的回顾上一节课的主要知识点,C51中的运算符、流水灯的硬件设计、三种流水灯设计编程方法。0.引入通过演示数码管显示学号、字母串的现象,为学生引入本节课的内容。1.数码管静态显示数码管由8只发光二极管按照一定的顺序排列成8字形组成,有共阴极和共阳极两种结构,分别如图1所示。共阴极数码管工作时,公共端接地,adp端接1时,对应LED灯点亮,相应地,共阳极数码管工作时,公共端接高电平,adp端接O时,对应LED灯点亮。此时要向同学们强调通过公共端可以控制数码管工作与否,这时数码管动态显示的重要依据。1
1 第九次课(共 2 学时) 一、授课题目:数码管显示程序(上) 二、教学目标和任务: 1. 掌握数码管动态显示原理; 2. 掌握 P0 控制段选、P2 控制位选时的编程方法; 3. 掌握显示一串数字、一串字母时的编程技巧; 三、教学重难点: 重点:数码管动态显示原理、P0 控制段选、P2 控制位选 时的编程方法。 难点:显示一串数字、一串字母时的编程技巧。 四、授课过程: 回顾:简要的回顾上一节课的主要知识点,C51 中的运算 符、流水灯的硬件设计、三种流水灯设计编程方法。 0. 引入 通过演示数码管显示学号、字母串的现象,为学生引入本 节课的内容。 1. 数码管静态显示 数码管由 8 只发光二极管按照一定的顺序排列成 8 字形 组成,有共阴极和共阳极两种结构,分别如图 1 所示。共阴极 数码管工作时,公共端接地,a~dp 端接 1 时,对应 LED 灯点 亮,相应地,共阳极数码管工作时,公共端接高电平,a~dp 端 接 0 时,对应 LED 灯点亮。此时要向同学们强调通过公共端可 以控制数码管工作与否,这时数码管动态显示的重要依据
com5Vao1ooaZ大.b.0100.福0010000O000dp01009g00.dpdp00共阳极共阴极comedpGND图1.数码管结构示意图数码管和MCU的连接方式如图2所示,如图所示当显示1时程序如下:P0=00000110BCoaP0=0x06P000bP01CP02d0P03MCUeAA0CP040P05dpg0P06ddp0P07共阴极GNDCdcomedp图2.数码管与单片机连接示意图#include<reg51.h)void main Owhile(1)P0=0x06H;2
2 图 1.数码管结构示意图 数码管和 MCU 的连接方式如图 2 所示,如图所示当显示 1 时程序如下: 图 2.数码管与单片机连接示意图 #include<reg51.h> void main () { while(1) { P0=0x06H;
1当需要显示数字27时,可以通过PO接数码管1,P2接数码管2,如图所示,再通过如下程序完成。POOP07MCUP20P27图3.单片机连接两只数码管的示意图#include<reg51.h>voidmain O1while(1)(PO=0x5B;P2=0x07;1按照这样的思路,我们实验用的开发板上有八只数码管,这就需要8组I/0口进行控制显示,显然是无法实现的,因此我们需要通过数码管动态显示技术来实现8只数码管的显示。3
3 } } 当需要显示数字 27 时,可以通过 P0 接数码管 1,P2 接数 码管 2,如图所示,再通过如下程序完成。 图 3. 单片机连接两只数码管的示意图 #include<reg51.h> void main () { while(1) { P0=0x5B; P2=0x07; } } 按照这样的思路,我们实验用的开发板上有八只数码管, 这就需要 8 组 I/O 口进行控制显示,显然是无法实现的,因此 我们需要通过数码管动态显示技术来实现 8 只数码管的显示
2.数码管动态显示以共阴极数码管为例,当公共极接低电平时,数码管可以正常工作,而当公共极接高电平时,数码管将无法正常工作。因此我们可以通过PO接八只数码管的a~dp端,控制数码管显示的字符,再通过P2分别接8只数码管的公共端。如图所示:A88888888conP27P2.6P2.5P2.4P2.3P2.2P2.1P2.0图4.数码管动态显示原理图例1:编写程序实现由右向左依次显示01234567的程序,数字中间间隔100mS。分析:该例题中,我们通过两个数组实现数码管的动态显示,分别如下:1.存放数字0~9对应段码的数组unsignedcharcodeseg[1o]=(0x3f,Ox5b,Ox66,0x7dOx7f,0x06,0x4f,0x6d,0x07,0x6f)2.控制数码管公共端信号的数组unsigned char codewei[8]={Oxfe,Oxfd,Oxfb,Oxf7,Oxef,Oxdf,0xbf,Ox7f);这样定义后需要选通n号数码管,显示m,只需要写如下程序即可:P2=wei[n];PO=seg[m];4
4 2. 数码管动态显示 以共阴极数码管为例,当公共极接低电平时,数码管可以 正常工作,而当公共极接高电平时,数码管将无法正常工作。 因此我们可以通过 P0 接八只数码管的 a~dp 端,控制数码管显 示的字符,再通过 P2 分别接 8 只数码管的公共端。如图所示: 图 4. 数码管动态显示原理图 例 1:编写程序实现由右向左依次显示 01234567 的程序, 数字中间间隔 100ms。 分析:该例题中,我们通过两个数组实现数码管的动态显 示,分别如下: 1. 存放数字 0~9 对应段码的数组 unsigned char code seg[10]= {0x3f,0x5b,0x66,0x7d, 0x7f,0x06,0x4f,0x6d,0x07,0x6f} 2. 控制数码管公共端信号的数组 unsigned char code wei[8]={0xfe,0xfd,0xfb,0xf7,0xef, 0xdf,0xbf,0x7f}; 这样定义后需要选通 n 号数码管,显示 m,只需要写如下 程序即可:P2=wei[n]; P0=seg[m];
程序如下:#include<reg5l.h)unsigned char code seg[10l= (Ox3f, Ox5b, Ox66, 0x7d,Ox7f,0x06,0x4f,0x6d,0x07,0x6f)charcodewei[8l={Oxfe,Oxfd,Oxfb,unsignedOxf7,Oxef,Oxdf,Oxbf,Ox7f):voiddelayl00ms()(略);void main O1while(1)funsigned i;for(i=0;i<=7;i++)(P2=wei[i]:PO=seg[i];delay100ms(;]11讲解要点:数组存放在code区的原因。思考:当我们将延时函数改为2mS,会出现什么现象?此时由于人眼极限分辨频率为24Hz,人眼将看到76543210。这种通过动态扫描实现数字同时呈现的技术就是数码管动态显示技术。例题2:当我们需要显示学号19070621时又改怎么编写程序呢?#include<reg5l.h)5
5 程序如下: #include<reg51.h> unsigned char code seg[10]= {0x3f,0x5b,0x66,0x7d, 0x7f,0x06,0x4f,0x6d,0x07,0x6f} unsigned char code wei[8]={0xfe,0xfd,0xfb , 0xf7,0xef, 0xdf,0xbf,0x7f}; void delay100ms(){略}; void main () { while(1) { unsigned i; for(i=0;i<=7;i++) { P2=wei[i]; P0=seg[i];delay100ms();} } } 讲解要点:数组存放在 code 区的原因。 思考:当我们将延时函数改为 2ms,会出现什么现象? 此时由于人眼极限分辨频率为 24Hz , 人眼将看到 76543210。这种通过动态扫描实现数字同时呈现的技术就是数 码管动态显示技术。 例题 2:当我们需要显示学号 19070621 时又改怎么编写 程序呢? #include<reg51.h>