您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页数码管显示

数码管显示

来源:华佗小知识
欧启标 单片机讲义

第二讲 数码管显示

一、硬件电路

图1 数码管与单片机连接电路

图1为与实验板配套的数码管电路,该电路使用时要先用短路帽接上CON2,以便给74HC573锁存器供电。数码管显示实验电路有两种核心器件:数码管和锁存器。74HC573锁存器可以锁存数据,当锁存器的C为高电平时,锁存器的输出随输入变化,输入为高电平,输出也为高电平,输入为低电平时,输出跟着也会低电平。当锁存器C为低电平时,输出状态保存其最后一次C使能时的状态。

数码管按段数可分为七段数码管和八段数码管,每段为一个发光二极管单元。八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)。

1

欧启标 单片机讲义

按发光二极管单元连接方式可分为共阳数码管和共阴数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共阴极COM端接到地线 GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段不亮。本实验使用的F5361AH三位数码管是共阴数码管。

二、数码管的外形及引脚排列

1、1位数码管

(a) (b)

图2

2

欧启标 单片机讲义

图2中(a)为1位数码管的外形图,(b)为其对应的引脚图,小数点端为引脚5,与之同排的第1个引脚为引脚1。

提示:如不知道数码管共阴或共阳,可用数字万用表电阻档的200欧档测量,用黑表笔接公共端,红表笔接公共端之外的任何一引脚,如有二极管段点亮,则为共阴数码管,否则为共阳数码管。引脚排列亦按此方法判断。

2、本实验所使用的三位数码管5361的外形及引脚定义

三位数码管引脚定义:正面观看(此时小数点在右下角),引脚排布如下

12 11 10 9 8 7

1 2 3 4 5 6

各引脚定义如下:

3

欧启标 单片机讲义

12 11 10 9 8 7 6 5 4 3 2 1

DIG1 A F DIG2 DIG3 B 不用 G C DP D E

其中DIG1~3分别为正面观看时从左到右的三个数码管的公共端。对于共阴数码管,如需点亮对应的二极管位,则此公共端必须为低电平。

三、程序示例一:用第一个数码管显示数字8

分析:要想显示8,第一个数码管的各段位应为

H G F E D C B A

0 1 1 1 1 1 1 1

其中H可为0可为1。

设置各段位的步骤:

1、设置该数码管公共端低电位:将控制各数码管公共端的锁存器573B的LE端(图1的C段)置高电平,P00置低电平,由于锁存器573的LE为高电平时其输出与输入同步,故此时第一个数码管的公共端WE1也为低电平。

2、点亮第一个数码管对应的二极管段位:将控制数码管各段位的锁存器573A的LE端置高电平,由于此时锁存器的输入输出同步,故要想显示8,只需将十六进制数0X7F送入P0口,在输出端即可使得第一个数码管对应的段位为0111 1111。

4

欧启标 单片机讲义

说明:由于两个573锁存器共用P0口,故在进行第2步时需要将控制各数码管公共端的锁存器573B的LE置为低电平。此时573B的输出不随输入变化,故WE1的状态不随P00的电平变化而变化。又由于锁存器的锁存作用使得此时的WE1的状态不变,在执行第2步时仍为低电平。

#include

void main()

{

P2=0X80; //P2=0000 0000 P27为高电平,P26为低电平

P0=0XFE; //P0=1111 1110

P2=0X40;

P0=0X7F; //dpgfedcba 0111 1111

}

程序示例二:

/************************************************************************

数码管实验,需要将CON2引脚短接以便给数码管供电

5

欧启标 单片机讲义

P2.6控制573B,也即控制数码管的位选端的使能,具体位选为P0.0~P0.5:WE1~WE6

P2.7控制573A的使能,也即数码管的段选端的使能,段选端具体对应关系如下:

P0.0~P0.7:ABCDEFGH(DP)

************************************************************************/

#include

#include

sbit E_573B=P2^7; //P2^6控制数码管573B的使能位,P2^7控制数码管573A的使能位

sbit E_573A=P2^6;

sbit WE1=P0^0;

sbit WE2=P0^1;

sbit WE3=P0^2;

sbit WE4=P0^3;

sbit WE5=P0^4;

6

欧启标 单片机讲义

sbit WE6=P0^5;

void main()

{ P2=0X10; //0001 0000,第三位为1主要是为了防止蜂鸣器响

P0=0XFF;

while(1)

{

E_573B=1; WE2=0; E_573B=0;

E_573A=1;

P0=0XFf; }

}

//P2=0000 0000 P27为高电平,P26为低电平

//如果需要其他数码管显示同样的字符,只需改此处为WE2等即可

//dpgfedcba 0111 1111

7

欧启标 单片机讲义

提高篇

编程实现数码管与定时器结合显示时间。

#include

#define uchar unsigned char

sbit HC573A=P2^6; //段控制锁存器的使能端

sbit HC573B=P2^7; //位控制锁存器的使能端

sbit WE1=P0^0;

sbit WE2=P0^1;

sbit WE3=P0^2;

sbit WE4=P0^3;

sbit WE5=P0^4;

sbit WE6=P0^5;

uchar String_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};

8

欧启标 单片机讲义

uchar String[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

uchar count;

uchar hour=22,minute=38,second=30;//设置时间初值,这里为11点56分57秒

void Second_Display(uchar);

void Minute_Display(uchar);

void Hour_Display(uchar);

void Time0_Init();

//定义延时函数

void Delay(uchar i)

{

uchar j,k;

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

for(k=10;k>0;k--);

9

欧启标 单片机讲义

}

//主函数

void main()

{

Time0_Init();

P2=0x10; //对P2口进行初始化

P0=0xFF; //对P0口进行初始化

while(1)

{

if(count==20)//满50ms*20=1s,second++

{

second++;

count=0;

10

欧启标 单片机讲义

if(second==60)

{

second=0;

minute++;

if(minute==60)

{

hour++;

minute=0;

if(hour==24)

{

hour=0;

}

}

11

欧启标 单片机讲义

}

}

Second_Display(second);

Minute_Display(minute);

Hour_Display(hour);

}

}

//用数码管5和6显示秒的函数

void Second_Display(uchar second)

{

//个位数据送P0口

HC573A=1;

P0=String[second%10];//秒的个位,送第六个数码管显示

12

欧启标 单片机讲义

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE6=0;

HC573B=0;

Delay(10);

//十位数据送P0口

HC573A=1;

P0=String[second/10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

13

欧启标 单片机讲义

HC573B=1;

WE5=0;

HC573B=0;

Delay(10);

}

//用数码管3和4显示分的函数

void Minute_Display(uchar minute)

{

//个位数据送P0口

HC573A=1;

P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

14

欧启标 单片机讲义

//打开位使能端

HC573B=1;

WE4=0;

HC573B=0;

Delay(10);

//十位数据送P0口

HC573A=1;

P0=String[minute/10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE3=0;

15

欧启标 单片机讲义

HC573B=0;

Delay(10);

}

//用数码管1和2显示小时的函数

void Hour_Display(uchar hour)

{

//个位数据送P0口

HC573A=1;

P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

16

欧启标 单片机讲义

WE2=0;

HC573B=0;

Delay(10);

//十位数据送P0口

HC573A=1;

P0=String[hour/10];//秒的个位,送第六个数码管显示HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE1=0;

HC573B=0;

Delay(10);

17

欧启标 单片机讲义

}

//初始化定时器0

void Time0_Init()

{

TMOD=0X01;

TH0=0X3C;

TL0=0XB0;

ET0=1;

EA=1;

TF0=0;

TR0=1;

}

//定时器中断函数,每次中断计时50ms

18

欧启标 单片机讲义

void Time0() interrupt 1 //50ms

{

TH0=0X3C;

TL0=0XB0;

count++;

}

三、按键调节时间

#include

#define uchar unsigned char

#define uint unsigned int

sbit HC573A=P2^6; //段控制锁存器的使能端sbit HC573B=P2^7; //位控制锁存器的使能端

sbit WE1=P0^0;

19

欧启标 单片机讲义

sbit WE2=P0^1;

sbit WE3=P0^2;

sbit WE4=P0^3;

sbit WE5=P0^4;

sbit WE6=P0^5;

sbit KEY1=P3^2; //KEY1用于设定小时

sbit KEY2=P3^3; //KEY2用于设定分钟

sbit KEY3=P3^4; //KEY3用于设定秒

uchar String_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

uchar String[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchar count;

uchar hour=8,minute=15,second=50;//设置时间初值,这里为11点56分57秒

void Second_Display(uchar);

20

欧启标 单片机讲义

void Minute_Display(uchar);

void Hour_Display(uchar);

void Time0_Init();

//定义延时函数

void Delay2us(uint i)

{

while(--i);

}

//主函数

void main()

{

Time0_Init();

P2=0x10; //对P2口进行初始化

21

欧启标 单片机讲义

P0=0xFF; //对P0口进行初始化

KEY1=1;

KEY2=1;

KEY3=1;

while(1)

{

if(!KEY1)

{

Delay2us(5000);

if(!KEY1) //单片机上电后所有IO口都为高电平,由于按键另一端接地,故按下按键对应引脚肯定为低电平

{

hour++;

if(hour==24)

22

欧启标 单片机讲义

{

hour=0;

}

}

while(KEY1==0);

}

if(!KEY2)

{

Delay2us(5000);

if(!KEY2)

{

minute++;

if(minute==60)

23

欧启标 单片机讲义

{

minute=0;

}

}

while(KEY2==0);

}

if(!KEY3)

{

Delay2us(5000);

if(!KEY3)

{

second++;

if(second==60)

24

欧启标 单片机讲义

{

second=0;

}

}

while(KEY3==0);

}

if(count==20)//满50ms*20=1s,second++

{

second++;

count=0;

if(second==60)

{

second=0;

25

欧启标 单片机讲义

minute++;

if(minute==60)

{

hour++;

minute=0;

if(hour==24)

{

hour=0;

}

}

}

}

Second_Display(second);

26

欧启标 单片机讲义

Minute_Display(minute);

Hour_Display(hour);

}

}

//用数码管5和6显示秒的函数

void Second_Display(uchar second)

{

//个位数据送P0口

HC573A=1;

P0=String[second%10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

27

欧启标 单片机讲义

HC573B=1;

WE6=0;

HC573B=0;

Delay2us(80);

//十位数据送P0口

HC573A=1;

P0=String[second/10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE5=0;

HC573B=0;

28

欧启标 单片机讲义

Delay2us(80);

}

//用数码管3和4显示分的函数

void Minute_Display(uchar minute)

{

//个位数据送P0口

HC573A=1;

P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE4=0;

29

欧启标 单片机讲义

HC573B=0;

Delay2us(80);

//十位数据送P0口

HC573A=1;

P0=String[minute/10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE3=0;

HC573B=0;

Delay2us(80);

}

30

欧启标 单片机讲义

//用数码管1和2显示小时的函数

void Hour_Display(uchar hour)

{

//个位数据送P0口

HC573A=1;

P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE2=0;

HC573B=0;

Delay2us(80);

31

欧启标 单片机讲义

//十位数据送P0口

HC573A=1;

P0=String[hour/10];//秒的个位,送第六个数码管显示

HC573A=0;

P0=0XFF;

//打开位使能端

HC573B=1;

WE1=0;

HC573B=0;

Delay2us(80);

}

//初始化定时器0

void Time0_Init()

32

欧启标 单片机讲义

{

TMOD=0X01;

TH0=0X3C;

TL0=0XB0;

ET0=1;

EA=1;

TF0=0;

TR0=1;

}

//定时器中断函数,每次中断计时50ms

void Time0() interrupt 1 //50ms

{

TH0=0X3C;

33

欧启标 单片机讲义

TL0=0XB0;

count++;

}

34

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务