当前位置: 首页 > article >正文

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.kler.cn/a/381457.html

相关文章:

  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day9
  • 软考-软件设计师-简答(5)-面向对象分析与设计-Java语言-设计模式-知识点、题型、技巧、历年真题解析
  • 【深度学习基础】常用图像卷积核类型
  • RabbitMQ交换机类型
  • qt QMenuBar详解
  • HarmonyOS Next星河版笔记--界面开发(3)
  • 云轴科技ZStack 联合 OpenCloudOS 完成技术兼容互认证
  • 目标检测YOLO实战应用案例100讲-基于深度学习的人眼视线检测
  • 【云原生开发】如何通过client-go来操作K8S集群
  • 排序算法详细总结
  • 导师双选系统开发新解:Spring Boot技术
  • 练手之基于python的新闻爬虫
  • github.com port 22
  • 基于TRIZ理论的便携式光伏手机充电装置创新
  • 《Linux系统编程篇》消息队列(Linux 进程间通信(IPC))——基础篇
  • docker配置与基础操作
  • Go语言组合和转发
  • 通过自然语言表达你的想法。GitHub Spark让任何人都能使用人工智能,为自己创建软件...
  • Spring Boot环境下的导师双选流程优化
  • 鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)
  • Xfce桌面设置右键菜单:用右键打开VSCode
  • ABAP Git PULL 出错:DDIF_TABLE_PUT
  • Linux基础1
  • Spring-Day5
  • 什么是软件设计模式, 它们⽤于解决什么问题, 它们为什么有效
  • Redis到底支不支持事务?半事务