数码管显示.docx
- 文档编号:24617433
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:19
- 大小:286.82KB
数码管显示.docx
《数码管显示.docx》由会员分享,可在线阅读,更多相关《数码管显示.docx(19页珍藏版)》请在冰豆网上搜索。
数码管显示
第二讲数码管显示
一、硬件电路
图1数码管与单片机连接电路
图1为与实验板配套的数码管电路,该电路使用时要先用短路帽接上CON2,以便给74HC573锁存器供电。
数码管显示实验电路有两种核心器件:
数码管和锁存器。
74HC573锁存器可以锁存数据,当锁存器的C为高电平时,锁存器的输出随输入变化,输入为高电平,输出也为高电平,输入为低电平时,输出跟着也会低电平。
当锁存器C为低电平时,输出状态保存其最后一次C使能时的状态。
数码管按段数可分为七段数码管和八段数码管,每段为一个发光二极管单元。
八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)。
按发光二极管单元连接方式可分为共阳数码管和共阴数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共阴极COM端接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段不亮。
本实验使用的F5361AH三位数码管是共阴数码管。
二、数码管的外形及引脚排列
1、1位数码管
(a)(b)
图2
图2中(a)为1位数码管的外形图,(b)为其对应的引脚图,小数点端为引脚5,与之同排的第1个引脚为引脚1。
提示:
如不知道数码管共阴或共阳,可用数字万用表电阻档的200欧档测量,用黑表笔接公共端,红表笔接公共端之外的任何一引脚,如有二极管段点亮,则为共阴数码管,否则为共阳数码管。
引脚排列亦按此方法判断。
2、本实验所使用的三位数码管5361的外形及引脚定义
三位数码管引脚定义:
正面观看(此时小数点在右下角),引脚排布如下
121110987
123456
各引脚定义如下:
121110987654321
DIG1AFDIG2DIG3B不用GCDPDE
其中DIG1~3分别为正面观看时从左到右的三个数码管的公共端。
对于共阴数码管,如需点亮对应的二极管位,则此公共端必须为低电平。
三、程序示例一:
用第一个数码管显示数字8
分析:
要想显示8,第一个数码管的各段位应为
HGFEDCBA
01111111
其中H可为0可为1。
设置各段位的步骤:
1、设置该数码管公共端低电位:
将控制各数码管公共端的锁存器573B的LE端(图1的C段)置高电平,P00置低电平,由于锁存器573的LE为高电平时其输出与输入同步,故此时第一个数码管的公共端WE1也为低电平。
2、点亮第一个数码管对应的二极管段位:
将控制数码管各段位的锁存器573A的LE端置高电平,由于此时锁存器的输入输出同步,故要想显示8,只需将十六进制数0X7F送入P0口,在输出端即可使得第一个数码管对应的段位为01111111。
说明:
由于两个573锁存器共用P0口,故在进行第2步时需要将控制各数码管公共端的锁存器573B的LE置为低电平。
此时573B的输出不随输入变化,故WE1的状态不随P00的电平变化而变化。
又由于锁存器的锁存作用使得此时的WE1的状态不变,在执行第2步时仍为低电平。
#include
voidmain()
{
P2=0X80;//P2=00000000P27为高电平,P26为低电平
P0=0XFE;//P0=11111110
P2=0X40;
P0=0X7F;//dpgfedcba01111111
}
程序示例二:
/************************************************************************
数码管实验,需要将CON2引脚短接以便给数码管供电
P2.6控制573B,也即控制数码管的位选端的使能,具体位选为P0.0~P0.5:
WE1~WE6
P2.7控制573A的使能,也即数码管的段选端的使能,段选端具体对应关系如下:
P0.0~P0.7:
ABCDEFGH(DP)
************************************************************************/
#include
#include
sbitE_573B=P2^7;//P2^6控制数码管573B的使能位,P2^7控制数码管573A的使能位
sbitE_573A=P2^6;
sbitWE1=P0^0;
sbitWE2=P0^1;
sbitWE3=P0^2;
sbitWE4=P0^3;
sbitWE5=P0^4;
sbitWE6=P0^5;
voidmain()
{P2=0X10;//00010000,第三位为1主要是为了防止蜂鸣器响
P0=0XFF;
while
(1)
{
E_573B=1;//P2=00000000P27为高电平,P26为低电平
WE2=0;//如果需要其他数码管显示同样的字符,只需改此处为WE2等即可
E_573B=0;
E_573A=1;
P0=0XFf;//dpgfedcba01111111
}
}
提高篇
编程实现数码管与定时器结合显示时间。
#include
#defineucharunsignedchar
sbitHC573A=P2^6;//段控制锁存器的使能端
sbitHC573B=P2^7;//位控制锁存器的使能端
sbitWE1=P0^0;
sbitWE2=P0^1;
sbitWE3=P0^2;
sbitWE4=P0^3;
sbitWE5=P0^4;
sbitWE6=P0^5;
ucharString_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};
ucharString[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
ucharcount;
ucharhour=22,minute=38,second=30;//设置时间初值,这里为11点56分57秒
voidSecond_Display(uchar);
voidMinute_Display(uchar);
voidHour_Display(uchar);
voidTime0_Init();
//定义延时函数
voidDelay(uchari)
{
ucharj,k;
for(j=i;j>0;j--)
for(k=10;k>0;k--);
}
//主函数
voidmain()
{
Time0_Init();
P2=0x10;//对P2口进行初始化
P0=0xFF;//对P0口进行初始化
while
(1)
{
if(count==20)//满50ms*20=1s,second++
{
second++;
count=0;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
hour++;
minute=0;
if(hour==24)
{
hour=0;
}
}
}
}
Second_Display(second);
Minute_Display(minute);
Hour_Display(hour);
}
}
//用数码管5和6显示秒的函数
voidSecond_Display(ucharsecond)
{
//个位数据送P0口
HC573A=1;
P0=String[second%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE6=0;
HC573B=0;
Delay(10);
//十位数据送P0口
HC573A=1;
P0=String[second/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE5=0;
HC573B=0;
Delay(10);
}
//用数码管3和4显示分的函数
voidMinute_Display(ucharminute)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE4=0;
HC573B=0;
Delay(10);
//十位数据送P0口
HC573A=1;
P0=String[minute/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE3=0;
HC573B=0;
Delay(10);
}
//用数码管1和2显示小时的函数
voidHour_Display(ucharhour)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
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);
}
//初始化定时器0
voidTime0_Init()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TF0=0;
TR0=1;
}
//定时器中断函数,每次中断计时50ms
voidTime0()interrupt1//50ms
{
TH0=0X3C;
TL0=0XB0;
count++;
}
三、按键调节时间
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitHC573A=P2^6;//段控制锁存器的使能端
sbitHC573B=P2^7;//位控制锁存器的使能端
sbitWE1=P0^0;
sbitWE2=P0^1;
sbitWE3=P0^2;
sbitWE4=P0^3;
sbitWE5=P0^4;
sbitWE6=P0^5;
sbitKEY1=P3^2;//KEY1用于设定小时
sbitKEY2=P3^3;//KEY2用于设定分钟
sbitKEY3=P3^4;//KEY3用于设定秒
ucharString_Dot[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
ucharString[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcount;
ucharhour=8,minute=15,second=50;//设置时间初值,这里为11点56分57秒
voidSecond_Display(uchar);
voidMinute_Display(uchar);
voidHour_Display(uchar);
voidTime0_Init();
//定义延时函数
voidDelay2us(uinti)
{
while(--i);
}
//主函数
voidmain()
{
Time0_Init();
P2=0x10;//对P2口进行初始化
P0=0xFF;//对P0口进行初始化
KEY1=1;
KEY2=1;
KEY3=1;
while
(1)
{
if(!
KEY1)
{
Delay2us(5000);
if(!
KEY1)//单片机上电后所有IO口都为高电平,由于按键另一端接地,故按下按键对应引脚肯定为低电平
{
hour++;
if(hour==24)
{
hour=0;
}
}
while(KEY1==0);
}
if(!
KEY2)
{
Delay2us(5000);
if(!
KEY2)
{
minute++;
if(minute==60)
{
minute=0;
}
}
while(KEY2==0);
}
if(!
KEY3)
{
Delay2us(5000);
if(!
KEY3)
{
second++;
if(second==60)
{
second=0;
}
}
while(KEY3==0);
}
if(count==20)//满50ms*20=1s,second++
{
second++;
count=0;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
hour++;
minute=0;
if(hour==24)
{
hour=0;
}
}
}
}
Second_Display(second);
Minute_Display(minute);
Hour_Display(hour);
}
}
//用数码管5和6显示秒的函数
voidSecond_Display(ucharsecond)
{
//个位数据送P0口
HC573A=1;
P0=String[second%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
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;
Delay2us(80);
}
//用数码管3和4显示分的函数
voidMinute_Display(ucharminute)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[minute%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE4=0;
HC573B=0;
Delay2us(80);
//十位数据送P0口
HC573A=1;
P0=String[minute/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE3=0;
HC573B=0;
Delay2us(80);
}
//用数码管1和2显示小时的函数
voidHour_Display(ucharhour)
{
//个位数据送P0口
HC573A=1;
P0=String_Dot[hour%10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE2=0;
HC573B=0;
Delay2us(80);
//十位数据送P0口
HC573A=1;
P0=String[hour/10];//秒的个位,送第六个数码管显示
HC573A=0;
P0=0XFF;
//打开位使能端
HC573B=1;
WE1=0;
HC573B=0;
Delay2us(80);
}
//初始化定时器0
voidTime0_Init()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;
EA=1;
TF0=0;
TR0=1;
}
//定时器中断函数,每次中断计时50ms
voidTime0()interrupt1//50ms
{
TH0=0X3C;
TL0=0XB0;
count++;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数码管 显示