51---动态数码管

本文介绍了如何使用51单片机通过逐位点亮8个数码管来显示数字520.1314。程序中定义了数码管的段码数组和选择数码管的控制码数组,并通过延时函数实现逐个数码管的显示更新。
摘要由CSDN通过智能技术生成
1.1、什么是动态数码管
(1)数码管还是原来的数码管(共阳极或共阴极均可);动态数码管有两端:COM端和段码端
(2)段码一侧还是接一个单片机端口
(3)COM(共极)接单片机一个IO口,多个联排数码管的COM共同接一个IO端口
分析对比静态和动态数码管,发现本质区别是:静态数码管中只要给了段码数码管就一定工作(显示只取决于段码端),动态数码管中段码端给了段码值后还需要COM端配合才能点亮数码管。


1.2、动态数码管如何工作
(1)在某一特定时间段中,联排数码管中只有一个数码管在工作,其他均在休息(不工作)
(2)COM端选择哪个数码管工作,段码端输出这个数码管要显式的数字的段码;延时;COM端选择下一个数码管工作,同时段码端改输出这个数码管要显示的数字的段码;延时;COM端选择下一个数码管工作······
(3)快速切换工作的数码管,则人看到的是所有的数码管都在亮(其实亮度是比静态驱动低的)。
(4)动态数码管利用了人眼的视觉暂留
第一,宏观上所有的数码管都是同时亮的,所以人以为所有数码管同时工作,所以多个数码管可以合在一起来显示(譬如显示12345678)

第二,微观上数码管是依次亮的,我们可以给不同的数码管送不同的段码,所以不同的数码管可以显示不同的数字。所以相当于8个数码管的显示是独立的。

您可以使用51单片机的定时器和中断来控制动态数码管的显示。具体步骤如下: 1. 设置定时器的计数值和计数方式,以控制动态数码管的刷新频率。 2. 在定时器中断服务程序中,按照时间顺序依次输出每个数字的段选信号和位选信号,来实现动态显示。 3. 在主函数中,将要显示的数字转换为相应的段选信号,并按位存储到数组中。 下面是一个简单的示例代码,可以实现0-999999的动态数码管显示: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar digit[6]; // 存储要显示的6位数字的段选信号 uchar index = 0; // 当前显示的数字的位数 // 定时器0中断服务程序 void timer0_isr() interrupt 1 { uchar i; // 输出当前位的段选信号 P2 = digit[index]; // 输出当前位的位选信号 switch (index) { case 0: P0 = 0xfe; break; // 第1位,打开第1个数码管 case 1: P0 = 0xfd; break; // 第2位,打开第2个数码管 case 2: P0 = 0xfb; break; // 第3位,打开第3个数码管 case 3: P0 = 0xf7; break; // 第4位,打开第4个数码管 case 4: P0 = 0xef; break; // 第5位,打开第5个数码管 case 5: P0 = 0xdf; break; // 第6位,打开第6个数码管 } // 切换到下一位 index++; if (index > 5) { index = 0; } // 延时一定时间,以控制刷新频率 for (i = 0; i < 20; i++); } // 主函数 void main() { uint num = 123456; // 要显示的数字 // 将要显示的数字转换为相应的段选信号,并按位存储到数组中 digit[0] = 0xc0 + num % 10; num /= 10; digit[1] = 0xc0 + num % 10; num /= 10; digit[2] = 0xc0 + num % 10; num /= 10; digit[3] = 0xc0 + num % 10; num /= 10; digit[4] = 0xc0 + num % 10; num /= 10; digit[5] = 0xc0 + num % 10; num /= 10; // 初始化定时器0,设置计数值和计数方式 TMOD = 0x01; // 定时器0,模式1,16位计数器 TH0 = 0xfc; // 计数值,定时500us TL0 = 0x66; TR0 = 1; // 启动定时器0 ET0 = 1; // 允许定时器0中断 // 主循环 while (1); } ``` 这个示例代码可以实现0-999999的动态数码管显示,您可以根据自己的实际需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值