第二节-数码管显示_第1页
第二节-数码管显示_第2页
第二节-数码管显示_第3页
第二节-数码管显示_第4页
第二节-数码管显示_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 3.2 数码管显示数码管显示 数码管是单片机常用的数字或字符显示部件,数码管是单片机常用的数字或字符显示部件,本节任务是让单片机本节任务是让单片机P0P0口驱动一个共阳型的数码口驱动一个共阳型的数码管显示依次管显示依次0909并循环,并编写程序仿真实现。并循环,并编写程序仿真实现。通过简单的程序设计让单片机驱动数码管显示,通过简单的程序设计让单片机驱动数码管显示,重点掌握数码管的字形编码和显示原理,并了解重点掌握数码管的字形编码和显示原理,并了解数组的应用和程序设计过程的程序优化技巧。数组的应用和程序设计过程的程序优化技巧。 3.2.1 数码管的显示原理数码管的显示原理一、数码管的字形编码一

2、、数码管的字形编码 单片机系统常用的数码管有共阳型和共阴型单片机系统常用的数码管有共阳型和共阴型两种类型,它是单片机常用的外围显示器件。两两种类型,它是单片机常用的外围显示器件。两种类型的数码管外形和结构类似,只是数码管内种类型的数码管外形和结构类似,只是数码管内部组成数码段和标点的部组成数码段和标点的LEDLED接法有区别,共阳型接法有区别,共阳型数码管的内部所有数码管的内部所有LEDLED的正极接在一起为公共极的正极接在一起为公共极引脚,负极分别引出,依次命名为引脚,负极分别引出,依次命名为a a、b b、c c、d d、e e、f f、g g、dotdot,使用时共阳型数码管的公共极接,

3、使用时共阳型数码管的公共极接正极,其他引脚分别接驱动电路,数码管显示时正极,其他引脚分别接驱动电路,数码管显示时低电平有效。数码管可以显示低电平有效。数码管可以显示0 0到到9 9共十个数字,共十个数字,如果加上小数点的显示,驱动一个数码管显示至如果加上小数点的显示,驱动一个数码管显示至 少需要少需要8 8位有效数据。数码管显示数字的位有效数据。数码管显示数字的8 8位位数据编码见表数据编码见表3-2-13-2-1和和3-2-23-2-2所示,其中表所示,其中表3-2-13-2-1为共阳型数码管编码,表为共阳型数码管编码,表3-2-23-2-2为共阴型编码。为共阴型编码。由于共阴型数码管内部所

4、有由于共阴型数码管内部所有LEDLED的负极接在一起,的负极接在一起,所以数码管显示时驱动数据高电平有效。所以数码管显示时驱动数据高电平有效。 显示数字dotgfedcba16进制0110000000 xc01111110010 xf92101001000 xa43101100000 xb04100110010 x995100100100 x926100000100 x827111110000 xf88100000000 x809100100000 x90 表表3-2-1 共阳数码管显示编码共阳数码管显示编码显示数字dotgfedcba16进制进制0001111110 x3f100000110

5、0 x062010110110 x5b3010011110 x4f4011001100 x665011011010 x6d6011111010 x7d7000001110 x078011111110 x7f9011011110 x6f 表表3-2-2共阴数码管显示编码共阴数码管显示编码二、数码管的驱动电路二、数码管的驱动电路 本节任务所需的电路只需在单片机的最小系统本节任务所需的电路只需在单片机的最小系统基础增加一个数码管即可。在图基础增加一个数码管即可。在图3-2-1中,单片机的中,单片机的P0口接一只共阳数码管,其中口接一只共阳数码管,其中P0.0P0.7口分别接数口分别接数码管的码管的a

6、dot引脚,引脚,P0的每个端口只要有低电平输出,的每个端口只要有低电平输出,对应的数码管的那个段就显示。如让数码管显示对应的数码管的那个段就显示。如让数码管显示1,数码管数码管b、c段亮,程序控制段亮,程序控制P0P0输出输出0 xbe十六进制编十六进制编码即可,因此共阳数码管显示码即可,因此共阳数码管显示09十进制数字,需要十进制数字,需要利用利用10个显示码组成的数组。小数点在不用时一般个显示码组成的数组。小数点在不用时一般不让显示,高位端口不让显示,高位端口P0.7输出高电平即可。输出高电平即可。 图图3-2-1 单片机驱动共阳数码管电路单片机驱动共阳数码管电路 由于由于P0每个端口的

7、灌电流达每个端口的灌电流达20mA,数码管每段,数码管每段LED正常显示正常显示5mA即可,因此电路中需要即可,因此电路中需要R29八个八个电阻用来限制数码管每一段电流,以防止驱动电流电阻用来限制数码管每一段电流,以防止驱动电流过大而烧毁器件。在利用过大而烧毁器件。在利用Proteus软件仿真时,数码软件仿真时,数码管采用管采用Optoelectronics元件库中元件库中7-Segment Displays下的下的7-SEG-COM-ANODE元件,可以不接限流电阻。元件,可以不接限流电阻。 数码管是单片机常用的显示器件,在实际应用数码管是单片机常用的显示器件,在实际应用中,为了保证数码管使

8、用安全,一般在中,为了保证数码管使用安全,一般在P0口和数码口和数码管之间加有限流电阻。管之间加有限流电阻。 另外,很多器件如三极管、继电器、蜂鸣器、另外,很多器件如三极管、继电器、蜂鸣器、步进电机等都要用到单片机的步进电机等都要用到单片机的I/O口驱动。单片口驱动。单片机的机的P0口在不加上拉电阻的情况下只能驱动低口在不加上拉电阻的情况下只能驱动低电平有的负载,电平有的负载, P1、P2和和P3由于采用场效应由于采用场效应管互补对称输出方式,高电平和低电平都有电流管互补对称输出方式,高电平和低电平都有电流出,除出,除P0口以外的其他口以外的其他I/O口作驱动输出应用口作驱动输出应用时可以把上

9、拉电阻省去。时可以把上拉电阻省去。三、程序设计三、程序设计 数码管显示数码管显示0到到9数字过程中,数字的变化需要数字过程中,数字的变化需要有一定的时间间隔,因此程序还要用到有一定的时间间隔,因此程序还要用到delay()()函数。在程序设计过程中,可以把数码管的字形编函数。在程序设计过程中,可以把数码管的字形编码做在一个数组里面,为了让码做在一个数组里面,为了让P0口依次输出口依次输出09数数字,让字,让P0口的内容依次在数组中取值即可。程序流口的内容依次在数组中取值即可。程序流程见程序清单如下:程见程序清单如下:/*/#includecode unsigned char seven_seg

10、10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90; /字形数组字形数组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; / 变量变量 i 作为数组的作为数组的09编号编号 P2 = 0; /P2.0 = 0,通过反相器反相后,加在数码管公,通过反相器反相后,加在数码

11、管公共端上的电压为正共端上的电压为正while (1) P0 = seven_segi; /输出输出09到共阳七段显示器到共阳七段显示器delay(1000); /调用时间延迟函数调用时间延迟函数delay()() i+;if(i = 10)i = 0;/*/ 本案例程序中,当程序中使用常量数据时,如共阳本案例程序中,当程序中使用常量数据时,如共阳数码管数字显示编码、液晶显示器的汉字编码等,一数码管数字显示编码、液晶显示器的汉字编码等,一般希望这些数据当程序下载到单片机时存放在单片机般希望这些数据当程序下载到单片机时存放在单片机的的ROM区,对此类数据声明前面需要加上关键字区,对此类数据声明前

12、面需要加上关键字code或或const,如数码管的显示编码。另外,在本案,如数码管的显示编码。另外,在本案例中用到了数组和函数调用以及文件包含等操作,这例中用到了数组和函数调用以及文件包含等操作,这些操作在单片机些操作在单片机C语言程序中经常用到,下面将简单介语言程序中经常用到,下面将简单介绍数组和函数的基本概念。绍数组和函数的基本概念。 3.2.2 数组数组 在本案例中,数码管的显示码是一组有规律在本案例中,数码管的显示码是一组有规律的同类型数据,如果定义大量的简单变量,程序的同类型数据,如果定义大量的简单变量,程序将变得非常繁琐。为了处理方便,将变得非常繁琐。为了处理方便,C C语言把具有

13、语言把具有相同类型的若干变量或常量,用一个带下标数组相同类型的若干变量或常量,用一个带下标数组定义。对各个变量的相同操作可以利用循环改变定义。对各个变量的相同操作可以利用循环改变下标值来进行重复的处理,使程序变得简明清晰。下标值来进行重复的处理,使程序变得简明清晰。带下标的变量由数组名称和用方括号括起来的下带下标的变量由数组名称和用方括号括起来的下标共同表示,称为数组元素。通过数组名和下标标共同表示,称为数组元素。通过数组名和下标可直接访问数组的每个元素。数组有两个特点:可直接访问数组的每个元素。数组有两个特点:一是其长度是确定的,在定义的同时确定了其数一是其长度是确定的,在定义的同时确定了其

14、数组的大小,在程序中不允许随机变动;组的大小,在程序中不允许随机变动; 二是其元素必须是相同类型,不允许出现混合类二是其元素必须是相同类型,不允许出现混合类型。型。 一、一维数组一、一维数组 在在C语言中使用数组必须先进行定义或声明,语言中使用数组必须先进行定义或声明,一旦定义了一个数组,系统就将在内存中为其分一旦定义了一个数组,系统就将在内存中为其分配一个所申请大小的空间,该空间大小固定,以配一个所申请大小的空间,该空间大小固定,以后不能改变。一维数组的定义格式为后不能改变。一维数组的定义格式为 数据类型数据类型 数组名常量表达式;数组名常量表达式; 在在C语方中规定,一个数组的名字表示该数

15、组在语方中规定,一个数组的名字表示该数组在内存中所分配的一块存储区域的首地址,因此,数组内存中所分配的一块存储区域的首地址,因此,数组名是一个地址常量,不允许对其进得修改。名是一个地址常量,不允许对其进得修改。“常量表常量表达式达式”表示该数组拥有的元素个数,即定义了数组的表示该数组拥有的元素个数,即定义了数组的大小,必须是正整数。例如,以下语句定义了大小,必须是正整数。例如,以下语句定义了int 型型的长度为的长度为10的一维数组的一维数组 unsigned char seven_seg10在定义了一个数组后,系统在内存在分配一块连续的在定义了一个数组后,系统在内存在分配一块连续的存储空间用

16、于存储数组。一个数组中的元素下标必须存储空间用于存储数组。一个数组中的元素下标必须从从0开始。所以,定义数组时,若开始。所以,定义数组时,若“常量表达式常量表达式”指指出数组长度为出数组长度为N,数组元素下标只能从,数组元素下标只能从0到到n-1。“常常量表达式量表达式”能包含常量,但不能包含变量。能包含常量,但不能包含变量。 二、一维数组元素的引用二、一维数组元素的引用 在程序中,一维数组元素可以直接作为变量或在程序中,一维数组元素可以直接作为变量或常量直接饮用,其的引用格式为常量直接饮用,其的引用格式为 数组名数组名 下标下标其中,其中,“下标下标”可以是整型常量或是整型表达式。可以是整型

17、常量或是整型表达式。下标是数组元素到数组开始的偏移量,第一个元素下标是数组元素到数组开始的偏移量,第一个元素的偏移量是的偏移量是0(亦称(亦称0号元素),第二个元素的偏移号元素),第二个元素的偏移量是量是1(亦称(亦称1号元素),依此类推。例如,号元素),依此类推。例如,seven_seg5表示引用数组表示引用数组seven_seg的下标的下标为为 5的元的元素,即素,即0 x99。三、一维数组的初始化三、一维数组的初始化 每个数组元素可以表示一个变量,对数组的每个数组元素可以表示一个变量,对数组的赋值也就是对数组元素的赋值。在定义数组的语赋值也就是对数组元素的赋值。在定义数组的语句中,可以直

18、接为数组赋值,这称为数组的初始句中,可以直接为数组赋值,这称为数组的初始化。数组的初始化方法是将数组元素的初值信存化。数组的初始化方法是将数组元素的初值信存放在由大括号括起来的初始值表中,每个初值之放在由大括号括起来的初始值表中,每个初值之间由逗号隔开。间由逗号隔开。 3.2.3 函数调用与文件包含函数调用与文件包含 按照一定顺序把单片机的程序在一个函数或按照一定顺序把单片机的程序在一个函数或一个中全部完成,是简单的单片机系统程序设计一个中全部完成,是简单的单片机系统程序设计常用的一种结构,当程序只有几十行或几百行的常用的一种结构,当程序只有几十行或几百行的时候,采用顺序结构编程的方法很容易让

19、人看明时候,采用顺序结构编程的方法很容易让人看明白。如果一个程序超过几千行的时候,分析就会白。如果一个程序超过几千行的时候,分析就会变得很复杂。单片机变得很复杂。单片机C C语言程序也支持模块化设语言程序也支持模块化设计,在模块化程序设计过程,经常会用到函数的计,在模块化程序设计过程,经常会用到函数的调用、文件的包含问题。调用、文件的包含问题。C C语言的模块化程序设语言的模块化程序设计给单片机编程带来很大的方便,在这里以本节计给单片机编程带来很大的方便,在这里以本节程序为例,简单介绍在程序为例,简单介绍在KeilKeil软件中实现模块化设软件中实现模块化设计常用的技巧。计常用的技巧。一、自定

20、义函数一、自定义函数 程序中经常反复执行的部分可以写成一个函数,程序中经常反复执行的部分可以写成一个函数,然后就可以在程序中反复地调用。以下是函数的一然后就可以在程序中反复地调用。以下是函数的一般格式般格式 函数类型函数类型 函数名称(参数序列);函数名称(参数序列); 函数的主体函数的主体 其中函数类型用来设置一个函数被调用之后所返回其中函数类型用来设置一个函数被调用之后所返回数值的类型,如果用户希望写一个不返回任何数据数值的类型,如果用户希望写一个不返回任何数据的函数时,可以将函数类型设为的函数时,可以将函数类型设为void。1. 无返回值函数无返回值函数本节案例中本节案例中delay()

21、()函数声明和调用情况为函数声明和调用情况为/*/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)while (1) . delay(1000); /调用时间延迟函数,有实参调用时间延迟函数,有实参 /*/2. 有返回值函数有返回值函数 如果函数中要返回数值时,必须使用如果函数中要返回数值时,必须使用return命令。并且返回值的类型必须与函数的类型一致,命令。并且返回值的

22、类型必须与函数的类型一致,以下是有返回值函数的例子以下是有返回值函数的例子/*/unsigned char sum(unsigned char a,unsigned char b)unsigned char x; check_GLCD_busyflag(); /函数中可以调用另一个函数函数中可以调用另一个函数 x=a+b; return x; /return会返回会返回unsigned char 类型的数据类型的数据/*/二、函数调用二、函数调用 我们可以把一些具有一定功能的程序打包为一我们可以把一些具有一定功能的程序打包为一个个独立的函数,用到此功能时直接调用即可。如个个独立的函数,用到此功

23、能时直接调用即可。如在本节的几个程序中,主函数都调用了延时函数。在本节的几个程序中,主函数都调用了延时函数。函数的调用是单片机程序模块化设计的一个方法,函数的调用是单片机程序模块化设计的一个方法,函数的调用让函数的调用让C语言的单片机程序具有很强的可移植语言的单片机程序具有很强的可移植性,同时也大大简化了程序的结构。性,同时也大大简化了程序的结构。 函数调用比较简单,如本例和上一节的程序函数调用比较简单,如本例和上一节的程序中,主函数中的出现的中,主函数中的出现的delay()()语句就是一种语句就是一种函数调用,当单片机运行主函数的函数调用,当单片机运行主函数的delay(1000)语句时,

24、调用延时函数语句时,调用延时函数delay (unsigned int x),其中其中1000为延时函数的实参,为延时函数的实参,x为函数的形参,为函数的形参,在还有形参函数中,实参必须与形参类型统一,在还有形参函数中,实参必须与形参类型统一,本例中如果本例中如果x为为char变量,则程序运行中会出错。变量,则程序运行中会出错。另外,为了提高单片机程序的可靠性,在函数另外,为了提高单片机程序的可靠性,在函数调用时,无返回值的函数尽量用调用时,无返回值的函数尽量用void声名,没有声名,没有形参的函数也要用形参的函数也要用void声名。声名。三、文件的包含三、文件的包含 函数调用只能使程序的结构

25、简,并不能使程序函数调用只能使程序的结构简,并不能使程序设计简化。在复杂的单片机程序中也常常用到文件设计简化。在复杂的单片机程序中也常常用到文件包含和文件关联。本例中程序前面的包含和文件关联。本例中程序前面的#include语句是一种文件包含形式。所谓文语句是一种文件包含形式。所谓文件包含,是指一个文件将另外一个文件的内容全部件包含,是指一个文件将另外一个文件的内容全部包含进来。包含进来。reg51.h是是Kiel软件中定义软件中定义51系列单片系列单片机机内部资源的头文件,在编写单片机程序时,只要用内部资源的头文件,在编写单片机程序时,只要用到到51单片机内部资源,程序前面必须把此文件包含单

26、片机内部资源,程序前面必须把此文件包含进来。进来。 复杂的单片机系统,程序可以有主程序和若复杂的单片机系统,程序可以有主程序和若干子程序组成,子程序服务与主程序,并通过文干子程序组成,子程序服务与主程序,并通过文件包含与主程序关联,文件包含最简单应用是直件包含与主程序关联,文件包含最简单应用是直接在主程序中包含子程序的接在主程序中包含子程序的C语言文件,也可以语言文件,也可以把子程序做成头文件形式被主程序包含。把子程序做成头文件形式被主程序包含。本例程本例程序中,我们可以把延时函数在文档中剪切保存为序中,我们可以把延时函数在文档中剪切保存为一个一个delay.c文件,并存放在与主程序同一个目中。文件,并存放在与主程序同一个目中。这个这个C文件内容为文件内容为/*/void delay (unsigned int x) unsigned int i;unsigned char j;for (i = 0;i x; i+) for (j = 0;j = 200;j+);/*/在设计在设计LED闪烁程序时直接包含即可,这样主程序可闪烁程序时直接包含即可,这样主程序可以得到简化,如:以得到简化,如:/*/#include /包含包含51头文件头文件 #include”delay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论