51单片机-1(数码管)

数码管

1.介绍

单片机系统中常用的显示器有:发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、TFT液晶显示器等。LED显示器有两种显示结构:段显示(7段、米字型等)和点阵显示(5×8、8×8点阵等)。
LED数码管根据LED的不同接法可以分为2类:共阴共阳
在这里插入图片描述
使用LED显示器时,要注意区分这两种不同的接法。为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。因此为LED显示器提供的编码正好是一个字节。根据电路连接图显示16进制数的编码已列在下表。
在这里插入图片描述

2.数码管静态显示原理

LED显示器工作方式有两种:静态显示方式和动态显示方式。

2.1静态显示的特点

每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用CPU时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高。

2.2编程实现

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;

u8 code smgduanC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共阴
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//加code将数据存到ROM
u8 code smgduanO[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,//共阳
					0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void main(){
	P0 = smgduanO[0];//共阳数码管低电平点亮
	while(1){
	}
}

3.数码管动态显示原理

动态显示的特点是将所有数码管的段选线并联在一起,由位选线(公共端)控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

4. 74HC245

4.1 主要特性

  • 采用 CMOS 工艺
  • 宽电压工作范围:3.OV—5.OV
  • 双向三态输出
  • 八线双向收发器
  • 封装形式:SOP20、SOP20-2、TSSOP20.DIP20

4.2 管脚定义说明

在这里插入图片描述
管脚功能

符号管脚名称管教号说明
A0~a7数据输入/输出2~9
B0~B7数据输入/输出18~11
~OE使能输出19
DIR传输方向控制1DIR , A --> B ; B --> A
GND逻辑地20逻辑地
VDD逻辑电源10电源端

4.3 功能真值表

输出使能输出控制工作状态
~OEDIR
LLBn 输入An输出
LHAn输入Bn 输出
HX高阻态

5.译码器D74HC138

5.1 概述

概述 D74HC138D 是一种三通道输入、八通道输出译码器,主要应用于消费类电子产品。

5.2 特性

在这里插入图片描述
引脚功能
在这里插入图片描述

5.3 功能真值表

在这里插入图片描述
A0/A1/A2三个输入不同的组合控制不同的输出位

6.动态数码管编程实现过程

在这里插入图片描述
在这里插入图片描述
段选控制引脚:138译码器(A/B/C)
位选控制引脚:74HC245(A0~A7)

代码实现

#include "reg52.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;//定义译码器位选输入控制引脚
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduanC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,//共阴
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//加code将数据存到ROM
u8 code smgduanO[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,//共阳
					0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
					
void delay10us(u16 i){
	while(i--);
}

void DigDisplay(){
	u8 i;
	for(i=0;i<8;i++){
		switch(i){
			case 0: LSA= 0;LSB = 0;LSC = 0;break;//点亮第一个数码管,000
			case 1: LSA= 1;LSB = 0;LSC = 0;break;//点亮第二个数码管,001
			case 2: LSA= 0;LSB = 1;LSC = 0;break;//点亮第三个数码管,010
			case 3: LSA= 1;LSB = 1;LSC = 0;break;
			case 4: LSA= 0;LSB = 0;LSC = 1;break;
			case 5: LSA= 1;LSB = 0;LSC = 1;break;
			case 6: LSA= 0;LSB = 1;LSC = 1;break;
			case 7: LSA= 1;LSB = 1;LSC = 1;break;
		}//结束switch后位选完成,也就是确定了点亮哪个数码管
		P0 = smgduanC[i];
		delay10us(100);//延时1毫秒,时间长短影响视觉暂留效果,不恰当的时间会有闪烁
		P0 = 0x00;//消隐
	}//所有执行完后,相当于从数字0开始到7依次显示在8个数码管上
}

void main(){
	while(1){
		DigDisplay();
	}
}
  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值