1、单片机应用技术项目项目2 2 数码管显示系统设计数码管显示系统设计泸州职业技术学院机电工程系泸州职业技术学院机电工程系单片机应用技术单片机应用技术精品课程组精品课程组本讲主要内容本讲主要内容4 相关知识1 教学目标2 工作任务3 项目实践5 能力拓展6 项目考核1、终极目标、终极目标: 制作一个数码管循环显示数字09的单片机控制系统。2、促成目标:、促成目标:(1) 掌握单片机查表程序的设计方法;(2) 掌握单片机的LED显示接口电路工作原理及其应用;(3) 掌单片机LED显示接口的程序设计方法;(4) 初步掌握单片机应用系统分析和软硬件设计的基本方法,建立单片机系统设计的基本概念;【教学目标
2、】 在数码管上循环显示数字09,时间间隔为0.2秒。【工作任务】【活动一】总体设计【活动一】总体设计1.系统组成系统组成 本系统功能由硬件和软件两大部份协调完成,硬件部分主要完成信息的显示;软件主要完成信号的处理及控制功能等。 本系统的硬件采用模块化设计,以AT89S52单片机为核心,与数码管接口电路组成控制系统。该系统硬件主要包括以下几个模块:AT89S52主控模块、数码管显示模块等。其中AT89S52主要完成外围硬件的控制以及一些运算功能, 数码管显示模块完成字符、数字的显示功能。系统组成方框图如图2.1所示。【项目实践】 单 片 机数码管显示电路复位电路时钟电路电源电路 图2.1 数码管
3、显示系统组成方框图【项目实践】 应用软件采用模块化设计方法。该系统软件主要由主程序、延时子程序等模块组成,系统软件结构框图如图2.2所示。延时子程序主程序 图2.2 系统软件结构框图【项目实践】2.系统工作原理系统工作原理 数码管由8个发光二极管构成,可以用来显示数字、字符等,它在家电及工业控制中有着很广泛的应用,例如用来显示温度、数量、重量、日期、时间等,具有显示醒目、直观的有点,如图2.3所示。 图2.3 数码管实物图【项目实践】 数码管实际上是由7个发光管组成“8”字形构成的,加上小数点就是8个。这些段分别由字母a、b、c、d、e、f、g、dp来表示。当数码管特定的段加上电压后,这些特定
4、的段就会发亮,以形成我们眼睛看到的字样。例如:显示一个“3”字,那么应当是a亮、b亮、c亮、d亮、e不亮、f不亮、g亮、dp不亮。数码管的内部结构如图2.4所示,其中COM引脚为公共端,用来控制数码管显示的打开或关闭,即起到“使能”作用。 根据公共端接法的不同,数码管又分为共阴极和共阳极两种结构,分别如图2.4(b)和图 2.4(c)所示。 共阳极就是将8个LED的阳极连接到一起组成公共端COM,接正极,当相应字段为低电平“0”时,可以点亮该字段;当相应字段为高电平“1”时,该字段不亮。 共阴极就是将8个LED的阴极连接到一起组成公共端COM,接负极,当相应字段为高电平“1”时,可以点亮该字段
5、;当相应字段为低电平“0”时,该字段不亮。【项目实践】图2.4 数码管内部结构图【项目实践】【活动二】硬件设计【活动二】硬件设计1.主控模块设计 本项目采用ATMEL公司生产的AT89S52单片机,主控模块的具体设计参见项目1。2.数码管显示模块设计 本项目中选用8段共阳极数码管,数码管的a、b、c、d、e、f、g、dp段分别与单片机P0口的P0.5、P0.3、P0.1、P0.0、P0.4、P0.6、P0.7、P0.2相连,用来控制显示数字的形状。数码管的公共使能端COM连接三极管C8550的集电极,三极管C8550主要用于信号的放大,以驱动数码管工作。三极管8550的基极通过限流电阻接到单片
6、机P2口的P2.0,通过控制三极管C8550基极电平来打开或关闭数码管的显示,起到“使能作用”。三极管C8550的集电极接+5V电源。数码管显示模块与单片机的接口电路如图2.5所示。【项目实践】图2.5 数码管显示模块与单片机的接口电路原理图【项目实践】1.算法设计 对于数码管而言,要想显示数字或字母,首先应该选中该数码管,然后相应字段被点亮。例如:显示一个“3”字,那么应当是a亮、b亮、c亮、d亮、e不亮、f不亮、g亮、dp不亮。对于共阳极数码管,对应到单片机的P0口,P0.7为低电平“0”,P0.6为高电平“1”,P0.5为低电平“0”,P0.4为高电平“1”,P0.3为低电平“0”,P0
7、.2为高电平“1”,P0.1为低电平“0”,P0.0为低电平“0”,即当把01010100(54H)送给P0口时,可以显示“3”字。其他数字的显示依此类推,那么可以列出数码管显示数字的段码表如表2.1所示。【项目实践】【项目实践】【活动三】软件设计【活动三】软件设计 表2.1 数码管显示数字的段码表段名称GFAEBDPCD对应段码对应引脚P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0数字01000010084H数字111110101F5H数字20100011046H数字30101010054H数字40010010135H数字5000111001CH数字6000011000CH
8、数字711010101D5H数字80000010004H数字90001010014H【项目实践】 如表2.1所示,由于数码管显示的数字“09”的字型码“84H、0F5H、46H、54H、35H、1CH、0CH、0D5H、04H、14H”没有规律可循,只能采用查表的方式来完成我们所需的要求。在程序设计中可以设计一个变量,每隔一定时间在“09”之间变化,然后按照这个数据去查找段码表,把查到的数据送到P0口。 所谓表格是指在程序中定义的一串有序的常数,如平方表、字形码表、键码表等。因为程序一般都是固化在程序存储器(通常是只读存储器ROM类型)中,因此可以说表格是预先定义在程序的数据区中,然后和程序一
9、起固化在ROM中的一串常数。 在程序设计中,有时需要预先把非线性数据以表格的形式存放在存储器中,然后使用程序读出,这种能读出数据表格的程序就称为查表程序。 查表程序的关键是表格的定义和如何实现查表。 表格的定义可以用伪指令DB来实现,查表的实现可以用指令MOVC A,A+PC或者MOVC A,A+DPTR来实现。【项目实践】 按照数字09的顺序,把每个数字的字型编码按顺序排列好,再用伪指令DB建立表格,最后利用指令MOVC A,A+PC或者MOVC A,A+DPTR来实现查表。 建立的表格的程序代码如下所示:TABLE:DB 84H,0F5H,46H,54H,35H,1CH,0CH,0D5H,
10、04H,14H2.数据结构设计 单片机的P0口用于控制数码管所要显示的字形; P2口P2.0用于控制三极管8550是否导通,从而实现对数码管的片选; 工作寄存器R1为数码管数据表索引寄存器; 数据指针DPTR为数码管字型码的基址寄存器; 工作寄存器R5、R6、R7为延时子程序的循环变量。【项目实践】 3.程序设计 (1) 主程序设计 主程序主要完成硬件初始化、子程序调用等功能。 初始化设置数码管使能信号有效,即P2.0=0;将数码管数据表索引寄存器R1赋初值00H。 字符显示 在查表时首先用MOV A,R1指令将存放在R1中的索引值送给累加器A,将数据表的表首地址TABLE送给数据指针DPTR
11、,然后用查表指令MOVC A, A+DPTR取出数码管显示数据,DPTR的值加上A的值即为所取数据的地址,将该地址中的数据送给A;接着把A的值送给用于控制数码管显示字形的P0口,即可在数码管上显示相应的数字。调用延时子程序是使数码管能够稳定显示相应的数字。最后数码管数据表索引寄存器R1加1,为下一个数字的显示做准备。【项目实践】 查表结束判断 对数码管数据表索引寄存器R1的值进行判断是否为结束码0AH,应用比较转移指令CJNE R1,#10,NEXT来判断数字09是否显示完。若未显示完则程序转移至标号NEXT的指令处执行,将存放在R1中的索引值送给累加器A,将数据表的表首地址TABLE送给数据
12、指针DPTR,然后用查表指令MOVC A,A+DPTR取出数码管显示数据,为下一个数字的显示做准备;若显示完则顺序执行,将跳转至主程序开始,重新将数码管数据表索引寄存器R1赋初值00H。从而实现数字09的循环显示。 主程序设计流程图如图2.6所示。【项目实践】 设置数码管字型码变址寄存器初值R1=0开始调用延时子程序Y R1=10?N根据R1的值查表查表获得的数据送P0R1+1R1数码管使能信号有效,P2.0=0 图2.6 主程序设计流程图【项目实践】 (2) 延时子程序模块设计 延时子程序模块设计请参考项目1。 4.汇编语言源程序汇编语言源程序 ;* ;功能:主程序 ;* ORG 0000H
13、 MOV P2, #0FEH ;P2.0用于控制数码管的片选 START: MOV R1, #00H ;R1为数码管字型码的变址寄存器 NEXT: MOV A, R1 ;把字型码的变址地址送给累加器A MOV DPTR, #TABLE ;取得表首地址 MOVC A, A+DPTR ;查表,取得显示的字型码 MOV P0, A ;P0用于数码管的字位口控制 LCALL DELAY200ms ;调用延时子程序 INC R1 ;下一个字型码的变址寄存器 CJNE R1, #10, NEXT ;判断09是否显示完毕 LJMP START ;循环显示【项目实践】;*;功能:延时子程序;*DELAY200
14、ms: MOV R5, #20 LOOP1: MOV R6, #20 LOOP2: MOV R7, #230 DJNZ R7, $ DJNZ R6, LOOP2 DJNZ R5, LOOP1 RET【项目实践】;*;功能:;LED字段码表;*;8字LED的连接方法;P0.7,P0.6,P0.5,P0.4,P0.3,P0.2,P0.1,P0.0;G, F A E B H C DTABLE:DB 84H,0F5H,46H,54H,35H,1CH,0CH,0D5H,04H,14HEND【项目实践】5.C语言源程序语言源程序#include unsigned char code table=0 x3f
15、,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=20;i0;i-) for(j=20;j0;j-) for(k=248;k0;k-);【项目实践】void main(void) P2=0 xfe; while(1) for(dispcount=0;dispcount10;dispcount+) P0=tabledispcount; delay02s(); 【项目实践】 系统仿真调试过程参见项
16、目1。【项目实践】【活动四】系统仿真调试【活动四】系统仿真调试一、数码管基本知识一、数码管基本知识 显示器是最常用的输出设备。特别是发光二级管显示器(LED:Light Emitting Diode)和液晶显示器(LCD),由于结构简单、价格便宜、接口容易,得到广泛的应用,尤其在单片机系统中大量使用。本项目主要介绍发光二级管显示器(LED)与单片机的接口设计和相应的程序设计。液晶显示器(LCD)与单片机的接口设计请参见项目6。【相关知识】1.数码管的结构数码管的结构 数码管由8个发光二极管(以下简称字段)构成,通过不同的组合可用来显示数字 09、 字符 AF、H、L、P、U、符号“”及小数点“
17、.”。数码管的外形结构如图2.7(a) 所示,数码管又分为共阴极和共阳极两种结构,分别如图 2.7(b)和图 2.7(c)所示。 所谓共阴极,即是将所有LED的阴极连接到一起,而共阳极则相反,所有的阳极被连接到了一起。但不管哪种结构,其显示设计的原理基本相同,唯一的是其驱动的电路的设计有所差异,一般共阴极采用推(Push)电流的方式来驱动,而共阳极结构则采用拉(Pull)电流的方式来驱动。【相关知识】 图2.7 数码管的外形结构图 【相关知识】2.数码管工作原理数码管工作原理 共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其他管脚接段驱动电路
18、输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。3.数码管的字形编码数码管的字形编码 要使数码管显示出相应的数字或字符,必须使段数据口输出相应的字形编码。对照图2.7,字型码各位定义为:数据线D0与a字段对应,D1与b字段对应,依次类推。如使用共阳极数码管,数据为 0 表示对应字段亮,数据为 1 表示对应字段暗;如使用共阴极数码管,数据为 0 表示对应字段暗,数据为 1 表示对应字段亮。如要显示“0”,共阳极数码管的字型编码应为
19、 11000000B(即C0H);共阴极数码管的字型编码应为00111111B(即3FH)。依次类推,可求得数码管字形编码见表2.2。【相关知识】 表2.2 数码管字型编码表【相关知识】【相关知识】4.LED数码管显示方式数码管显示方式 根据LED显示的硬件设计方法的不同,LED显示驱动分为静态法和动态法两种方法。 (1) LED 的静态显示方式 所谓静态显示驱动法,即是指每一个LED灯分别对应一个独立的I/O驱动口;其点亮和关闭由该I/O来对其进行控制,互不干扰。对于I/O驱动能力弱的MCU,必须增加外部的驱动芯片或驱动三极管等器件。 LED显示器工作在静态方式时,其公共端应接到一个固定的电
20、平(共阴极接低电平,共阳极接高电平)。如图 2.8 所示为两位共阳极 LED 数码管与单片机连接。【相关知识】 此种设计一般应用在对单个LED的驱动或LED数量较少,且所选的MCU I/O比较充裕的情况下。比如一些项目的LED指示灯、产品的设计中只有一个7段LED码需要显示等。 由于每一个LED均由独立的I/O口来控制,因此此种显示驱动的软件设计 比较简单明了,无需特别的处理,在需要点亮和关闭时设置相应的I/O输出口的电平即可(即“0”或“1”,具体须根据驱动电路的设计来决定)。【相关知识】 图2.8 LED 静态显示电路【相关知识】 优点:电路设计简单,编程简单,而且LED的亮度控制容易,只
21、需在驱动端增加相应的电流调节电阻即可方便地实现亮度的调节(对于存在独立驱动的设计,还可以通过调整驱动电压来达到亮度的调节)。 缺点:由于每一个LED灯需要一个I/O口,因此对I/O口的需求较大,不易实现大数量的LED驱动和显示,扩展性能差。【相关知识】(2) LED 的动态显示方式 在LED的位数比较多时,采用静态显示方式,要占用大量的I/O,硬件电路比较复杂,为了简化电路,降低成本,可采用动态显示方式。 所谓动态显示动态显示就是一位一位地轮流点亮各位显示器(扫描),对于每一位显示器来说,每隔一段时间点亮一次。显示器的点亮既跟点亮时的导通电流有关,也跟点亮时间和间隔时间的比例有关。调整电流和时
22、间的参数,可实现亮度较高较稳定的显示。若显示器的位数不大于8位,则控制显示器公共极电位只需一个I/O口(称为扫描口),控制各位显示器所显示的字形也需一个8位口(称为段数据口)。 动态显示的硬件接法是将所有 LED 显示器的段选线并在一起,接到一个 8 位的I/O 接口上,而位选线则分开接到各自的控制 I/O 线上。 【相关知识】 各LED的段选线是并到一起的,如果不加控制,在送显示字模时各LED会显示同样的内容,为解决这一问题,应使LED在每一个时间段内只显示一位,在此期间只使一位LED 的位选线有效,则在此期间内只有一位LED显示,而其他LED不显示,通过程序 或硬件电路控制,各LED在一个
23、显示周期内分别显示一段时间,当一个显示周期足够短时(小于100ms),由于人眼的视觉暂留特性,使人感觉每个LED总在亮。这种方式称动态扫描显示方式,完成这种功能可由软件也可由硬件完成。图2.9是用MCS-51单片机设计的一个5位共阴极LED动态显示电路。 8位共阳极显示器和单片机的接口逻辑如图2.9所示。P0端口接动态数码管的字形码笔段(段数据口),P2端口接动态数码管的数位选择端(扫描口)。【相关知识】 图 2.9 LED 动态显示电路【相关知识】二、项目相关的指令二、项目相关的指令1定义字节指令伪指令定义字节指令伪指令DB指令格式: 标号:DB 字节常数表或ASCII码字符表 功能:从指定
24、的地址单元开始定义若干个字节的数值或ASCII码字符,各数据之间用逗号分隔,常用于定义一个数据表格存入程序存储器。在表示ASCII码字符时需要在字符上加单引号,标号表示数据表的首地址。【相关知识】 【例如】下面的DB指令从0100H单元开始定义了一个10个字节的数据表。 ORG 0100H TAB:DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DB定义的数据表一行可以写多个数据,当一行写不下要分行时,在下一行也必须用DB伪指令开头。数据表首地址为0100H,那么标号TAB=0100H,定义了10个字节数据,(0100H)=3FH,(0101H)=0
25、6H,(0102H)=5BH,以此类推,(0109H)=6FH。 216位数据传送指令位数据传送指令 MOV DPTR,#data16 ;DPTRdata16 这是51单片机唯一的一条16位数据传送指令,其功能是将16位立即数送入数据指针DPTR。【相关知识】3程序存储器传送指令程序存储器传送指令 MOVC A,A+PC ;PCPC+1,A(A+PC) MOVC A,A+DPTR ; A(A+DPTR) 这两条指令都是一字节指令,并且都为变址寻址方式,其寻址范围为64KB。程序存储器传送指令的助记符是在MOV的后面加C,“C”是Code的第一个字母,是代码的意思。这两条指令用于访问程序存储器中
26、的数据表格,因此可以把它们看成是查表专用指令。 在第1条指令中以PC作为基址寄存器,第2条指令中以DPTR作为基址寄存器。两条指令中A均作为变址寄存器,通常A的值为要取数据的索引值(即要取数据在数据表中的序号)。在MOVC A,A+PC指令中由于基址寄存器PC的值用户不能改变,且变址寄存器A为一个8位寄存器,其最大值为255,所以数据表中数据的个数最多为256,即数据表的长度为256字节,所以数据表只能存放在该指令之后的256B范围内。而MOVC A,A+DPTR指令中基址寄存器DPTR的值可以是64KB程序存储器中的任何一个值,所以使用该指令时数据表可以存放在64KB程序存储器的任何位置,并
27、且数据表的长度可超过256。【相关知识】 使用MOVC A,A+PC查表指令时,由于数据表的存放范围受到限制,并且还必须计算出查表指令下一地址与数据表首地址的差值,使用起来较麻烦。而使用MOVC A,A+DPTR指令时只需将数据表首地址送入DPTR中,将数据索引值送入A中即可,且数据表的存放位置任意,所以使用起来较方便。【相关知识】1、P0端口接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.0接一个开关,当开关接高电平时,显示“12345678”字样;当开关接低电平时,显示“87654321”字样。2、数字显示0059秒计时器。【能力拓展】【项目考核】考核项目考核内容技术要求
28、评分标准得分备注总体设计任务分析方案设计软件和硬件功能划分任务明确(5分);方案设计合理、有新意(10分);软件和硬件功能划分合理(5分);20分硬件设计片内器件分配;电路原理图设计;电路板制作;片内器件分配正确、合理(5分);电路原理图设计正确(10分);电路板制作:布线正确、整齐、合理(5分);20分软件设计算法和数据结构设计;流程图设计;编程;算法和数据结构设计正确、合理(5分);流程图设计正确、简明;(5分);编程正确、有新意(10分);20分系统仿真与调试调试顺序;错误排除;调试结果;调试顺序正确(5分);能熟练排除错误(10分);调试后运行正确(5分);20分实训报告书写;内容;图形绘制;结果分析书写规范整齐(5分);内容翔实具体(5分);图形绘制正确、完整、全面(5分);能正确分析实验结构(5分);20分合计100分