51单片机数码管静态显示

电子说

1.3w人已加入

描述

数码管静态显示其实在实际应用中很少,除非项目中就只用到了一位数码管显示,否则的话静态显示非常占用IO口。但是,静态显示又是动态显示的基础,所以,在这里我打算跟大家分享一下,数码管静态显示的工作原理和编程方法。

一、电路原理图

51单片机

备注:这是一个6位数码管的电路,在本项目中我们只用到其中的一个,电路中74LS04电路在这里主要是用作驱动芯片,用于提高单片机IO口的驱动能力。

二、相关知识

1、数码管的结构

51单片机51单片机

数码管内部结构其实就是由8颗LED按照8自形排列组成,而根据结构的不同,数码管可分为共阳极数码管和共阴极数码管,其中把所有LED的阴极连接到一起做引出端的成为共阴极数码管,其中把所有LED的阳极连接到一起做引出端的成为共阳极数码管。

2、取码方式

数码管的使用过程中,我们通过点亮数码管的不同笔段组合,来达到显示不同数字的效果,这就是取码,段码一般按照16进制书写。而共阴极数码管和共阳极数码管的的段码也不一样。

(1)共阴极数码管的取码方式

“0”的段码:取码时a为对应地位,h对应高位

51单片机

“1”的段码:取码时a为对应地位,h对应高位

51单片机

根据这种方式我们可以总结得出,共阴极数码管的段码表

0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07
0 1 2 3 4 5 6 7
0x7f 0x6f 0x77 0x7c 0x39 0x5e 0x79 0x71
8 9 A B C D E F

如果将段码表使用c语言数组的方式书写则为:

unsigned char table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~f

(2)共阳极数码管的取码方式

“0”的段码:取码时a为对应地位,h对应高位

51单片机

“1”的段码:取码时a为对应地位,h对应高位

51单片机

根据这种方式我们可以总结得出,共阳极数码管的段码表

0xc0  0xf9  0xa4 0xb0 0x99 0x92 0x82 0xf8
0 1 2 3 4 5 6 7
0x80 0x90 0x88 0x83 0xc6 0xa1 0x86 0x8e
8 9 A B C D E F

如果将段码表使用c语言数组的方式书写则为:

unsigned char table[]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//0~f

3、数显方式

如果我们想要在数码管上显示数字,只需要把相应的段码送到IO口,即可让数码管显示。

三、例程

 

​#include<  reg52.h  >

#define uint unsigned int
#define uchar unsigned char

sbit LED1=P2^0;

uchar table_K[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极数码管段码表

/*-------微秒延时--------*/
void delay_us(uint z)
{
	uint x;
	for(x=z;x  >0;x--);
}
/*--------毫秒延时--------*/
void delay_ms(uint z)
{
  uint x,y;
	for(x=z;x  >0;x--)
	   for(y=110;y  >0;y--); 
}

/*----------主函数-----------*/
void main()
{
	uchar i=1;
	P0=0x00;P1=0xff;P2=0x00;P3=0x00;  //IO口状态初始化
	while(1)
	{
    LED1=1;
		for(i=0;i<  16;i++)  //循环16次 i从0~15
		{
			P0=table_K[i]; //把0~f的段码一次送到P0口
			delay_ms(1000);//等待1秒
		}
  }
}

 

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分