单片机学习笔记

第一章 STC89系列单片机总体介绍

1.1 STC89C51RC/RD+系列单片机简介

        在Keil C开发环境中,选择Intel 8052编译,头文件包含<reg51.h>即可

1. 应用程序空间:4K/8K/13K/16K/32K/64K字节

2. RAM:1280/512字节

3. 通用I/O口(35/39个)

4. 3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用

5. 通用异步串口(UART)

1.2 STC89C51RC/RD+系列单片机的内部结构

        STC89C51RC/RD+系列单片机的内部结构框图如下图所示。STC89C51RC/RD+单片机中包含中央处理器(CPU)、程序存储器(FLASH)、数据存储器(SRAM)、定时/计数器、UART串口、I/O接口、EEPROM、看门狗等模块。

1.3 STC89C51RC/RD+系列单片机最小应用系统

补充:

第二章 复位及省电模式

2.1 复位

        STC89C51RC/RD+系列单片机有四种复位方式:外部RST引脚复位,软件复位,掉电复位/上电复位,看门狗复位。

2.1.1 外部RST引脚复位

        外部RST引脚复位就是从外部向RST引脚施加一定宽度的复位脉冲,从而实现单片机的复位。将RST复位管脚拉高并维持至少24个时钟加10us后,单片机就会进入复位状态,将RST复位管脚拉回低电平后,单片机结束复位状态并从用户程序0000H出开始正常工作。

        PS:"复位管脚拉高" 是指将某个设备或电路中的复位(reset)管脚(通常是一个物理引脚)设置为高电平状态。

2.1.2 软件复位

        用户应用程序在运行过程当中,有时会有特殊需求,需要实现单片机系统软复位(热启动之一)。通过控制ISP_CONTR特殊功能寄存器的其中两位SWBS/SWRST就可以实现系统复位。

ISP_CONTR:ISP/IAP控制寄存器

2.1.3 上电复位/掉电复位

        当电源电压VCC低于上电复位/掉电复位电路的检测门槛电压时,所有的逻辑电路都会复位。当VCC重新恢复正常电压时,上电复位/掉电复位结束。进入掉电模式时,上电复位/掉电复位功能被关闭。

2.1.4 看门狗复位

        在工业控制/汽车电子/航空航天等需要高可靠性的系统中,为了防止“系统在异常情况下,受到干扰,MCU/CPU程序跑飞,导致系统长时间异常工作”,通常是引进看门狗,如果MCU/CPU不在规定时间内按要求访问看门狗,就认为MCU/CPU处于异常状态,看门狗就会强迫MCU/CPU复位,是系统重新从头开始按规律执行用户程序。

WDT_CONTR:看门狗(Watch-Dog-Timer)控制寄存器

2.1.5 冷启动复位和热启动复位

2.2 STC89C51RC/RD+系列单片机的省电模式(仅支持掉电模式,不支持空闲模式)

        STC89C51RC/RD+系列单片机可以运行2种省电模式以降低功耗,它们分别是:空闲模式和掉电模式。空闲模式和掉电模式的进入由电源控制寄存器PCON的相应位控制。PCON寄存器定义如下:

        将PD/PCON.1置为1,单片机将进入POWER DOWN(掉电)模式,掉电模式也叫停机模式。进入掉电模式后,内部时钟停振,由于无时钟源,CPU、定时器、看门狗、串行口等停止工作,外部中断继续工作。如果低压检测电路被允许可产生中断,则低压检测电路也可继续工作,否则将停止工作。进入掉电模式后,所有I/O口、SFRs(特殊功能寄存器)维持进入掉电模式前那一刻的状态不变。

        可将CPU从掉电模式唤醒的外部引脚有:         \overline{INT0}/P3.2, \overline{INT1}/P3.3, \overline{INT2}/P4.3, \overline{INT3}/P4.2

        另外,外部复位也将MCU从掉电模式中唤醒,复位唤醒后的MCU将从用户程序的0000H处开始正常工作。

        当用户系统无外部中断源将单片机从掉电模式唤醒时,下面的电路能够定时唤醒掉电模式。

        控制充电的I/O口首先配置为推挽/强上拉模式并置高,上面的电路会给储能电容充电。在单片机计入掉电模式之前,将控制充电的I/O口拉低,上面电路通过电阻R1给储能电容放电。当电容C1的电被放到小于0.8V时,外部中断INTx会产生一个下降沿中断,从而自动地将掉电模式中唤醒。

第三章 存储器和特殊功能寄存器

        STC89C51RC/RD+系列单片机的程序存储器和数据存储器是各自独立编址的。STC-89C51RC/RD+系列单片机除可以访问片上Flash存储器外,还可以访问64KB的外部程序存储器。STC89C54RD+系列单片机内部有1280字节的数据存储器,其在物理和逻辑上都分为两个地址空间:内部RAM(256字节)和内部扩展RAM(1024字节)。而STC89C51RC系列单片机内部有512字节的数据存储器,其在物理和逻辑上都分为两个地址空间:内部RAM(256字节)和内部扩展RAM(256字节)。另外,STC89C51RC/RD+系列单片机还可以访问在片外扩展的64KB外部数据存储器。现以STC89C54RD+系列单片机为例,分别介绍其程序存储器和数据存储器。

3.1 程序存储器

        程序存储器用于存放用户程序、数据和表格等信息。STC89C51RD+系列单片机内部集成了4K-64K字节的Flash程序存储器。

        单片机复位后,程序计数器(PC)的内容为0000H,从0000H单元开始执行程序。STC89C51RC/RD+系列单片机利用\overline{EA}引脚来确定时访问片内程序存储器还是访问片外程序存储器。当\overline{EA}引脚接高电平时,对于STC89C51RC/RD+系列单片机首先访问片内程序存储器,当PC的内容超过片内存储器的地址范围时,系统会自动转到片外程序存储器。以STC89C54RD+单片机为例,当\overline{EA}引脚接高电平时,单片机首先从片内程序存储器的0000H单元开始执行程序,当PC的内容超过3FFFH时系统会自动转到片外程序存储器中取指令。此时外部程序存储器的地址从4000H开始。

        另外中断服务程序的入口地址(又称中断向量)也位于程序存储器单元。在程序存储器中,每个中断都有一个固定的入口地址,当中断发生并得到响应后,单片机就会自动跳转到相应的中断入口地址去执行程序。外部中断0的中断服务程序的入口地址是0003H,定时器/计数器0中断服务程序的入口地址是000BH,外部中断1的中断服务程序入口地址是0013H,定时器/计数器1的中断服务程序入口地址是001B等。由于相邻中断入口地址的间隔区间(8个字节)有限,一般情况下无法保存完整的中断服务程序,因此,一般在中断响应的地址区域存放一条无条件转移指令,指向真正存放中断服务程序的空间中去执行。

3.2 数据存储器

        STC89C54RD+系列单片机内部集成了1280字节RAM,可用于存放程序执行的中间结果过程数据。内部数据存储器在物理和逻辑上都分为两个地址空间:内部RAM(256字节)和内部扩展RAM(1024字节)。此外,STC89C51RC/RD+系列单片机还可以访问在片外扩展的64KB外部数据存储器。

3.2.1 内部RAM

        内部RAM共256字节,可分为3个部分:低128字节RAM(与传统8051兼容)、高128字节RAM(Intel在8052中扩展了高128字节RAM)及特殊功能寄存器区。低128字节的数据存储器既可直接寻址也可间接寻址。高128字节RAM与特殊功能寄存器区貌似共用相同的地址范围,都使用80H~FFH,地址空间虽然貌似重叠,但物理上是独立的,使用时通过不同的寻址方式加以区分。高128字节RAM只能间接寻址,特殊功能寄存器区只可直接寻址。
        内部RAM的结构如下图所示,地址范围是00H~FFH。

        

        下图是传统的8051存储器组织结构,可以用来对比学习:

        低128字节RAM也称通用RAM区。通用RAM区又可分为工作寄存器组区,可位寻址区,用户RAM区和堆栈区。工作寄存器组区地址从0OH~1FH共32B(字节)单元,分为4组(每一组称为一个寄存器组),每组包含8个8位的工作寄存器,编号均为RO ~R7,但属于不同的物理空间。通过使用工作寄存器组,可以提高运算速度。RO-R7是常用的寄存器,提供4组是因为1组往往不够用。程序状态字PSW寄存器中的RS1和RSO组合决定当前使用的工作寄存器组。见下面PSW寄存器的介绍。可位寻址区的地址从20H ~2FH共16个字节单元。20H-2FH单元既可向普通RAM单元一样按字节存取,也可以对单元中的任何一位单独存取,共128位,所对应的地址范围是00H~7FH。位地址范围是OOH~7FH,内部RAM低128字节的地址也是00H~7FH;从外表看,二者地址是一样的,实际上二者具有本质的区别;位地址指向的是一个位,而字节地址指向的是一个字节单元,在程序中使用不同的指令区分。内部RAM中的30H~FFH单元是用户RAM和堆栈区。一个8位的堆栈指针(SP),用于指向堆栈区。单片机复位后,堆栈指针SP为07H,指向了工作寄存器组0中的R7,因此,用户初始化程序都应对SP设置初值,一般设置在80H以后的单元为宜。

堆栈指针(SP):

        堆栈指针是一个8位专用寄存器。它指示出堆栈顶部在内部RAM块中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始,考虑08H-1FH单元分别属于工作寄存器组1-3,若在程序设计中用到这些区,则最好把SP值改变为80H或更大的值为宜。STC89C51RC/RD+单片机的堆栈是向上生长的,即将数据压入堆栈后,SP内容增大。

3.2.2 内部扩展RAM

        STC89C54RD+单片机片内除了集成256字节的内部RAM外,还集成了1024字节的扩展RAM,地址范围是0000H~03FFH.访问内部扩展RAM的方法和传统8051单片机访问外部扩展RAM的方法相同,但是不影响PO口、P2口、P3.6、P3.7和ALE。

        单片机内部扩展RAN是否可以访问受辅助寄存器AUXR(地址为8EH)中的RXTRAM位控制。

3.2.3 可外部扩展的64K Bytes(字节)数据存储器

                STC89C51RC/RD+系列单片机具有扩展64KB外部数据存储器和I/O口的能力。访问外部数据存储器期间,\overline{WR}\overline{RD}信号要有效。

3.3 特殊功能寄存器(SFRs)

        特殊功能寄存器(SFR)是用来对片内各功能模块进行管理、控制、监视的控制寄存器和状态寄存器,是一个特殊功能的RAM区。STC89C51RC/RD+系列单片机内的特殊功能寄存器(SFR)与内部高128字节RAM貌似共用相同的地址范围,都使用80H-FFH,但特殊功能寄存器(SFR)必须用直接寻址指令访问。

        下面介绍一些8051单片机常用的一些寄存器:

        1. 程序计数器(PC)

        程序计数器PC在物理上是独立的,不属于SFR之列。PC字长16位,是专门用来控制指令执行顺序的寄存器。单片机上电或复位后,PC=0000H,强制单片机从程序的零单元开始执行程序。

        2. 累加器(ACC)

        累加器ACC是8051单片机内部最常用的寄存器,也可写作A。常用于存放参加算术或逻辑运算的操作数及运算结果。

        3. B寄存器

        B寄存器在乘法和除法运算中须与累加器A配合使用。MUL AB指令把累加器A和寄存器B中的8位无符号数相乘,所得的16位乘积的低字节存放在A中,高字节存放在B中。DIV AB指令用B除以A,整数商存放在A中,余数存放在B中。寄存器还可以用作通用暂存寄存器。

        4. 程序状态字(PSW)寄存器

        5. 堆栈指针(SP)

        堆栈指针是一个8位专用寄存器。它指示出堆栈顶部在内部RAM块中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始,考虑08H-1FH单元分别属于工作寄存器组1-3,若在程序设计中用到这些区,则最好把SP值改变为80H或更大的值为宜。STC89C51RC/RD+单片机的堆栈是向上生长的,即将数据压入堆栈后,SP内容增大。

        6. 数据指针(DPTR)

        数据指针(DPTR)是一个16位专用寄存器,由DPL(低8位)和DPH(高8位)组成,地址是82H(DPL,低字节)和83H(DPH,高字节)。DPTR是传统8051机中唯一可以直接进行16位操作的寄存器也可分别对DPL河DPH按字节进行操作。STC89C51RC/RD+系列单片机有两个16位的数据指针DPRTO和DPTR1.这两个数据指针共用同一个地址空间,可通过设置DPS/AUXR1.0来选择具体被使用的数据指针。

第四章 STC89C51RC/RD+系列单片机的I/O结构

        STC89C51RC/RD+系列单片机所有IO口均(新增P4口)有3种工作类型:准双向口/弱上拉(标准8051输出模式)、仅为输入(高阻)或开漏输出功能。STC89C51RC/RD+系列单片机的P1/P2/P3/P4上电复位后为准双向口/弱上拉(传统8051的IO口)模式,PO口上电复位后是开漏输出。PO口作为总线扩展用时,不用加上拉电阻,作为I/0口用时,需加10K-4.7K上拉电阻。

4.1 准双向口输出配置

4.2 开漏输出配置

第五章 指令系统

5.1 寻址方式

        寻址方式是每一种计算机的指令集中不可缺少的部分。寻址方式规定了数据的来源和目的地。对不同的程序指令,来源和目的地的规定也会不同。在STC单片机中的寻址方式可概括为:立即寻址、直接寻址、间接寻址、寄存器寻址、相对寻址、变址寻址、位寻址。

5.1.1 立即寻址

        立即寻址也称立即数寻址,它是在指令操作数中直接给出参加运算的操作数,其指令格式如下:

        如:MOV   A,    #70H

        这条指令的功能是将立即数70H传送到累加器A中。

5.1.2 直接寻址

        在直接寻址方式中,指令操作数域给出的是参加操作数地址。直接寻址方式只能用来表示特殊功能寄存器、内部数据寄存器和位地址空间。其中特殊功能寄存器和位地址空间只能用直接寻址方式访问。

        如:ANL   70H,    #48H

        表示70H单元中的数与立即数48H相与,结果存放在70H单元中。其中70H为直接地址,表示内部数据存储器RAM中的一个单元。

5.1.3 间接寻址

        间接寻址采用R0或R1前添加“@”来表示。例如,假设R1中的数据时40H,内部数据存储器40H单元所包含的数据为55H,那么如下指令:

        MOV    A,    @R1

        表示把数据55H送到累加器A。

5.1.4 寄存器寻址

        寄存器寻址是对选定的工作寄存器R0-R7、累加器A、通用寄存器B、地址寄存器和进位位C中的数进行操作。其中寄存器R7-R0由指令码的低三位表示,ACC、B、DPTR及进位位C隐含在指令码中,因此,寄存器寻址也包含一种隐含寻址方式。

        寄存器工作区的选择由程序状态字寄存器PSW中的RS1、RS0来决定。指令操作数指定的寄存器均指当前工作区中的寄存器。

        如:INC     R0     ;(R0)+1→R0

5.1.5 相对寻址

        相对寻址是将程序计数器PC中的当前值与指令第二字节给出的数相加,其结果作为转移指令的转移地址。转移地址也称为转移目的地址,PC中的当前值称为基地址,指令第二字节给出的数称为偏移量。由于目的地址是相对于PC中的基地址而言所以这种寻址方式称为相对寻址。偏移量为带符号的数,所能表示的范围为+127~-128。这种寻址方式主要用于转移指令。

        如:JC     80H,     C=1; 跳转

        表示若进位位为0,则程序计数器PC中的内容不改变,即不转移。若进位位C为1,则以PC中的当前值为基地址,加上偏移量80H后所得到的结果作为该转移指令的目的地址。

5.1.6 变址寻址

        在变址寻址方式中,指令操作数指定一个存放变址基址的变址寄存器。变址寻址时,偏移量与变址基值相加,其结果作为操作数的地址。变址寄存器所有程序计数器PC和地址寄存器DPTR。

        如:MOVC     A,     @A+DPTR

        表示累加器A为偏移量寄存器,其内弄与地址寄存器DPTR中的内容相加,其结果作为操作数的地址,取出该单元中的数送入累加器A。

5.1.7 位寻址

        位寻址是指对一些内部数据存储器RAM和特殊功能寄存器进行位操作时的寻址。在进行位操作时,借助于进位位C作为位操作累加器,指令操作数直接给出该位的地址,然后根据操作码的性质对该位进行位操作。位地址与字节直接寻址中的字节地址形式完全一样,主要由操作码加以区分,使用时应注意。
        如: MOV     C,     20H      ;片内位单元位操作型指令

第六章 中断系统

        中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。

        当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

        当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

        STC89C51RC/RD+系列单片机提供了8个中断请求源,它们分别是:外部中断0(INTO)、定时器0中断、外部中断1(INT1)、定时器1中断、串口(UART)中断、定时器2中断、外部中断2(INT2)、外部中断3(INT3)。所有的中断都具有4个中断优先级。用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制为开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

        通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果只设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。

        如果使用C语言编程,中断查询次序号就是中断号,例如:

6.1 中断结构

        STC89C51RC/RD+系列单片机的中断系统结构示意图如图6-1所示:

        各个中断触发行为总结如下表6-2所示:

6.2 中断寄存器

        1. 中断允许寄存器IE和XICON

        STC89C51RC/RD+系列单片机CPU对中断源的开放或屏蔽,每一个是否被允许中断,是由内部的中断允许寄存器IE和XICON控制的。寄存器IE的格式如下:

        寄存器XICON的格式如下:

        STC89C51RC/RD+系列单片机复位以后,IE和XICON被清0,由用户程序置“1”或清“0”IE和XICON相应的位,实现允许或禁止各中断源的中断申请,若使某一个中断源允许中断必须同时使CPU开放中断。更新IE和XICON的内容可由位操作指令来实现(SETB BIT;CLR BIT),也可用字节操作指令实现(即MOV IE,#DATA,ANL IE,#DATA;ORL IE,#DATA;MOV IE,A等)。

        2. 中断优先级控制寄存器IP/XICON和IPH

        传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。STC89C51RC/RD+系列单片机通过设置新增加的特殊功能寄存器(IPH/XICON)中的相应位,可将中断优先级设置为4个中断优先级;如果只设置IP,那么中断优先级只有两级,与传统8051单片机两级中断优先级完全兼容。
        一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则:
                1.低优先级中断可被高优先级中断所中断,反之不能。
                2.任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

        中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0”。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节操作指令来更新。STC89C51RC/RD+系列单片机复位后IP和IPH均为O00H,各个中断源均为低优先级中断。

        3. 定时器/计数器0/1控制寄存器TCON

        TCON为定时器/计数器T0/T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:

        4. 串行口控制寄存器SCON

        SCON为串行口控制寄存器,SCON格式如下:

        5. 定时器/计数器2控制寄存器T2CON

        

6.3 中断优先级

        STC89C51RC/RD+系列单片机的所有的中断都具有4个中断优先级,对于这些中断请求源可编程为高优先级中断或低优先级中断,可实现两级中断服务程序嵌套。一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断,一直执行到结束,遇到返回指令RETI,返回主程序后再执行一条指令才能响应新的中断申请。以上所述可归纳为下面两条基本规则:
        1.低优先级中断可被高优先级中断所中断,反之不能。
        2.任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

        当同时收到几个同一优先级的中断要求时,哪一个要求得到服务,取决于内部的查询次序。这相当于在每个优先级内,还同时存在另一个辅助优先级结构,STC89C51RC/RD+系列单片机各中断优先查询次序如下:

        如果使用C语言编程,中断查询次序就是中断号,例如:

6.4 中断处理

        当某中断产生而且被CPU响应,主程序被中断,接下来将执行如下操作:

        1.当前正被执行的指令全部执行完毕;
        2.PC值被压入栈;
        3.现场保护;
        4.阻止同级别其他中断;
        5.将中断向量地址装载到程序计数器PC;6.执行相应的中断服务程序。
        中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,将PC值从栈中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。
        当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是同该中断源相对应的中断服务程序的起始地址。各中断源服务程序的入口地址(即中断向量)为:

        当“转去执行中断”时,引起中断的标志位将被硬件自动清零。由于中断向量入口地址位于程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越过中断向量区(LJMPMAIN)。
注意:不能用RET指令代替RETI指令
        RET指令虽然也能控制PC返回到原来中断的地方,但RET指令没有清零中断优先级状态触发器的功能,中断控制系统会认为中断仍在进行,其后果是与此同级或低级的中断请求将不被响应。
若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操作,即在中断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回断点。

6.5 外部中断

        外部中断0(INTo)、外部中断1(INT1)、外部中断2(INT2)和外部中断3(INT3)有两种触发方式,下降沿触发方式和低电平触发方式。
        请求四个外部中断的标志位是位于寄存器TCON中的IEO/TCON.1、IE1/TCON.3、IE2/XI-CON.2和IE3/XICON.5。当外部中断服务程序被响应后,中断请求标志位IEO、IE1、IE2和IE3会自动被清0。TCON寄存器中的ITO/TCON.0、IT1/TCON.2、IT2/XICON.0和IT3/XICON.4决定了外部中断0、1、2和3是低电平触发方式还是下降沿触发方式。如果ITx =0(x =0,1,2,3),那么系统在INTx(x =0,1,2,3)脚探测到低电平后可产生外部中断。如果ITx = 1(x =0,1,2,3),那么系统在INTx( x= 0,1,2,3)脚探测下降沿后可产生外部中断。外部中断0(INTO)、外部中断1(INT1)、外部中断2(INT2)和外部中断3(INT3)还可以用于将单片机从掉电模式唤醒。
        由于系统每个时钟对外部中断引脚采样1次,所以为了确保被检测到,输入信号应该至少维持2个系统时钟。如果外部中断是仅下降沿触发,要求必须在相应的引脚维持高电平至少1个系统时钟,而且低电平也要持续至少一个系统时钟,才能确保该下降沿被CPU检测到。同样,如果外部中断是低电平可触发,则要求必须在相应的引脚维持低电平至少2个系统时钟,这样才能确保CPU能够检测到该低电平信号。

第七章 定时器/计数器

7.1 定时器/计数器0/1   

        STC89C51RC/RD+系列单片机的定时器0和定时器1,与传统8051的定时器完全兼容,当在定时器1做波特率发生器时,定时器0可以当两个8位定时器用。
        STC89C51RC/RD+系列单片机内部设置的两个16位定时器/计数器TO和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(TO和T1),在特殊功能寄存器TMOD中都有一控制位一C/T来选择TO或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(TO为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。
        定时器/计数器0有4种工作模式:模式0(13位定时器/计数器),模式1(16位定时器/计数器模式),模式2(8位自动重装模式),模式3(两个8位定时器/计数器)。定时器/计数器1除模式3外,其他工作模式与定时器/计数器0相同,T1在模式3时无效,停止计数。

7.1.1 定时器/计数器0和1的相关寄存器

        1. 定时器/计数器控制寄存器TCON

        TCON为定时器/计数器T0、T1的控制寄存器,同时也所存T0、T1溢出中断源和外部请求中断源等,TCON格式如下:

        2. 定时器/计数器工作模式寄存器TMOD

        定时和计数功能由特殊功能寄存器TMOD的控制位C/\overline{T}进行选择,TMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有四种操作模式,通过TMOD的M1和M0选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。

7.1.2 定时器/计数器0工作模式

        通过对寄存器TMOD中的M1(TMOD.1) 、M0(TMOD.0)的设置,定时器/计数器0有4种不同的工作模式。

7.1.2.1 模式0(13位定时器/计数器)

        将定时器设置成模式0时类似8048定时器,即8位计数器带32分频的预分频器。下图所示为定时器/计数器的模式O工作方式。此模式下,定时器0配置为13位的计数器,由TLO的低5位和THO的8位所构成。TLO低5位溢出向THO进位,THO计数溢出置位TCON中的溢出标志位TFO。GATE(TMOD.3)=0时,如TRO=1,则定时器计数。GATE=1时,允许由外部输入INTi控制定时器1,INTo控制定时器0,这样可实现脉宽测量。TRO为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见TCON寄存器各位的具体功能描述表。
        在模式0下定时器/计数器0作为13位定时器/计数器,如下图所示。

        当C/\overline{T}=0时,多路开关连接到系统时钟的分频输出,TO对时钟周期计数,TO工作在定时方式。当C/\overline{T}=1时,多路开关连接到外部脉冲输入P3.4/T0,即TO工作在计数方式。
        STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是6T模式,每6个时钟加1,速度是传统8051单片机的2倍。TO的速率在烧录用户程序时在STC-ISP编程器中设置。
        该模式下的13位寄存器包含THO全部8个位及TLO的低5位。TLO的高3位不定,可将其忽略。置位运行标志(TRO)不能清零此寄存器。模式0的操作对于定时器0及定时器1都是相同的。2个不同的GATE位(TMOD.7和TMOD.3)分别分配给定时器1及定时器0。

7.1.2.2 模式1(16位定时器/计数器)

        模式1除了使用TH0及TL0全部16位外,其他与模式0完全相同。即此模式下定时器/计数器0作为16位定时器/计数器,如下图所示。

        此模式下,定时器配置为16位定时器/计数器,由TLO的8位和THO的8位所构成。TLO的8位溢出向THO进位,THO计数溢出置位TCON中的溢出标志位TFO。
        当GATE=0(TMOD.3)时,如TRO=1,则定时器计数。GATE=1时,允许由外部输入INTO控制定时器0,这样可实现脉宽测量。TRO为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。∩
        当C/\overline{T}=0时,多路开关连接到系统时钟的分频输出,TO对时钟周期计数,TO工作在定时方式。当C/\overline{T}=1时,多路开关连接到外部脉冲输入P3.4/TO,即TO工作在计数方式。
        STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是6T模式,每6个时钟加1,速度是传统8051单片机的2倍。TO的速率在烧录用户程序时在STC-ISP编程器中设置。

7.1.2.3 模式2(8位自动重装模式)

        此模式下定时器/计数器作为可自动重装载的8位计数器,如下图所示。

        TL0的溢出不仅置位TF0,而且将TH0内容重新装入TL0,TH0内容由软件预置,重装时TH0内容不变。

7.1.2.4 模式3(两个8位计数器)

        对定时器1,在模式3时,定时器1停止计数,效果与将TR1设置为0相同。
        对定时器0,此模式下定时器0的TLO及THO作为2个独立的8位计数器。下图为模式3时的定时器0逻辑图。TLO占用定时器0的控制位: cT、GATE、TRO、INTO及TFO。THO限定为定时器功能(计数器周期),占用定时器1的TR1及TF1。此时,THO控制定时器1中断。
        模式3是为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。模式3只适用于定时器/计数器0,定时器T1处于模式3时相当于TR1=0,停止计数,而TO可作为两个定时器用。

7.1.3 定时器/计数器1工作模式

        通过对寄存器TMOD中的M1(TMOD.5)、M0(TMOD.4)的设置,定时器/计数器1有三种不同的工作模式。

7.1.3.1 模式0(13位定时器/计数器)

        此模式下定时器/计数器作为13位定时器,由TL1的低5位和TH1的8位所构成,如下图所示。模式0的操作对于定时器1和定时器0是相同的。

        当GATE=O0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。
        当C/\overline{T}=0时,多路开关连接到系统时钟的分频输出,T1对时钟周期计数,T1工作在定时方式。当C/\overline{T}=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。
        STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是6T模式,每6个时钟加1,速度是传统8051单片机的2倍。T1的速率在烧录用户程序时在STC-ISP编程器中设置。

7.1.3.2 模式1(16位定时器/计数器)

        此模式下定时器/计数器1作为16位定时器/计数器,如下图所示。

        此模式下,定时器1配置为16位定时器/计数器,由TL1的8位和TH1的8位所构成。TL1的8位溢出向TH1进位,TH1计数溢出置位TCON中的溢出标志位TF1。
        当GATE=0(TMOD.7)时,如TR1=1,则定时器计数。GATE=1时,允许由外部输入INT1控制定时器1,这样可实现脉宽测量。TR1为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。
        当C/\overline{T}=0时,多路开关连接到系统时钟的分频输出,T1对时钟周期计数,T1工作在定时方式。当C/\overline{T}=1时,多路开关连接到外部脉冲输入P3.5/T1,即T1工作在计数方式。
        STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是6T模式,每6个时钟加1,速度是传统8051单片机的2倍。T1的速率在烧录用户程序时在STC-ISP编程器中设置。

7.1.3.3 模式2(8位自动重装模式)

        此模式下定时器/计数器1作为可自动重装载的8位计数器,如下图所示。

        TL1的溢出不仅置位TF1,而且将TH1内容重新装入TL1,TH1内容由软件预置,重装时TH1内容不变。

7.2 定时器/计数器2

        定时器2是一个16位定时/计数器。通过设置特殊功能寄存器T2CON中的C/\overline{T2}位,可将其作为定时器或计数器(特殊功能寄存器T2CON的描述如下所示)。

7.2.1 定时器2的捕获模式

        在捕获模式中,通过T2CON中的EXEN2设置2个选项。如果EXEN2=0,定时器2作为一个16位定时器或计数器(由T2CON中C/T2位选择),溢出时置位TF2(定时器2溢出标志位)。该位可用于产生中断(通过使能IE寄存器中的定时器2中断使能位ET2)。如果EXEN2=1,与以上描述相同,但增加了一个特性,即外部输入T2EX由1变零时,将定时器2中TL2和TH2的当前值各自捕获到RCAP2L和RCAP2H。另外,T2EX的负跳变使T2CON中的EXF2置位,EXF2也像TF2一样能够产生中断(其向量与定时器2溢出中断地址相同,定时器2中断服务程序通过查询TF2和EXF2来确定引起中断的事件),捕获模式如下图所示。在该模式中,TL2和TH2无重新装载值,甚至当T2EX产生捕获事件时,计数器仍以T2EX的负跳变或振荡频率的1/12 (12时钟模式)或1/6 (6时钟模式)计数。

7.2.2 定时器2的自动重装模式(递增递减计数器)

        16位自动重装模式中,定时器2可通过C/T2配置为定时器/计数器,编程控制递增/递减计数。计数的方向是由DCEN(递减计数使能位)确定的,DCEN位于T2MOD寄存器中,T2MOD寄存器各位的功能描述如表3所示。当DCEN=0时,定时器2默认为向上计数;当DCEN=1时,定时器2可通过T2EX确定递增或递减计数。图2显示了当DCEN=0时,定时器2自动递增计数。在该模式中,通过设置EXEN2位进行选择。如果EXEN2=0,定时器2递增计数到OFFFFH,并在溢出后将TF2置位,然后将RCAP2L和RCAP2H 中的16位值作为重新装载值装入定时器2。RCAP2L和RCAP2H的值是通过软件预设的。
        如果EXEN2=1,16位重新装载可通过溢出或T2EX从1到0的负跳变实现。此负跳变同时EXF2置位。如果定时器2中断被使能,则当TF2或EXF2置1时产生中断。在图3中,DCEN=1时,定时器2可增或递减计数。此模式允许T2EX控制计数的方向。当T2EX置1时,定时器2递增计数,计数到OFFFFH后溢出并置位TF2,还将产生中断(如果中断被使能)。定时器2的溢出将使RCAP2L和RCAP2H中的16 位值作为重新装载值放入TL2和TH2。
        当T2EX置零时,将使定时器2递减计数。当TL2和TH2计数到等于RCAP2L和RCAP2H时,定时器产生中断。

7.2.3 定时器2作串口波特率发生器

        寄存器T2CON的位TCLK和(或)RCLK允许从定时器1或定时器2获得串行口发送和接收的波特率。当TCLK=0时,定时器1作为串行口发送波特率发生器;当TCLK=1时,定时器2作为串行口发送波特率发生器。RCLK对串行口接收波特率有同样的作用。通过这2位,串行口能得到不同的接收和发送波特率,一个通过定时器1产生,另一个通过定时器2产生。如图4所示为定时器2工作在波特率发生器模式。与自动重装模式相似,当TH2溢出时,波特率发生器模式使定时器2寄存器重新装载来自寄存器RCAP2H和RCAP2L的16位的值,寄存器RCAP2H和RCAP2L的值由软件预置。当工作于模式1和模式3时,波特率由下面给出的公式所决定:
                                   模式1和模式3的波特率=(定时器2溢出速率)/16

波特率公式汇总:

        定时器2工作在波特率发生器模式,外部时钟信号由T2脚进入,这时的波特率公式如下.
                                           模式1和模式3的波特率=(定时器2溢出速率)/16
如果定时器2采用内部时钟信号,则波特率公式如下:
                                                      波特率= \frac{SYSclk}{n\times [65536-(RCAP2H,RCAP2L)]}
式中:n=32(12时钟模式)或16(6时钟模式), SYSclk=振荡器频率。
自动重装值可由下式得到:
                                           RCAP2H, RCAP2L=65536-[sYsclk/(n×波特率)]

7.2.4 定时器2作为可编程时钟输出

        STC89C51RC/RD+系列单片机,可设定定时/计数器2,通过P1.0输出时钟。P1.0除作通用I/0口外还有两个功能可供选用:用于定时/计数器2的外部计数输入和定时/计数器2时钟信号输出。图5为时钟输出和外部事件计数方式示意图。

        通过软件对T2CON.1位C/T2复位为0,对T2MOD.1位T20E置1就可将定时/计数器2选定为时钟信号发生器,而T2CON.2位TR2控制时钟信号输出开始或结束(TR2为启/停控制位).由主振频率(SYSclk)和定时/计数器2定时、自动再装入方式的计数初值决定时钟信号的输出频率。其设置公式如下:
                                模式1和模式3的波特率=\frac{SYSclk}{n\times [65536-(RCAP2H,RCAP2L)]}
n=2,6时钟/机器周期;n=4,12时钟/机器周期
        从公式可见,在主振频率(SYSclk)设定后,时钟信号输出频率就取决于定时计数初值的设定。
        在时钟输出模式下,计数器回0 溢出不会产生中断请求。这种功能相当于定时/计数器2用作波特率发生器,同时又可以作时钟发生器。但必须注意,无论如何波特率发生器和时钟发生器不能单独确定各自不同的频率。原因是两者都用同一个陷阱寄存器RCAP2H、RCAP2L,不可能出现两个计数初值。

第八章 串行口通信

        STC89C51RC/RD+系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。

        串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

        STC89C51RC/RD+系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。        

        STC89C51RC/RD+系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并行IO口,或作串—并转换,或用于扩展串行外设等。

8.1 串行口相关寄存器

        1. 串行口控制寄存器SCON和PCON

        STC89C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
        串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。其格式如下:

        2. 串行口数据缓冲器SBUF

        STC89xx系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
        串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。
        串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
        由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

        3. 从机地址控制寄存器SADEN和SADDR

        为了方便多机通信,STC89C51RC/RD+系列单片机设置了从机地址控制寄存器SADEN和SADDR。其中SADEN是从机地址掩模寄存器(地址为B9H,复位值为0OH),SADDR是从机地址寄存器(地址为A9H,复位值为00H)。

        4. 与串行口中断相关的寄存器IE和IHP、IP

        串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:
        

        串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中,中断优先级控制寄存器的格式如下:

8.2 串行口工作模式

        STC89C51RC/RD+系列单片机的串行通信有4种工作模式,可通过软件编程对SCON中的SMO、SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的字符都带有1个启动位和1个停止位。在模式0中,串行口被作为1个简单的移位寄存器使用。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值