1.数字管的基本介绍
先给大家提供一张原理图,如图1所示。
图1数字管原理图
这是数码管的常见原理图,我们板上有6根数码管。LED学习小灯,学习,数字管的学习会容易得多。从图1可以看出,数字管是共有的a,b,c,d,e,f,g,dp事实上,这八段的每一段都是一段LED小灯,所以数码管是8个LED由小灯组成。让我们来看看数字管的内部结构图。
图2数字管结构图
数码管分为共阳数码管和共阴数码管,所谓的共阴数码管就是8只LED小灯的阴极是连接在一起的,即阴极是公共端,小灯是否亮灭由阳极控制。同理,共阳数码管是阳极接收在一起的,大家可以仔细研究下图1。细心的学生也会发现数字管上有两个com,其实是我们数码管的公共端。为什么有2 我个人认为,一方面有两个可以起到对称的作用,只有10个引脚。另一方面,公共端通过的电流很大,我们在初中就学会了。并联电路电流之和等于总电流,使用两个com将公共电流平均上升到两个引脚上,以减少线路承受的电流。
从我们板子的电路图可以看出,我们使用的数码管是共阳数码管,如图所示。
图3共阳数码管电路
他们的com当然,上,当然,和,LED小灯电路相似,也是74HC138控制了三极管的导通来控制整个数字管的电流。让我们先看看DS这个数字管。原理图上可以看到控制DS1的三极管是Q17,控制Q17的引脚是LEDS0,对应到74HC138上边就是Y0端的输出。
图474HC138控制图
我们现在的目的是让步LEDS这个引脚输出低电平,相信大家现在可以根据之前学到的内容独立把握ADDR0,ADDR1,ADDR2,ADDR3,ENLED这4个输入状态写出来,现在大家不要偷懒,都去根据138的手册去写一下,不需要你记住这些结论,但是遇到就写一次,锻炼过几次后,当你遇到类似的芯片时,你知道如何解决问题。
数字管通常用来显示数字。我们板上的6个数字管通常被称为6位。控制位选择74HC138。数码管内部有8个LED我们称小灯为数码管段,所以数码管段的选择(即该段的亮灭)是通过的P74后0口控制HC245驱动。
2、数码管的真值表
我们直接将数字管的8段视为8段LED控制小灯,那就是a、b、c、d、e、f、g、dp一共8个LED小灯。如果我们点亮们可以很容易地看到,如果我们点亮b和c这两个LED小灯,即数码管的b段和c段,如果所有其他段都熄灭,可以让数码管DS1显示一个数字1,所以这个时候其实是P0值的二进制是0b1111001,16进制xF9。然后我们写一个程序,看看数字管显示。
#include///包含寄存器的库文件
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
voidmain()
{
unsignedcharj=0;
unsignedinti=0;
ENLED=0;
ADDR0=0;
ADDR1=0;
ADDR2=0;
ADDR3=1;//74HC138开启三极管Q17
while(1)///程序死循环
{
P0=0xF9;//打开数码管b和c段
}
}
编译此程序,下载到单片机中,您会发现最右边的数字管成功显示1。
同样,我们可以成功地在数字管上显示其他数字,并且数字管显示的数字是相应的P0的赋值,我们称之为数字管的真值表。让我们列出我们电路图中的数字管真值表。请注意,这个真值表中显示的数字没有小数点。
表1数字管真值表
数字 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
真值表 |
0xC0 |
0xF9 |
0xA4 |
0xB0 |
0x99 |
0x92 |
0x82 |
0xF8 |
数字 |
8 |
9 |
A |
B |
C |
D |
E |
F |
真值表 |
0x80 |
0x90 |
0x88 |
0x83 |
0xC6 |
0xA1 |
0x86 |
0x8E |
大家可以把上边那个数码管显示1的那个程序中的P0的赋值随便修改成我们表5-1中的真值表里的数字试试看,把数码管显示的数字显示出来。
3、数码管的静态显示
从第三课我们学习74HC138以后,我们了解到74HC138同时一次只能让一个输出口为低电平,也就是在一个时刻内,我们只能让一个数码管显示,始终选通数码管并且可以根据我们的P0总线的信号来改变这个数码管的值,我们可以理解为数码管的静态显示。
数码管静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,多个数码管,静态显示实现的意义就没有了。这节课我们先用一个数码管的静态显示来实现一个简单的秒表,为下节课的动态显示打下基础。
先来介绍一个51单片机的关键字code。我们前边课程定义变量的时候,一般用到unsigned char或者unsigned int这两个关键字,这样定义的变量都是放在我们的单片机的RAM中,我们在程序中可以随意去改变这个变量的值。但是还有一种常数,我们在程序中要使用,但是却不进行对这个值的改变,这种值我们可以加一个code关键字修饰一下,修饰完毕后,这个值就会存储到我们的程序空间flash中,这样可以大大节省我们单片机的RAM的使用量,毕竟我们的RAM空间比较小,而程序空间是很大的。比如我们现在要使用的数码管真值表,我们来看一下我们下边的这个程序。
#include //包含寄存器的库文件
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e
}; //用数组来存储数码管真值表,下一课详细介绍数组
void main()
{
unsigned char counter = 0;
unsigned char j = 0;
ENLED = 0; ADDR0 = 0; ADDR1 = 0;
ADDR2 = 0; ADDR3 = 1; P0 = 0XFF; //74HC138和P0初始化部分
TMOD = 0x01; //设置定时器0为模式1
TH0 = 0xB8;
TL0 = 0x00; //定时值初值
TR0 = 1; //打开定时器0
while(1)
{
if(1 == TF0) //判断定时器0是否溢出
{
TF0 = 0;
TH0 = 0xB8; //溢出后,重新赋值
TL0 = 0x00;
counter++;
if(50 == counter) //判断定时器0溢出是否达到50次
{
counter = 0; //counter清0,重新计数
P0 = LedChar[j++]; //把数组里的对应值送给P0
if(16 == j) //当显示到F后,归0重新开始
{
j = 0;
}
}
}
}
}
文章来源于网络,版权归原作者
觉得不错,请点个赞