IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 二、数码管显示原理及应用实现 -> 正文阅读

[嵌入式]二、数码管显示原理及应用实现

数码管显示原理及应用实现

视频链接
对应课程:P11-P12

数码管显示原理

  1. 我们先看一下一个数码管是如何亮起来的。数码管内部电路如图所示:

    image-20221027143142574

    为了封装统一,生产商为单位数码管都封装了10个引脚,其中第3个和第8个引脚是连接在一起的。显示一个8字需要七个小段,另外还有一个小数点,所以其内部共有8个小的发光二极管,最后还有一个公共端。

    公共端可分为共阳极和共阴极,其内部原理图如图所示:

    image-20221027144528501

    对于共阴极数码而言,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称为”共阴“,它们的阳极是独立的。当我们给数码管的任一个阳极加上一个高电平时,对应的发光二极管就点亮了。

    例如如果想让数码管显示”0“,只需要让”g“"dp"引脚送入低电平,而其余引脚全部输入高电平。

    共阳极数码同理,其8个发光二极管的阳极在数码管内部全部连接在一起,所以称为”共阳“,它们的阴极是独立的。当我们给数码管的任一个阴极加上一个低电平时,对应的发光二极管就点亮了。

    数码管内部发光二极管要想点亮,需要5mA以上的电流,但电流也不可过大,否则会烧毁发光二极管。由于单片机的I/O口送不出如此大的电流,所以数码管与单片机连接时需要加上驱动电路。

  2. 多位一体数码管

    以四位一体的数码管为例,其内部原理图如图所示:

    image-20221027145804875

    它们内部的公共端是独立的,而负责显示什么数字的段线全部是连接在一起的,独立的公共端可以控制多位一体中的哪一位数码管点亮,而连接在一起的段线可知控制这个能点亮数码管亮什么数字。

    通常我们把公共端叫做位选线

    连接在一起的段线叫做段选线

    有了这两个线,通过单片机及外部电路就可以控制任意的数码管显示任意的数字了。

数码管静态显示

先来看巫妖王V2版数码管原理图:

image-20221027154500301

本实验板使用的数码管为共阴极,COM为公共端,若想让LED6亮,则赋LED6为0其余为1,此为”选中“,若想LED6显示1,则要给阳码:0110 0000 (1是亮 0是灭)

  • 74LS138(38译码器)

    LED1—LED8连接38译码器的输出端,即通过38译码器可实现P22、P23、P24这三个I/O口来控制LED1—LED8的输出。

  • 74HC573(锁存器)

    OE(使能端,低电平有效)

    LE连接VCC(跳帽连接)

    这样锁存器的输入端连接单片机的P0口,实现D0-D7的数据原封不动的送入Q0-Q7.

代码

先介绍C51数组

  • 数组:把相同类型的一系列数据统一编制到某一个组别中,可以通过数组名+索引号简单快捷的操作大量数据

  • 定义和引用:

    int x[3];	//定义一组变量(3个)
    int x[]={1,2,3};//定义一组变量并初始化
    
    x[0] 		//引用数组的第0个变量
    x[1] 		//引用数组的第1个变量
    x[2]		//引用数组的第2个变量
    引用x[3]时,数组越界,读出的数值不确定,应避免这种操作
    
  • Switch语句

    switch(变量)
    {
    	case 常量1:语句体1break;
    	case 常量2:语句体2break;
    	case 常量3:语句体3break;
    	case 常量4:语句体4break;
    	...
    	default:语句体x;break;
    }
    

    将变量与case后的各个常量对比,若有相等,则执行相应的语句体。若没有一个相等,则执行default后的语句体(default可以不写)

完整代码如下:

#include <REGX52.H>    //和#include <REG52.H>的区别

//段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出,通过38译码器进而实现数码管的选中
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出          
}												
                                                
void main()
{
	while(1)
	{
		Nixie(3,0); //在第3个数码管位置显示0
	}
}	
/*
当P0等于0x3f,换算成2进制为 0011 1111
P0.0是低位,P0.7是高位,则P0.0-P0.7:1111 1100
由于是共阴极连接,1是亮,0是灭,则g,dp不亮,其余亮,显示为数字0
*/

数码管动态显示

数码管驱动方式通常有两种:

  • 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间

  • 专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可

数码管动态扫描,其实是轮流向各个数码管送出字形码和相应的位选,利用发光管的余晖和人眼视觉暂留作用,使得人的感觉好像数码管同时都在显示,实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼无法分辨出来。

#include <REGX52.H>    //和#include <REG52.H>的区别

//段位表(共阴极数码管编码,对于的符号为0,1,2,3,4,5,7,8,9)
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延时子函数
void Delay1ms(unsigned int xms)		//@12.000MHz
{
	while(xms--)
	{
		unsigned char i, j;
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}	
}
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出,通过38译码器进而实现数码管的选中
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出 
	Delay1ms(1);    //
	P0=0x00;        //消影
}												
                                                
void main()
{
	while(1)
	{
		Nixie(1,0); //八个数码管依次显示为01234567
		Nixie(2,1); 
		Nixie(3,2); 
		Nixie(4,3); 
		Nixie(5,4);
		Nixie(6,5);
		Nixie(7,6); 
		Nixie(8,7); 
	}
}  


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:14:20  更:2022-10-31 12:19:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:49:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码