1. 7段数码管
数码管是应用电路中常用的显示器件。每个数码管由8个发光二极管组成,它的原理图、外形图和电路符号图如图1所示。
图1 数码管的原理图、外形图和电路符号图
数码管原理图如图1的(a)和(b)所示。数码管有共阴极和共阳极两种类型。共阴极数码管内部8个二极管的N极被连接在一起和管脚COM相接。在使用时管脚COM应接低电平,当数码管其余的某个管脚接高电平,则该管脚对应的发光二极管被点亮,也就是数码管对应的发光段被点亮。共阳极数码管内部8个二极管的P极被连接在一起和管脚COM相接。在使用时管脚COM应接高电平,当数码管其余的某个管脚接入低电平,则该管脚对应的发光二极管被点亮,也就是数码管对应的发光段被点亮。
数码管外形图如图1的(c)所示。数码管有2个COM管脚,它们在数码管内部被连接在一起,在使用时,应用电路中只需要连接一个COM管脚即可。数码管的电路符号图如图1的(d)所示。
数码管的显示电路可以由上一次完成的交通灯控制电路进行改装来实现,具体电路如图2所示。从交通灯的控制电路中去掉发光二极管,换上一个共阴极数码管,单片机P1口的输出数据仍然通过74LS245进行电流放大以后再驱动数码管。由于数码管有8个输入管脚,因此这里需要使用单片机的管脚P1.7和P1.4。
在图2中,数码管即可以采用共阴极数码管,也可以采用共阳极数码管。对于共阴极数码管,它的管脚COM应该通过一个限流电阻和接地线相接;对于共阳极数码管,它的管脚COM应该通过一个限流电阻和电源线相接。
数码管的限流电阻还有第二种接入
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
。第二种方法是在数码管的8个输入管脚与74LS245的8个输出管脚之间分别接一个电阻,共需8个电阻。这时管脚COM可以直接与地或者电源连接。限流电阻的第一种接入方法的优点是接线简单,第二种方法的优点是在显示不同的字符时数码管亮度一致。
图2 基于P1口的数码管显示电路
数码管的各个管脚与单片机P1口的各个管脚的连接关系如
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
1所示。
表1 数码管的管脚与单片机P1口的管脚的连接关系
P1口
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
数码管
dp
g
f
e
d
c
b
a
在图2中,如果不使用数码管的小数点时,控制共阴极数码管的单片机管脚P1.7可以一直输出低电平。在不使用数码管小数点的情况下,数码管的显示字符与输入代码,即单片机P1口的输出数据,之间的关系如表2所示。在表2中,共阳极数码管的显示字符与输入代码的关系也被同时列出。对于共阳极数码管,如果不使用数码管的小数点,这时单片机管脚P1.7应该一直输出高电平。
表2 数码管的显示代码
显示字符
共阴极数码管
共阳极数码管
显示字符
共阴极数码管
共阳极数码管
0
3FH
C0H
9
6FH
90H
1
06F
F9H
A
77H
88H
2
5BH
A4H
b
7CH
83H
3
4FH
B0H
C
39H
C6H
4
66H
99H
d
5EH
A1H
5
6DH
92H
E
79H
86H
6
7DH
82H
F
71H
8EH
7
07H
F8H
“灭”
00H
FFH
8
7FH
80H
“全亮”
FFH
00H
2. 数码管顺序循环显示0到F的控制程序
程序示例seg7_p:
#include
// 包含定义特殊功能寄存器名称的头文件
main() // 主函数
{
while(1) // 无限循环,使主函数内容重复执行
{
P1=0x3f; // 输出数据0的显示代码
P1=0x06; // 输出数据1的显示代码
P1=0x5b; // 输出数据2的显示代码
P1=0x4f; // 输出数据3的显示代码
P1=0x66; // 输出数据4的显示代码
P1=0x6d; // 输出数据5的显示代码
P1=0x7d; // 输出数据6的显示代码
P1=0x07; // 输出数据7的显示代码
P1=0x7f; // 输出数据8的显示代码
P1=0x6f; // 输出数据9的显示代码
P1=0x77; // 输出数据a的显示代码
P1=0x7c; // 输出数据b的显示代码
P1=0x39; // 输出数据c的显示代码
P1=0x5e; // 输出数据d的显示代码
P1=0x79; // 输出数据e的显示代码
P1=0x71; // 输出数据f的显示代码
}
}
8位并行输入/输出端口在芯片内部被映射为特殊功能寄存器P1。特殊功能寄存器被用作CPU和在片外围器件之间的接口,它们之间的联系方框图如图3所示。
图3 特殊功能寄存器(SFR)工作框图
CPU通过向相应的特殊功能存储器写入数据实现控制对应的在片外围器件的工作,从相应的特殊功能存储器读出数据实现读取对应的在片外围器件的工作结果。
3. 译码程序
程序示例seg7_p可以控制数码管完成从0到F共计16个数字的顺序循环显示,但是并不能被用来显示来自某个信号源的数据,因为它的显示结果是确定的,而来自信号源的数据是不确定的。
直接把信号源的数据送到P1端口来控制数码管的显示也是不行的,因为待显示的数据与对应的数码管显示代码是不同的,例如数据“0”的显示代码为“0x3f”。译码程序,或者译码电路,的目的就是完成从显示数据到显示代码的转换。程序示例seg7_decode给出一种译码的软件解决方法。
程序示例seg7_decode:
/* 利用P1并行口实现1位共阴极数码管显示,显示从0到F字符 */
#include // 包含定义特殊功能寄存器名称的头文件
void led1(unsigned char x); // 声明利用P1并行口输出共阴极数码管的显// 示代码的函数
void time1s(void); // 声明延时1s的函数
main() // 主函数
{
unsigned char data seg7_data; // 定义显示数据变量
while(1) // 无限循环,使主函数内容重复执行
{
for(seg7_data=0; seg7_data<16; seg7_data++)
// 循环产生0到F的显示数据
{
led1(seg7_data); // 调用利用P1并行口输出共阴极数码管的显// 示代码的函数
time1s( ); // 调用延时1s的函数
}
}
}
void led1(unsigned char x) // 利用P1并行口输出共阴极数码管的显示代// 码的函数
{
unsigned char code table[16] = // 显示代码表
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
P1 = table[x]; // 利用P1并行口输出显示代码
}
void time1s(void) // 延时1s的函数
{
unsigned char data i, j, k; // 定义循环变量
for(i=0; i<5; i++) // 利用循环实现延时
{
for(j=0; j<255; j++)
{
for(k=0; k<255; k++)
{;}
}
}
}