该文章仅为作者大学期间的一时兴起!!!
一、器件描述
先直接看一下我们要用的proteus仿真图吧!
本篇博客,主要介绍当中的51单片机和共阴极的6位一体数码管以及拨码开关。
1. 51单片机:
名称和类型:这是一款经典的嵌入式微控制器,通常用于各种电子应用中。
功能和用途:51单片机用于控制和处理各种电子设备,包括嵌入式系统、传感器数据采集、控制器等。
技术规格:描述其型号、时钟频率、内存容量和其他技术规格。
连接和集成:说明如何将51单片机与其他组件连接,可能需要讨论其引脚分配以及通信接口。
2. 共阴极6位一体数码管:
名称和类型:这是一种显示设备,通常用于显示数字字符。
功能和用途:用于显示数字、字母或符号,常见于计时器、温度计、电子秤等设备。
技术规格:描述其位数、亮度、电源电压要求等规格。
连接和集成:说明如何连接该数码管到其他电路,可能需要讨论连接引脚和限流电阻。
3. 拨码开关:
名称和类型:这是一种开关设备,通常用于选择不同的配置选项。
功能和用途:用于设置或选择不同的参数、模式或选项,常见于电子设备的配置部分。
技术规格:描述拨码开关的位数和可配置选项的数量。
连接和集成:说明如何将拨码开关连接到电路,以及如何读取其状态。
二、实现的功能
功能1:实现数码管的动态显示
话不多说直接上代码(接线参照上面的仿真图):
// 数码管动态显示函数
// 参数:
// seg_nums - 一个数组,用于每位数码管的显示,数组元素为数码管显示的段码;
// n - 需要使用几位数码管,取值范围为 0 到 NUM_DIGITS。
void seg_show(uchar *seg_nums, uchar n)
{
uint time = 10; // 延时时间,单位毫秒
uchar i = 0;
if (n > NUM_DIGITS) // 数码管位数大于上限值返回函数
return;
// 循环显示每位数码管的内容
for (i = 0; i < n; i++)
{
// 根据当前i的值选择要显示的数码管位
DIG_SET(i); // 选择一位数码管
P2 = seg_nums[i]; // 根据当前的i值设置数码管段码
delay_ms(time); // 延时显示
}
}
这段代码实现了一个动态显示共阴极数码管内容的函数。通过传入包含每位数码管段码的数组`seg_nums`和需要显示的数码管位数`n`,函数循环选择每位数码管,设置其段码,并在每次切换后延时一定时间,实现了数码管内容的动态显示效果。这种功能常用于数字时钟等电子设备中,使得数码管能够连续显示不同的数字或字符。
代码中的NUM_DIGITS、DIG_SET(i)为下面这样的定义:
// 数码管最大位数
#define NUM_DIGITS 6
// 定义函数宏DIG_SET(x),用于设置数码管的某一位为1,x表示该位的位置
#define DIG_SET(x) (P1 = 0x80 >> (2 + x))
使用时传入要显示的数组和数组的位数即可。
// 数码管显示数字码(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
const uchar nums[] = {
0x3f, 0x06, 0x5b, 0x4f, // 0,1,2,3
0x66, 0x6d, 0x7d, 0x07, // 4,5,6,7
0x7f, 0x6f, 0x77, 0x7c, // 8,9,A,B
0x39, 0x5e, 0x79, 0x71 // C,D,E,F
};
void main()
{
P0 = 0xff; // P0端口全部置1
P1 = 0x00; // P1端口全部置0
P2 = 0x00; // P2端口全部置0
P3 = 0x00; // P3端口全部置0
while(1)
{
seg_show(nums,6);
}
}
三、相关练习实验
1、每2个数码管为一组,交替点亮“8”。
2、对第4个数码管按照一段亮、二段亮à三段亮……全部亮、灭一段、灭二段……全部灭方式,如此反复进行。
3、将开关K0~K5的置位情况显示在数码管上,开关置“ON”的对应数码管显示“0”,开关置“OFF”(拨向下)的对应数码管显“1”。
4、将开关K0~K7的置数显示在数码管上,如K0~K7全部为OFF,第1,2位数码管显示FF。
四、预告
最容易理解的矩阵键盘实现