51单片机学习三 关于静态数码管的使用

编程入门 行业动态 更新时间:2024-10-10 07:25:02

51<a href=https://www.elefans.com/category/jswz/34/1769836.html style=单片机学习三 关于静态数码管的使用"/>

51单片机学习三 关于静态数码管的使用

单片机芯片型号 STC89C516

需求

需要知识

1.有关数码管

数码管是一种半导体发光器件,其基本单元是发光二极管。就是若干个二极管拼出来的。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点( DP),这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为 1 位、 2 位、 3 位、 4 位、 5 位、6 位、7 位等数码管。

2.共阳极数码管和共阴极数码管

按单元连接方式可分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管, 共阳数码管在使用时将公共极 COM 接到一定电压(5v), 某一字段发光二极管的阴极为低电平时,相应字段就点亮, 当某一字段的阴极为高电平时, 相应字段就不亮。共阴数码管反之。

其实就是,八个条形的发光二极管焊在一起,阴极或阳极也一起连接,当另一边给出一个信号,让二极管的另一边有规律的接电,使需要的二极管亮起来,就可以组成数字了。

3.关于如何亮起来


(中间图为共阴极内部原理图,右图为共阳极内部原理图)

我们看这张图 :

一位数码管的引脚是 10 个,显示一个 8 字需要 7 个小段,另外还有一个小数点,所以其内部一共有 8 个小的发光二极管,最后还有一个公共端。多数生产商为了封装统一,单位数码管都封装 10 个引脚,其中第 3 和第 8 引脚是连接在一起的。它们的公共端又可分为共阳极和共阴极。

先看共阴极的:
8个发光二极管的阴极在数码管内部连接在一起,阳极是独立的, 通常在设计电路时一般把阴极接地。

给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。 如果想要显示出一个 8 字,并且把右下角的小数点也点亮的话,可以给 8个阳极全部送高电平,如果想让它显示出一个 0 字,可以除了给第“g,dp” 这两位送低电平外, 其余引脚全部都送高电平, 这样它就显示出 0 字了。

但共阴二极管有一些不足

首先是需要注意增加单片机 IO 口驱动电流,因为共阴数管是要靠单片机 IO 口输出电流来点亮的,但单片机 I/O 口难以输出稳定的、 如此大的电流, 所以数码管与单片机连接时需要加驱动电路,可以用上拉电阻的方法或使用专门的数码管驱动芯片,比如 74HC573、74HC245 等,其输出电流较大,电路接口简单,可借鉴使用。
其次,数码管的非公共端往往接在 IC 芯片(可以理解为单片机的CPU)的 I/O 上,而 IC 芯片的驱动电流往往是比较小的,如果采用共阴极数码管,它的驱动端在非公共端, 就有可能受限于 IC 芯片输出电流不够而显示昏暗,要外加上拉电阻或者是增加三极管加大驱动能力,更为麻烦。

而 IC 芯片的输入电流范围比较大,可以将驱动数码管的工作交到公共端(一般接驱动电源),加大驱动电源的功率自然要比加大 IC 芯片 I/O口的驱动电流简单许多,也能减轻主芯片的负担。所以共阳数码管使用更多。

再来看共阳二极管的显示原理:

其内部 8 个发光二极管的所有阳极全部连接在一起,电路连接时,公共端接高电平,因此要点亮发光管二极管,就需要给阴极送低电平,此时显示数字的编码与共阳极编码是相反的关系

注意,数码管内部发光二极管点亮时,也需要 5mA 以上的电流,而且电流不可过大,否则会烧毁发光二极管。开发板的静态数码管使用的是共阳极数码管,不仅要防止数码管电流过大,同时要防止流经数码管的电流集中到单片机时电流不能过大,否则会损坏主芯片。

4.关于静态与动态显示
LED 数码管显示器工作方式有两种:静态显示方式和动态显示方式。

静态显示是每个数码管段必须接一个 8 位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。这种方法的优点是占用 CPU 时间少,显示便于监测和控制。缺点是硬件电路比较复杂,成本较高,比如使用 4 个静态数码管,那么就得 32 个 IO 来控制。

动态显示的特点是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。

6.开发板上的显示

开发板上使用的是一个共阳数码管,即 8 个 LED 的阳极全部并联一起引出如果要让共阳数码管显示数字0,即对应的段给低电平,其他的段给高电平。

下面给出共阴和共阳数码管的 0-F 段码数据表,如下所示:


它们的数据正好是相互取反的值。比如共阴数码管数字 0 段码:0x3f,其二进制是:0011 1111,取反后为:1100 0000,即为 0XC0。其他段码依此类推。
该段码数据由来,是将 a 段作为最低位,b 段作为次低位,其他按顺序类推,dp 段为最高位,共 8 位,正好和51 单片机的一组端口数一样,因此可以直接使用某一组端口控制数码管。
在软件设计里一般用一个数组表示,如显示0

......
//定义一个数组记录共阴数码管码表
unsigned char code faguang[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
P0=~faguang[0]; //因为单片机用的是一个共阳的数码管,这里取反,当然前面定义一个共阳的也可以

硬件设计
开发板上的数码管

静态数码管的控制管脚并未直接连接到 51 单片机的 IO 上,而是连接到 J8 端子上。由于使用的是共阳数码管,公共极接VCC,所以在数码管控制端可加一个限流电阻,阻值为 470 欧(471)。
如果要想 51单片机控制静态数码管,就必须将单片机管脚通过导线连接到 J8 端子上。因此需使用一根8Pin排线将单片机的管脚与J8端子连接。由于静态数码管模块电路是独立的, 所以使用任意单片机管脚都可以。
这里使用P0 组的 8 个 IO 管脚。

注意:要想让前面段码在静态数码管显示,就必须保证 P0 口的 P00 与 A 段到 P0 口的 P07 与 DP 段依次顺序连接,不能交叉,否则数据就会错位。

软件编程

之前学的实现点亮,for函数实现循环,延时函数实现停留1s,按键控制实现重置(把数组索引数重新赋值为0)

代码与注释如下

#include "reg52.h"   //单片机头文件和一些c语言功能的头文件
#include<intrins.h>sbit k1=P1^0;  //定义p1^0端口为k1,把k1和p1^0连起来typedef unsigned int u16;
typedef unsigned char u8; //定义一些数据类型u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 i;void keydelay()		//@12.000MHz 按键延迟消除抖动函数
{unsigned char i, j;i = 20;j = 113;do{while (--j);} while (--i);
}void delay()		//@12.000MHz   数码管显示延迟1s函数
{unsigned char i, j, k;_nop_();i = 8;j = 154;k = 122;do{do{while (--k);} while (--j);} while (--i);
}void main ()
{	while(1)  //保持循环运行{for(i=0;i<10;++i){ P0=~smgduan[i];  //显示控制delay(); //延迟1sif(k1==0)   //这里是按键,检测按键是否落下{keydelay(); //消除抖动if(k1==0){   //再次检测按键是否落下i=-1;  //把数码管显示复位}while (!k1); //检测按键松开}}
}
}

效果预览

资料参考:百度百科,晋中51单片机开发攻略

更多推荐

51单片机学习三 关于静态数码管的使用

本文发布于:2024-02-27 23:20:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1767215.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:单片机   静态   数码管   习三

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!