单片机经典教程 - 图文(7)

2019-07-13 16:05

时200mS )的次数来实现,以每拍800mS 的节拍时间为例,一拍需要调用D200 子程序4 次,同样的道理,半拍就需要调用2 次,由此就演奏出了上面的乐曲。

单片机经典教程20 单片机的定时与中断实验

现在来看一看外部计数和外部中断的实验,在实际的工程应用中计数器会有两种要求:第一种,将计数的值显示出来,象录音机上的计数器、汽车上的里程表等等;第二种,计数值到一定值后即中断报警,如前面提到的生产线上的计数、定长定量仪等等。接下来我们先来做一个外部计数器的实验。要将外部计数的值显示出来,最好是用数码管,可我们还没有讲到这一部份,为了避免把问题复杂化,我们用P1 口的8 个LED 来显示计到的数据。为了完成这个实验,我们需要用到一套附件,它的作用就是输出一个宽度为500mS 的方波,这套附件不在我们的实验板上。为了节约大家的学习费用,我特地做了几套供大家借用,各位可以到我这儿来借,免费使用,不过请各位爱惜哦,不要搞坏了。有了这套附件就可以完成我们的实验了。我们把附件的两根线分别连接到实验板的电源接口和单片机的15 脚(也就是T1 的输入端)。实验的程序如下:一.计数器实验一程序如下: ORG 0000H ; AJMP START ; ORG 0030H ; START:MOV SP,#5FH ; MOV TMOD,#01000000B ; 定时/计数器1 作计数用,T0 不用全置“0” SETB TR1 ;启动T1 开始运行 LOOP:MOV A,TL0 ; MOV P1,A ; AJMP LOOP ; END。运行这个程序,看到了什么?随着LED 的闪烁,实验板上的8 个LED 也在不断地变化,注意观察,是不是按二进制:00000000,00000001,00000010,00000011 ,??这样的顺序在变呢?对了,这就是TL0 中的数据。不过这个实验还看不出什么名堂,接着做第二个实验:二.计数器实验二程序如下: ORG 0000H ; AJMP START ;ORG 001BH ; AJMP TIMER1 ;定时器1 的中断处理ORG 0030H ; START:MOV SP,#5FH ; MOV TMOD,#01010000B ; 定时/计数器1 作计数用,工作方式1,T0 不用置“0” MOV TH1,#0FFH ; MOV TL1,#0FAH ;预置值,每计到6 个脉冲即为一个事件 SETB EA ; SETB ET1 ;开总中断和定时器1 中断允许 SETB TR1 ;启动定时/计数器1 开始运行 AJMP $ ; TIMER1:PUSH ACC ; 这个程序完成的工作其实很简单,就是每6 个计数脉冲到来后取反一次P1.0,因此实验的结果应当是:15 脚接的LED 亮、灭6 次,则P1.0 口所接的LED 就亮或灭一次,这就是我们对输入脉冲的计数,也就是每6 个计数产生一次中断。这段程序中有一个符号以前没见过,需要给大家解释一下,AJMP $,“$”我们称为标识符,它的作用是指这段指令的开始处,(注意?:是标号以后的这段指令),在这里,它的意思就是跳转到标号START 处执行,它的作用同AJMP START 是一样的。那为什么要这样写呢?就是为了方便,如果您觉得不习惯,直接写AJMP START 也是一样的。这两个实验需要附件,如果您觉得做起来不大方便,没关系,我们接着来做第三个实验,采用两个定时/计数器合用,一个作为定时器用,一个作为计数器用,来实现P1.1 的延时,这可以直接在我们的实验板上完成。三.两个定时/计数器合用的延时实验采用两个定时/计数器,其中T0 作为定时器用,工作方式为方式1,T1 作为计数器用,计数次数为1000 次。T0 溢出时,产生一个间隔为60mS 的方波(也就是让LED3 各亮灭60mS),然后把P1.2 的输出作为T1 的计数脉冲,T1 计数溢出时(满1000 次),取反一次P1.1,产生一个周期为2 秒的方波(即LED2 每2 秒闪烁一次)。程序如下: ORG 0000H ; AJMP MAIN ; ORG 000BH ;定时器T0 的中断入口 AJMP T_0 ;转T0 中断服务程序 ORG 001BH ;定时器T1 的中断入口 AJMP T_1 ;转T1 中断服务程序 ORG 0030H ; MAIN:MOV TMOD,#51H ;T1 为计数器方式1,T0 为定时器方式1 MOV TH0,#15H ;设置T0 初值 MOV TL0,#0A0H ; MOV TH1,#0FCH ;设置T1 初值 MOV TL1,#18H ; MOV IE,#8AH ;允许 T0、T1 中断 SETB TR0 ;启动定时器T0 SETB TR1 ;启动定时器T1 LL:SJMP LL ;循环T_0:MOV TH0,#15H ;给T0 重新赋值 MOV TL0,#0A0H ; CPL P1.2 ;定时到,取反P1.2 RETI ; T_1:MOV TH1,#0FCH ;给T1 重新赋值 MOV TL1,#18H ; 把程序下载到单片机,看到什么?LED3 在不断的闪烁,这就是T0 的作用,闪烁的周期是多少,请大家计算一下。接下来,把P1.2(也就是3 脚)和P3.5(也就是T1)的输入端相连接,是不是接在P1.1 上的LED2 每2 秒闪烁一次。对了,这就是T1 作计数器的结果。在这段程序里,有一点请大家注意?,第四条—AJMP T_0, 为什么要在T 和0 之间加上一条横线,而不直接用T0 呢?原来在MCS—51 系列单片机中,是不能用T0、T1、INT、RET、IP、PSW 等等内部名称作为标号的,如果这样做的话,编译软件会出错,这点我们好象很早以前曾经提到过。接下来我们再来做一个外部中断的实验:四.外部中断实验程序如下: ORG 0000H ; AJMP START ; ORG 0003H ;外部中断0 地址入口AJMP INTO ;ORG 30H ;START: MOV SP,#5FH ; MOV P1,#0FFH ;灯全灭 MOV P3,#0FFH ;P3 口置高电平 SETB EA ; SETB EX0 ; AJMP $ ; INTO:PUSH ACC ; PUSH PSW ; CPL P1.0 ; POP PSW ; POP ACC ; RETI ; END。本程序的功能就是按一次按键S1(接在P3.2 引脚上的),就引发一次外部中断(INT0=0),取反一次P1.0,因此理论上按一下灯亮,再按一下灯灭,有点象我们工程应用中的自锁开关。不过这段程序在实际的实验中,可能会发觉有时不很“灵”,按了它没反应,但在大部份时候还是对的,这是怎么回事呢?其实这是因为按键没有作“去抖动”处理,也就是说,理论上我们是按了一次键,但由于计算机的处理速度很快,计算机实际上却认为已经按了好多次了,如何来解决这个问题呢?这就需要我们对按键作去抖动处理,什么是按键的去抖动处理,我们下一课讨论键盘接口时再作详细解释。 单片机经典教程21 键盘的工作原理和编程方法

键盘接口和数码管接口是构成单片机人机界面的主要方法,对于一个初学者来说,这部分的内容也是较难的,我们将用四节课的时间来学习这方面的知识。这一课先来讨论键盘的接口原理与编程方法。

键盘是单片机应用系统不可缺少的重要输入设备,主要负责向计算机传递信息,我们可以通过键盘向计算机输入各种指令、地址和数据。它一般由若干个按键组合成开关矩阵,按照其接线方式的不同可分为两种:一种是独立式接法,一种是矩阵式接法(如下面的图),这一课先来讲解独立式键盘的工作原理和编程方法。一.独立式键盘的工作原理和编程方法

独立式键盘具有结构简单,使用灵活等特点,因此被广泛应用于单片机系统中,那么它是如何来工作的呢?我们慢慢往下看: 1.独立式键盘的接线原理

独立式键盘是由若干个机械触点开关构成的,把它与单片机的I/O 口线连起来,通过读I/O 口的电平状态,即可识别出相应的按键是否被按下,看下面的电路图:

如果按键不被按下,其端口就为高电平;如果相应的按键被按下,则端口就变为低电平。在这种键盘的连接方法中,我们通常采用上拉电

阻接法,即各按键开关一端接低电平,另一端接单片机I/O 口线并通过上拉电阻与VCC 相连,如上图所示。这是为了保证在按键断开时,各I/O 口线有确定的高电平,当然,如果端口内部已经有上拉电阻,则外电路的上拉电阻可以省去,想想看,哪几个并行口内部是有上拉电阻的?

通常我们用来做键盘的按键有触点式和非触点式两种,单片机中应用的一般是由机械触点构成的触点式微动开关。这种开关具有结构简单,使用可靠的优点,但当我们按下按键或释放按键的时候它有一个特点,就是会产生抖动,看上图的按键脉冲波形,这种抖动对于人来说是感觉不到的,但对单片机来说,则是完全可以感应到的,因为计算机处理的速度是在微秒级的,而机械抖动的时间至少是毫秒级,对计算机而言,这已是一个很“漫长”的过程了。下面我们通过一个实验来验证一下,实验程序如下: ORG 0000H ; AJMP START ; ORG 0030H ; START:MOV SP,5FH ;

把这个程序下载到单片机,我们会发现,当按下相应的按键时,灯并不是想象中的按一下亮,再按一下就灭,而是有时灵,有时不灵,为什么会这样呢?原来,当你按了一次按键,可是单片机却早已执行了好多次,如果执行的次数正好是奇数次,那么结果正如您所料;如果执行的次数是偶数次,那结果就不对了。为了使CPU 能正确地读出端口的状态,对每一次按键只作一次响应,就必须考虑如何去除按键的抖动。

2.按键的去抖动原则和方法

常用的去抖动的方法有两种:硬件方法和软件方法。硬件去抖动的方法很多,好多书都有介绍,这不在我们的讨论范围。单片机中常用软件去抖动法,软件法其实很简单,就是在单片机获得端口为低电平的信息后,不是立即认定按键已被按下,而是延时10 毫秒或更长一些时间后再次检测该端口,如果仍为低,说明此键的确被按下了,这实际上是避开了按键按下时的抖动时间;而在检测到按键释放后(端口为高电平时)再延时5-10 毫秒,消除后沿的抖动,然后再对按键进行处理,不过一般情况下,我们通常不对按键释放的后沿进行处理,实践证明,也能满足通常的要求。下面我们把前面的程序改一下,看看按键的去抖动是如何实现的。看下面的程序: ORG 0000H ; AJMP START ; ORG 0030H ; START:MOV SP,#5FH ; MOV P1,#0FFH ;

MOV P3,#0FFH ; L1:JB P3.4,L2 ;P3.4 为“1”,不做处理,转P3.5 LCALL D10mS ; 调用延时程序

JB P3.4,L1 ; P3.4 为“0”,说明此键确实被按下了

CPL P1.0 ; 去除抖动后取反P1.0 L3:JNB P3.4,L3 ;直到P3.4 释放后转去判断第二个键L2:JB P3.5,L1 ;P3.5 为“1”,返回去继续处理P3.4

LCALL D10mS ; 调用延时程序

JB P3.5,L2 ; P3.5 为“0”,说明此键确实被按下了

CPL P1.1 ; 去除抖动后取反P1.1 L4:JNB P3.5,L4 ;直到P3.5 释放为止 LJMP L1 ;返回D10mS:MOV R7,#50 ;延时的时间一般为10-20mS D1:MOV R6,#200 ; D2:DJNZ R6,D2 ;

把这段程序写入单片机,试试看,是不是行了,这就是独立式按键去抖动的基本方法。不过这个程序在实际应用中并没有多大的意义,因为如果按键数量比较多的话,程序就会变得很长,为什么会这样呢?因为这里我们采用了直接寻址的方式,如果我们把键值放入一个表格中,再通过查表程序来判断到底是哪个按键被按下了,再去处理相应的程序就会很简单,想想看,该怎么做? 二.独立式键盘的编程方法

我们刚才的程序演示了按键的去抖动原理和基本方法,接下来让我们做一个按键使用的实验来验证一下,大家看附图的电路图,我们的实验板上有4 个按键分别接到了P3 口的P3.3,P3.4,P3.5,P3.6 引脚上,现在我们用P3.3,P3.4,P3.5 和P3.6 这四个按键来做一个实验。实验之前,先定义各个按键的功能:

A.P3.3 开始,按此键则灯开始流动(由左向右) B.P3.4 停止,按此键则停止流动,所有灯为灭C.P3.5 向左,按此键则灯反向流动(由右向左)D.P3.6 向右,按此键则灯正向流动(由左向右) 实验程序如下:

UpDown EQU 00H ; 上下行标志

StartEnd EQU 01H; 起动及停止标志

LampCode EQU 21H; 存放流动的数据代码

ORG 0000H ; AJMP MAIN ; ORG 30H ; MAIN:MOV SP,#5FH ;MOV P1,#0FFH ; CLR UpDown ;启动时处于向上的状态 CLR StartEnd ;启动时处于停止状态 MOV LampCode,#0FEH;单灯流动的代码 LOOP:ACALL KEY ;调用键盘程序 JNB F0,LNEXT ;如果无键按下,则继续 ACALL KEYPROC ;否则调用键盘处理程序 LNEXT:ACALL LAMP ;调用灯显示程序 KEYPROC:MOV A,B ;从B 寄存器中获取键值

JB ACC.2,KeyStart ;分析键的代码,某位被按下,则该位为”1”(在键盘程序中已取反) JB ACC.3,KeyOver ; JB ACC.4,KeyUp ; JB ACC.5,KeyDown ;

AJMP KEY_RET ; KeyStart:SETB StartEnd ;第一个键按下后的处理

AJMP KEY_RET ; KeyOver:CLR StartEnd;第二个键按下后的处理 AJMP KEY_RET ; KeyUp:SETB UpDown ;第三个键按下后的处理 AJMP KEY_RET ; KeyDown:CLR UpDown ;第四个键按下后的处理

K_RET:ORL P3,#01111000B ;此处循环等待键的释放 MOV A,P3 ; ORL A,#10000111B ; CPL A ; JZ K_RET1 ;直到读取的数据取反后为”0”说明键释放了,才从键盘处理程序返回AJMP K_RET ; K_RET1:RET ; D500mS: ;;

LAMP:JB StartEnd,LampStart ;如果MOV A,LAMPCODE ; RL A ;实际就是左移位 MOV LAMPCODE,A ; MOV P1,A ; LCALL D500mS ; AJMP LAMPRET ;

LAMPUP:MOV A,LAMPCODE ; RR A ;向下流动实际就是右移 MOV LAMPCODE,A ; MOV P1,A ; LCALL D500mS ; LAMPRET:RET ; END。

这段程序是我们到目前为止最长的程序,相信大多数指令大家应该能看懂,开始三条,UpDown EQU 00H;StartEnd EQU 01H;LampCode EQU 21H 给大家解释一下,EQU 叫做等值伪指令,它的功能是将一个常数或者特定的符号赋予规定的字符串。什么意思呢?举个例子:

ORG 200H;ABC EQU R6;MOV A,ABC;这里将ABC 等值为寄存器R6,也就是说,在指令中,R6 这个寄存器可以用字符串ABC 来代替, 为什么要这样写呢?当然是为了增加程序的可读性,不过有一点大家要记住了,这里使用的字符串不是标号,不能用“:”来做分隔符,比如这样写ABC:LJMP START ;如果加上“:”汇编程序会出错;当然,用EQU 指令除了可以赋值数据地址外,还可以赋值直接地址或者直接当作一个立即数来使用,例如:

ABC EQU 10H;DELAY EQU 05AFH;MOV A,ABC;LCALL DELAY;这里ABC 赋值以后被当作了直接地址使用;而DELAY 被赋值以后则成了一个16 位的地址,用作 子程序的入口。

如此一来,上面的三条指令也就很清楚了。这里有一个问题大家需注意?:使用EQU 伪指令必须先赋值,后使用。 既然讲到了赋值伪指令,我们再讲一下另外三条赋值伪指令. A.位地址定义伪指令BIT

它的功能是将一个可直接寻址的位地址赋予所规定的字符名称,例如: ABC BIT P1.0;把P1.0 赋值给ABC,即字符串ABC 就是直接寻址位P1.0。

这里注意?:与EQU 不同的是,这条指令只能对位地址赋值,而不能对寄存器或直接地址和立即数赋值。相反,EQU 指令却可以用来定义位地址变量,不过这时所赋的值应当是具体的位地址值。比如P1.0 要用90H 来代替;P2.0 要用AOH 来代替等等。 B.内部RAM 定义伪指令DATA

它的功能是给一个8 位的内部RAM 起一个名称,例如:ABC DATA 20H;把内部RAM 的20H 定义为ABC。 C.外部RAM 定义伪指令XDADT

给一个8 位的外部RAM 起一个名称,例如:

ABC XDATA 0ACH ;由于89C51 的内部RAM 寻址范围为00H-FFH ,所以这个地址必然大于FFH 。讲了赋值伪指令,再回到上面的按键程序,这段程序的功能虽然很简单,但它演示了一个键盘处理程序

的基本思路,程序本身很简单,也不很实用,实际工作中还会有好多要考虑的因素,比如主循环每次都调用了灯的循环程序,会造成按键反应“迟钝”;而如果一直按着键不放,则灯不会再流动,一直要到松开手为止,大家可以仔细考虑一下这些问题,想想有什么好的解决办法。

独立式键盘除了上面介绍的这种连接方法,我们还可以采用上图右边所示的连接方法,用一个“与非”门把四个输入端连接起来,当有任何一个按键按下时,都会使“与非”门输出为低电平,从而引起单片机的中断,它的好处是不用在主程序中不断地循环查询了,如果有键按下,单片机就去作相应的处理。

单片机经典教程22 矩阵式键盘的连接方法和工作原理

StartEnd=1,则启动 MOV P1,#0FFH ; AJMP LAMPRET ;否则关闭所有显示,返

回 LampStart:JB UpDown,LAMPUP ;如果UpDown=1,则向上流动

间 PUSH PSW ; SETB RS0 ; MOV R7,#200 ; D51:MOV R6,#250 ; D52:NOP NOP NOP NOP DJNZ R6,D52 ; DJNZ R7,D51 ; POP PSW ; RET

什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩阵形式,如下图所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。比如再多加一条线就可以构成20 键的键盘,而直接用端口线则只能多出一个键(9 键)。由此可见,在需要的按键数量比较多时,采用矩阵法来连接键盘是非常合理的。 矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。这样,当按键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下所述:二.矩阵式键盘的按键识别方法

确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。行扫描法又称为逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。因此我们就以“行扫描法”为例介绍矩阵式键盘的工作原理: 1.判断键盘中有无键按下

将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表示键盘中无键按下。 2. 判断闭合键所在的位置

在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平(即在置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 下面给出一个具体的例子:

单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4 位,也就是把列线P1.0-P1.3 分别接4 个上拉电阻到电源,把列线P1.0-P1.3 设置为输入线,行线P1.4-P1.7 设置为输出线,4 根行线和4 根列线形成16 个相交点,如上图所示。

检测当前是否有键被按下:检测的方法是P1.4-P1.7 输出全“0”,读取P1.0-P1.3 的状态,若P1.0-P1.3 为全“1”,则说明无键闭合;否则有键闭合。

去除键抖动:当检测到有键按下后,延时一段时间再做下一次的检测判断,若仍有键按下,应识别出是哪一个键闭合,方法是对键盘的行线进行扫描,P1.4-P1.7 按下述4 种组合依次输出:P1.7 1110;P1.6 1101;P1.5 1011;P1.4 0111 ;在每组行输出时读取P1.0-P1.3 ;若全为“1”,则表示为“0”这一行没有键闭合;否则就是有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值。为了保证按键每闭合一次CPU 仅作一次处理,必须去除键释放时的抖动。举个实例: 三.矩阵式键盘的实验程序 ORG 0030H ;

SCAN:MOV P1,#0FH ; MOV A,P1 ; ANL A,#0FH ; CJNE A,#0FH,NEXT1 ; SJMP NEXT3 ; NEXT1:ACALL D20Ms ; CJNE A,#0FH,KCODE ; MOV A,R1 ; SETB C ; RLC A ; JC NEXT2 ; NEXT3:MOV R0,#00H ;

RET ; KCODE:MOV B,#0FBH ; NEXT4:RRC A ; INC B ; JC NEXT4 ; MOV A,R1 ;

CJNE A,#0FH,NEXT6; MOV R0,#0FFH ; RET ; END。

单片机经典教程23 单片机的键盘接口与编程

如果说键盘构成的是单片机的输入系统,那么数码管就是单片机的输出系统,和学会使用键盘接口一样,学会数码管的接口与编程对单片

机的开发同样有着十分重要的意义。这一课我们就来讲解数码管的接口与编程方法:一.LED 数码显示器的连接与显示方法 在单片机系统中,通常用LED 数码显示器来显示各种数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。那么数码管是如何工作的呢?我们学习数字电路时讲过,可能大家都忘得差不多了,这里我再从头给大家讲一遍,您可不要觉

得我烦哦!

还记得我们小时候玩过的“火柴棒游戏”吗,几根火柴棒组合起来,可以拼成各种各样的图形,LED 显示器实际上就是利用这个原理做成

的。

八段LED 显示器由8 个发光二极管组成。其中7 个长条形的发光管排列成一个“日”字形,另一个圆点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED 显示器有两种不同的连接形式:一种是8 个发光二极管的正极连在一起,称之为共阳极LED 显示器;另一种是8 个发光二极管的负极连在一起,称之为共阴极LED 显示器。共阳和共阴结构的LED 显示器各笔划段名的安排位置是相同的,当二极管导通时,相应的笔划段就发亮,由发亮的笔划段组合而显示出各种字符。8 个笔划段h(在许多书中用dp 来表示,其实是一个意思)gfedcba 对应于一个字节(8 位)的D7 D6 D5 D4 D3 D2 D1 D0, 于是用8 位二进制码就可以表示欲显示字符的字形代码。例如,对于共阴LED 显示器,当公共阴极接地(零电平),阳极hgfedcba 各段为01110011 时,显示器就显示“P”字符,即“P”字符的字形码是73H ;而如果是共阳极LED 显示器,公共阳极接高电平,显示“P”字符的字形代码应为10001100(8CH),也就是

与73H 的各位相反。这里必须注意?的是:很多产品为了方便接线,常常不按照规则的方法去对应字段与位的关系,这时字形码就必须根据接线来自行设计了。后面我们会给出一个例子让大家参考,那么数码管和单片机的接口又是如何连接的呢?请继续往下看:二.LED 数

码管的静态显示方法

在单片机的应用系统中,数码管显示器的显示常采用两种方法:静态显示和动态扫描显示。所谓静态显示,就是把多个LED 显示器的每一段与一个独立的并行口连接起来,而公共端则根据数码管的种类连接到“VCC ”或“GND ”端,这种连接方式的每一个显示器都要占用一个单独的具有锁存功能的I/O 端口,用于笔划段字形代码,单片机只需把要显示的字形代码发送到接口电路,就不用再管它了,直到要显示新的数据时,再发送新的字形码。因此,使用这种方法当显示位数较多时单片机中I/O 口的开销很大,需要提供的I/O 接口电路也较

复杂,但它具有编程简单,显示稳定,CPU 的效率较高的优点。

MCS-51 单片机串行口方式称为移位寄存器方式,外接6 片74LS164 作为6 位LED 显示器的静态显示接口,我们把单片机的RXD 作为数据输出线,TXD 作为移位时钟脉冲。74LS164 为TTL 单向8 位移位寄存器,可实现串行输入,并行输出。其中A、B(1、2 脚)为串行数据输入端,2 个引脚按逻辑“与”运算规律输入信号,只有一个输入信号时可并接。T(8 脚)为时钟输入端,可连接到串行口的TXD 端。每一个时钟信号的上升沿加到T 端时,移位寄存器移一位,8 个时钟脉冲过后,8 位二进制数全部移入74LS164 中;R(9 脚)为复位端,当R=0 时,移位寄存器各位复“0”,只有当R=1 时,时钟脉冲才起作用。Q1??Q8(3-6 脚和10-13 脚)为并行输出端,分别接到LED 显

示器的hgfedcba 各段对应的引脚上。

关于74LS164 还可以作如下的介绍:所谓时钟脉冲端,其实就是需要高、低、高、低的脉冲,不管这个脉冲是怎么来的,比如,我们用根电线,一端接T,一端用手拿着,分别接高电平、低电平,那也是给出时钟脉冲,在74LS164 获得时钟脉冲的瞬间(再讲清楚点,是在脉冲的前沿),如果数据输入端(1,2 脚)是高电平,则就会有一个“1”进入到74LS164 的内部;如果数据输入端是低电平,则就会有一个“0”进入其内部。在给出了8 个脉冲后,最先进入74LS164 的第一个数据到达了最高位,然后再来一个脉冲会有什么情况发生呢?第

一个脉冲就会从最高位移出,就象车站排队买票,栏杆就那么长,要从后面进去一个人,就必须要从前面走出去一个人才行。 搞清了这一点,让我们再来看电路图(电路图在后面的附录中),6 片74LS164 首尾相串,而时钟端则连接在一起,这样,当第一次输入8 个脉冲时,从单片机RXD 端输出的数据就进入到了第一片74LS164 中了;而当第二次8 个脉冲到来后,这个数据就进入到了第二片74LS164 ,新的数据则进入了第一片74LS164 中??这样,当第六次8 个脉冲完成后,首次送出的数据被送到了最左面的74LS164 中,其他的数据则依次出现在第一、二、三、四、五片74LS164 中。这里有个问题,在第一次8 个脉冲到来时,除了第一片74LS164 中接收数据外,其他各片在干吗呢?它们也在接收数据,因为它们的时钟端都是被接在一起的,可是数据还没有送到其他各片呢,它们在接收什么数据呢?其实所谓数据不过是一种说法而已,它实际上就是电平的高或低。当第一次8 个脉冲到来时,第一片74LS164 固然是从单片机接收数据了,而其它各片也接到前一片的Q8 上,而Q8 是一根电线,在数字电路中它只可能有两种状态:低电平或高电平,也就是“0”和“1”。所以它的下一片74LS164 也相当于是在接收数据,只是接收的全部是“0”或“1”而已。这个问题放在这儿来讲,可能有的朋友不屑一顾,而有的朋友可能还是不清楚,这实际上涉及到数的本质的问题,如果不懂,请并回到前面的内容再仔细的复习一遍,或找一些数字电路方面的书籍看一下。理解了74LS164 的工作原理,再来看这个问题就会变得简单多了,这里就算给大家留个习题吧,希望大家务

必把74LS164 的工作原理搞清楚,搞懂了这一点,您的级别就超过初级了,变成中级了。

接下来让我们做一个实验,做这个实验也需要一套附件,这套附件由于大家只用一次,所以我没有把它卖给大家,各位一样可以到我这儿

来借,同样免费使用,不过还是那句老话,请各位多多爱惜哦,不要把它搞坏了。 我们把附件的两根线连接到实验板的P3 口扩展插座和实验仪的电源接口上,先看实验要求: 输入:把要显示的数分别放在显示缓冲区60H-65H 共6 个单元中,并且分别对应各个数码管LED1-LED6。 输出:将预置在显示缓冲区中的6 个数转换成相应的显示字形码,然后输出到显示器中显示出来。

START:MOV SP,#6FH;

MOV 65H,#0 ; MOV 64H,#1 ; MOV 63H,#2 ; MOV 62H,#3 ; MOV 61H,#4 ; MOV 60H,#5 ; LCALL DISP ; SJMP $ ;

DISP:MOV SCON,#00H ;初始化串行口方式0 MOV R1,#06H ;显示6 位数 MOV R0,#65H ;60H-65H 为显示缓冲区 MOV DPTR,#SETTAB ;字形表的入口地址 LOOP:MOV A,@R0 ;取最高位的待显示数据 MOVC A,@A+DPTR ;查表获取字形码 MOV SBUF,A ;送串口显示 DELAY:JNB TI,DELAY ;等待发送完毕 CLR TI ;清发送标志 DEC R0 ;指针下移一位,准备取下一个待显示数 DJNZ R1,LOOP ;直到6 个数据全显示完 RE

T ;

SETTAB: ;字形表,前面有介绍,后面我们会介绍字形表的制作 DB 03H,9FH,27H,0DH,99H,49H,41H,1FH,01H,09H,0FFH;

END。

如果按图示数码管排列,则以上程序将显示543210。


单片机经典教程 - 图文(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:某工程监理大纲

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: