51单片机-第二节-数码管

一、数码管介绍:

1.什么是数码管?

多个LED组合成8字显示器。

2.一位数码管的引脚(只有一个8):

数码管的引脚为1-10,其中公共极为3,8,其余八位分别对应一个二极管,如下图:

若3,8为公共阴极,则各引脚接高电平1为亮;

若3,8为公共阳极,则各引脚接低电平0为亮;

3.多位数码管的引脚(四个8):

其中每个8的对应位置(如A),都链接在一个引脚上,故只需要12(4+8)个引脚。

4.多位数码管的缺点与解决:

缺点:因为4个8的同一位置链接在同一引脚,故只能显示同一数字(如同时显示四个1)。

解决:动态数码管,利用人眼分辨率低,快速切换四个数字,让每个数字高速频闪,欺骗眼睛。
(即第一个数字显示1,立刻关闭第一个,并让第二个显示2 。。。)

二、静态数码管实战:LED6显示6

1.51单片机数码管端口介绍:

   由P2_2 - P2_4控制8个8的亮灭,三个端口,二进制转十进制,2^3=8,遵循CBA。
(例:101(CBA)=5,使Y5端口对应LED6亮)

由P0_0 - P0_7控制每个8的每个二极管亮灭。

2.实战代码:

void main()
{
	P2_4 = 1;
	P2_3 = 0;
	P2_2 = 1;

	P0 = 0x7D;// 0111 1101 分别对应P0_7-P0_0,注意是倒着的
	while (1);
}

3.进阶代码:设计子函数,可直接指定对应位置显示对应数字:

void Nixie(unsigned char Location, int Number)
{
	switch (Location)
	{
	case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
	case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
	case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
	case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
	case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
	case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
	case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
	case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}

	unsigned char NixieTable[10] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };
	P0 = NixieTable[Number];  

	Delayms(1);
	P0 = 0x00;//显示一下后清零
}

三、动态数码管实战:显示123:

void main()
{
	while (1)
	{
		Nixie(1, 1);
		Delayms(200);
		Nixie(2, 2);
		Delayms(200);
		Nixie(3, 3);
		Delayms(200);
	}
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用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、付费专栏及课程。

余额充值