蓝桥杯单片机竞赛学习计划(二)

蓝桥杯单片机学习计划之点亮数码管

前言

上一节我们学习了点亮LED灯,成功编写程序将竞赛板上的八个LED灯点亮了,那么今天我们一起来学习点亮数码管。


一、数码管介绍

数码管是一种显示器件,在平时生活中应该是比较常见的,比如有些热水器就是使用数码管来显示水温的。每个数码管的内部其实都是由8个LED灯组成的,只是对其进行了排列然后进行了封装。根据数码管内部连接方式的不同,分为共阳数码管和共阴数码管。竞赛板上使用了两个四位的共阳数码管,原理图如下:
在这里插入图片描述
从上图可以看到,每个四位的数码管都有12个管脚,其中com1——com4分别是每一位数码管的公共级,板子上的数码管是共阳的,所以它们的公共级就是阳极;剩下八个管脚分别对应数码管的a——dp段,dp是小数点。如果想要使数码管显示数字1,则只需要让对应的d段和c段点亮,其他熄灭即可,对应十六进的0xF9。0-9数码管段码表如下:
在这里插入图片描述

二、原理图

那么板子上数码管和单片机是如何连接的呢?和上一节一样,我们一起顺藤摸瓜寻找一下:
在这里插入图片描述
首先从上图可以看到,板子上分别使用两个74H573锁存器控制两个数码管,关于锁存器上一节点亮LED灯的时候已经使用过了,这边就不再介绍了。上面那个锁存器(U7)控制的是数码管的八个段,下面那个锁存器(U8)控制的是八个数码管的位,而两个锁存器的八个输入端都是由P0控制的,另外两个锁存使能端Y7C和Y6C连接如下:在这里插入图片描述
分别连接到了译码器的Y6和Y7,对应真值表:
在这里插入图片描述
那么到此为止引脚的连接关系就都找完了。下面开始写程序将数码管点亮。

三、数码管静态显示

那么我们想要将数码管点亮,思路就是:首先选通控制控制位的锁存器,使P0端口输出0xFF(共阳),然后关闭位锁存器,再选通控制端的锁存器,使P0端口输出0x00,那么八个数码管就都点亮了,程序如下:

#include <STC15F2K60S2.H>
void main()
{
	P2 = (P2&0x1f) | 0xC0;//位选
	P0=0xFF;//打开所有位
	P2 &= 0x1f;//锁存
			
	P2 = (P2&0x1f) | 0xE0;//段选
	P0=0x00;//八段全部点亮
	P2 &= 0x1f;//锁存
	while(1);
}

效果图如下:
在这里插入图片描述
可以看到数码管全部点亮了,现在我们来修改程序,使八个数码管循环显示0-9.

#include <STC15F2K60S2.H>
#include "intrins.h"
unsigned char SEG_Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0-9段码
void main()
{
	unsigned char i;
	unsigned char x;
	while(1)
	{
		for(i=0x01;i!=0;i<<=1)
		{
			P2 = (P2&0x1f) | 0xC0;//位选
			P0=0xFF;
			P2 &= 0x1f;//锁存
				
			P2 = (P2&0x1f) | 0xE0;//段选
			P0=SEG_Code[x++];
			P2 &= 0x1f;//锁存
			Delay500ms();
		}
		x=0;
}

在这里插入图片描述
程序下载后运行可以看到八个数码管循环显示0-9。

四、数码管动态显示

上面我们实现了八个数码管循环显示0-9,那我们想要让八个数码管每个都显示不同的数字应该怎么办呢?这时候就需要使用数码管的动态显示了,我们可以让第一个数码管显示0,过一会让第二个数码管显示1,再过一会让第三个数码管显示2…那么这个一会是多久呢,我们知道人眼的视觉暂留一般是0.05~0.2秒,所以我们只需要让刷新时间比0.2快就行了,一般数码管扫描时间为1ms左右,下面我们来编写程序实现数码管的动态显示:

#include <STC15F2K60S2.H>
#include "intrins.h"
unsigned char SEG_Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0-9段码
unsigned char SEG_Buf[8];//显示数据缓冲区
void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}
void main()
{
	unsigned char i;
	unsigned char x;
	for(i=0;i<8;i++)//将0-7放入数据缓冲区
	{
		SEG_Buf[i]=i;
	}
	while(1)
	{
		for(i=0x01;i!=0;i<<=1)
		{
			P2 = ((P2 & 0x1f) | 0xe0);
			P0 = 0xff;//消隐
			P2 &= 0x1f;
			
			P2 = (P2&0x1f) | 0xC0;//位选
			P0=i;
			P2 &= 0x1f;//锁存
			
			P2 = (P2&0x1f) | 0xE0;//段选
			P0=SEG_Code[SEG_Buf[x++]];//送入显示缓冲区的值
			P2 &= 0x1f;//锁存
			Delay1ms();
		}
		x=0;
	}
}

在这里插入图片描述
程序下载进开发板运行后,可以看到数码管成功显示0-7了。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值