51单片机教程(八)- 数码管的静态显示

news/2024/11/6 5:08:19 标签: 51单片机, 嵌入式硬件, 单片机

1、项目分析

  • 使用数码管显示指定的字符、数字和符号。

2、技术准备

1、显示器及其接口

  • 单片机系统中常用的显示器有:
    • 发光二极管LED(Light Emitting Diode)显示器、液晶LCD(Liquid Crystal Display)显示器、CRT显示器等。
    • LED、LCD显示器有两种显示结构:
      • 段显示(7段、米字型等)
      • 点阵显示(5×8、8×8点阵等)

2、数码管实物

  • 数码管是一种半导体发光器件,其基本单元是发光二极管。



3、数码管特点

  • 可显示内容

    • 数字、小数点(0-9)和部分英文字符(A、C、E、F、L)、符号(.)。
  • 特点:

    1. 自发光、亮度高,特别适合环境亮度低的场合使用。

    2. 牢固,不怕冲击。


4、数码管结构与原理

  1. 数码管结构

    • LED显示器(数码管)系发光器件的一种。常用的LED发光器件有两类:数码管和点阵。
    • 数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。根据内部发光二极管的接线形式可分为共阴极和共阳极两种。
    • 使用时,共阴极数码管公共端接地,共阳极数码管公共端接电源。每段发光二极管需5~10mA的驱动电流才能正常发光,一般需加限流电阻控制电流的大小。
  2. 数码管原理

    • LED数码管的a~g七个发光二极管。加正电压的发光,加零电压的不能发光,不同亮暗的组合就能形成不同的字型,这种组合称为字型码。共阳极和共阴极的字型码是不同的。

      在这里插入图片描述


5、数码管驱动电路

  • 要驱动1个四位数码管常见的有以下几种数码管驱动电路(本电路是使用:共阴极数码管):

    1. 使用12个IO口
    2. P2.4-P2.7驱动位选,IO口直接驱动位选
    3. P0驱动段选,IO口直接驱动段选

    在这里插入图片描述


6、数码管显示分析

  • LED数码管的结构:共阳与共阴

    在这里插入图片描述

  • 显示设置

    • 设置位选,设置 P2.4 - P2.7 对应位为高电平,即可选择第1 ~ 4 位数码管工作
    • 设置段选:设置 P0.0 - P0.7 对应位为高电平,即可控制显示的字符、数字内容

3、项目实施

实验1 第1位数码管显示字符:b

/************************************
*实验名:数码管静态显示
*实验效果:第一个数码管显示字符“b”
************************************/
  • 分析

    在这里插入图片描述

方式1:单独设置

```c
#include <reg52.h>

#define par P0

sbit pos1 = P2^4;
sbit pos2 = P2^5;
sbit pos3 = P2^6;
sbit pos4 = P2^7;

void main()
{
	pos1 = 1;
	pos2 = 0;
	pos3 = 0;
	pos4 = 0;
	par = 0x7C;
	while (1);
}
```

方式2:整体设置

```c
#include <reg52.h>

#define par P0
#define pos P2 

void main()
{
	pos = 0x18;
	par = 0x7C;
	while (1);
}
```

实验2 4位数码管显示数值:12.34

  • 实验需求

    • 让四位数码管显示 12.34
  • 实验分析:

    • 第1位数码管显示 1,第2位数码管显示 2. ,第3位数码管显示 3,第4位数码管显示 4

      | 字符 |  h   |  g   |  f   |  e   |  d   |  c   |  b   |  a   | 十六进制 |
| :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :------: |
|  1   |  0   |  0   |  0   |  0   |  0   |  1   |  1   |  0   |   0x06   |
|  2.  |  1   |  1   |  0   |  1   |  1   |  0   |  1   |  1   |   0xdb   |
|  3   |  0   |  1   |  0   |  0   |  1   |  1   |  1   |  1   |   0x4f   |
|  4   |  0   |  1   |  1   |  0   |  0   |  1   |  1   |  0   |   0x66   |

方式1:逐位设置

  #include <reg52.h>
  
  void delay(unsigned int t);
  
  void main3()
  {
  	while(1)
  	{
  		//  第1个数码管显示:1
  		P2 = 0x18;
  		P0 = 0x06;
  		delay(100);
  		
  		//	第2个数码管显示:2.
  		P2 = 0x28;
  		P0 = 0xdb;
  		delay(100);
  		
  		//	第3个数码管显示:3
  		P2 = 0x48;
  		P0 = 0x4f;
  		delay(100);
  		
  		//	第4个数码管显示:4
  		P2 = 0x88;
  		P0 = 0x66;
  		delay(100);
  	}
  }
  
  // 延迟函数
  void delay(unsigned int t)
  {
  	while(t--);
  }

方式2:遍历数组设置

```c
#include <reg52.h>

// 定义位选:P2 表示设置数码管的位数
#define wei P2

// 定义段选:P0 表示设置要显示的内容
#define duan P0

// 定义数组:分别存储位选或段选的值
unsigned int wValue[] = {0x18,0x28,0x48,0x88};
unsigned int dValue[] = {0x06,0xdb,0x4f,0x66};

void delays(unsigned int i);

void main()
{	
	unsigned int idx;
	while(1)
	{
		for(idx =0; idx<4; idx++){
			// 第idx位显示
			P2 = wValue[idx];
			P0 = dValue[idx];
			delays(50);
		}
	}
}

void delays(unsigned int i)
{
	while(--i);
}
```

方式3:左移+数组遍历

```c
#include <reg52.h>

void delays(unsigned int t);

unsigned int dValue[] = {0x06, 0xdb, 0x4f, 0x66};

void main()
{
	unsigned int idx;
	while(1)
	{
		for(idx=0; idx<4; idx++)
		{
			//  第idx个数码管显示:1 2. 3 4
			P2 = 0x10 << idx | 0x08;
			P0 = dValue[idx];
			delays(100);
		}
	}
}

// 延迟函数
void delays(unsigned int t)
{
	while(t--);
}

```
  • 说明
    • 在位选切换时,需要增加扫描延时,延迟时间太长会闪烁,太短则会造成重影。

实验3 选择对应的位显示内容

  • 需求

    • 选择指定的位显示指定的内容
  • 分析

    在这里插入图片描述

  • 实现

      #include <reg52.h>
      
      #define uint unsigned int
      
      // 定义位选:P2 表示设置数码管的位数
      #define pos P2
      
      // 定义段选:P0 表示设置要显示的内容
      #define par P0
      
      // 定义显示字符:0-9 C D E F L
      uint parValue[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x39, 0x79, 0x71};
      
      // 函数声明
      void delay_s(unsigned int i);
      void smgShow(uint postion, uint letter);
      
      void main()
      {
      	uint idx;
      	while(1)
      	{
      		// 函数测试
      		for(idx=1; idx<17; idx++){
      			smgShow(4, idx);
      			delay_s(90000);
      		}
      	}
      }
      
      /**
       * 指定对应位的数码管显示对应的内容
       *
       * @param postion 第几位数码管
       * @param letter 要显示的字符内容
       *
       * @return 无
       */
      void smgShow(uint postion, uint letter)
      {
      	if((postion > 0 && postion < 5) && (letter > 0 && letter < 14))
      	{
      		switch(postion){
      			case 1:
      				pos = 0x18;
      			  par = parValue[letter-1];
      			  break;
      			case 2:
      				pos = 0x28;
      			  par = parValue[letter-1];
      			  break;
      			case 3:
      				pos = 0x48;
      			  par = parValue[letter-1];
      			  break;
      			case 4:
      				pos = 0x88;
      			  par = parValue[letter-1];
      			  break;
      		}
      	}
      }
      
      
      /**
       * 延迟函数:让CPU重复执行从指定的值一直减到0
       *
       * @param i 初值
       *
       * @return 无
       */
      void delay_s(uint i)
      {
      	while(--i);
      }
    

http://www.niftyadmin.cn/n/5740212.html

相关文章

网络技术----wireshark抓包出现1500以上的大包原因分析

网络技术----wireshark抓包出现1500以上的大包原因分析 背景描述原因分析TSO&#xff08;TCP segment offload&#xff0c;TSO&#xff09;linux中关闭/开启TSO功能&#xff1a;其他类似TSO的机制 wireshark抓包来源 背景描述 我们在使用抓包工具的过程中&#xff0c;经常发现…

基于MATLAB的农业病虫害识别研究

1 背景介绍 病虫害一直是限制农业生产过程中农业和副产品的高质量和高产量的最重要因素。然而&#xff0c;在识别中国的病虫害时&#xff0c;无论是用肉眼识别的传统方法还是后来专家的系统判断&#xff0c;这些病虫害的特征一般都是主观因素。主观意图非常大&#xff0c;效率…

pdf添加目录标签python(手动配置)

先安装对应的库: pip install pypdf 代码分为两个部分,一部分是config.py,代码如下: offset=10 catgorys=[("第一章",12),("第二章",45), ] 需要自己手动更改offset,和目录列表 下面是主要代码: import pypdf # import sys from config import…

Intellij IDE报错:[Information:java:javacTask:源发行版8需要目标发行版1.8]

Intellij IDE报错:[Information:java:javacTask:源发行版8需要目标发行版1.8] 处理方法 File->Settings->Build,execution,Deployment->Compiler->Java Compiler 进入该目录下&#xff0c;修改Per-module bytecode version&#xff0c;将该项目修改为8 合理的创…

java mapper 的 xml讲解

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.bnc.s12.mapper.GoodaCateDT…

W55RP20芯片介绍

目录 概述 引脚映射 特征 资料 文件 相关 EVB-Pico 概述 我们最新的 ioNIC 将串行接口与以太网连接集成在一起&#xff0c;为您提供量身定制的网络解决方案。通过支持各种网络协议、增强的 SSL 安全功能和云 SDK&#xff0c;体验行业特定应用程序的优化性能&#xff01; …

Android Studio 中关于com.github.barteksc:android-pdf-viewer 无法正确加载的问题

Android Studio 的app 模块下&#xff0c;添加依赖&#xff1a; implementation com.github.barteksc:android-pdf-viewer:3.2.0-beta.1 运行程序报错&#xff1a; Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveEx…

使用Python和Vosk库实现语音识别

使用Python和Vosk库实现语音识别 在人工智能和机器学习领域&#xff0c;语音识别技术正变得越来越重要。Python作为一种强大的编程语言&#xff0c;拥有丰富的库和框架&#xff0c;可以方便地实现语音识别功能。今天&#xff0c;我们将介绍如何使用Python中的SpeechRecognitio…