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

C51单片机使用3-数码管显示

目录

一、硬件介绍

1、原理

2、多位数码管驱动

二、数码管显示控制

1、静态显示

(1)单个数码管

(2)多个数码管显示

(3)显示数字使用编码方式

2、动态显示

(1)原理

(2)代码实现

(3)测试

工程下载链接


一、硬件介绍

1、原理

数码管有单位数码管、双位数码管和其它多位数码管。如下图所示

单个的数码管共10个引脚,显示不同的数字需要7个引脚,小数点占用1个引脚,公共端占用1个,厂家为了生产方便同意10个引脚,3和8引脚都是公共端。根据公共端接线不同分共阴和共阳。单个的数码管的原理如下

比如:

显示数字“8”,则需要点亮a、b、c、d、e、f、g引脚

显示数字“5”,则需要点亮a、c、d、f、g引脚

2、多位数码管驱动

当多位数码管应用于某一系统时,他们的“位选”是可独立控制的,而“段选“是连接在一起的,通过”位选“信号控制哪几个数码管亮。而在同一时刻,位选选通的所有数码管上显示的数字都是一样的(因为他们8段数码都连在一起的),这种显示方式叫静态显示

位和段分别用两个74HC573驱动和控制,P0同时使用上拉电阻。单片机可以控制锁存器的锁存端,进而控制锁存器的数据输出。当锁存使能低电平时11引脚)为高电平时,锁存器输出数据随输入数据变化而变化。当锁存器使能端(11引脚)为高电平时,输出数据为之前状态数据,输出数据不随输入变化。

 六位的数码管显示电气原理图

二、数码管显示控制

数码管采用共阴极方式,即程序中给数码管3和8公共引脚低电平,再给其它段码高电平则段码点亮。

1、静态显示

(1)单个数码管

任务:在左边第二个数码管上显示数字8

位选:

对于要启用的对应数码管,该位为低电平即0。不用的即1。从左往右依次为数码管1-数码管6。没有数码管7和数码管8,则这两个位都写1。

如,对于只启用第二个数码管,则六个数码管的值分别如下:

数码管1:1

数码管2:0

数码管3:1

数码管4:1

数码管5:1

数码管6:1

预留位7:1

预留位8:1

1111 1101即0xFD

段选:

需要点亮的段为1,不点亮的则是0

如,显示数字8,即

a=1

b=1

c=1

d=1

e=1

f=1

g=1

dp=0(小数点)

二进制表示就是0111 1111,16进制表示为0x7F

代码

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char


unsigned char m,n;
sbit dula=P2^6;					//段选锁存器-使能控制
sbit wela=P2^7;					//位选锁存器-使能控制


void Delay_ms(uint xms)
{
	uint i,j;	
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

void main()
{
	wela=1;						//位选锁存器使能
	//P0=0xFE;					//1111 1110 :启用第一个数码管-左边第一个
	P0=0xFD;					//1111 1101 :启用第二个数码管-左边第二个
	wela=0;

	dula=1;						//段选锁存器使能
	P0=0X7F;					//0111 1111	:显示数字8				
	dula=0;
  	while(1)
  	{
	
   	}
}

实验结果

(2)多个数码管显示

显示6个数码管的话,即将位选的6个数码管都置为0,即1100 0000、16进制为0xC0。即可将六个全部都显示。

显示其它个数数码管同样原理即可。

(3)显示数字使用编码方式

任务:从0到F间隔0.5秒依次显示

数码管编码

根据该原理图,将0-F字符如下表格进行编码。

 共阴极数码管编码

注意:

①本原理图数码管为共阴极显示,共阳极数码管编码就不一样了

②如果需要点亮小数点,则需要对表格重新编码。

定义数组

uchar code table[]=
{
	//0-9   A-F,共阴极数码管显示编码
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
};

代码

 #include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char


sbit dula=P2^6;					//段选锁存器-使能控制
sbit wela=P2^7;					//位选锁存器-使能控制
uchar num;

uchar code table[]=
{
	//0-9   A-F,共阴极数码管显示编码
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
};


void Delay_ms(uint xms)
{
	uint i,j;	
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

void main()
{
	wela=1;						//位选锁存器使能
	//P0=0xFE;					//1111 1110 :启用第一个数码管-左边第一个
	//P0=0xFD;					//1111 1101 :启用第二个数码管-左边第二个
	P0=0xC0;					//1100 0000
	wela=0;

	
	P0=0X7F;					//0111 1111	:显示数字8				

  	while(1)
  	{
		for(num=0;num<16;num++)
		{
			dula=1;						//段选锁存器使能
			P0=table[num];
			dula=0;						//段选锁存器去使能
			Delay_ms(500);				//500毫秒延时
		}
	
   	}
}

2、动态显示

(1)原理

数码管动态显示又叫数码管的动态扫描显示。通俗的说就是先在第一个数码管显示一个数字然后关闭再在在很短的时间延迟后在第二个数码管上显示数字再关闭,再延迟一段时间再在第三个数码管上显示数字,依次类推。

这个延迟时间要设置的非常小,测试的时候从500毫秒到10毫秒内,现象为轮流点亮6个数码管数码管到数码管一起变得闪烁显示数字。最后设置1毫秒延时,因为视觉暂留效应,人的眼睛是看不出来的,所以看起来像是静态显示的一样。

(2)代码实现

#include <reg51.h>
#include <intrins.h>
 
#define uint unsigned int
#define uchar unsigned char
 
 
sbit dula=P2^6;					//段选锁存器-使能控制
sbit wela=P2^7;					//位选锁存器-使能控制
uchar num;
uchar index;
 
uchar code table[]=
{
	//0-9   A-F,共阴极数码管显示编码
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
};
 
 
void Delay_ms(uint xms)
{
	uint i,j;	
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}
 
void main()
{

	uint delayTime=1;			//延时时间-毫秒
	while(1)
	{
		//第一个数码管显示
		num=1;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;				//消影功能-将所有数码管段都置高电平,都熄灭,就不会有亮点带到下一位数码管上了

		wela=1;
		P0=0xfe;
		wela=0;
		Delay_ms(delayTime);			

		//第二个数码管显示
		num=2;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;

		wela=1;
		P0=0xfd;					//1111 1101
		wela=0;
		Delay_ms(delayTime);

		//第三个数码管显示
		num=3;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;

		wela=1;
		P0=0xfb;					//1111 1011
		wela=0;
		Delay_ms(delayTime);

		//第四个数码管显示
		num=4;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;

		wela=1;
		P0=0xf7;					//1111 0111
		wela=0;
		Delay_ms(delayTime);

		//第五个数码管显示
		num=5;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;

		wela=1;
		P0=0xef;					//1110 1111
		wela=0;
		Delay_ms(delayTime);

		//第六个数码管显示
		num=6;
		dula=1;
		P0=table[num];
		dula=0;
		P0=0xFF;

		wela=1;
		P0=0xdf;					//1101 1111
		wela=0;
		Delay_ms(delayTime);
	}



}

(3)测试

分别设置delayTime不同的值,依次编译生成HEX文件下载。

500毫秒运行效果:

uint delayTime=500;

100毫秒运行效果:

uint delayTime=100;

20毫秒运行效果:

uint delayTime=20;

5毫秒运行效果:

uint delayTime=5;

1毫秒运行效果:

uint delayTime=1;


工程下载链接



https://download.csdn.net/download/panjinliang066333/86504920

相关文章:

  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[27]以太坊-反思
  • Swin Transformer网络模型
  • Spring——Spring基础介绍
  • C语言入门(七)while和do-while循环
  • 猿创征文|算法刷题——哈希
  • 基于阿里云 Serverless 快速部署 function 的极致体验
  • docker 如何查看运行中的容器
  • 数学建模十大算法02—插值与拟合(拉格朗日插值、三次样条插值、线性最小二乘法……)
  • 嵌入式Linux入门-异常与中断(流程+寄存器全解析)
  • java计算机毕业设计-体育新闻网站-源码+系统+数据库+lw文档+mybatis+运行部署
  • 基于QT的opencv照片美颜及背景更换
  • [车联网安全自学篇] Android安全之检测APK中异常处理代码是否暴露敏感信息
  • Java基础语法
  • 谷粒商城 renren-fast pom文件报红
  • A40I工控主板(SBC-X40I)LVDS显示屏测试
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • HashMap剖析之内部结构
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript设计模式之工厂模式
  • KMP算法及优化
  • Median of Two Sorted Arrays
  • MySQL QA
  • PaddlePaddle-GitHub的正确打开姿势
  • springMvc学习笔记(2)
  • Vue--数据传输
  • 机器学习 vs. 深度学习
  • 如何优雅地使用 Sublime Text
  • 使用Swoole加速Laravel(正式环境中)
  • 通过几道题目学习二叉搜索树
  • 微信小程序:实现悬浮返回和分享按钮
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一天一个设计模式之JS实现——适配器模式
  • # Maven错误Error executing Maven
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #NOIP 2014# day.1 T2 联合权值
  • (C语言)球球大作战
  • (python)数据结构---字典
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (三)mysql_MYSQL(三)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET正则基础之——正则委托
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • ?.的用法
  • [1127]图形打印 sdutOJ
  • [AIGC 大数据基础]hive浅谈
  • [AX]AX2012 SSRS报表Drill through action
  • [ESP32] 编码旋钮驱动
  • [HEOI2013]ALO
  • [Linux] LVS+Keepalived高可用集群部署
  • [LitCTF 2023]Http pro max plus