加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

51单片机学习--第三章 数码管显示原理及应用实现

(2014-10-02 23:53:00)
标签:

it

分类: 51单片机学习

第三章 数码管显示原理及应用实现

§3.1 数码管显示原理

共阴极数码管编码

符号

编码

符号

编码

0

0x 3f

8

0x7f

1

0x06

9

0x6f

2

0x5b

10

0x77

3

0x4f

11

0x7c

4

0x66

12

0x39

5

0x6d

13

0x5e

6

0x7d

14

0x79

7

0x07

15

0x71

 

C语言编程时,编码定义方法如下:

unsigned char code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

上面unsigned char 是数组类型,也就是数组中元素变量类型,table是数组名,我们可以自由定义它,但是不要和关键字重名;table后面必须加中括号[],等号右边用一个大括号包含所有的元素,大括号后面加一个分号,大括号内部元素与元素之间用逗号隔开,注意,最后一个元素后面不要加逗号。

调用数组方法如下:

      P0=table[3]

即将table这个数组中的第4个元素直接赋给P0口,即

      P0=0x4f

  需要注意的是,在调用数组时,table后面中括号的数字是从0开始的,对应后面大括号里的第一个元素。

 

★ 锁存器(74HC573)

http://s2/mw690/002YfyShty6Mvv9KIZb81&690数码管显示原理及应用实现" TITLE="51单片机学习--第三章 数码管显示原理及应用实现" />

:三态允许控制端(低电平有效),通常叫做输出使能端,或输出允许端都可以

1D8D:数据输入端

1Q8Q:数据输出端

LE:锁存允许端,或叫锁存控制端

 

 

§3.2 数码管静态显示

当多位数码管应用于某以系统时,他们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终是一样的,因为它们的段选是连接在一起的,所以送入所有数码管的段选信号都是相同的,那么它们显示的数字必定一样,数码管的这种显示方法叫做静态显示。

下面我们就用C语言写一段程序,先让第一个共阴数码管显示一个8字。

1、只打开第一个数码管的位选

2(U1锁存器控制控制段选、U2锁存器控制位选)

位选,给U2锁存器的锁存端一个高电平,然后将数据0xfe(二进制为1111 1110)从单片机的P0口直接送出到锁存器U2的数据输出端,然后再关闭U2锁存器

段选,用操作U2的方法给U1的数据输出端再送出一个数据0x7f(二进制为0111 1111)

 

例:3.2.1 让第一个数码管显示一个8

#include

sbit dula=P2^6;        //声明U1锁存器的锁存端

sbit wula=P2^7;        //声明U2锁存器的锁存端

void main()

{

  wela=1;              //打开U2锁存器

  P0=0xfe;             //送入位选信号

  wela=0;              //关闭U2锁存器

 

  dula=1;              //打开U1锁存器

  P0=0x7f;             //送入段选信号

  dula=0;              //关闭U1锁存器

 

  while(1);            //程序停止到这里

}

 

3.2.2 让实验板上6个数码管同时点亮,依次显示0f,时间间隔为1s,循环下去

#include

#define uchar unsigned char

#define uint unsigned int

sbit FM=P2^3;                  //声明蜂鸣器定义端

sbit dula=P2^6;                 //声明U1锁存器的锁存端

sbit wela=P2^7;                 //声明U2锁存器的锁存端

uchar num;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

 

void delayms(uint);

 

void main()

{

  wela=1;                        //打开U2锁存端

  P0=0xc0;                       //送入位选信号

  wela=0;                        //打开U2锁存端

  while(1)

  {

    for(num=0;num<16;num++)      //16个数循环显示

    {

      dula=1;                    //打开U1锁存端

      P0=table[num];             //送入段选信号

      FM=0;                      //蜂鸣器开

      dula=0;                    //关闭U1锁存端

      delayms(500);              //延时0.5

      FM=1;                      //蜂鸣器关

      delayms(500);              //延时0.5

    }

  }

}

 

void delayms(uint xms)            //延时子函数

{

  uint i,j;

  for(i=xms;i>0;i--)

    for(j=113;j>0;j--);

}

 

 

§3.3 数码管动态显示

数码管的动态显示又叫数码管的动态扫描显示。

所谓动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时在显示,而实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快人眼已经无法分辨出来。

下面我们来看例子

 

例子3.3.1 第一个数码管显示1,时间由0.5s缩短到1ms,然后关闭它,立即让第二个数码管显示2,时间为1ms,在关闭它……一直到最后一个数码管显示6,时间同样为1ms,关闭它后再回来显示第一个数码管,一直循环下去

#include

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

 

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

 

void delayms(uint);

 

void main()

{

  while(1)

  {

dula=1;

P0=table[1];       //送段选数据

dula=0;

P0=0xff;           //消影,送位选数据前关闭所有显示,防止打开位选锁存时

wela=1;            //原来的段选数据通过位选锁存器造成混乱

P0=0xfe;           //送位选数据

wela=0;

delayms(1);        //延时

 

dula=1;

P0=table[2];

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delayms(1);

 

dula=1;

P0=table[3];

dula=0;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

delayms(1);

 

dula=1;

P0=table[4];

dula=0;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

delayms(1);

 

dula=1;

P0=table[5];

dula=0;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

delayms(1);

 

dula=1;

P0=table[6];

dula=0;

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

delayms(1);

}

}

 

void delayms(uint xms)

{

  uint i,j;

  for(i=xms;i>0;i--)

    for(j=113;j>0;j--);

}

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有