实验四 数码管显示

  • 格式:doc
  • 大小:764.50 KB
  • 文档页数:9

实验四数码管显示1. 驱动原理数码管由7个发光二极管组成,行成一个日字形,它门可以共阴极,也可以共阳极.通过解码电路得到的数码接通相应的发光二极而形成相应的字,这就是它的工作原理.基本的半导体数码管是由7个条状的发光二极管(LED)按图1所示排列而成的,可实现数字"0~9"及少量字符的显示。

另外为了显示小数点,增加了1个点状的发光二极管,因此数码管就由8个LED组成,我们分别把这些发光二极管命名为 "a,b,c,d,e,f,g,dp",排列顺序如下图1。

图1:数码管引脚图及外形图2. 数码管的结构及分类特别提示:注意段码和位码的概念;会找出不同接法的段码分析方法。

数码管按各发光二极管电极的连接方式分为共阳数码管和共阴数码管两种共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。

共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。

当某一字段的阳极为低电平时,相应字段就不亮。

共阴数码管内部连接如图3所示。

共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。

共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。

当某一字段的阴极为高电平时,相应字段就不亮。

共阳数码管内部连接如图2所示。

图2:共阳数码管内部连接图图3:共阴数码管内部连接图二、多位数码管的驱动方法A.静态法静态显示驱动:静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

送数后可保持。

B.动态扫描法动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

注意:需要不停送数。

实验任务一:静态扫描显示在数码管上循环显示0000至9999。

打开锁存器74HC573锁存端,使数码管和P0口直通,向P0口送段码,打开数码管位选。

注意:若P0口只需要用数码管功能,则锁存器573可以为直通方式若P0口需要数码管和其它器件复用,则需要用上573的锁存功能(1)硬件的连接图(2)实验目的:●学会对数码管静态显示操作(3)实验步骤●分析设计内容,设计软硬件设计方法●编写C语言代码●编译代码●下载可执行文件●硬件调试●观察现象(4)程序源码:/***********************头文件*********************/#include"regx52.h"#define uchar unsigned char#define uint unsigned intuchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9共阴显示子码sbit LOCK=P1^0; //定义锁存端sbit D1=P1^1; //数码管位选第一位sbit D2=P1^2; //数码管位选第二位sbit D3=P1^3; //数码管位选第三位sbit D4=P1^4; //数码管位选第四位/*******************毫秒级延时函数 *****************/void delayms(uint ms){uchar b;while(ms--){for(b=0;b<125;b++);}}/***********************主函数*****************/void main(){uint i;LOCK=1; //高电平通,低电平锁//此程序因为不复用端口,所以让它全通D1=0; //依次打开全部数码管位选D2=0;D3=0;D4=0;while(1){for(i=0;i<9;i++){P0=dispcode[i]; //向P0口送段码delayms(1000); //延时1S}}}(6)现象数码管循环显示0000~9999。

(7)扩展任务设计0~9自减器用数码管静态显示。

实验任务二:动态扫描显示分别在各位上,显示7、6、5、4四个数,然后依次关闭显示,如此反复。

(1)硬件的连接图(2)实验目的:学会对数码管的基本操作(3)程序设计内容打开锁存器74HC573锁存端,使数码管和P0口直通,向P0口送段码,依次打开数码管位选,延时1S再依次关闭位选,如此往复循环。

注:若P0口只需要用数码管功能,则锁存器573可以为直通方式;若P0口需要数码管和其它器件复用,则需要用上573的锁存功能(4)程序流程图:(5)程序源码:/*************************头文件***********************/#include"regx52.h"#define uchar unsigned char#define uint unsigned intuchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9共阴显示子码sbit LOCK=P1^0; //定义锁存端sbit D1=P1^1; //数码管位选第一位sbit D2=P1^2; //数码管位选第二位sbit D3=P1^3; //数码管位选第三位sbit D4=P1^4; //数码管位选第四位/********************毫秒级延时函数 ***********************/void delayms(uint ms){uchar b;while(ms--){for(b=0;b<125;b++);}}/*********************主函数***********************/void main(){LOCK=1; //高电平通,低电平锁//此程序因为不复用端口,所以让它全通while(1){D1=0; //依次打开全部位选P0=dispcode[8]; //把数组的第八位(7)取出来赋给P0delayms(1000);D1=1;delayms(1000);D2=0;DI显示7延时1s,关闭延时1s;D2显示6延时1s,关闭延时1s;D3显示5延时1s,关闭延时1s;D4显示4延时1s,关闭延时1s;(7)扩展任务拉布显示8765->7654->6543->5432->4321->3210->2108如此循环。

实验任务三:数码管动态扫描使用进阶0~9999自加器,满9999清0重新计数。

(1)硬件连接图如上(2)实验目的:学会对数码管的更进一步的控制(3)程序设计内容本实验使用了定时器0中断完成4位数码管的显示。

注意:若P0口只需要用数码管功能,则锁存器573可以为直通方式;若P0口需要数码管和其它器件复用,则需要用上573的锁存功能。

(4)实验步骤●分析设计内容,设计软硬件设计方法●编写C语言代码●编译代码●下载可执行文件●硬件调试●观察现象#include"regx52.h"#define uchar unsigned char#define uint unsigned intuchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9共阴显示子码uchar code dispbit[]={0xfd,0xfb,0xf7,0xef};//数码管位选码,低电平为选通,分别是P11,P12,P13,P14uchar dispbuf[]={" "};uint num=0; //计数变量uchar cont=0; //显示偏移量uchar i=0; //计时变量sbit LOCK=P1^0; //定义锁存端/************************毫秒级延时函数*****************/void delayms(uint ms){uchar b;while(ms--){for(b=0;b<125;b++);}}/**************************主函数*****************/void main(){LOCK=0; //数码管直通IE=0X82; //EA=1 ET0=1 打开总中断打开定时器0中断TMOD=0X01; //T0方式2 8位定时器自动重装TL0=(65536-5000)%256; //定时5MSTH0=(65536-5000)/256;TR0=1; //启动定时器T0while(1) //大循环{num++; //计数变量自增if(num==10000) //满10000清0(数码管最大显示9999){num=0;}dispbuf[3]=num/1000%10; //分离千位,放缓冲区dispbuf[]dispbuf[2]=num/100%10; //分离百位dispbuf[1]=num/10%10; //分离十位dispbuf[0]=num/1%10; //分离个位delayms(50); //延时50MS(时间自定)}}/********************定时器0的中断服务程序*****************///利用中断服务函数,完成4位数码管的显示void timetodisplay() interrupt 1//定时器T0{TL0=(65536-5000)%256; //定时5MSTH0=(65536-5000)/256;P0=dispcode[dispbuf[cont]];//根据显示偏移量cont,将数组dispbuf[]中的数取出来,//作为取数组dispcode[]的偏移量,再根据取出来的数,//将dispcode[]里面的段码取出来送给P0 P1=dispbit[cont]&0xff; //根据偏移量cont++; //显示偏移量自增(显示下一位)if(cont==4) //满4清0(四位数码管){cont=0;}}(6)现象0~9999每50毫秒自加一次。