摘要
本实验采用了普中科技的51单片机开发板
本实验以静态数码管显示实验为基础
https://blog.csdn.net/weixin_41995541/article/details/89392804
通过动态扫描方式静态显示八个数据
实验器件简介
- 74HC573
- 八进制三态非反转透明锁存器
- 功能表
- 74HC138
- 三通道输入、八通道输出的译码器,也称3-8译码器
- 管脚说明
- 真值表
实验原理
数码管静态显示:必须接一个8位数据线来保持显示的字形码。
动态显示的特点:
-
将所有的数码管的段选线并联在一起
-
由位选线控制是哪一位数码管被选中
-
选亮数码管采用动态扫描方式显示
- 即轮流向各位数码管送出字形码和相应的位选线
- 利用发光二极管的余晖效应和人眼的视觉暂留作用
- 使人感觉好像所有数码管同时在显示
-动态数码管的亮度要比静态显示的亮度差一些,所以限流电阻要略小
硬件电路图
完整电路图查看资源分享中 4–开发板原理图
硬件电路连线
参照上面的原理图连接:
- MCU的JP10接74HC573的J12
- MCU的JP11接74HC138的J6
- 开发板已经用跳线帽连接好
实验代码
/**********************************************************/
//晶振频率 : 12.0MHz
//文件名 : main.c
//功能说明 : 七段LED动态数码管显示实验
//制作 : https://blog.csdn.net/weixin_41995541
//技术支持 : QQ:2116447359
//变更记录 : 2019.04.19
//变更内容 :
//说明 :
/**********************************************************/
#include <reg51.h>
#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--);
}
}
实验结果
- 一次实验
//注释代码DelayMS(1);
实验1成功但亮度太低
//注释代码LED_8 = 0x00;
实验2成功
//注释代码
//DelayMS(1);
//LED_8= 0x00;
实验3失败
- 二次实验
只用了P0进行实验,让位选和段选同时进行;
重新进行编码
实验成功
只用了P0进行实验,让位选和段选同时进行;
重新进行编码
实验失败,第一位有问题
思考以及注意事项
- 注意接线,弄清楚高位和低位的对应位置
- 重点:
- 重影和消影问题
- 因为位选P2口和段选P0口并不是在同一时间赋值导致存在时差,量的累积最后达到质变(看见重影)
- 所以需要通过代码 P0=0x00; 将段选清零(无显示)
- 从一次实验实验2结果可以看出实际上只要有代码DelayMS(1); 延时一毫秒
- 实验就可以成功,亮度也很亮,但实际上这个位选和段选依然存在时差
- 这个也有量的累积最后达到质变,但是相对于延时显示的1ms来说太短了,人眼无法捕捉
- 所以没得重影
- 动态扫描,最后显示出来的是静态画面。显然很耗费CPU,但是节约硬件资源,8个数码管只需要两个IO口
- 如果是静态方式的话,需要8个IO口来保持显示的数据,很耗硬件资源
- 可以用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;
}
}
实验视频教程
资源分享
003-普中51单片机开发板教程+参考资料
链接:https://pan.baidu.com/s/1SHARpgOLFtkY0gQXOGLx7g 提取码:yqjq
复制这段内容后打开百度网盘手机App,操作更方便哦