《第五节七段数码管的使用》由会员分享,可在线阅读,更多相关《第五节七段数码管的使用(19页珍藏版)》请在金锄头文库上搜索。
1、第五节 数码管的使用5.1 数码管简介同学们!相信你的流水灯也做的不错了吧,现在能玩出几种花样了?但是工程师们设计这么一个单片机,并不是只为了让它做流水灯的,那样也太浪费点了吧 . _ 。数码管的一种是半导体发光器件,7 段 LED 数码管是利用 7 个 LED(发光二极管)外加一个小数点的 LED 组合而成的显示设备,可以显示 09 等 10 个数字和小数点,使用非常广泛,数码管可以分为一位和多位它的外观如图 5-1 所示。图 5-15.2 数码管的显示原理数码管可以分为共阳极与共阴极两种,共阳极就是把所有 LED 的阳极连接到共同接点com,使用时 com 接正 5 伏电源,而每个 LED
2、 的阴极分别为 a、b、c 、d、e、f、g 及dp(小数点) ;共阴极则是把所有 LED 的阴极连接到共同接点 com,使用时 com 要将其接地。而每个 LED 的阳极分别为 a、b、c 、d、e、f、g 及 dp(小数点) ,8 个 LED 的分布方式如图 5-2 所示。图中的 8 个 LED 分别与上面那个图中的 ADP 各段相对应,通过控制各个 LED 的亮灭来显示数字。那么,实际的数码管的引脚是怎样排列的呢?对于单个数码管来说,从它的正面看进去,左下角那个脚为 1 脚,以逆时针方向依次为 110 脚,左上角那个脚便是 10 脚了,上面两个图中的数字分别与这 10 个管脚一一对应。注
3、意,3 脚和 8 脚是连通的,这两个都是公共脚。它对应的引脚分布为图 5-3 所示。图 5-2 图 5-3数码管的 8 段,对应一个字节的 8 位,a 对应最低位,dp(小数点)对应最高位。所以如果想让数码管显示数字 0,那么共阴数码管的字符编码为 00111111,即 0x3f;共阳数码管的字符编码为 11000000,即 0xc0。可以看出两个编码的各位正好相反。如图 5-4 所示。图 5-4那么,一位数码管要显示字符 0F,则对应的编码如表 2 所示。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即 a,b,c,d,e,f,g,dp)连在一起,而各自的公共端
4、称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。5.3 一位数码管的显示请实现:让一位数码管依次显示字符 0F,每个字符显示 1 秒,如此反复。一般情况下,为了计算或取码的方便,我们把 a-dp 依次接到单片机某个口上的 Px.0-Px.7 上。x 表示 0,1,2,3 其中的一个。这样我们只要给某个口,赋一个值,则相应的LED 段就被点亮,但是在硬件连接上要注意了:单片机可能不能直接驱动 LED,所以我们可以通过控制三级管的导通或截止,或者使用共阳极数码管(以灌电流的方式) 、或者使用锁存器来驱动。来控制 LED 的亮与灭!5.3.1 硬件的选择与仿真电路
5、的设计1.打开 Proteus,选择“File/NewDesign”菜单选项,新建一个“设计项目” 。并将项目保存为“SEG7_1” 。2.选择“P”按钮或菜单“Library/Pick Divice/Symbol P”菜单,从“元件库”中选取元件。依次添加其他元件。其名称和位置见下表。元件名称 Category Sub-Category ResultsAT89C52 Microprocessor ICs 8051 Family AT89C527SEG-MPX1-CA(注1)Optoelectronics 7-Segment Displays 7SEG-MPX1-CARX8(注 2) Resi
6、stors Resistor Packs RX8RESPACK-8(注 3) Resistors Resistor Packs RESPACK-8注 1:7SEG 表示 7 段数码管(Proteus 还提供了 14 段和 16 段数码管)MPX1 表示 1 位(Proteus 还提供了 2 位、4 位、6 位和 8 位数码管)CA 表示共阳极(CC 表示共阴极)注 2:RX8 表示电阻排,它实际相当于 8 个电阻并排摆放在一个容器内。在这里是作为限流电阻来使用的。注 3:RESPACK-8 表示电阻排,它实际相当于 8 个电阻并排摆放在一个容器内,但是这 8 个电阻的一段是连接在一起作为公共端
7、的。在这里是作为 P0 口的上拉电阻来使用的。依次从备选元件库中摆放器件,连线,画出仿真电路图,如图 5-5 所示。图 5-5注意:在 Proteus 中,实际上,51 单片机是不需要晶振、复位电路和电源就可以仿真的,因此,为了方便我们教学,以后,我们将不再画上述 51 的外围电路。5.3.2 程序的设计1.新建一个 keil 项目,并命名为“SEG7_1”并添加一个名为“main.c”的源代码文件,然后键入如下代码。如代码 5.1 所示。/代码 5.1#include #define SegPort P0 /定义数码管连接的端口#define uchar unsigned char /宏定义
8、 将 unsigned char 替换为较为简单的 uchar 写法#define uint unsigned int/宏定义 将 unsigned int 替换为较为简单的 uint 写法/用一个数组来定义字符 0f 共阳极数码管编码uchar code seg7ca= 0xc0,0xf9,0xa4,0xb0,/030x99,0x92,0x82,0xf8,/470x80,0x90,0x88,0x83,/8b0xc6,0xa1,0x86,0x8e /cf;/延时函数 ms 毫秒void DelayMs(uint ms)uint i,j;for(i=0;i#define SegPort P0 /
9、定义数码管连接的端口#define uchar unsigned char /宏定义 将 unsigned char 替换为较为简单的 uchar 写法#define uint unsigned int/宏定义 将 unsigned int 替换为较为简单的 uint 写法/用一个数组来定义字符 0f 共阴极数码管编码uchar code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x77,0x7c, /8b0x39,0x5e,0x79,0x71 /cf;sbit GeWei=P11; /定义数码管个位的位
10、选线sbit ShiWei=P10; /定义数码管十位的位选线sbit le573=P12; /定义 573LE 引脚的位选线/延时函数 ms 毫秒void DelayMs(uint ms)uint i,j;for(i=0;i#include commmon.h /包含 #define uchar unsigned char 等定义#include function.h /包含 DelayMs 函数#define SegPort P0 /定义数码管连接的端口sbit GeWei=P11; /定义数码管个位的位选线sbit ShiWei=P10; /定义数码管十位的位选线sbit le573=P
11、12; /定义 573LE 引脚的位选线/用一个数组来定义字符 0f 共阴极数码管编码unsigned char code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x77,0x7c, /8b0x39,0x5e,0x79,0x71 /cf;void main()uchar tmp,second; /second 为当前的秒数GeWei=1; /先将数码管个位显示关闭ShiWei=1; /先将数码管十位显示关闭second=0; /second 将从 0 开始增加while(1)/无限大循环tmp = se
12、cond%10;/提取个位数le573=1; /将锁存器设置为直通模式SegPort=seg7cctmp; /将second个位的编码送出GeWei=0; /先显示个位,将十位关闭le573=0; /将锁存器设置为锁存模式DelayMs(500);GeWei=1;ShiWei=1; /消隐操作,防止数码管闪烁tmp = second/10;/提取十位数le573=1; /将锁存器设置为直通模式SegPort=seg7cctmp; /将second十位的编码送出ShiWei=0;/再显示十位,将个位关闭le573=0; /将锁存器设置为锁存模式DelayMs(500); /延时 500 毫秒,连
13、同前面延时的 500 毫秒,刚好是 1 秒GeWei=1;ShiWei=1; /消隐操作,防止数码管闪烁if(second#include commmon.h /包含#define uchar unsigned char 等定义#include function.h /包含 DelayMs 函数#define SegPort P0 /定义数码管连接的端口sbit GeWei=P11; /定义数码管个位的位选线sbit ShiWei=P10; /定义数码管十位的位选线sbit le573=P12; /定义 573LE 引脚的位选线/用一个数组来定义字符 0f 共阴极数码管编码unsigned c
14、har code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x77,0x7c, /8b0x39,0x5e,0x79,0x71 /cf;uchar tmp,second; /定义一个全局变量,second 为当前的秒数uchar count; /定义一个全局变量,count 为定时器中断执行的次数void main()/*定时器 T0 的初始化*TMOD=0x01; /设置定时器 T0 工作在方式 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/设置定时器中断时间
15、间隔为 50 毫秒EA=1; /开总中断ET0=1; /开定时器 T0 中断TR0=1; /定时器开始运行/*GeWei=1; /先将数码管个位显示关闭ShiWei=1; /先将数码管十位显示关闭second=0; /second 将从 0 开始增加count=0; /count 将从 0 开始增加while(1)/无限大循环tmp = second%10;/提取个位数le573=1; /将锁存器设置为直通模式SegPort=seg7cctmp; /将second个位的编码送出GeWei=0; /先显示个位,将十位关闭le573=0; /将锁存器设置为锁存模式DelayMs(1);GeWei=1;ShiWei=1; /消隐操作,防止数码管闪烁tmp = second/10;/提取十位数le573=1; /将锁存器设置为直通模式SegPort=seg7cctmp; /将second十位的编码送出ShiWei=0;/再显示十位,将个位关闭le573=0; /将锁存器设置为锁存模式DelayMs(1); GeWe