51单片机点亮数码管


前言

在这里我将简单介绍数码管的点亮原理及基本编程(点个赞吧求求了)


提示:以下是本篇文章正文内容,下面案例可供参考

一、点亮数码管

学会如何静态点亮一排数码管,并学会动态点亮。

1.静态点亮

(1)静态点亮原理:

 单个数码管是由八个发光二极管连接而成,通过控制不同led点亮,可以使之显示不同的数字。
  数码管通常有两种不同的接法,共阴极和共阳极,共阴极顾名思义就是讲八个二极管的阴极连接在一起,这样根据二极管导通原理,通过控制不同二极管阳极电平就可以控制数码管显示不同的数字。
控制多个数码管要控制两点
一、选择亮那个数码管。
二、亮的数码管亮什么数字。
  选择数码管操作称为位选,根据自己的开发板原理图找到位选对应的管脚,以共阴极为例。要在编程时执行选中操作,只要给对应管脚低电平即可。段选同样。
我使用的开发板是不同数码管的段选管脚是串联的在这里插入图片描述

  如果每个单独连接占用管脚太多,很浪费硬件资源,所以采用多位串联控制。
注意区分两个概念即段选和位选;位选指数码管对应的位,例如图共有八个数码管,位选就是选中哪一个数码管操作,段选则是控制数码管显示什么数字。

 静态显示为了缩短代码长度,一般都是采用总线式编程,显示数字共阴共阳互为反。

(2)总线控制各个数字显示代码

uchar code smgduan[16]={0x3f,0x06,0x6b,0x4f,0x66,0x6d,0x7d,0x07,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71};

这里采用定义数组方式,smgduan[n]对应相应显示的数字

2、动态数码管点亮

(1)点亮原理

  静态数码管点亮原理十分简单,编程在这里省去。如果想要控制多个数码管显示不同的数字,需要进行动态点亮。
例如上图中八位数码管,我们可以看到,如果进行操作使八个数码管同时点亮,由于这八个数码管段选段是串联在一起的,所以同一时刻这些数码管只能显示同样的数字。
  而动态显示,就是利用减少段选线,分开位选线,利用位选线不同时选择通断,改变段选数据来实现的。比如在第一次选中第一位数码管时,给段选数据 0,下一次位选中第二位数码管时显示 1。
  为了在显示 1 的时候,0 不会消失( 当然实际上是消失了),必须在人肉眼观察不到的时间里再次点亮第一次点亮的 0。
  而这时就需要记住,人的肉眼正常情况下只能分辨变化超过 24ms 间隔的运动。
也就是说,在下一次点亮 0 这个数字的时间差不得大于 24ms。这时就会发现,数
码管点亮是在向右或者向左一位一位点亮, 形成了动态效果。 如果把间隔时间
改长就能直接展现这现象。

(2)点亮硬件基础

数码管
在这里插入图片描述
 上面两图是此次编程所需用到的芯片。

(3)代码实现

#include "reg52.h" //此文件中定义了单片机的一些特殊功能
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显 示0~F 的值
/****************************************************************
***************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1 时,大约延时 10us
*****************************************************************
**************/
void delay(u16 i)
{
while(i--);
}
/****************************************************************
***************
* 函 数 名 : DigDisplay
* 函数功能 : 数码管动态扫描函数,循环扫描 8 个数码管显示
*****************************************************************
**************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=1;LSC=1; break;//显示第 0 位
case(1):
LSA=0;LSB=1;LSC=1; break;//显示第 1 位
case(2):
LSA=1;LSB=0;LSC=1; break;//显示第 2 位
case(3):普中 51 单片机开发攻略
www.prechin.cn
104
LSA=0;LSB=0;LSC=1; break;//显示第 3 位
case(4):
LSA=1;LSB=1;LSC=0; break;//显示第 4 位
case(5):
LSA=0;LSB=1;LSC=0; break;//显示第 5 位
case(6):
LSA=1;LSB=0;LSC=0; break;//显示第 6 位
case(7):
LSA=0;LSB=0;LSC=0; break;//显示第 7 位
}
P0=smgduan[i];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
/****************************************************************
***************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*****************************************************************
**************/
void main(){
	while(1){
	DigDisplay(); //数码管显示函数
  }
}

以上代码即可实现单片机动态点亮数码管功能。
  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值