动态数码管显示实验

文章目录

    • 摘要
    • 实验器件简介
    • 实验原理
    • 硬件电路图
    • 硬件电路连线
    • 实验代码
    • 实验结果
    • 思考以及注意事项
    • 实验视频教程
    • 资源分享

摘要

本实验采用了普中科技的51单片机开发板
本实验以静态数码管显示实验为基础
https://blog.csdn.net/weixin_41995541/article/details/89392804
通过动态扫描方式静态显示八个数据

实验器件简介

  • 74HC573
    • 八进制三态非反转透明锁存器
    • 功能表
      动态数码管显示实验_第1张图片
  • 74HC138
    • 三通道输入、八通道输出的译码器,也称3-8译码器
    • 管脚说明
      动态数码管显示实验_第2张图片
    • 真值表
      动态数码管显示实验_第3张图片

实验原理

数码管静态显示:必须接一个8位数据线来保持显示的字形码。
动态显示的特点:

  • 将所有的数码管的段选线并联在一起

  • 位选线控制是哪一位数码管被选中

  • 选亮数码管采用动态扫描方式显示

    • 即轮流向各位数码管送出字形码和相应的位选线
    • 利用发光二极管的余晖效应和人眼的视觉暂留作用
    • 使人感觉好像所有数码管同时在显示

-动态数码管的亮度要比静态显示的亮度差一些,所以限流电阻要略小

硬件电路图

完整电路图查看资源分享4–开发板原理图
动态数码管显示实验_第4张图片
动态数码管显示实验_第5张图片
动态数码管显示实验_第6张图片

硬件电路连线

参照上面的原理图连接:

  • MCU的JP10接74HC573的J12
  • MCU的JP11接74HC138的J6
    动态数码管显示实验_第7张图片
  • 开发板已经用跳线帽连接好
    动态数码管显示实验_第8张图片

实验代码


/**********************************************************/
//晶振频率	: 12.0MHz
//文件名		: main.c
//功能说明	: 七段LED动态数码管显示实验
//制作    	: https://blog.csdn.net/weixin_41995541
//技术支持	: QQ:2116447359
//变更记录	: 2019.04.19
//变更内容	: 
//说明		:
/**********************************************************/
#include 

#define	u8		unsigned char
#define LED_8	P0
void DelayMS(u8 i);

//编码前提条件:
//1.共阳极数码管
//2.各段数码管按顺时针排列
//3.a是高位,h(即dp)是低位
u8 code segmentCode[23]={0xFF,   						//无显示
	0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,  //0~9
	0x11,0xC1,0x63,0x85,0x61,0x71,  					//A~F
	0x91,0xE3,0x13,0x31,0x83,0xD1						//H,L,N,P,U,h
};  
//动态数码管采用共阴型七段数码管 所以编码需要按位取反
//加code把数组存放在Flash ROM中否则在RAM中

void main()
{
	u8 i;											
	while(1)
	{
		for(i=0;i<8;i++)
		{
			P2 = i;
			//共阴型数码管需要将共阳型数码管的编码按位取反
			LED_8 = ~segmentCode[i+1];  //按位取反
			DelayMS(1);   
			LED_8= 0x00;
		}
		//二次实验( 只用了P0进行实验 )所用代码
		//LED_8 = 0x60;
		//LED_8 = 0x71;
		//LED_8 = 0xE2;
		//LED_8 = 0xF3;
	}
}

void DelayMS(u8 i)
{
	//大约 1ms
	u8 j=100;
	while(i--)
	{
		while(j--);  
	}
}


实验结果

  1. 一次实验
    //注释代码DelayMS(1);
    实验1成功但亮度太低
    动态数码管显示实验_第9张图片
    //注释代码LED_8 = 0x00;
    实验2成功
    动态数码管显示实验_第10张图片
    //注释代码
    //DelayMS(1);
    //LED_8= 0x00;
    实验3失败
    动态数码管显示实验_第11张图片
  2. 二次实验
    只用了P0进行实验,让位选和段选同时进行
    重新进行编码
    动态数码管显示实验_第12张图片
    实验成功
    动态数码管显示实验_第13张图片
    只用了P0进行实验,让位选和段选同时进行
    重新进行编码
    动态数码管显示实验_第14张图片
    实验失败,第一位有问题
    动态数码管显示实验_第15张图片

思考以及注意事项

  1. 注意接线,弄清楚高位和低位的对应位置
  2. 重点
    • 重影消影问题
    • 因为位选P2口和段选P0口并不是在同一时间赋值导致存在时差,量的累积最后达到质变(看见重影)
    • 所以需要通过代码 P0=0x00; 将段选清零(无显示)
    • 从一次实验实验2结果可以看出实际上只要有代码DelayMS(1); 延时一毫秒
    • 实验就可以成功,亮度也很亮,但实际上这个位选和段选依然存在时差
    • 这个也有量的累积最后达到质变,但是相对于延时显示的1ms来说太短了,人眼无法捕捉
    • 所以没得重影
  3. 动态扫描,最后显示出来的是静态画面。显然很耗费CPU,但是节约硬件资源,8个数码管只需要两个IO口
  4. 如果是静态方式的话,需要8个IO口来保持显示的数据,很耗硬件资源
  5. 可以用switch和case语句来专门指定每位数码管显示的字符
u8 i;
while(1)
{
	for(i=0;i<8;i++)
	{
		switch(i)
		{
			case 0 :
				LED_8 = ~segmentCode[6]; //显示数字 5
				break;
			case 1 :
				LED_8 = ~segmentCode[10]; //显示数字 9
				break;
			case 2 :
				LED_8 = ~segmentCode[11]; //显示数字 A
				break;
			case 3 :
				LED_8 = ~segmentCode[14]; //显示数字 d
				break;
			case 4 :
				LED_8 = ~segmentCode[12]; //显示数字 b
				break;
			case 5 :
				LED_8 = ~segmentCode[13]; //显示数字 C
				break;
			case 6 :
				LED_8 = ~segmentCode[16]; //显示数字 F
				break;
			case 7 :
				LED_8 = ~segmentCode[15]; //显示数字 E
				break;
			case 8 :
				LED_8 = ~segmentCode[18]; //显示数字 H
				break;
		}
		//消影处理
		DelayMS(1);   
		LED_8= 0x00;
	}
}

实验视频教程

推荐视频:https://www.bilibili.com/video/av32132894/?p=25

资源分享

003-普中51单片机开发板教程+参考资料
链接:https://pan.baidu.com/s/1SHARpgOLFtkY0gQXOGLx7g 提取码:yqjq
复制这段内容后打开百度网盘手机App,操作更方便哦

你可能感兴趣的:(51单片机,动态数码管,C51,普中C51单片机开发板)