《数码管显示学习.pptx》由会员分享,可在线阅读,更多相关《数码管显示学习.pptx(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数码管的显示原理一、数码管的字形编码 单片机系统常用的数码管有共阳型和共阴型两种类型,它是单片机常用的外围显示器件。两种类型的数码管外形和结构类似,只是数码管内部组成数码段和标点的LEDLED接法有区别,共阳型数码管的内部所有LEDLED的正极接在一起为公共极引脚,负极分别引出,依次命名为a a、b b、c c、d d、e e、f f、g g、dotdot,使用时共阳型数码管的公共极接正极,其他引脚分别接驱动电路,数码管显示时低电平有效。数码管可以显示0 0到9 9共十个数字,如果加上小数点的显示,驱动一个数码管显示至第1页/共31页 少需要8 8位有效数据。数码管显示数字的8 8位数据编码见
2、表3-2-13-2-1和3-2-23-2-2所示,其中表3-3-2-12-1为共阳型数码管编码,表3-2-23-2-2为共阴型编码。由于共阴型数码管内部所有LEDLED的负极接在一起,所以数码管显示时驱动数据高电平有效。第2页/共31页显示数字dotgfedcba16进制0110000000 xc01111110010 xf92101001000 xa43101100000 xb04100110010 x995100100100 x926100000100 x827111110000 xf88100000000 x809100100000 x90 表3-2-1 共阳数码管显示编码第3页/共31
3、页显示数字dotgfedcba16进制进制0001111110 x3f1000001100 x062010110110 x5b3010011110 x4f4011001100 x665011011010 x6d6011111010 x7d7000001110 x078011111110 x7f9011011110 x6f 表3-2-2共阴数码管显示编码第4页/共31页二、数码管的驱动电路 本节任务所需的电路只需在单片机的最小系统基础增加一个数码管即可。在图3-2-1中,单片机的P0口接一只共阳数码管,其中P0.0P0.7口分别接数码管的adot引脚,P0的每个端口只要有低电平输出,对应的数码管
4、的那个段就显示。如让数码管显示1,数码管b、c段亮,程序控制P0P0输出0 xbe十六进制编码即可,因此共阳数码管显示09十进制数字,需要利用10个显示码组成的数组。小数点在不用时一般不让显示,高位端口P0.7输出高电平即可。第5页/共31页图3-2-1 单片机驱动共阳数码管电路第6页/共31页 由于P0每个端口的灌电流达20mA,数码管每段LED正常显示5mA即可,因此电路中需要R29八个电阻用来限制数码管每一段电流,以防止驱动电流过大而烧毁器件。在利用Proteus软件仿真时,数码管采用Optoelectronics元件库中7-Segment Displays下的7-SEG-COM-ANO
5、DE元件,可以不接限流电阻。数码管是单片机常用的显示器件,在实际应用中,为了保证数码管使用安全,一般在P0口和数码管之间加有限流电阻。第7页/共31页 另外,很多器件如三极管、继电器、蜂鸣器、步进电机等都要用到单片机的I/O口驱动。单片机的P0口在不加上拉电阻的情况下只能驱动低电平有的负载,P1、P2和P3由于采用场效应管互补对称输出方式,高电平和低电平都有电流出,除P0口以外的其他I/O口作驱动输出应用时可以把上拉电阻省去。第8页/共31页三、程序设计 数码管显示0到9数字过程中,数字的变化需要有一定的时间间隔,因此程序还要用到delay()函数。在程序设计过程中,可以把数码管的字形编码做在
6、一个数组里面,为了让P0口依次输出09数字,让P0口的内容依次在数组中取值即可。程序流程见程序清单如下:/*/#includecode unsigned char seven_seg10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;/字形数组第9页/共31页void delay(unsigned int x)/*时间延迟函数*/unsigned int i;unsigned char j;for(i=0;i x;i+)for(j=0;j=200;j+);void main(void)unsigned char i;/变
7、量 i 作为数组的09编号 P2=0;/P2.0=0,通过反相器反相后,加在数码管公共端上的电压为正while(1)P0=seven_segi;/输出09到共阳七段显示器delay(1000);/调用时间延迟函数delay()第10页/共31页 i+;if(i=10)i=0;/*/第11页/共31页 本案例程序中,当程序中使用常量数据时,如共阳数码管数字显示编码、液晶显示器的汉字编码等,一般希望这些数据当程序下载到单片机时存放在单片机的ROM区,对此类数据声明前面需要加上关键字code或const,如数码管的显示编码。另外,在本案例中用到了数组和函数调用以及文件包含等操作,这些操作在单片机C语
8、言程序中经常用到,下面将简单介绍数组和函数的基本概念。第12页/共31页数组 在本案例中,数码管的显示码是一组有规律的同类型数据,如果定义大量的简单变量,程序将变得非常繁琐。为了处理方便,C C语言把具有相同类型的若干变量或常量,用一个带下标数组定义。对各个变量的相同操作可以利用循环改变下标值来进行重复的处理,使程序变得简明清晰。带下标的变量由数组名称和用方括号括起来的下标共同表示,称为数组元素。通过数组名和下标可直接访问数组的每个元素。数组有两个特点:一是其长度是确定的,在定义的同时确定了其数组的大小,在程序中不允许随机变动;第13页/共31页 二是其元素必须是相同类型,不允许出现混合类型。
9、一、一维数组 在C语言中使用数组必须先进行定义或声明,一旦定义了一个数组,系统就将在内存中为其分配一个所申请大小的空间,该空间大小固定,以后不能改变。一维数组的定义格式为 数据类型 数组名常量表达式;第14页/共31页 在C语方中规定,一个数组的名字表示该数组在内存中所分配的一块存储区域的首地址,因此,数组名是一个地址常量,不允许对其进得修改。“常量表达式”表示该数组拥有的元素个数,即定义了数组的大小,必须是正整数。例如,以下语句定义了int 型的长度为10的一维数组 unsigned char seven_seg10在定义了一个数组后,系统在内存在分配一块连续的存储空间用于存储数组。一个数组
10、中的元素下标必须从0开始。所以,定义数组时,若“常量表达式”指出数组长度为N,数组元素下标只能从0到n-1。“常量表达式”能包含常量,但不能包含变量。第15页/共31页二、一维数组元素的引用 在程序中,一维数组元素可以直接作为变量或常量直接饮用,其的引用格式为 数组名 下标其中,“下标”可以是整型常量或是整型表达式。下标是数组元素到数组开始的偏移量,第一个元素的偏移量是0(亦称0号元素),第二个元素的偏移量是1(亦称1号元素),依此类推。例如,seven_seg5表示引用数组seven_seg的下标为 5的元素,即0 x99。第16页/共31页三、一维数组的初始化 每个数组元素可以表示一个变量
11、,对数组的赋值也就是对数组元素的赋值。在定义数组的语句中,可以直接为数组赋值,这称为数组的初始化。数组的初始化方法是将数组元素的初值信存放在由大括号括起来的初始值表中,每个初值之间由逗号隔开。第17页/共31页 函数调用与文件包含 按照一定顺序把单片机的程序在一个函数或一个中全部完成,是简单的单片机系统程序设计常用的一种结构,当程序只有几十行或几百行的时候,采用顺序结构编程的方法很容易让人看明白。如果一个程序超过几千行的时候,分析就会变得很复杂。单片机C C语言程序也支持模块化设计,在模块化程序设计过程,经常会用到函数的调用、文件的包含问题。C C语言的模块化程序设计给单片机编程带来很大的方便
12、,在这里以本节程序为例,简单介绍在KeilKeil软件中实现模块化设计常用的技巧。第18页/共31页一、自定义函数 程序中经常反复执行的部分可以写成一个函数,然后就可以在程序中反复地调用。以下是函数的一般格式 函数类型 函数名称(参数序列);函数的主体 其中函数类型用来设置一个函数被调用之后所返回数值的类型,如果用户希望写一个不返回任何数据的函数时,可以将函数类型设为void。第19页/共31页1.无返回值函数本节案例中delay()函数声明和调用情况为/*/void delay(unsigned int x)/没有返回值,有形参 unsigned int i;unsigned char j;
13、for(i=0;i x;i+)for(j=0;j=200;j+);void main(void)while(1)第20页/共31页 .delay(1000);/调用时间延迟函数,有实参 /*/2.有返回值函数 如果函数中要返回数值时,必须使用return命令。并且返回值的类型必须与函数的类型一致,以下是有返回值函数的例子第21页/共31页/*/unsigned char sum(unsigned char a,unsigned char b)unsigned char x;check_GLCD_busyflag();/函数中可以调用另一个函数 x=a+b;return x;/return会返回
14、unsigned char 类型的数据/*/第22页/共31页二、函数调用 我们可以把一些具有一定功能的程序打包为一个个独立的函数,用到此功能时直接调用即可。如在本节的几个程序中,主函数都调用了延时函数。函数的调用是单片机程序模块化设计的一个方法,函数的调用让C语言的单片机程序具有很强的可移植性,同时也大大简化了程序的结构。第23页/共31页 函数调用比较简单,如本例和上一节的程序中,主函数中的出现的delay()语句就是一种函数调用,当单片机运行主函数的delay(1000)语句时,调用延时函数delay(unsigned int x),其中1000为延时函数的实参,x为函数的形参,在还有形
15、参函数中,实参必须与形参类型统一,本例中如果x为char变量,则程序运行中会出错。另外,为了提高单片机程序的可靠性,在函数调用时,无返回值的函数尽量用void声名,没有形参的函数也要用void声名。第24页/共31页三、文件的包含 函数调用只能使程序的结构简,并不能使程序设计简化。在复杂的单片机程序中也常常用到文件包含和文件关联。本例中程序前面的#include语句是一种文件包含形式。所谓文件包含,是指一个文件将另外一个文件的内容全部包含进来。reg51.h是Kiel软件中定义51系列单片机内部资源的头文件,在编写单片机程序时,只要用到51单片机内部资源,程序前面必须把此文件包含进来。第25页
16、/共31页 复杂的单片机系统,程序可以有主程序和若干子程序组成,子程序服务与主程序,并通过文件包含与主程序关联,文件包含最简单应用是直接在主程序中包含子程序的C语言文件,也可以把子程序做成头文件形式被主程序包含。本例程序中,我们可以把延时函数在文档中剪切保存为一个delay.c文件,并存放在与主程序同一个目中。这个C文件内容为第26页/共31页/*/void delay(unsigned int x)unsigned int i;unsigned char j;for(i=0;i x;i+)for(j=0;j=200;j+);/*/在设计LED闪烁程序时直接包含即可,这样主程序可以得到简化,如
17、:第27页/共31页/*/#include /包含51头文件#include”delay.c”/包含delay.c文件void main(void)unsigned char i;/变量 i 作为数组的09编号 while(1)P0=seven_segi;/*输出09到共阳七段显示器*/delay(1000);/*调用时间延迟函数delay()*/i+;if(i=10)i=0;/*/第28页/共31页也可以把delay.c文件生成一个delay.h文件在程序中进行包含,在使用时delay.h也放在与主程序同一级目录中。delay.h的内容为/*/#ifndef _delay_h_#define
18、 _ delay _h_void delay(unsigned char x);#endif/*/其中条件指示符#ifndef为预编译指令,用来检查预编译字符在前面是否已经被定义,如果在前面没有被定义,则条件指示符的值为真,于是把#ifndef到#endif之间的所有语句都被包含进来进行处理。第29页/共31页 如果#ifndef指示符的值为假,则它与#endif指示符之间的行将被忽略。利用数码管也可以显示日期和时间,但是在本案例中,数字变化时间是由延时函数实现的,由于C语言程序进过编译后的生成的汇编程序与直接采用汇编语言编写的程序区别很大,因此延时函数实现的延时并不准确,如果要得到准确的延时时间,需要用到单片机内部定时器/计数器这个重要部件。第30页/共31页感谢您的观看!第31页/共31页