定时器与数码管之数码管

数码管的基本介绍

数码管共有 a、b、c、d、e、f、g、dp 八段,每一段都是一个LED灯,所以一个数码管是由8个LED灯组成的

数码管分为共阳极和共阴极两种。

共阴极就是8个LED灯的阴极连接在一起,阴极是公共端,由阳极来控制单个小灯的亮灭

共阳极就是8个LED灯的阳极连接在一起,阳极是公共端,由阴极来控制单个小灯的亮灭

以上是板子的数码管电路图

板子上的数码管都是共阳极数码管,数码管的阳极都接在了com端上

数码管的真值表

以DS6数码管为例分析:

控制DS6的是三极管Q7,需要LEDS5为低电平,三极管Q7才可以道通

ENLED为低电平,ADDR3为高电平,74HC138才能使能

ADDR2为高电平,ADDR1为低电平,ADDR0为高电平时,LEDS5为低电平,此时Q7导通

 

b、c段LED亮灯时,数码管将显示1,即P0 = 0xF9时,数码管显示1


#include<reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

void main(void)
{
	//74HC138使能
	ENLED = 0;
	ADDR0 = 1;


	//Q7导通
	ADDR2 = 1;
	ADDR1 = 0;
	ADDR0 = 1;

	P0 = 0xF9;//数码管b、c段亮,即显示1

	while(1)
		;
}

按此方法依次得出数码管的真值表:

数码管真值表1
字符 0 1 2 3 4 5 6 7
数值 0xC0 0xF9 0xA4 0xB0 0x99 0x92 0x82 0xF8
数码管真值表2
字符 8 9 A b C d E F
数值 0x80 0x90 0x88 0x83 0xC6 0xA1 0x86 0x8E

数码管的静态显示

数码管的静态显示:74HC138同一时刻只能让一个输出口为低电平,也就是说在一个时刻内,只能使能一个数码管,并根据给出的P0的值来改变这个数码管的显示字符

数码管的静态显示是对应动态显示而言的,静态显示对于一两个数码管还行,对于多个数码管,静态显示就没有意义了

code:51单片机的关键字

unsigned char 定义的变量放在单片机的ARM中,在程序中可以随意改变这些变量的值

在程序中要使用,却不会改变值,定义这种数据时可以加上一个code关键字修饰一下,这个数据就会存储到程序空间Flash中,这样子就可以大大减少单片机的RAM的使用量

 


#include<reg52.h>

sbit ADDR0 = P1 ^ 0;
sbit ADDR1 = P1 ^ 1;
sbit ADDR2 = P1 ^ 2;
sbit ADDR3 = P1 ^ 3;
sbit ENLED = P1 ^ 4;

unsigned char code LedChar[16] = 
{ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void main(void)
{
	unsigned cnt;//溢出次数
	int i;

	//74HC138使能
	ENLED = 0;
	ADDR0 = 1;

	//Q7导通
	ADDR2 = 1;
	ADDR1 = 0;
	ADDR0 = 1;

	TMOD = 1;//To设置为模式0

	//设置T0初始值
	TH0 = 0xB4;
	TL0 = 0x00;

	TR0 = 1;//启动T0
    cnt = 0;
	i = 0;

	while(1)
	{
		if (1 == TF0)//溢出
		{
			//设置T0初始值
			TF0 = 0;
			TH0 = 0xB4;
			TL0 = 0x00;

			cnt++;

			//溢出1s
			if (cnt >= 20)
			{
				cnt = 0;

				if (16 == i)
					i = 0;

				P0 = LedChar[i];
				i++;
			}
		}
	}
}

数码管将从0显示到F,间隔1s,重复显示