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

2019-07-13 16:05

清零,也就是让LED1亮,然后再去执行第4条指令,执行完后又回到6.7.8.9.10

条指令,最后执行第5条指令:LJMP MAIN,也就是我们刚才说的跳转到第1条,将P1.0置位,就是LED1 灭掉。如此周而复始,LED1就不断的闪烁。好好理解这段文字,务必把它搞清楚!!!

从标号DELAY处(即第6条)开始到RET的这一段指令我们称之为子程序,它是一段延时程序,至于延时多长时间,我们会在以后的课程中学习。程序的最后一条是END,它不是指令,它只是告诉编译软件整个程序到此结束了,它叫“伪指令”。在大家以后的编程中,写完程序都要加上这一条。

在上面的程序中我们知道了从标号DELAY开始的子程序是一段延时程序,那么它又是如何工作的呢?在了解它的工作过程之前我们必须先知道其中的一些符号,就从R7开始吧,它是单片机内部的一个重要组成部分,叫工作寄存器,什么是工作寄存器?下面我们就来讲解这个问题: 二.工作寄存器

上一课我们已经讲过,在单片机中有许多的功能寄存器和半导体存储器RAM有关,那么工作寄存器又属于哪一部分呢?它是用来干什么的呢?要搞清楚这个问题,让我们先从日常生活中的一个例子说起,如我们要做一道数学题123+456,您会马上得出答案:579,接下来再看一道题:

123+456+789,要你马上得出答案就不那么容易了,通常我们会怎么做呢?一般总是先把123+456的结果

579写在一张纸上,然后再算579+789=1368,这1368就是我们想要的最终结果,而579只是为了得到最终结果而暂时记下来的中间结果,单片机中做运算和我们生活中做运算一样,也需要把中间结果放在某个地方,那么计算机把它放在哪儿呢?前面我们提到的ROM(只读存储器)中,不行!因为ROM是用来存放程序的,它只能写进去,能读出来(再次提醒一下,这只是相对而已),所以只能放在单片机的另一个区域—RAM中(即随机存取存储器)中。R7就是RAM区域中划出的一部分。知道了R7,接下来让我们来分析一下这段子程序(延时程序)。

三.LED灯闪烁程序子程序的分析

首先看第6条,MOV R7,#250,这也是一条指令,意思是传递数据。我们知道在日常生活中,要传递一件东西就必须要有一个传递者,一个接受者和被传递的东西,那么在单片机中是怎么区分它们的呢?在这条指令中,R7是接受者,250就是要传递的东西(单片机中要传递的东西当然是数字了),这

里传递者被省略了(顺便提一下,并不是每条指令都能省略的,事实上大部分的指令都要有传递者)

,这样一来,这条指令的意思也很清楚了:就是把250这个数传递给R7这个工作寄存器(也就是把250个数送入R7中),这样执行完这条指令后R7中的值就应该是250,我们可以用DUBG8051这个软件来验证一下,看是不是符合。讲到这里,不知大家注意没有,在250这个数的前面有个#,它是什么意思呢?这个#就说明250是一个被传递的数的本身,而不是传递者。看懂了MOV R7,#250,那么MOV R6,#250也应该很清楚了。

接着看第8条DJNZ R6,D2,这又是另一条指令,我们来看一下DJNZ后面跟着什么,一个是R6,一个是D2,R6我们已经知道了,再找一下D2,D2在本行的开头,我们已经学过,它是标号。那么这条指令是怎么执行的呢?它的执行过程是这样的:它将后面的值(即工作寄存器R6中的值)减1,然后查一下这个值是否等于“0”,如果等于“0”就往下执行,如果不等于“0”就转移,转移到什么地方去呢?大家应该明白了,实际上这条指令的执行结果就是在原地转250次;当R6中的值等于“0”之后,程序就去执行第9条指令,也就是DJNZ R7,D1,大家自行分析一下这条指令的结果(是不是转去执行MOV R6,#250,同时R7中的值减1),这段子程序的最终执行结果就是DJNZ R6,#250这条指令被 16 执行了250*250=62500次,执行这么多次干吗?就是为了延时。 单片机经典教程5 单片机内部结构(三) 1.时序的由来

已经知道单片机执行指令的过程就是顺序地从ROM(程序存储器)中取出指令一条一条的顺序执行,然后进行一系列的微操作控制,来完成各种指定的动作。它在协调内部的各种动作时必须要有一定的顺序,换句话说,就是这一系列微操作控制信号在时间上要有一个严格的先后次序,这种次序就是单片机的时序。就好比学校上课时用的电铃,为了保证课堂秩序,学校就必须在铃声的统一协调下安排各个课程和活动。那么单片机的时序是如何规定的呢?接着往下看: 2.时序的周期

计算机每访问一次存储器的时间,我们把它称为一个机器周期,它是一个时间基准,就象我们日常生活中使用的秒一样,计算机中一个机器周期包括12 个振荡周期,什么是振荡周期?一个振荡周期是多少时间?振荡周期就是振荡源的周期,也就是我们使用的晶振的时间周期,一个12M 的晶振,它的时间周期是多少,如果电子技术学得好的朋友应该不难算出(T=1/f),也就是1/12 (微秒),那么使用12M 晶振的单片机,它的一个机器周期就应该等于12*1/12(微秒),也就是1μS。

在MCS-51 系列单片机中,有些指令只要一个机器周期,而有些指令则需要两个或三个机器周期,另外还有两条指令需要4 个机器周期,这也不难理解,你在家擦地板的话总比擦桌子的时间要长,不过我可是大男子主义,从来不做家务的。开句玩笑!!!如何衡量指令执行时间的长短?我们就要用到一个新的概念:指令周期—即执行一条指令所需的机器周期,INTEL 公司规定了每一条指令执行的机器周期,当然这不需要我们非把它记住,不过在这里DJNZ 指令我们是要记住的,它是双周期指令,执行一次需要两个机器周期,即2μS。(12M 晶振的话),回到我们上一课的实验,延时的时间就应该算出来了吧,是62500*2μS=125000μS,也就是125mS 。这么大的数字也就0.125S,怪不得LED1 闪烁的这么快。二.单片机的时钟电路,单片机是在一定的时序控制下工作的,那么时序和时钟又有什么关系呢?时钟是时序的基础,单片机本身就如同一个复杂的同步时序电路,为了保证同步工作方式的实现,电路就要在唯一的时钟信号控制下按时序进行工

作。那么单片机内的时钟是如何产生的呢? 1. 内部时钟电路

在MCS-51 单片机的内部有一个高增益的反相放大器,其输入端为引脚XTL1(19),输出端为XTL2

我们只要在外部接上两个电容和一个晶振,就能构成一个稳定的自激振荡器,它的内部电路的工作原理就不介绍了,这里主要讲一下电容和晶振的选择,看上面的图,晶振的大小与单片机的振荡频率有关,我们到串行接口时再详细讲解,电容的大小影响着振荡器振荡的稳定性和起振的快速性,通常选择10-30P 的瓷片电容或校正电容;另外在设计电路时,晶振和电容应尽可能的靠近芯片,以减少PCB 板的分布电容保证振荡器振荡工作的稳定性,提高系统的抗干扰能力 2. 外部时钟电路

除了内部时钟方式外,单片机还可以采用外部引入时钟的振荡方式,什么时候需要采用外部时钟方式呢?当我们的系统由多片单片机组成时,为了保证各单片机之间时钟信号的同步,就应当引入唯一的公用的外部脉冲信号作为各单片机的振荡脉冲,此时应将XTAL2 悬空不用,外部脉冲信号由XTAL1 引入,如上右图所示,外部信号的高低电平持续时间应大于20mS,

单片机经典教程6 单片机内部结构(四) 一、单片机I/O 口的输出实验 1.实验程序 程序如下:

LOOP:MOV P1,#0FFH ; LCALL DELAY ; MOV P1,#00H ; LCALL DELAY ; LJMP LOOP

调试,写入源代码,编译,下载,看到了什么?8 只LED 灯都在闪烁(注意:前面的实验是让一个LED 灯闪烁),分析一下程序: 2.程序分析

这段程序和前面的程序比较,有两处不同,第1 条,原来是SETB P1.0,现在改为MOV P1,#0FFH,第3 条,原来是CLR P1 ,现在改为MOV P1,#00H 。为什么这样改了之后就变成了8 只LED 灯同时闪烁了?原来P1 代表了P1.7-P1.0 的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存储器单元送数就应该用MOV 指令了;在这里P1(P1.7-P1.0 )接的是LED 灯(也就是负载),它起到了一个输出端的作用。那如果把P1 改为P2 或P3 或P4 行不行呢?答案是肯定的,为什么?我们稍后再谈,接着看第2 个实验。二.单片机I/O 口的输入实验 1.实验程序 程序如下:

MAIN:MOV P3,#0FFH ;

把程序下载到单片机,按下第1 个按钮,第1 个LED 灯亮了,按下第2 个按钮,第2 个LED 灯亮了,松开按钮,相应的灯就灭了,是不是有点象工业控制中的点动控制原理。分析一下这个程序: 2.程序分析

看附图的硬件接线图,有4 个按钮分别接到了P3.2,P3.3,P3.4,P3.5 ,引脚上。再来分析一下程序,第1 条,使P3 口(包括P3.7-P3.0 )全部为高电平(为什么MOV P3,#0FFH 能使P3 口全部为高电平,我们在下一课中讨论);第2 条MOV A,P3;MOV 我们已经知道,是送数的意思,这条指令的意思就是把P3 口的数送到A 中去,A 是什么呢?我们也可以把它看成一个中间单元,就象R7 寄存器一样,第3 条指令就是把A 中的数送到P1 口去;第4 条是循环,这些我们都已经见过,当我们按下P3.2 所连接的按钮时,#0FFH 这个数就被送到了A 中,通过程序又送到了P1,使P1.2 输出低电平,LED3 就亮了,按下P3.3-P3.5 连接的按钮,对应的LED4-LED6 也亮了,松开按钮,相应的LED 灯就灭了。如果把按钮接到P2.0-P2.7 或P4.0-P4.7 可不可以呢?当然可以。所以在这里P3 口又起到了一个输入端的作用。 由上面两个实验我们得出结论,凡是以P 开头的管脚都可以用作输入输出口,在89C51 中这32 个管脚我们就称之为并行口。它们实际上就是特殊功能存储器SFR (什么是特殊功能寄存器,我们后面再讲)中的四个,记作P0,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢?继续往下看。 三.单片机并行口的结构分析先来看看输入结构: 1.输入结构

I/O 口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。比如取反,置位,清零等等指令;而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表示的就是输入缓冲器,CPU 将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的操作,

这是硬件自动完成的,不需要我们操心。

读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再实行读引脚操作,否则就可能读入出错。为什么?看上面的图,如果不对端口置“1”,端口锁存器原来的状态有可能为“0”(Q 端为0,Q^为1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1”信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备动作,所以这类I/O 口被称为“准双向”口,MCS-51 的P0,P1,P2,P3 口作为输入/输出口时都是“准双向”口。接下来让我们再看另一个问题,从图中可以看出,这四个端口还有一个差别,除了P1 口外,P0,P2,P3 口都还有第二功能,这些第二功能又是作什么用的呢?

2.端口的工作原理(1)。P0 口

先来看P0 口,从图中可以看到,P0 口的内部有一个2 选1 的选择器,受内部信号的控制,如果在图中的位置则处在I/O 口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口线可以独立定义为输入或输出,但是须在口线上加上拉电阻。如果将开关往另一个方向,则就是另一个功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时,输入8 位数据;而当作地址总线用时,则输出8 位地址。再强调一点,当P0 口作为地址/数据总线用之后,就再也不能作I/O 口使用了。讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?这其实是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,知道了P0 口,再来看P1 口。 (2)。P1 口

同P0 不同,P1 口只能作为I/O 口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1,P2,P3 都一样,务必请大家注意。 (3)。P2 口

P2 口作为I/O 口线用时,与P0 口一样,当内部开关向另一个方向时,即作地址输出时,可以输出程序存储器或外部数据存储器的高8 位地址,并与P0 口输出的低地址一起构成16 位的地址线,从而可以分别寻址64K 的程序存储器或外部数据存储器,同样地址线是8 位一起自动输出的,不能象I/O 口线那样逐位定义。 (4)。P3 口

P3 口作为I/O 口线用时,同P1 口相同,也是“准双向口”;不同的是,P3 口的每一位都有另一种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用到时再详细解释。

既然单片机的引脚有第二功能,那么CPU 是如何来区分的呢?这是一个令许多初学者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU 执行到相应的指令,就自动转成了第二功能。了解了各个I/O 口的功能和作用,再来给大家讲解一下单片机I/O 与外围电路的连接方法。 四.单片机I/O 口的连接方法

当单片机的I/O 口作输出时可以直接与外部设备连接,不过由于在实际的应用中,由于其驱动电流是有限的(P0 口10mA,P1,P2,P3 口20mA),所以我们常常需要通过接口电路来扩展它的驱动能力,在单片机的后向通道控制系统中,常用的功率控制器件有机械继电器、晶闸管、固态继电器等等,下面我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法。 1. 单片机与机械继电器的接口

单片机的一个I/O 口只能灌入20mA 的电流,所以往往不足以驱动一些功率开关(比如稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单片机与机械继电器的接口呢?其实很简单,我们通常采用下面的接法(如图),为了防止前向通道信号的干扰,常采用一些光电隔离器件,比如光电耦合器4N25,PC814 等,当单片机的P1.0 脚输出为低电平时,光藕受电导通,Q1 饱和开通,继电器吸合,负载电路接通。这里请注意?:P0-P3 口作输出控制端时,应尽量采用低电平控制方法,这是因为在低电平时,I/O 口允许灌入的电流比高电平时要大,一般情况下,低电平的灌入电流为高电平的4 倍。

另外为了防止电压间的互相干扰,继电器的工作电压VDD 与单片机的工作电压VCC 不要使用同一个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电流,其他的元件就不讲了,大家自行分析一下。讲了单片机与继电器的接口,再来介绍与固态继电器的接口方法,接着往下看: 2. 单片机与固态继电器的接口

普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在某些特殊应用场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器是一种无触点的电子继电器,它的输入端只要很小的控制电流,可以与单片机的I/O 口直接连接;输出则采用双向晶闸管控制,其输入输出间均通过内部光电耦合器隔离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成熟,应用的广泛,价格也已经非常的便宜,1A/250V 的目前在10 元左右,它与单片机的连接方法如图所示,当“-”端所接的P1.0 为低电平时,SSR 导通,负载工作。除了以上两种连接方法外,单片机与TTL,CMOS 管等都可以连接。.

单片机经典教程7 单片机内部结构(五)

讲到了指令MOV P3,#0FFH 能使P3 口全部为高电平,而在第四课中LED 灯闪烁程序中给R7 送数用的指令是MOV R7,#250 ,那么这#250 和#0FFH 到底有什么不同?它们又代表什么意思呢? 复习一下数字电路中学过的数制概念:

一.数制

1.十进制数(Decimal Number)

在日常生活中,我们表示数的多少用的是十进制数,即0,1,2,3,4,5,6,7,8,9。它遵循“逢十进一,借一当十”的原则,通常我们把计数符号的个数叫做基数,十进制的基数就是十。

比如一个十进制数5847=5*1000+8*100+4*10+7*1 ,它的每一个数码都有一个系数1000,100,10,1;这个系数叫做权或位权。十进制数虽然非常符合我们的使用习惯,但计算机中却无法采用,因为计算机只能有两种状态:“0”和“1”,所以我们还得应用二进制数。 2.二进制数(Binary Number)

二进制的基数为二,0 和1,它遵循的是“逢二进一,借一当二”的进借位原则。也就是当某位计数到两个数时就向高位进“1”,同时本位变为“0”。

比如二进制数1100=1*23+1*22+0*21+0*20,二进制数只有0 和1 两个数,正好代表了计算机中电路的两种状态,所以它在计算机中被广泛应用。下面是二进制的加法和乘法运算规则: 加法:0+0=0;1+0=0+1=1;1+1=10 乘法:0*0=0;1*0=0*1=0;1*1=1

二进制数虽然在计算机中处理很方便,但当位数较多时,就不容易记忆和书写了,所以计算机中又有了十六进制数。 3.十六进制数(Hexadecimal Number)

十六进制也遵循两个规则,一是有十六个基数,即0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;另一个规则是“逢十六进一,借一当十六”。

比如我们前面提到的#0FFH 就是一个十六进制数,#--我们已经明白了,它表示的是传递数的本身,“H”叫数制简码,它表示这个数是十六进制数,为什么前面我在标题后面都加了英文注释,相信大家也应该明白了吧(这里随便提一下,二进制简码B 和十进制简码D 通常是可以省略的,我们以后的课程中用到的数都是这样写的),那么0FFH 这个十六进制数的表示方法是怎么样的呢?用十进制表示0FFH=F*161+F*160,即等于255 。(大家也许会疑问?这里的“0”到哪里去了呢?原来,在单片机中,当我们用十六进制格式表示一个数时,如果高位的数字为“A-F ”时,高位前面就得加上个“0”,不然,编译软件会出错,就象#0FFH。二.进制之间的转换

十进制有使用比较习惯的特点,二进制有易于表示和运算方便的特点,十六进制又有表示位数较多的特点,但有时我们常常要把十进制数转换成二进制数或十六进制数来处理;把二进制数逆转换成十六进制数,如何进行这种转换呢?下面就举几个例子: 1. 十进制数与非十进制数之间的转换 (1)非十进制数转换为十进制数

具体做法是:将一个非十进制数按权展开成一个多项式,每项是该位数码与相应权值之积,把多项式按十进制的规则进行计算求和,所得的结果就是该数的十进制形式。

比如:二进制数1011B 转换成十进制为1*23+0*22+1*21+1*20=8+2+1=11D ,再比如:十六进制数FFH 转换成十进制为255D。 (2)十进制数转换为非十进制数

十进制数转换为非十进制数时,可将其分为整数部分和小数部分分别进行转换,最后将结果合并为目的数。为了简单,我这里只讲整数部分的转换。这种转换叫做除基取余法,具体做法是用欲转换数制的基数去除十进制数的整数部分,第一次除所得余数为目的数的最低位,把得到的商再除以该基数,所得余数为目的数的次低位,依次类推,继续上面的过程,直至商位为0,此时所得余数为目的数的最高位。 比如:将十进制数53D 转换成二进制数为53D=110101B。 2└53 2└26??1 2└13??0 2└6??1 2└3??0 2└1??1 0 ??1

2. 二进制数与十六进制数之间的转换

四位二进制共有16 种组合,而这16 种组合正好与十六进制数的16 个基数一致,所以每4 位二进制数对应一位十六进制数,我们只要把二进制数的整数部分自右向左每4 位一组,最后不足4 位的用0 补足;小数部分自左向右每4 位一组,最后不足4 位的在右面补0,再将每4 位二进制数对应的十六进制数写出即可。相反,如果将十六进制数转换为二进制数只需将每位十六进制数写成对应的4 位二进制数即可。

比如:将1101011B 转换成十六进制数为D6H,再比如:将F0FH 转换成二进制数为111100001111B 。 上面的表格就是二进制数、十进制数和十六进制数之间的对应关系。 三.立即数的写法

通过前面一小节的讲解,我们已经懂了,MOV R7,#250 和MOV R7,#OFFH 中#250 和#0FFH 原来是十进制数250D 和十六进制数FFH 的区别,在单片机中,通常我们把这个数称之为立即数,那么如果我在编写指令时把立即数#0FFH 写成二进制数(即11111111 )或用十进制写法(255 )是不是可以呢?当然可以,立即数既可以是二进制数,也可以是十进制数或十六进制数。不过有一点再重复一遍:那就是当

用十六进制格式表示一个立即数时,如果高位的数字为“A-F”时,高位前面要加上个“0”,请大家务必记住了。

这里再讲一下,关于数制以及二进制、十进制和十六进制数的关系,大家可以在以后的实践中慢慢去理解和掌握,如果您一时记不住,千万不要刻意地去死记硬背!下面让我们来讨论另一个问题: 四.存储器的地址

什么是存储器的地址,地址和数据又有什么关系呢?这个问题往往让初学者非常的难以理解,既然单片机存储器内存放的是数据,为什么还要有地址的概念?让我们从生活中的一个例子谈起:大家都知道寄信是怎么回事吧!我们要寄一封信就必须写好信的内容,然后在信的封面写上详细地址,邮局才能按地址把它寄出去;我们给单片机送数也一样,除了要给出立即数(犹如信的内容),还必须知道这个数送达的地址(犹如信的地址或邮政编码),所以就必须给每个寄存器(即半导体存储器)都规定不同的地址,只不过在单片机中地址的编码也是用数字来表示的,那么单片机中有多少个寄存器呢?它们的地址又是如何规定的呢?

前面我们学过,单片机有两种存储器,即只读存储器ROM 和随机存储器RAM,它们都被规定了各自的地址,我们把它称做寻址空间。既然是空间,就必然有一个范围的概念,接下来就让我们看看MCS-51 单片机中程序存储器ROM 的寻址范围: 1.内部R0M 的寻址范围

89C51 的内部有4K 的FLASH ROM 空间,其寻址范围为000H-0FFH(16*16*16),这4K 的ROM 空间就是用来存放我们为单片机编写的程序的,单片机执行指令时就是一条一条地顺序地从ROM 中寻找指令进行执行。了解了ROM 的寻址范围,让我们接着来看另一种存储器:内部RAM 的寻址范围

单片机的内部RAM 共有256 个字节,寻址范围为00H-FFH(即16*16),它被分为两个部分:第一部分从00H-7FH 共128 个字节是真正的RAM 区,可以用来读写各种数据,在这128 个字节中,又分成三个区域:第一个区域00H-1FH 安排了4 组工作寄存器,每组用8 个字节,共32 个字节,分别为R0-R7,当然在同一时刻,只能用其中的一组工作寄存器,怎么来控制它,就要用程序状态字PWS 中的RS0、RS1 两位,(这我们后面再讲);第二个区域20H-2FH 共16 个字节除了可以作为一般的RAM 单元读写外,还可以对每个字节的每一位(即每一个抽屉中的每一个小盒子)进行操作,并且对这些位都规定了固定的位地址:从20H 单元的第0 位开始到2FH 单元的第7 位结束共128 位;第三个区域就是一般的RAM 单元,地址为30H-7FH,共80 个字节;第二部分从80H-FFH 是专门用于特殊功能寄存器(SFR)的,89C51 共用21 个特殊功能寄存器(这些我们都将在下一课中讲解),它们每个也都有8 位,这部分的128 个字节并没有全部用完。

单片机经典教程8 单片机内部结构(六)

我们已经讲过,R7,R6 是工作寄存器,P0,P1,P2,P3 是并行口,那么单片机中还有些什么东西?它们的结构又是怎么样的呢?这就是本课要讨论的问题。一.单片机的特殊功能寄存器,在单片机中,除了前面介绍的RAM,ROM,P0-P3 和CPU 外,方框内的还有许多其他的东西它们被称为特殊功能寄存器,英文简写SFR ,下表例出的就是MCS-51 单片机中几个常用的特殊功能寄存器。这一课我们先来介绍几个:

二.几个常用的特殊功能寄存器 1.累加器ACC

通常用A 表示,它是一个什么东西呢?我们知道单片机在做运算时它的中间结果需要放在某个地方,这个地方就是累加器,它的名字很特殊,功能也很特殊,几乎所有的运算类指令都离不开它。 2.寄存器B

B 寄存器在做乘法时用来存放一个乘数,在做除法时用来存放一个除数,不做乘除法时随你怎么用。 3.程序状态字PSW

它是一个很重要的东西,里面放了CPU 工作时的很多状态,知道它就可以了解CPU 当前的工作状态,它有点象平时看书用的目录,我们浏览它就可以了解一本书的内容。它是一个8 位的寄存器,用到了其中的7 位。其格式如下: 下面来逐位介绍它的功能: (1)CY:进位标志位

MCS-51 是一种8 位的单片机,它的运算结果只能表示到28(即0-255),但我们有时候的运算结果要超过255 ,怎么办呢?就要用CY 位。例如:79H+87H(01111001+01010111)=1 00000000 ,这里的“1”就进到了CY 中去了。 (2)AC:半进位标志位

当D3 位向D4 位进位/借位时,AC=1,通常用于十进制调整运算中。 (3)F0:用户自定义标志位

由编程人员自行决定,什么时候用,什么时候不用。 (4) RS1、RS0:工作寄存器组选择位。

前面讲到单片机共有四个工作寄存器组(0 组-3 组),它们就是由RS1,RS0 来控制,这两位就在这里,它共有四种组合状态,看上面的表格:每个工作寄存器组有8 个字节,分别记为R0-R7 ,当然在某一时刻,CPU 只使用其中的一组。

假设PSW 为“10”(即00010001),那么RS1=1,RS0=0,则用到了第2 组寄存器组(地址10H-17H),RO-R7 即为10H-17H ,用DUBG8051 软件输入数值,看看内部RAM 中地址为10H-17H 中的值是不是为输入值。 (5) 0V:溢出标志位

什么时候溢出,我们讲到定时器时再研究。


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

下一篇:某工程监理大纲

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

马上注册会员

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