新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机知识(二)

单片机知识(二)

作者: 时间:2016-11-22 来源:网络 收藏
单片机的内外部结构分析

一、延时程序分析

本文引用地址:https://www.eepw.com.cn/article/201611/319709.htm

上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。

DELAY: MOV R7,#250   ;(6)

D1: MOV R6,#250   ;(7)

D2: DJNZ R6,D2    ;(8)

DJNZ R7,D1   ;(9)

RET        ;(10)


1.MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一个人的手上传到另一个人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者)。它的意义也很明显:将数据250送到R7中去,因此执行完这条指令后,R7单元中的值就应当是250。在250前面有个#号,这又是什么意思呢?这个#就是用来说明250就是一个被传递的东西本身,而不是传递者。那么MOV R6,#250是什么意思,应当不用分析了吧。

2.DJNZ:这是另一条指令,我们来看一下这条指令后面跟着的两个东西,一个是R6,一个是D2,R6我们当然已知是什么了,查一下D2是什么。D2在本行的前面,我们已学过,这称之为标号。标号的用途是什么呢?就是给本行起一个名字。DJNZ指令的执行过程是这样的,它将其后面的第一个参数中的值减1,然后看一下,这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是,在原地转圈250次。


3.执行完了DJNZ R6,D2之后(也就是R6的值等于0之后),就会去执行下面一行,也就是DJNZ R7,D1,请大家自行分析一下这句话执行的结果。(转去执行MOV R6,#250,同时R7中的值减1),最终DJNZ R6,D2这句话将被执行250*250=62500次,执行这么多次同一条指令干吗?就是为了延时。


4.一个问题:如果在R6中放入0,会有什么样的结果。

二、时序分析:

前面我们介绍了延时程序,但这还不完善,因为,我们只知道DJNZ R6,D2这句话会被执行62500次,但是执行这么多次需要多长时间呢?是否满足我们的要求呢?我们还不知道,所以下面要来解决这个问题。

先提一个问题:我们学校里什么是最重要的。(铃声)校长可以出差,老师可以休息,但学校一日无铃声必定大乱。整个学校就是在铃声的统一指挥下,步调一致,统一协调地工作着。这个铃是按一定的时间安排来响的,我们可以称之为“时序时间的顺序”。一个由人组成的单位尚且要有一定的时序,计算机当然更要有严格的时序。事实上,计算机更象一个大钟,什么时候分针动,什么时候秒针动,什么时候时针动,都有严格的规定,一点也不能乱。计算机要完成的事更复杂,所以它的时序也更复杂。

我们已知,计算机工作时,是一条一条地从ROM中取指令,然后一步一步地执行,我们规定:计算机访问一次存储器的时间,称之为一个机器周期。这是一个时间基准,好象我们人用“秒”作为我们的时间基准一样,为什么不干脆用“秒”,多好,很习惯,学下去我们就会知道用“秒”反而不习惯。

一个机器周期包括12个时钟周期。下面让我们算一下一个机器周期是多长时间吧。设一个单片机工作于12M晶振,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。(请计算一个工作于6M晶振的单片机,它的机器周期是多少)。

MCS-51单片机的所有指令中,有一些完成得比较快,只要一个机器周期就行了,有一些完成得比较慢,得要2个机器周期,还有两条指令要4个机器周期才行。这也不难再解,不是吗?我让你扫地的执行要完成总得比要你完成擦黑板的指令时间要长。为了恒量指令执行时间的长短,又引入一个新的概念:指令周期。所谓指令周期就是指执行一条指令的时间。INTEL对每一条指令都给出了它的指令周期数,这些数据,大部份不需要我们去记忆,但是有一些指令是需要记住的,如DJNZ指令是双周期指令。

下面让我们来计算刚才的延时。首先必须要知道晶振的频率,我们设所用晶振为12M,则一个机器周期就是1微秒。而DJNZ指令是双周期指令,所以执行一次要2个微秒。一共执行62500次,正好125000微秒,也就是125毫秒。

练习:设计一个延时100毫秒的延时程序。

要点分析:1、一个单元中的数是否可以超过255。2、如何分配两个数。

三、复位电路

任何单片机在工作之前都要有个复位的过程,复位是什么意思呢?它就象是我们上课之前打的预备铃。预备铃一响,大家就自动地从操场、其它地方进入教室了,在这一段时间里,是没有老师干预的,对单片机来说,是程序还没有开始执行,是在做准备工作。显然,准备工作不需要太长的时间,复位只需要5ms的时间就可以了。如何进行复位呢?只要在单片机的RST引脚上加上高电平,就可以了,按上面所说,时间不少于5ms。为了达到这个要求,可以用很多种方法,这里提供一种供参考,见图1。实际上,我们在上一次实验的图中已见到过了。

这种复位电路的工作原理是:通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程序,即为低电平,单片机开始正常工作。

单片机的内外部结构分析(四)
第三个实验


上两次我们做过两个实验,都是让P1.0这个引脚使灯亮,我们可以设想:既然P1.0可以让灯亮,那么其它的引脚可不可以呢?看一下图1,它是8031单片机引脚的说明,在P1.0旁边有P1.1,P1.2….P1.7,它们是否都可以让灯亮呢?除了以P1开头的外,还有以P0,P2,P3开头的,数一下,一共是32个引脚,前面我们以学过7个引脚,加上这32个这39个了。它们都以P字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了P10之外,还有P11P17都与LED相连,下面让我们来做一个实验,程序如下:

MAIN: MOV P1,#0FFH

LCALL DELAY

MOV P1,#00H

LCALL DELAY

LJMP MAIN

DELAY:MOV R7,#250

D1: MOV R6,#250

D2: DJNZ R6,D2

DJNZ R7,D1

RET

END

将这段程序转为机器码,用编程器写入芯片中,结果如何?通电以后我们可以看到8只LED全部在闪动。因此,P10P17是全部可以点亮灯的。事实上,凡以P开头的这32个引脚都是可以点亮灯的,也就是说:这32个引脚都可以作为输出使用,如果不用来点亮LED,可以用来控制继电器,可以用来控制其它的执行机构。

程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是SETB P1.0,现在改为MOV P1,#0FFH,第三句:原来是CLR P1.0,现在改为MOV P1.0,#00H。从中可以看出,P1是P1.0P1.7的全体的代表,一个P1就表示了所有的这八个管脚了。当然用的指令也不一样了,是用MOV指令。为什么用这条指令?看图2,我们把P1作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数可以用MOV指令。

二、第四个实验

除了可以作为输出外,这32个引脚还可以做什么呢?下面再来做一个实验,程序如下:

MAIN: MOV P3,#0FFH

LOOP: MOV A,P3

MOV P1,A

LJMP LOOP

先看一下实验的结果:所有灯全部不亮,然后我按下一个按钮,第()个灯亮了,再按下另一个按钮,第()个灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。

从硬件电路的连线可以看出,有四个按钮被接入到P3口的P32,P33,P34,P35。第一条指令的用途我们可以猜到:使P3口全部为高电平。第二条指令是MOV A,P3,其中 MOV已经见,是送数的意思,这条指令的意思就是将P3口的数送到A中去,我们可以把A当成是一个中间单元(看图3),第三句话是将A中的数又送到P1口去,第四句话是循环,就是不断地重复这个过程,这我们已见过。当我们按下第一个按钮时,第(3)只灯亮了,所以P12口应当输出是低电平,为什么P12口会输出低电平呢?我们看一下有什么被送到了P1口,只有从P3口进来的数送到A,又被送到了P1口,所以,肯定是P3口进来的数使得P12位输出电平的。P3口的P32位的按钮被按下,使得P32位的电平为低,通过程序,又使P12口输出低电平,所以P3口起来了一个输入的作用。验证:按第二、三、四个按钮,同时按下2个、3个、4个按钮都可以得到同样的结论,所以P3口确实起到了输入作用,这样,我们可以看到,以P字开头的管脚,不仅可以用作输出,还可以用作输入,其它的管脚是否可以呢?是的,都可以。这32个引脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实现输入和输出的。

并行口结构分析:


1、输出结构

先看P1口的一位的结构示意图(只画出了输出部份):从图中可以看出,开关的打开和合上代表了引脚输出的高和低,如果开关合上了,则引脚输出就是低,如果开关打开了,则输出高电平,这个开关是由一根线来控制的,这根数据总线是出自于CPU,让我们回想一下,数据总线是一根大家公用的线,很多的器件和它连在一起,在不同的时候,不同的器件当然需要不同的信号,如某一时刻我们让这个引脚输出高电平,并要求保持若干时间,在这段时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持原来的值不变,输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存储器中是可以存放电荷的,我们不妨也加一个小的存储器的单元,并在它的前面加一个开关,要让这一位输出时,就把开关打开,信号就进入存储器的单元,然后马上关闭开关,这样这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就能使这一位的状态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。

2、输入结构

这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部引脚接入,另一根从锁存器的输出接出,分别标明读引脚和读锁存器。这两根线是用于从外部接收信号的,为什么要两根呢?原来,在51单片机中输入有两种方式,分别称为‘读引脚’和‘读锁存器’,第一种方式是将引脚作为输入,那是真正地从外部引脚读进输入的值,第二种方式是该引脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正地读引脚状态,而只是读入锁存器的状态,然后作某种变换后再输出。

请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得到正确的结果(为什么?)参考图2输入示意图。接在外部的开关如果打开,则应当是输入1,而如果闭合开关,则输入0,但是,如果单片机内部的开关是闭合的,那么不管外部的开关是开还是闭,单片机接受到的数据都是0。可见,要让这一端口作为输入使用,要先做一个‘准备工作’,就是先让内部的开关断开,也就是让端口输出‘1’才行。正因为要先做这么一个准备工作,所以我们称之为“准双向I/O口”。

以上是P1口的一位的结构,P1口其它各位的结构与之相同,而其它三个口:P0、P2、P3则除入作为输入输出口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的结构是相同的。看图()。对我们来说,这些附加的功能不必由我们来控制,所以我们就不去关心它了。

单片机内部结构分析(五)
通过前面的学习,我们已知单片机的内部有ROM、有RAM、有并行I/O口,那么,除了这些东西之外,单片机内部究竟还有些什么,这些个零碎的东西怎么连在一起的,让我们来对单片机内部作一个完整的分析吧!

看图(1)(本图太大,请大家找本书看吧,一般讲单片机的书,随便哪本都有)。从图中我们可以看出,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在一个51单片机的内部包含了这么多的东西。

对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到相应I/O口的锁存器就可以了,那么对于定时/计数器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些呢?看表1

符号 地址 功能介绍

B F0H B寄存器

ACC E0H 累加器

PSW D0H 程序状态字

IP B8H 中断优先级控制寄存器

P3 B0H P3口锁存器

IE A8H 中断允许控制寄存器

P2 A0H P2口锁存器

SBUF 99H 串行口锁存器

SCON 98H 串行口控制寄存器

P1 90H P1口锁存器

TH1 8DH 定时器/计数器1(高8位)

TH0 8CH 定时器/计数器1(低8位)

TL1 8BH 定时器/计数器0(高8位)

TL0 8AH 定时器/计数器0(低8位)

TMOD 89A 定时器/计数器方式控制寄存器

TCON 88H 定时器/计数器控制寄存器

DPH 83H 数据地址指针(高8位)

DPL 82H 数据地址指针(低8位)

SP 81H 堆栈指针

P0 80H P0口锁存器

PCON 87H 电源控制寄存器

表1
下面,我们介绍一下几个常用的SFR,看图2。

ACC:累加器,通常用A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身份也特殊,稍后我们将学到指令,可以发现,所有的运算类指令都离不开它。


2、B:一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。

3、PSW:程序状态字。这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应的处理。它的各位功能请看表2

D7 D6 D5 DD D2 D1 D0

CY AC F0 RS1 RS0 OV P

表2

下面我们逐一介绍各位的用途

(1)CY:进位标志。8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事了。

例:78H+97H(01111000+10010111)

(2)AC:半进位标志。


例:57H+3AH(01010111+00111010)

(3)F0:用户标志位,由我们(编程人员)决定什么时候用,什么时候不用。

(4)RS1、RS0:工作寄存器组选择位。这个我们已知了。

(5)0V:溢出标志位。什么是溢出我们稍后再谈吧。

(6)P:奇偶校验位:它用来表示ALU运算结果中二进制数位“1”的个数的奇偶性。若为奇数,则P=1,否则为0。


例:某运算结果是78H(01111000),显然1的个数为偶数,所以P=0。

4、DPTR(DPH、DPL):数据指针,可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。

5、P0、P1、P2、P3:这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的内容对应着管脚的输出。

6、SP:堆栈指针。

堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去的则放在最下面,在取的时候正好相反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。

在单片机中,我们也可以在RAM中构造这样一个区域,用来存放数据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对,知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我们只要知道第一个数据所在地址单元就可以了(看图2)如果第一个数据在27H,那么第二、三个就在28H、29H了。所以利用堆栈这种方法来放数据可以简化操作

那么51中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆栈,所以就在内存(RAM)中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为51是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要那么多,所以怎么分配都不合适,怎样来解决这个问题?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以51单片机中堆栈的位置是可以变化的。而这种变化就体现在SP中值的变化,看图2,SP中的值等于27H不就相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元,而不是27H单元,为什么会这样,我们在学堆栈命令时再说明。

其它的SFR,我们在用到时再介绍。



关键词: 单片机SF

评论


技术专区

关闭