




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-.z.AVR单片机595驱动数码管显示一、电路实现8位数码管的电路如下图所示数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。数码管的分类:按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极()的数码管。共阳数码管在应用时应将公共极接到+5V,当*一字段发光二极管的阴极为低电平时,相应字段就点亮。当*一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极()的数码管。共阴数码管在应用时应将公共极接到地线GND上,当*一字段发光二极管的阳极为高电平时,相应字段就点亮。当*一字段的阳极为低电平时,相应字段就不亮。我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。数码管段、位引脚的确定(以4位8段数码管为例),我们在实际应用中购买的数码管不像电阻、电容、集成等元件那样有数据手册或者直接在元件上标明管脚序号和用途,并且市场上数码管的管脚排列顺序并不是一致的,所以我们购买回来的数码管一般都要亲自测量一下各个引脚的用途,怎么测量呢?数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的*一段是否会点亮,如果全部引脚试过都没有亮的,则将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。相反,按住电源正极不动,电源负极逐个接到数码管的其余引脚上,如果有8个数码管全亮,则该数码管是共阳极的。确定了数码管的极性后,下面该确定数码管的位选端口了。仍旧按照第一步的测量方法,如果测量过程中发现当一个引脚固定后,逐个连接到其余端口上的时候,会有一个数码管的所有段都被点亮了,则这个固定端就是一个位选端。依照这种方法依次找出其余的3个位选端即可。最后确定段选端口,根据数码管的极性将电源正极(串电阻)或负极固定在一个位选端上,然后将电源的另一端逐个连接数码管的位选端口以外的引脚,当接到一个引脚上数码管的哪一段点亮,就能够确定该引脚对应那一段了,依次量出全部8段分别对应那个引脚。经过上面的步骤后,我们就完成了数码管引脚的确定,其实在实际使用过程中,操作熟练的话是不必经过这么繁琐的步骤来确定数码管的引脚的。数码管的驱动方式:数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,根据数码管的驱动方式的不同,可以分为静态式和动态式两类。①静态显示驱动:静态驱动也称直流驱动。静态驱动是指将公共端接到电源正极或者电源地上,每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。②动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。在实际使用中,通常都是采用动态显示驱动的方法。在本实例中我们就是采用的动态驱动的方法。数码管的性能参数:电流:静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。电压:查引脚排布图,看一下每段的芯片数量是多少?当红色时,使用1.9V乘以每段的芯片串联的个数;当数码管的LED为绿色时,使用2.1V乘以每段的芯片串联的个数。74HC595功能描述在本实例中我们使用了一片74HC595来驱动8位数码管的位选端口,下面就简单介绍一下74HC595的功能。74HC595是带锁存功能的三态输出的8位串行输入/并行输出的移位寄存器。由于它自带锁存器,所以其数据在移位寄存器中的移位与锁存器的输出是独立的,当数据移位时,可以保持锁存器输出的数据不改变,等所有8位数据全部串入完成移位操作后,一次性的将数据打入锁存器中,从而实现了并行输出的同步改变。另外该芯片可以进行级联,能够实现8*n个并口扩展。下图是74HC595的逻辑功能表74HC595管脚描述:QA--QH:八位并行输出端,可以直接控制数码管的8个段。QH':级联输出端。我将它接下一个595的SI端。SI:串行数据输入端。74595的控制端说明:/SCLR(10脚):复位引脚,低电平时将移位寄存器的数据清零。一般情况下接Vcc。SCK(11脚):时钟引脚,上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。RCK(12脚):锁存引脚,上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了),更新显示数据。/G(13脚):使能引脚。高电平时禁止输出(高阻态)。如果单片机的引脚不紧,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力,通常可以直接接地GND。A(14脚):数据串入引脚。74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。74HC595还具有SPI功能,但在本例中我们先不使用,我们直接用单片机的普通I/O口模拟74HC595的时序来实现数据的串入并出功能。从74HC595的逻辑功能表中我们可以分析出74HC595的工作过程:数据的串入和部数据移位的操作由SCLK控制。SCLK的上升沿将移位寄存器中的数据由Qa向Qh依次移动一位,同时将数据线上的电平打入Qa,而最高位的数据Qh从SQh端移出。如果把SQh与另一片74HC595的数据端连接,则SQh的串行输出就是第2片74HC595的串行数据输入,从而实现级联。74HC595在移位的过程中并不影响其锁存器的输出,移位寄存器中的数据是通过锁存端的上升沿打入到锁存器中的。正是由于74HC595具备了锁存功能,因而可以保证并行输出数据的稳定和数据同步改变的功能。经过以上分析我们可以得出74HC595控制数据输入输出的实现步骤:1、在SCLK上升沿期间将数据端串入的数据经过发送到移位寄存器中,如果需要发送8位的数据,则需要8个SCLK上升沿才能将8位数据全部输入到移位寄存器中。2、使锁存端产生一个上升沿,从而将移位寄存器中的数据打入到锁存器中并输出。本实例中8位数码管显示电路的工作原理:8位数码管的8个段选端口全部并联接到单片机的PB口上。74HC595控制8位数码管的8个位选端,当*位选通后,点亮该位的数码管,使它显示相应的数字。今天就讲到这里吧,下一节我们再介绍8位数码管显示的程序实现。我们接着来完成8位数码管的显示实验。现在我们开始动手编写程序;根据前面的介绍,我们应该已经能够知道编写一个AVR单片机的C语言程序的基本步骤和方法了。下面给出这个程序的主程序文件,在这个程序中我们应该能够知道这个程序都包含了那几块,具体来说我们应该能够在这个程序中把以下几个部分找出来:预编译语句、全局变量的定义、函数的声明、主函数、函数定义。如果你还不能够准确找出这几部分,则需要把前面的容再详细阅读一下。主程序代码*include<avr/io.h>//io端口寄存器配置文件,必须包含*include<util/delay.h>//GCC中的延时函数头文件*include"hc595.h"//unsignedcharLed_Disbuf[10]={0*3F,0*06,0*5B,0*4F,0*66,0*6D,0*7D,0*07,0*7F,0*6F};//共阴极unsignedcharLed_Disbuf[10]={0*C0,0*F9,0*A4,0*B0,0*99,0*92,0*82,0*F8,0*80,0*90};//共阳极unsignedcharBuf[8]={0*01,0*02,0*04,0*08,0*10,0*20,0*40,0*80};//函数声明e*ternvoidDelayus(unsignedintlus);//us延时函数e*ternvoidDelayms(unsignedintlms);//ms延时函数intmain(void)//GCC中main文件必须为返回整形值的函数,没有参数{unsignedchari;PORTB=0*ff;//PORTB输出低电平,使LED熄灭DDRB=0*FF;//配置端口PB全部为输出口HC595_port_init();while(1){for(i=0;i<8;i++){PORTB=Led_Disbuf[i];//送段码HC595_Send_Data(Buf[i]);//选通位选端口Delayus(70);//延时HC595_Send_Data(0*00);//位选通关闭}}}//us级别的延时函数voidDelayus(unsignedintlus){while(lus--){_delay_loop_2(4);//_delay_loop_2(1)是延时4个时钟周期,参数为4则延时16//个时钟周期,本实验用16M晶体,则16个时钟周期为16/16=1us}}//ms级别的延时函数voidDelayms(unsignedintlms){while(lms--){Delayus(1000);//延时1ms}}在这个主程序文件中有人可能会注意到有一些我们前面没有介绍过的容,比如e*tern这个单词,它在这里起什么作用?这就牵涉到C语言的关键字了,关于C语言的关键字,我们可以到相关的C语言教材中去做详细了解,在这里我们只针对e*tern这个关键字作出解释,我们注意到e*tern用在一个函数声明的地方,它的作用就是把这个函数声明为外部函数,这样我们在整个项目的所有文件中就都可以调用这个函数了。同理e*tern也可以用来声明一个变量为外部变量。我们可能还会有一个疑惑:*include"hc595.h"这个头文件包含语句中的hc595.h有什么作用,它是GCC提供的还是我们自己编写的?这里我们就要学习C语言中的一个重要的概念:模块化程序设计。何为模块化程序设计?它实现什么功能?如果要铺开来讲的话,可能需要一本书的容。我们耗不起这个时间和精力。其实我们只需要知道,模块化程序设计是为了简化程序容量而采取的一种将一个程序分成不同的模块,然后通过特定的方法将这些模块组合起来共同完成同一个目标。通俗的说就是化整为零。在我们刚开始学习单片机的时候,我们编写的程序都很简单,程序量也不大,所以往往涉及不到模块化程序设计,但是这是一种很好的编程思路,我们有必要掌握。本实例就是采用的这种方法。模块化程序设计的思路是:将实现相同功能的程序单独编写,然后实现一个综合的功能,举个例子,我们想实现一个液晶显示的温度测量程序,则我们可以把液晶显示相关的程序放在一个文件中,把温度测量的程序放在另一个文件中,最后在主程序中调用这两个文件来实现整体的功能。通常我们在进行模块化程序设计的时候,常常将变量定义,端口设置,函数声明等部分保存在一个.h文件中,而将函数定义部分放在一个.c文件中,在编写主程序文件的时候,用预处理命令*include将.h文件包含起来,而在编译的时候将所有用到的.c文件一起编译。这样就实现了模块化文件的整合。在本实例中,我们将74HC595相关的变量定义,端口定义,函数声明放在74HC595.h文件中,而主程序中的*include"hc595.h"这句话实现了将这个文件包含到主程序中的功能。下面是本实例中模块化程序设计的.h文件/*****************************74hc595.h***********************************//*74hc595与单片机的引脚连接/MR(10脚)VCC低点平时将移位寄存器的数据清零。通常将它接Vcc/OE(13脚)PG4高电平时禁止输出(高阻态)。如果单片机的引脚不紧,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。ST_CP(12脚)PG1上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新显示数据。SH_CP(11脚)PG0上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。通常都选微秒级)DS(14)PG2串行数据输入端。*/*ifndef__HC595_H__*define__HC595_H__*include<avr/io.h>//io端口寄存器配置文件,必须包含*include<util/delay.h>//GCC中的延时函数头文件*defineHC595_latch(1<<PG1)//上升沿数据打入8位锁存器,下降沿锁存器数据不变*defineHC595_sclk(1<<PG0)//上升沿数据移位,下降沿数据不变*defineHC595_oe(1<<PG4)//低电平,8位数据锁存器输出,高电平输出高组态*defineHC595_data(1<<PG2)//串行数据输入端*defineSET_HC595_latch(PORTG|=(1<<PG1))*defineCLR_HC595_latch(PORTG&=~(1<<PG1))*defineSET_HC595_sclk(PORTG|=(1<<PG0))*defineCLR_HC595_sclk(PORTG&=~(1<<PG0))*defineSET_HC595_data(PORTG|=(1<<PG2))*defineCLR_HC595_data(PORTG&=~(1<<PG2))*defineSET_HC595_oe(PORTG|=(1<<PG4))*defineCLR_HC595_oe(PORTG&=~(1<<PG4))voidHC595_port_init(void);//595端口初始化voidHC595_Send_Data(unsignedcharbyte);//发送一个字节voidHC595_Output_Data(unsignedchardata);//发送字符串*endif同时我们将与74HC595相关的函数定义部分放在74HC595.c文件中,如下/********************************74hc595.c**************************************/*include"hc595.h"//595端口初始化voidHC595_port_init(void){PORTG=0*00;DDRG|=(1<<PG0)|(1<<PG1)|(1<<PG2)|(1<<P
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年新疆英吉沙县事业单位公开招聘工作人员考试题含答案
- 2024年新疆特克斯县事业单位公开招聘工作人员考试题含答案
- 2024年新疆尼勒克县事业单位公开招聘工作人员考试题含答案
- 新设高校管理办法
- 成人学校管理办法
- 效率体系管理办法
- 材料加强管理办法
- 招生差旅管理办法
- 影视资助管理办法
- 报关岗位管理办法
- GB/T 15738-2008导电和抗静电纤维增强塑料电阻率试验方法
- 2023年三亚琼海市文化和旅游系统事业单位招聘笔试模拟试题及答案
- DB63-T 949-2020锅炉安全使用管理规范
- 控制计划CP模板
- 出生缺陷定义及分类和预防要求
- 人民币上的风景
- 华南理工大学发酵工厂设计管道设计与布置
- 内科临床典型病例分析
- 观音神课三十二卦
- 云南省用人单位解除(终止)劳动合同证明书(存根)
- 电子评标专家操作手册doc
评论
0/150
提交评论