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)、符号(.)。
-
特点:
-
自发光、亮度高,特别适合环境亮度低的场合使用。
-
牢固,不怕冲击。
-
4、数码管结构与原理
-
数码管结构
- LED显示器(数码管)系发光器件的一种。常用的LED发光器件有两类:数码管和点阵。
- 数码管内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的亮暗组合成字符。根据内部发光二极管的接线形式可分为共阴极和共阳极两种。
- 使用时,共阴极数码管公共端接地,共阳极数码管公共端接电源。每段发光二极管需5~10mA的驱动电流才能正常发光,一般需加限流电阻控制电流的大小。
-
数码管原理
-
LED数码管的a~g七个发光二极管。加正电压的发光,加零电压的不能发光,不同亮暗的组合就能形成不同的字型,这种组合称为字型码。共阳极和共阴极的字型码是不同的。
-
5、数码管驱动电路
-
要驱动1个四位数码管常见的有以下几种数码管驱动电路(本电路是使用:共阴极数码管):
- 使用12个IO口
- P2.4-P2.7驱动位选,IO口直接驱动位选
- 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
-
方式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); }