数码管显示.ppt
课题四 数码管显示,任务一 LED数码管的静态控制显示方式任务二 LED数码管的动态控制显示方式任务三 0999秒表计数器任务四 数字时钟,课题目标 本课题的任务是用单片机实现简易数字显示,演示效果如图4-1所示。通过编程,学会在单片机上实现一位数字和多位数字的静态和动态显示控制方法,以及不同进制计数的程序编写方法。,图4-1 数码管显示实物图,任务一 LED数码管的静态显示,本任务就是将单片机与数码管接成图4-2所示静态显示方式,编程实现数码管每隔0.5s的0-9数字显示。,图4-2 数码管显示电路图,一、任务分析,所谓静态显示,就是当单片机某一端口输出一组显示数据之后,该端口一直保持该数据输出,维持数码管的显示数字,直到端口数据改变,又保持显示下一数据的显示方式。在具体电路连接上,将单片机一个端口的八个端子接在一只数码管的八个引脚上(h端为小数点),控制数码管的七段LED的亮或熄,显示器出数字,这种显示控制方式就是静态显示。静态显示电路连接特点是单片机端口的每一位与数码管的一个端相连接,相当于单片机的一个引脚外接一只发光二极管。,二、LED数码管的结构和工作原理。,图4-3 数码管结构图,数码管实际上是由7个发光管组成“8”字形构成的,加上小数点就是8个。这些段分别由字母a、b、c、d、e、f、g、dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样。例如:显示一个“3”字,那么应当是a亮、b亮、c亮、d亮、e不亮、f不亮、g亮、dp不亮。数码管的内部结构如图4.3所示,其中COM引脚为公共端,用来控制数码管显示的打开或关闭,即起到“使能”作用。根据公共端接法的不同,数码管又分为共阴极和共阳极两种结构,分别如图4.3(b)和图 4.3(c)所示。共阳极就是将8个LED的阳极连接到一起组成公共端COM,接正极,当相应字段为低电平“0”时,可以点亮该字段;当相应字段为高电平“1”时,该字段不亮。共阴极就是将8个LED的阴极连接到一起组成公共端COM,接负极,当相应字段为高电平“1”时,可以点亮该字段;当相应字段为低电平“0”时,该字段不亮。,数码管段码表,表4-1 共阴数码管显示数字的段码表,三、74LS138译码器:74LS138 为3 线8 线译码器,其工作原理如下:当一个选通端(S1)为高电平,另两个选通端(/S2和/S3)为低电平时,可将地址端(A0、A1、A2)的二进制编码在一个对应的输出端以低电平译出。,图4-4 74LS138引脚图,真值表:表4-2 74LS138功能表,四、程序设计,要实现09的显示,设计方法与前面彩灯花样显示类似,首先写出09的显示数据(表4-1中的字型码数据,注意电路中选用的是共阴或共阳数码管与段码一致),这些数据在程序中作数组元素。程序中将数组元素依次读出送到端口,使数码管显示出对应的数字。程序的设计框图见图4-5。,图4-5,1、C语言程序:#include#define uchar unsigned charsbit a=P05;sbit b=P06;sbit c=P07;unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount;void delay02s(void)unsigned char i,j,k;for(i=10;i0;i-)for(j=200;j0;j-)for(k=248;k0;k-);,void main(void)while(1)for(dispcount=0;dispcount10;dispcount+)a=0;b=0;c=0;P1=tabledispcount;delay02s();如何让第8个数码管都点亮?程序如何修改。,2、汇编语言程序:org 00haa:mov r0,#00hmov dptr,#tabclr p0.5clr p0.6clr p0.7sd:mov a,r0movc a,a+dptrlcall delaymov p1,ainc r0,cjne r0,#10,sdsjmp aadelay:mov r6,#5SS:MOV R7,#200LOOP:MOV R5,#249DJNZ R5,$DJNZ R7,LOOPDJNZ R6,SSrettab:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh end,任务二 LED数码管的动态显示,本任务就是当单片机与数码管接成动态显示方式,编程实现数码管的0-7数字显示。,一、电路原理,动态显示的电路有很多,本课题中所选用的电路如图4-6所示。图中用的是两只四位数码管。每只已将所有数码管的ah分别连接在一起,再将两只四位数码管的ah连接在一起,即将八只数码管八段显示的段码控制线连接在一起,作为整个数码管的段码控制。单片机端口驱动能力不足,在段码上使用74LS373提高数码管亮度。对每只数码管的公共端进行控制,使每只数码管可以单独显示。电路中,将每个数码管的COM端接位选信号dig,该引脚为低电平即接通显示,实现数码管的位控制。,图4-6 数码管原理图,如图4-6所示电路,在电路连接上将所有要显示的数码管的八个端并接在单片机同一个端口的八位上,而用单片机的另一个端口的各个位分别控制各数码管的公共端,控制数码管是否点亮。在程序的控制下,快速地依次输出要显示各个数,并同时控制对应数码管工作,这就是数码管的动态显示方式。,动态显示达到一定速度时,由于人眼的视觉暂留特性,在观察时,数码管所有内容如同静态显示一样,不会产生闪烁。所以,对动态扫描的频率有一定的要求,频率太低,LED数码管将出现闪烁现象。如频率太高,由于每个LED数码管点亮的时间太短,LED数码管的亮度太低,无法看清。所以,显示时间一般取几个ms左右为宜。在编写程序时,常采用调用延时子程序来达到要求的保持时间。程序工作时,使电路选通某一位数码管后,该数码管被点亮后并保持一定的时间。,下面,以在数码管上从左到右依次显示出8个数字(07)为例,编写动态显示程序。程序中将要显示的八个数字放在一个数组中(该数组取名为tabledu)。如果从段码输出端口来看,动态显示程序的显示段码输出的过程,其实质和静态显示八个数字是一样的,依次输出各个段码;从位码端口看,要哪只数码管显示,就在那只数码对应位输出0,显示一个数字后,则下一位输出低电平,(数组中取数tablewe)这与跑马灯的控制是一样的。将这两个程序结合起来,就是动态显示程序,流程图如图4-7所示。,二、程序分析,图4-7 动态显示结构图,1、C语言程序:#include#define uchar unsigned charunsigned char code tabledu=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char code tablewe=0 x1f,0 x3f,0 x5f,0 x7f,0 x9f,0 xbf,0 xdf,0 xff;,unsigned char dispcount;void delay02s(void)unsigned char i,j,k;for(i=10;i0;i-)for(j=200;j0;j-)for(k=248;k0;k-);void main(void)while(1)for(dispcount=0;dispcount8;dispcount+)P0=tablewedispcount;P1=tabledudispcount;delay02s();,2、汇编语言:org 00haa:mov r0,#00hsd:mov dptr,#tab2mov a,r0movc a,a+dptrmov p0,amov a,r0mov dptr,#tab1movc a,a+dptrmov p1,alcall delayinc r0cjne r0,#8,sdsjmp aa,delay:mov r6,#5SS:MOV R7,#200LOOP:MOV R5,#249DJNZ R5,$DJNZ R7,LOOPDJNZ R6,SSrettab1:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07htab2:db 1fh,3fh,5fh,7fh,9fh,0bfh,0dfh,0ffhend,任务三 0999秒表计数器,本任务是实现0999的加1S计数显示。,程序设计分析,本任务是运用动态显示实现0999的加1S计算显示,下面就是整个显示过程的流程图。计算函数的程序框图详见图4-8所示。,图4-8 0999计数流程图,1、C语言程序:,#include#define uchar unsigned charsbit a=P05;sbit b=P06;sbit c=P07;unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount,bai,shi,ge;unsigned int temp,aa;void display();void delay02s(void)unsigned char i,j,k;for(i=1;i0;i-)for(j=100;j0;j-)for(k=200;k0;k-);void delay05s(void)unsigned char s,m,t;for(s=2;s0;s-)for(m=200;m0;m-)for(t=250;t0;t-);,void main(void)temp=0;while(1)delay05s();delay05s();temp+;display();void display()if(temp=999)temp=0;bai=temp/100;shi=temp%100/10;ge=temp%10;a=0;b=1;c=0;P1=tablebai;delay02s();a=1;b=0;c=0;P1=tableshi;delay02s();a=0;b=0;c=0;P1=tablege;delay02s();,1、C语言程序(中断)#include#define uchar unsigned charsbit a=P05;sbit b=P06;sbit c=P07;unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char dispcount,bai,shi,ge;unsigned int temp,aa;void init();void delay02s(void)unsigned char i,j,k;for(i=10;i0;i-)for(j=20;j0;j-)for(k=24;k0;k-);,void main(void)init();temp=0;while(1)if(aa=20)aa=0;temp+;if(temp=999)temp=0;bai=temp/100;shi=temp%100/10;ge=temp%10;,a=0;b=1;c=0;P1=tablebai;delay02s();a=1;b=0;c=0;P1=tableshi;delay02s();a=0;b=0;c=0;P1=tablege;delay02s();,void init()TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;void timer0()interrupt 1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;aa+;,思考:,1、如何用数码管显示出动态6541238.,项目四 数字时钟,采用数码管进行数字时钟显示时间,并通过按键调整时间。,实验原理,源程序,#include#define uint unsigned int#define uchar unsigned char sbit key3=P03;/时调整sbit key2=P02;/分调整sbit key1=P01;/秒调整sbit key0=P00;/全部清零键uchar code tab1=0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7d,0 x07,0 x7f,0 x6f,0 x00,0 x40,0 x80;/共阳09/-段码/点uchar code tab2=0 x1f,0 x3f,0 x5f,0 x7f,0 x9f,0 xbf,0 xdf,0 xff;/07依次位码表uchar sec,min,hour,count;/定义秒,分,时,中断计数,void delay(uint z)/延时子函数 uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/-void init()/初始化T0函数 TMOD=0 x01;/T0-方式1-16位计时器 TH0=(65536-50000)/256;/50MS TL0=(65536-50000)%256;/晶振:12M计算 EA=1;/开总中断 ET0=1;/允许T0中断 TR0=1;/启动T0中断,void timer0()interrupt 1/定时器函数 TH0=(65536-50000)/256;/50MS TL0=(65536-50000)%256;/晶振:12M计算 count+;/50毫秒中断一次count便加1 if(count=20)/中断了20次?(20*50=1秒)count=0;sec+;/计数清零/秒加1 if(sec=60)/满了60秒?sec=0;min+;/秒清零/分加1 if(min=60)/满了60分钟?min=0;hour+;/分清零/时加1 if(hour=24)/满了24小时?hour=0;/时清零,void display()/数码管显示子函数 uchar s;for(s=0;s=10;s+)/扫描/控制显示刷新和按键速度 P1=tab1hour/10;P0=tab27;delay(2);/时十位 P1=tab1hour%10;P0=tab26;delay(2);/时个位 P1=tab111;P0=tab25;delay(2);/横 P1=tab1min/10;P0=tab24;delay(2);/分十位 P1=tab1min%10;P0=tab23;delay(2);/分个位 P1=tab111;P0=tab22;delay(2);/横 P1=tab1sec/10;P0=tab21;delay(2);/秒十位 P1=tab1sec%10;P0=tab20;delay(2);/秒个位,void key()/按键调整子函数 if(key1=0)/秒调整 delay(10);if(key1=0)sec+;if(sec=60)sec=0;/调到了60?if(key2=0)/分调整 delay(10);if(key2=0)min+;if(min=60)min=0;/调到了60?if(key3=0)/时调整 delay(10);if(key3=0)hour+;if(hour=24)hour=0;/调到了24?if(key0=0)/全部归清零按 delay(10);if(key0=0)sec=min=hour=0;/秒/分/时清零,void main()/主函数 init();/T0初始化 while(1)/死循环 key();/调整函数 display();/显示函数,