单片机学习资料2

更新时间:2024-05-28 04:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

二 Atmega8单片机结构分析

通过第一章内容的学习,我们已经知道,单片机就是在一块芯片上集成了一台微型计算机所必须的几个组成部分:CPU、存储器、I/0接口。

单片机主要是针对各种控制而设计的,因此,单片机除了具有一般微型计算机的组成部分外,一般还集成了定时/计数器、看门狗电路和中断系统,有的单片机还集成了A/D转换功能部件。

单片机的这些组成部件在结构上有什么特点?又是怎样工作的呢?这些都是本章要解决的问题。

§2.1 Atmega8单片机结构

为了提高运行效率,Atmega8单片机采用了哈佛(Harvar)结构,即程序存储器和数据存储器使用不同的存储空间。Atmega8单片机系统结构如图2—1:

RESETPC0-PC6PB0-PB7B端口驱动8位数据总线ADCPORTB数字接口TWI定时/计数器内部振荡器看门狗定时器MCU控制器MCU控制器VCCC端口驱动PORTC数字接口模拟输入选择GNDAGNDAREF程序计数器程序Flash指令寄存器指令译码器控制线CPU编程逻辑+-模拟比较器堆栈指针SRAM通用寄存器ALU状态寄存器SPI模拟比较器接口振荡器振荡器中断单元E2PROMUSARTPORTD数字接口D端口驱动PD0-PD7 图2—1 Atmega8结构框图

§2.2 Atmega8引脚功能

Atmega8单片机有PDIP、TQFP和MLF三种不同形式的封装,这里我们主要介绍它的PDIP封装,见图2—2所示。

(RESET)PC6(RXD)PD0(TXD)PD1(INT0)PD2(INT1)PD3(XCK/T0)PD4VCCGND(XTAL1/TOSC1)PB6(XTAL2/TOSC2)PB7(T1)PD5(AIN0)PD6(AIN1)PD7(ICP)PB01234567891011121314282726252423PC5(ADC5/SCL)PC4(ADC4/SDA)PC3(ADC3)PC2(ADC2)PC1(ADC1)PC0(ADC0)GNDAREFAVCCPB5(SCK)PB4(MISO)PB3(MOSI/OC2)PB2(SS/OC1B)PB1(OC1A)ATmega82221201918171615

图2—2 ATmega8引脚配置图

由上图可以看出,Atmega8单片机各引出脚的功能分括号外功能(第一功能)和括号内功能(第二功能)。下面我们先介绍Atmega8单片机引脚的第一功能,引脚第二功能,我们将在以后相关章节中讲述。

1.VCC(7脚)——(数字)电源; 2.GND(8、22脚)——地;

3.AVCC(20脚)——ADC转换模块电源供电端,即当PC0—PC3用于ADC时,AVCC引脚应通过低通滤波器连接到VCC上;当PC0—PC3不使用ADC时,该引脚应直接连接到VCC上。注意:PC4、PC5端口的电源是由VCC提供的;

4.AREF(21脚)——ADC转换模块参考电源输入端; 5.PB7(10脚)、PB6(9脚)、PB5(19脚)、PB4(18脚)、PB3(17脚)、PB2(16脚)、PB1(15脚)和PB0(14脚)——组成B端口的8个位。B端口是一个8位的双向I/O口,每个引脚都有内部上拉电阻,而且输出缓冲器具有双向(输入和输出)大电流的驱动能力,可以直接驱动发光二极管发光。

6.PC6(1脚)、PC5(28脚)、PC4(27脚)、PC3(26脚)、PC2(25脚)、PC1(24脚)和PC0(23脚)——组成C端口的7个位。C端口是一个7位的双向I/O口,每个引脚都有内部上拉电阻,而且输出缓冲器具有双向(输入和输出)大电流的驱动能力,可以直接驱动发光二极管发光。

注意:PC6的电气特性与端口C其他引脚的电气特性不同。当未对RSTDISBL熔丝编程时,PC6只作为复位输入引脚,不能当作I/O端口使用。要想使PC6作为I/O端口,就必须对RSTDISBL熔丝进行编程。如何对RSTDISBL熔丝编程,我们将在后面相关内容中介绍。

7.PD7(13脚)、PD6(12脚)、PD5(11脚)、PD4(6脚)、PD3(5脚)、PD2(4脚)、PD1(3脚)和PD0(2脚)——组成D端口的8个位。D端口是一个8位的双向I/O口,每个引脚都有内部上拉电阻,而且输出缓冲器具有双向(输入和输出)大电流的驱动能力,可以直接驱动发光二极管发光。

Atmega8的B、C、D端口都是双向I/O口,如何定义它们是输入还是输出,或内部上拉电阻是否有效,这些相关内容我们将在下一节《ATmega8的I/O端口》中讲述。

§2.3 ATmega8的I/O端口

由上节内容我们知道:Atmega8的I/O端口具有第一和第二两种功能,下面我们具体介绍这些内容。

一、端口的第一功能——通用的数字I/O口

Atmega8的I/O端口用做通用数字I/O口时,具有真正的读—修改—写功能,意思是某端口引脚方向改变(输入还是输出),不会影响其他引脚方向的改变。同样,某端口引脚输出值的改变(输出高电平还是输出低电平)以及用做输入时其上拉电阻的通、断,也不会影响其他引脚。

Atmega8每个I/O引脚内部都有独立的上拉电阻,如图2—3。

+5V开关K控制信号:为1时,K合上;为0时,K断开.K上拉电阻I/O口引脚(如PB0)ATmega82—3 I/O口引脚内部上拉电阻

如何用C语言定义打开某I/0(如PB0)口的上拉电阻呢?其格式如下:

DDRB=0B00000000;//先定义PB0为输入口

PORTB=0B00000001;//再将要打开上拉电阻的位置1。

上述定义中DDRB、PORTB是什么呢?其实在Atmega8中每个I/O端口都有3个寄存器,它们分别是:数据方向寄存器(DDRx)、数据寄存器(PORTx)和数据输入引脚寄存器(PINx)(x:是B或C或D)。下面我们以B端口为例,介绍这三种寄存器及其应用。

1.B端口方向寄存器——DDRB

位7DDB7R/W复位值R/W065432DDB2R/W01DDB1R/W00DDB0R/W0DDRBDDB6DDB5R/W0R/W0DDB4DDB3R/W0R/W0

方向寄存器主要用来定义I/O口引脚是输入还是输出,当I/O口的某位置“1”时,那么相应的引脚为输出,否则,该引脚为输入。例如:DDRB=0B00000010,即DDB=1,说明B口的PB1为输出,其他引脚为输入。

2.B端口数据寄存器——PORTB

位76543210PORTB7PORTB6PORTB5PORTB4PORTB3PORTB2PORTB1PORTB0PORTBR/W复位值R/W0R/W0R/W0R/W0R/W0R/W0R/W0R/W0

数据寄存器或用来定义引脚输出电平的高低,或用来定义是否打开引脚内部的上拉电阻。定义了I/O口某个引脚为输出后,当数据寄存器相应位置“1”时,说明该引脚输出高电平;置“0”时,输出低电平,如:

DDRB=0B00000110;//定义PB1、PB2为输出。

PORTB=0B00000010;//PB1输出高电平,PB2输出低电平。

定义了I/O口某个引脚为输入后,当数据寄存器相应位置“1”时,说明打开该引脚的内部上拉电阻;置“0”时,该引脚内部的上拉电阻是关断的,如: DDRB=0B00000000;//定义PB0—PB7为输入。

PORTB=0B00000010;//打开PB1内部上拉电阻。 3.B端口输入引脚寄存器——PINB

位76543210PORTB7PORTB6PORTB5PORTB4PORTB3PORTB2PORTB1PORTB0PINBR/WRN/ARN/ARN/ARN/ARN/ARN/ARN/ARN/A

输入引脚寄存器主要用来读取I/O口引脚电平的高低。

注意:“0B00000010”,这种书写格式与B端口的PB0—PB7之间的对应关系如图2—4所示。

PB7PB6PB5PB4PB3PB2PB1PB00B图2—4

Atmega8C、D断口的方向寄存器、数据寄存器、输入引脚寄存器与B口相类似,这里不在叙述。 二、端口的第二功能

大家可能注意到了,有些单片机引脚的功能不止一个,是什么原因呢?由于

工艺及标准化等原因,单片机引脚数目总是有限的。Atmega8单片机引脚数目为28个,但单片机为实现功能所需要的信号数目却远远超过这个数。如何解决这个供需矛盾呢?正如有的人为了增加收入,要做一些兼职工作。单片机也同样如此,当引脚数量有限时,“兼职”是唯一可行的办法,即给其中一些引脚赋以双重功能。下面介绍Atmega8单片机引脚的第二功能。 1. B端口引脚第二功能:见表2—1

表2—1 B端口引脚第二功能 引 脚 PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 第 二 功 能 XTAL2(系统时钟晶振引脚2) TOSC2(实时时钟晶振引脚2) XTAL1(系统时钟晶振引脚1或外部系统时钟输入口) TOSC1(实时时钟晶振引脚1) SCK(SPI总线时钟) MISO(SPI总线主输入口/从输出口) MOSI(SPI总线主输出口/从输入口) OC2(T/C2输出比较匹配输出口) SS(SPI总线主从选择) OC1B(T/C1输出比较B匹配输出口) OC1A(T/C1输出比较A匹配输出口) ICP(T/C1输入捕获输入口) ①PB7——XTAL2/ TOSC2 XTAL2:系统时钟晶振引脚2。当系统使用外部晶振时,该引脚连接晶振的一个脚,此时,该引脚不能作为I/O引脚使用。当系统使用内部可校准的RC振荡器或外部时钟源时,该引脚可作为一般I/O口使用。

TOSC2:实时时钟晶振引脚2。只有当选择内部可校准的RC振荡器作为系统时钟源时,而且设置寄存器ASSR中的AS2位,允许使用异步时钟定时器时,PB7才可用作TOSC2。当ASSR寄存器的AS2位置“1”,使能定时/计数器2的异步时钟功能时,PB7与端口引脚脱离,作为振荡放大器的反向输出端。在这种模式下,时钟晶体连接到该引脚,且不能作为I/O引脚。

如果PB7被用作晶振,寄存器DDB7、PORTB7和PINB7读出都为“0”。 ②PB6——XTAL1/ TOSC1

XTAL1:系统时钟晶振引脚1。当系统使用外部晶振时,该引脚连接晶振的一个脚,此时,该引脚不能作为I/O引脚使用。当系统使用内部可校准的RC振荡器或外部时钟源时,该引脚可作为一般I/O口使用。

TOSC1:实时时钟晶振引脚2。只有当选择内部可校准的RC振荡器作为系统时钟源时,而且设置寄存器ASSR中的AS2位,允许使用异步时钟定时器时,PB6才可用作TOSC1。当ASSR寄存器的AS2位置“1”,使能定时/计数器2的异步时钟功能时,PB6与端口引脚脱离,作为振荡放大器的反向输入端。在这种模式下,时钟晶体连接到该引脚,且不能作为I/O引脚。

如果PB6被用作晶振,寄存器DDB6、PORTB6和PINB6读出都为“0”。 ③PB5——SCK

SCK:SPI串行总线接口时钟线。当系统作为主机时,SCK为SPI总线的时钟输出端;当系统作为从机时,SCK为SPI总线的时钟输入端。当使能SPI为从机模式时,无论DDB5是何设置,该引脚被强置为输入。尽管SCK引脚被SPI

强置为输入,且其内部上拉电阻仍由PORTB5控制。当使能SPI为主机时,PB5的数据方向由DDB5来控制。

④PB4——MISO

MISO:SPI串行总线接口的主机数据输入/从机数据输出端。当使能SPI为主机模式时,无论DDB4,PB4都被设置为输入,但其内部上拉电阻仍由PORTB4控制。;当使能SPI为从机模式时, PB4的数据方向由DDB4来控制。

⑤PB3——MOSI/OC2

MOSI:SPI串行总线接口的主机数据输出/从机数据输入端。当使能SPI为从机模式时,无论DDB3,PB3都被设置为输入,且其内部上拉电阻仍由PORTB3控制。当使能SPI为主机模式时, PB3的数据方向由DDB3来控制。

OC2:比较匹配输出端。PB3引脚还可以作为定时/计数器2比较匹配的外部输出口,此时,PB3引脚必须设置为输出(DDB3=1)。在PWM应用中,OC2引脚还可作为PWM定时器模块的输出引脚。

⑥PB2——SS/OC1B

SS:SPI总线从机选择输入。当使能SPI为从机模式时,无论DDB2,PB2都被设置为输入,且其内部上拉电阻仍由PORTB2控制。当使能SPI为主机模式时, PB2的数据方向由DDB2来控制。

OC1B:T/C1比较匹配B输出端。PB2引脚还可以作为定时/计数器1比较匹配B的外部输出口,此时,PB2引脚必须设置为输出(DDB2=1)。在PWM应用中,OC1B引脚还可作为PWM定时器模块的输出引脚。

⑦PB1——OC1A

OC1A :T/C1比较匹配A输出端。PB1引脚还可以作为定时/计数器1比较匹配A的外部输出口,此时,PB1引脚必须设置为输出(DDB1=1)。在PWM应用中,OC1A引脚还可作为PWM定时器模块的输出引脚。

⑧PB0——ICP ICP:输入捕获的输入引脚。PB0引脚能作为T/C1输入捕获功能的输入引脚。 2. C端口引脚第二功能:见表2—2

表2—2 C端口引脚第二功能

引 脚 PC6 PC5 PC4 PC3 PC2 PC1 PC0 第 二 功 能 RESET(系统复位引脚) ADC5(ADC输入通道5) SCL(2线串行总线接口时钟线) ADC4(ADC输入通道4) SDA(2线串行总线接口数据输入/输出线) ADC3(ADC输入通道3) ADC2(ADC输入通道2) ADC1(ADC输入通道1) ADC0(ADC输入通道0) ①PC6——RESET RESET:系统复位引脚。当RSTDISBL熔丝位被置位时,PC6作为一般I/O引脚应用,此时,芯片内部的上电复位(POWER—UP)和掉电检测复位(BROWN—OUT)作为系统的复位源。当RSTDISBL熔丝位没有被置位时,内部复位电路将连接到PC6引脚,此时PC6不作为I/O口使用,当被外部拉成低电平时,产生复位动作,使系统复位。

②PC5——SCL/ ADC5/

SCL:2线串行总线时钟线。当TWCR寄存器中的TWEN位被置“1”时,使能TWI接口,,PC5将与I/O端口脱离,成为TWI总线接口的串行时钟线。PC5工作在TWI模式下时,有一个尖峰滤波器连接到该引脚,能够抑制输入信号中小于50ns的毛刺,同时引脚将由具有缓冲率限制的开漏驱动器驱动。

ADC5:PC5也可以作为ADC输入的通道5。注意:ADC输入通道5由数字电源端Vcc供电。

③PC4——SDA/ADC4

SDA:2线串行总线时钟线。当TWCR寄存器中的TWEN位被置“1”时,使能TWI接口,,PC4将与I/O端口脱离,成为TWI总线接口的串行时钟线。PC4工作在TWI模式下时,有一个尖峰滤波器连接到该引脚,能够抑制输入信号中小于50ns的毛刺,同时引脚将由具有缓冲率限制的开漏驱动器驱动。

ADC4:PC4也可以作为ADC输入的通道4。注意:ADC输入通道4由数字电源端Vcc供电。

④PC3——ADC3

ADC3: PC3也可以作为ADC输入的通道3。注意:ADC输入通道3由模拟电源端AVcc供电

⑤PC2——ADC2

ADC2: PC2也可以作为ADC输入的通道2。注意:ADC输入通道2由模拟电源端AVcc供电。

⑥PC1——ADC1

ADC1: PC1也可以作为ADC输入的通道1。注意:ADC输入通道1由模拟电源端AVcc供电。

⑦PC0——ADC0

ADC0: PC0也可以作为ADC输入的通道0。注意:ADC输入通道0由模拟电源端AVcc供电。

⑧PD0——RXD

RXD:USART总线的数据输入口。当使用USART的数据接收功能时,无论DDD0为如何设置,PD0均为输入,此时PD0内部上拉电阻仍然由PORTD0控制。

3. D端口引脚第二功能:见表2—3

表2—3 D端口引脚第二功能 引 脚 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 第 二 功 能 AIN1(模拟比较器负输入) AIN0(模拟比较器正输入) T1(T/C1外部计数脉冲输入口) XCK(USART外部时钟输入/输出口) T0(T/C0外部计数脉冲输入口) INT1(外部中断1输入) INT0(外部中断0输入) TXD(USART输出口) RXD(USART输入口) ①PD7——AIN1 AIN1:模拟比较器反相输入。在使用模拟比较器功能时,应将PD7设置为

输入,且关断内部上拉电阻,防止数字口功能影响模拟比较器的性能。

②PD6——AIN0

AIN0:模拟比较器正相输入。在使用模拟比较器功能时,应将PD6设置为输入,且关断内部上拉电阻,防止数字口功能影响模拟比较器的性能。

③PD5——T1

T1:T/C1外部计数脉冲输入口 ④PD4——XCK/T0

XCK:USART串行总线外部时钟输入/输出口 T0:T/C0外部计数脉冲输入口 ⑤PD3——INT1

INT1:外部中断源1。PD3可作为一个外部中断源的输入口 ⑥PD2——INT0

INT0:外部中断源0。PD2可作为一个外部中断源的输入口 ⑦PD1——TXD

TXD:USART总线的数据输出口。当使用USART的数据输出功能时,无论DDD1如何设置,PD1均为输出。

⑧PD0——RXD

RXD:USART总线的数据输入口。当使用USART的数据接收功能时,无论DDD0为如何设置,PD0均为输入,此时PD0内部上拉电阻仍然由PORTD0控制。

以上是Atmega8单片机各端口引脚的第二功能,有的引脚的第二功能比它的第一功能还有用,有时可以不利用它的第一功能,但是不能没有它的第二功能。缺少了它的第二功能,单片机甚至不能工作。尽管单片机引脚的地二功能如此有用,但初学者对它们的用法感到迷惑不解,总以为第二功能和第一功能之间要有一个切换过程,或者说要用某条指令来完成第一功能和第二功能的切换。实际上,单片机各引脚的第二功能完全是自动的,不需要用指令来切换。

§2.4 Atmega8存储器

单片机开始处理问题之前,必须事先把编写好的各种程序和所需的一些常数送到单片机中存放起来。我们把能够存放程序或数据的器件称为存储器。下面我们看看单片机的存储器究竟是什么样子的。

一、程序存储器

程序指的是控制单片机动作的一系列命令。单片机只认识由“0”和“1”代码构成的机器指令,因此必须将我们用C语言编写的程序转换成它能认识的指令码。也就是说在单片机处理问题之前必须将将编好的程序、常数等编译成机器代码后存入单片机的存储器中,这种用与存放程序指令、常数的存储器称为程序存储器。

程序存储器具有“非易失”和“只读”属性。所谓“非易失性”指的是在掉电情况下,储存在程序存储器中的程序代码不会丢失。“只读性”指的是单片机在正常工作时,不能往程序存储器中写入数据,而只能从程序存储器中将数据读出,所以这种存储器又称为ROM(Read Only Memory)。要想往程序存储器中写入数据,必须在特殊条件下、用特定的设备进行写操作。

Atmega8单片机所采用的程序存储器就是一种可电擦除的只读存储器,称为Flash ROM。由于所有的AVR指令都是16位或32位,因此Atmega8单片机Flash程序存储器具有4K×16位的结构。图2—5为Atmega8单片机Flash程序存储器的结构图。另外,为了提高程序的安全性性,设计时已将Atmega8单片机的Flash程序存储器分为引导程序区(Boot Program Section)和应用程序区(Application Program Section)两部分。我们可以通过对相应熔丝位的编程设定,选择是否需要使用引导程序区以及该区空间的大小。

16Bits$000应用程序区引导程序区$FFF

图2—5 Flash程序存储器结构

二、数据存储器

单片机中仅有程序存储器是不够的,因为它在作各种运算时与人工计算类似,为了得到最终结果,往往要经过许多步的中间过程,得到许多中间结果。这些中间结果在运算过程中也要有个地方存放才行。程序结束了,这些中间结果可能就不需要了。把它们放哪呢?当然放在存储器中。放在前面提到的程序存储器中可以吗?显然不行,因为这些中间结果是随时可能变化的,单片机要将它们写进程序存储器中,而在正常工作时程序存储器又是不可以写的。所以,在单片机中还必须有一个存放中间结果的区域,称为数据存储器。

数据存储器具有随机可读、可写的性能,称为RAM(Random Access Memory)。

Atmega8 单片机数据存储器包括SRAM数据存储器和512B的E2PROM数据存储器。SRAM数据存储器的空间组织结构如图2—6。

通用工作寄存器组R0R1R2?R29R30R31I/O存储器空间$00$01$02?$3D$3E$3F64个32个数据存储器空间$0000$0001$0002?$001D$001E$001F$0020$0021$0022?$005D$005E$005F内部SRAM$0060$00611024个?$045E

图2—6 SRAM数据存储器的空间结构

$045F也许有同学问:在一般的计算机中,并没有程序存储器和数据存储器的说法。其实,这正是单片机和一般计算机的不同之处之一。单片机在存储空间上将程序存储器与数据存储器分开,这种结构称为哈佛(Harvard)结构。而一般计算机中程序和数据共用一个存储空间。

单片机的存储器为什么要采用这种哈佛(Harvard)结构呢?这是由单片机的应用特点所决定的。单片机往往是针对某个特定的对象和任务设计的,其程序设计成功后,一般不会再变化。因此程序(包括程序中的一些常数)可以而且也应该一次性的永久地存放到单片机中,这样不仅省去了每次开机时重新装载程序,还可以有效地防止因为掉电和其他干扰而引起的程序丢失和错误。 三、I/O寄存器

Atmega8所有的I/O口及外围设备的控制寄存器、数据寄存器都被设置在I/O寄存器空间中。表2—4列出了Atmega8单片机的I/O寄存器的地址空间分配、名称和功能。

表2—4 Atmega8单片机I/O寄存器地址空间分配表 十六进制地址 $00($0020) $01($0021) $02($0022) $03($0023) $04($0024) $05($0025) $06($0026) $07($0027) $08($0028) $09($0029) $0A($002A) $0B($002B) $0C($002C) $0D($002D) $0E($002E) $0F($002F) 名称 TWBR TWSR TWAR TWDR ADCL ADCH ADCSR ADMUX ACSR UBRRL UCSRB UCSRA UDR SPCR SPSR SPDR 功能 I2C波特率寄存器 I2C状态寄存器 I2C从机寄存器 I2C数据寄存器 ADC数据寄存器低字节 ADC数据寄存器高字节 ADC控制和状态寄存器 ADC多路选择器 模拟比较控制和状态寄存器 USART波特率寄存器低8位 USART控制状态寄存器B USART控制状态寄存器A USART I/O数据寄存器 SPI控制寄存器 SPI状态寄存器 SPI I/O数据寄存器

$10($0030) $11($0031) $12($0032) $13($0033) $14($0034) $15($0035) $16($0036) $17($0037) $18($0038) $19($0039) $1A($003A) $1B($003B) $1C($003C) $1D($003D) $1E($003E) $1F($003F) $20($0040) $21($0041) $22($0042) $23($0043) $24($0044) $25($0045) $26($0046) $27($0047) $28($0048) $29($0049) $2A($004A) $2B($004B) $2C($004C) $2D($004D) $2E($004E) $2F($004F) $30($0050) $31($0051) $32($0052) $33($0053) $34($0054) $35($0055) $36($0056) $37($0057) $38($0058) $39($0059) PIND DDRD PORTD PINC DDRC PORTC PINB DDRB PORTB (Reserved) (Reserved) (Reserved) EECR EEDR EEARL EEARH UCSRC UBRRH WDTCR ASSR OCR2 TCNT2 TCCR2 ICR1L ICR1H OCR1BL OCR1BH OCR1AL OCR1AH TCNT1L TCNT1H TCCR1B TCCR1A SFIOR OSCCAL TCNT0 TCCR0 MCUCSR MCUCR TWCR SPMCR TIFR TIMSK D端口输入脚 D端口数据方向寄存器 D端口数据寄存器 C端口输入脚 C端口数据方向寄存器 C端口数据寄存器 B端口输入脚 B端口数据方向寄存器 B端口数据寄存器 保留 保留 保留 E2PROM控制寄存器 E2PROM数据寄存器 E2PROM地址寄存器低8位 E2PROM地址寄存器高8位 USART控制状态寄存器C USART波特率寄存器高4位 看门狗定时器控制寄存器 异步模式状态寄存器 T/C2输出比较寄存器 T/C2计数器 T/C2控制寄存器 T/C1输入捕获寄存器低8位 T/C1输入捕获寄存器高8位 T/C1输出比较寄存器B低8位 T/C1输出比较寄存器B高8位 T/C1输出比较寄存器A低8位 T/C1输出比较寄存器A高8位 T/C1计数器低8位 T/C1计数器高8位 T/C1控制寄存器B T/C1控制寄存器A 特殊功能I/O寄存器 内部RC振荡器校准值寄存器 T/C0计数器 T/C0控制寄存器 MCU控制和状态寄存器 MCU控制寄存器 I2C总线控制寄存器 写程序存储器控制寄存器 T/C中断标志寄存器 T/C中断屏蔽寄存器 $3A($005A) $3B($005B) $3C($005C) $3D($005D) $3E($005E) $3F($005F) GIFR GICR (Reserved) SPL SPH SREG 通用中断控制寄存器 通用中断控制寄存器 保留 堆栈指针寄存器低8位 堆栈指针寄存器高8位 状态寄存器 §2.5 时钟电路和复位电路

一、时钟源

单片机在执行指令时,通常将一条指令分解为若干基本的微操作,这些微操作对应的脉冲信号在时间上的先后次序,称为单片机的时序。

为了保证同步工作,单片机内部电路应在唯一的时钟信号控制下,严格地按照时序进行工作。

Atmega8共有5种源,如图2—7所示。

外部晶振CPU时钟clkCPU外部RC振荡器外部低频晶振外部时钟内部 RC晶振时钟源选择器I/O时钟clkI/O主时钟时钟控制器Flash时钟clkFLASHADC时钟clkADC异步定时器时钟clkASY

图2—7 Atmega8时钟系统

具体的Atmega8应用系统采用哪种时钟源,可以通过利用广州双龙MCU下载程序V1.3.4对Atmega8内部的熔丝位CKSEL进行编程设置,如表2—6。

表2—5 Atmega8时钟源选择 可选择的时钟源 外部晶振 外部RC振荡器 外部低频晶振 外部时钟 内部RC振荡 熔丝位CKSEL3,2,1,0 1111—1010 1000—0101 1001 0000 0100—0001 例如:采用8.000MHz内部RC振荡器,我们可以利用V1.3.4进行如图2—8所示设置。

图2—8

注意:在图2—8中,打“√”表示相应的CKSEL被编程,且为“0”。 1.外部晶振

Atmega8的XTAL1和XTAL2分别为片内振荡器的反向放大器的输入、输出端,可在外部连接石英晶体(对频率要求不高时可接陶瓷晶体),构成稳定的自激振荡器,产生一个与石英晶体固有频率相等的时钟信号,如图2—9。

C2XTAL2C1XTAL1GNDATmega8

图2—9 外部晶振连接图

图中晶振频率可以在0.4—16MHz之间选择。C1、C2通常选则容量为12~22pF的NPO电容,且使两者的容量相等。另外,为了保证振荡器的稳定性,在设计电路板时,晶体、电容尽可能靠近芯片,以减少分布电容的影响。

使用外部晶振,可以通过熔丝位CKOPT选择两种不同的工作方式:当熔丝位CKOPT被编程时,外部晶振振荡器输出一个满幅的振荡信号,使系统适合在高噪声环境下工作,或需要把从XTAL2的时钟信号作为时钟信号输出;当熔丝位CKOPT未4被编程时,外部晶振振荡器输出一个小摆幅的振荡信号,此时相应减少了功率消耗。但此方式的工作频率范围受限,而且振荡器的输出不能作为外部时钟驱动使用。

外部晶振振荡器的每种工作方式又有不同的三种模式,可以通过熔丝位

CKSEL(3、2、1)不同的编程组合来选择,具体情况参见表2—6。

表2—6 外部晶振振荡器不同工作模式 工作 方式 1 熔 丝 位 工作频率范C1、C2(使用石 围(MHz) 英晶体,pF) CKOPT CKSEL(3、2、1)仅使用于陶瓷振荡器 1 101 0.4~0.9 1 110 0.9~3.0 12~22 1 111 3.0~8.0 12~22 0 0 101、110、111 ≤1.0 12~22 2.外部时钟源 在由多个单片机组成的系统中,为了保证各单片机之间时钟信号的同步,应当引入唯一的公用外部脉冲作为各单片机的时钟脉冲。

Atmega8采用外部时钟源时,连接方法如图2—10,而且要将熔丝位CKSEL编程为“0000”。另外,通过对熔丝位CKOPT编程,可以使芯片内部XTAL1与地之间的36pF有效。

NCXTAL2外部时钟信号XTAL1GNDATmega8

图2—10外部时钟源接法

3.可校准的内部RC振荡器

Atmega8中集成了可校准的内部RC振荡电路,它可以提供固定的1.0、2.0、4.0或8.0MHz时钟信号,对频率要求不高时,可以作为系统时钟源,从而使得系统硬件配置变得简单。我们可以通过对熔丝位CKSEL编程来选用内部RC振荡器作为系统时钟(熔丝位CKOPT应处于未编程状态),见表2—7。

表2—7 使用内部RC振荡器的不同工作模式 熔丝位CKSEL(3、2、1、0) 0001 0010 0011 0100 工作频率(MHz) 1.0 2.0 4.0 8.0 注意:Atmega8芯片出厂时设置为0001 由Atmega8构成的单片机系统除了可以选择以上三种时钟源外,还可以采用外部RC振荡器或外部低频晶振作为系统时钟源,具体使用方法参照相关的技术文件。

二、单片机的复位电路

复位功能类似预备铃的作用,预备铃一响,大家就自动进入教室,在这段时间里,老师还没有开始上课。对于单片机来说,复位的时候,CPU也没有开始执行程序,只是做准备工作。

Atmega8单片机有4个复位源:上电复位、外部复位、看门狗复位和电源电压检测BOD复位。下面我们详细介绍Atmega8的上电复位功能。

上电复位脉冲(POR)由Atmega8芯片内部的电源检测电路产生,检测电平门限见表2—8。当系统电源电压VCC低于上电复位门限电平VPOT,产生内部复位脉冲,使MCU复位。

表2—8 Atmega8复位特性

符 号 参 数 上电复位门限电压(上升沿) 条 件 最小值 典型值 最大值 单位 VPOT 1.4 2.3 V 上电复位门限电压(下降沿) 1.3 2.3 V VRST 复位引脚门限电压 0.1 0.9 V 复位引脚需要的最小脉宽 tRST 50 ns BODLEVEL=1 VBOT 掉电复位门限电压 2.5 2.7 3.2 V BODLEVEL=0 3.7 4.0 4.5 V TBOD 掉电检测的低电压最小宽度 BODLEVEL=1 2 us BODLEVEL=0 2 us VHYST 掉电检测迟滞电压 130 mV 当系统上电电压达到上电复位门限电平VPOT时,启动Atmega8芯片内部一个延时计数器,由它决定Atmega8上电后保持复位状态的时间,如图2—11。

VPOT系统电源电压Vcc VRST复位引脚电平t延时延迟时间内部复位脉冲

图2—11 MCU上电复位(复位引脚接到系统电源VCC)

由上面的介绍可知,由于Atmega8特有的上电复位功能,在它构成的单片机系统中,我们可以不用外设复位电路,只要将其复位引脚直接接到电源端即可,从而简化了硬件电路,这也是单片机发展的方向。

Atmega8其它三种复位源,请大家参考相关的技术资料。

§2.6 中断系统

中断系统是单片机的重要组成部分,实时控制、数据传送、故障自动处理等往往都采用中断系统。中断系统的应用使单片机的功能更强、效率更高、使用更加灵活方便。本章主要介绍中断的概念以及Atmega8单片机的中断系统。 一、中断的概念:

㈠ 什么是中断

所谓中断指的是由于某中原因,使当前正在进行的工作暂时停止,改为去执行另一项工作,待这项工作处理完后,回到原来的地方继续以前的工作。

其实,在我们日常生活中也经常发生中断现象。例如:小王正在家中看书,突然响起急促的电话铃。小王放下手中的所看的书,去听电话。电话是他同学打来的,因两人很久没有联系,自然少不了一番寒暄。之后,小王挂断电话,又继续看书。

㈡、中断的基本术语 1.主程序

主程序就是单片机中断前所执行的程序。上例中小王看书的过程可以理解为主程序。

2.中断源

中断源即引起中断的原因或事件。上例中小王的同学是引起小王中断看书的根本原因,因此,小王的同学是产生这次中断的中断源。

3.中断请求信号

中断请求信号指的是中断源通过什么方式请求中断。上例中小王的同学是通过电话铃声请求中断的,因此,电话铃声是产生这次中断的中断请求信号。

4.中断服务程序

中断服务程序即发生中断后所执行的程序。上例中小王暂停看书后所做的事是接他同学的电话,因此,小王接听电话是中断服务程序。

5.断点

断点就是主程序被断开的位置。在上例中,假设小王刚好看到第98页时,电话铃声响了,小王暂停看书去接听电话,那么第98页就是断点。

6.中断的优先级 在同一时刻,使单片机暂停当前正在执行程序的中断源有可能不止一个,而每个中断源都有自己的“份量”,有的请求比较迫切,单片机必须尽快响应,而有的则可以等会后才响应,这就是中断的优先级。 二、Atmega8单片机的中断系统

不同型号的单片机,其硬件结构和软件指令有所不同,中断系统也有所不同。下面我们就来看看Atmega8单片机的的中断系统。

㈠ 中断源

Atmega8单片机提供了18个中断源和一个复位向量。每个中断源在程序空间都有一个独立的中断向量号(地址),如表2—9所示。

表2—9 Atmega8中断源和中断向量 中断向量号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 中断源 RESET INT0 INT1 TIMER2 COMP TIMER2OVF TIMER1CAPT TIMER1 COMPA TIMER1 COMPB TIMER1OVF TIMER0OVF SPI,STC USART,RCX USART,UDRE USART,TXC ADC EE_RDY ANA_COMP TWI SPM_RDY 中断定义 上电、外部、BOD、看门狗复位 外部中断0 外部中断1 定时/计数器2比较匹配 定时/计数器2溢出中断 定时/计数器1捕获事件 定时/计数器1比较匹配A 定时/计数器1比较匹配B 定时/计数器1溢出中断 定时/计数器0溢出中断 SPI串行传输完成 USART,Rx完成 USART,寄存器空 USART,Tx完成 ADC转换完成 E2PROM准备好 模拟比较器 两线串行接口(I2C) 写程序存储器准备好 在这19个中断向量中,中断向量号越小的,其中断优先级别越高。

㈡ 与外部中断有关寄存器

在Atmega8单片机18个中断源中,每个中断源都有独立的中断使能位,在这里我们先介绍与外部中断有关使能位,其它(如定时/计数器溢出中断)在相应章节中介绍。Atmega8与外部中断有关的寄存器有MCUCR、GICR、GIFR。这三个寄存器是如何为外部中断系统服务呢?具体地说,Atmega8两个外部中断源的中断方式锁存在MCUCR中。这两个外部中断源的中断请求,能否得到响应,还受通用中断控制寄存器GICR中各位的控制和状态寄存器I位控制(I位置1,允许全局中断,在C语言中定义为SEI())。响应中断后的中断标志寄存在通用中断标志寄存器GIFR中。

1.MCU控制积存器——MCUCR

MCUCR寄存器中包含外部中断方式控制位和一般的MCU功能控制位,每一位定义如下。

位7SER/W复位值R/W06SM2R/W05SM1R/W043210MCUCRSM0ISC11ISC10ISC01ISC00R/W0R/W0R/W0R/W0R/W0

⑴ 位3、2:外部中断1的中断方式控制位

如果状态寄存器中的I位和中断控制寄存器GICR中相应的中断屏蔽位被置“1”,外部中断1会由引脚INT1(PD3)上电平的变化而触发。外部中断1的中断方式定义如表2—10。

表2—10 INT1中断方式

位3 0 0 1 1 位2 0 1 0 1 中 断 方 式 INT1的低电平产生一个中断请求 INT1的下降沿和上升沿都产生一个中断请求 INT1的下降沿产生一个中断请求 INT1的上升沿产生一个中断请求 我们用C语言编写了这样一条语句:MCUCR=0x08;其意思是外部中断1采用INT1引脚上脉冲下降沿触发。

⑵ 位1、0:外部中断0的中断方式控制位

如果状态寄存器中的I位和中断控制寄存器GICR中相应的中断屏蔽位被置“1”,外部中断0会由引脚INT0(PD2)上电平的变化而触发。外部中断0的中断方式定义如表2—11。

表2—11 INT0中断方式 位1 位0 中 断 方 式 0 0 INT0的低电平产生一个中断请求 0 1 INT0的下降沿和上升沿都产生一个中断请求 1 0 INT0的下降沿产生一个中断请求 1 1 INT0的上升沿产生一个中断请求 我们用C语言编写了这样一条语句:MCUCR=0x02;其意思是外部中断0采用INT0引脚上脉冲下降沿触发。

2.通用中断控制寄存器—GICR

我们用GICR寄存器的控制位定义相应外部中断使能,每一控制位的定义如下。

位7INT1R/W复位值R/W06INT0R/W05-R04-R03-R02-R010GICRIVSELIVCER/W0R/W0

⑴ 位7:外部中断1使能 当位7置“1”,同时状态寄存器SREG的I位被置“1”时(即打开全局中断),外部中断1被使能(开放)。即使INT1引脚(即PD3)被定义为输出方式,其上的有效电平变化仍会触发中断。

⑵ 位6:外部中断0使能 当位6置“1”,同时状态寄存器SREG的I位被置“1”时(即打开全局中断),外部中断0被使能(开放)。即使INT0引脚(即PD2)被定义为输出方式,其上的有效电平变化仍会触发中断。

3.通用中断标志寄存器—GIFR

位765-R04-R03-R02-R01-R00-R0GIFRINTF1INTF0R/W复位值R/W0R/W0

⑴ 当INT1引脚(即PD3)上的有效电平触发一个中断请求后,GIFR寄存

器的位7会变成“1”。如果SREG寄存器中的I位和GICR的位7被置“1”,MCU将跳至相应的中断处开始执行中断服务程序,同时硬件自动将GIFR的位7清零。如果将逻辑“1”写到GIFR的位7,该位将被清零。

⑵ 当INT0引脚(即PD2)上的有效电平触发一个中断请求后,GIFR寄存器的位6会变成“1”。如果SREG寄存器中的I位和GICR的位6被置“1”,MCU将跳至相应的中断处开始执行中断服务程序,同时硬件自动将GIFR的位6清零。如果将逻辑“1”写到GIFR的位6,该位将被清零。 三、单片机中断处理过程

㈠ 中断响应的条件 单片机在运行时,将对所有中断源按优先级顺序检测,单片机响应中断的条件是:

1.中断源有中断请求;

2.MCU开放全局中断,即状态寄存器SREG的I位置“1”(用C语言编程时定义为“SEI();”);

3.通用中断控制寄存器GICR的相应位置“1”。 满足以上条件,MCU一般会响应中断。 ㈡ 中断处理过程

中断处理过程可以分为中断响应、中断处理和中断返回3个阶段。 1.中断响应

中断响应包括保护断点和将程序转向中断服务程序的向量入口。当有中断源申请中断时,先将这些中断的标志位置“1”,以便MCU采样每一个中断标志。MCU根据具体情况决定是否响应中断。如果MCU没有更急、更重要的任务,则在执行完当前指令后响应中断申请。

2.中断处理

中断处理就是执行中断服务程序。 3.中断返回

中断返回就是完成中断服务程序后,程序返回到断点的位置,继续执行原来的程序。

四、C语言编制中断源程序

对中断实现控制,实质上就是对上面所讲的几个与中断有关的寄存器进行管理和控制。只要将这些寄存器的相应位按照我们的要求进行状态预置,MCU就会按照我们的意图对中断源进行管理和控制。

C语言编制中断程序的要点如下:

1.程序中必须有“#include ”调用中断头文件的伪指令。 2.MCU要开放全局中断,即程序中要么对状态寄存器SREG的I位置“1”,要么在中断程序中包含有“SEI( );”语句。一般编程时采用第二种方式。

3.相应中断控制寄存器(如GICR)相应位置“1”。

4.对于外部中断源,还必须用MCUCR寄存器定义中断方式,是低电平触发中断,还是下降沿,或上升沿触发中断。

5.声明中断源入口的中断向量,书写格式为:

#pragma interrupt_handler 中断服务程序名_isr:中断向量 6.编制中断服务程序,书写格式如下:

#pragma interrupt_handler 中断服务程序名_isr:中断向量 void 中断服务程序名_isr:中断向量 {

中断服务程序内容 }

如果多个中断源使用同一个中断服务程序,可以用不同的中断向量声明多次,如INT0和INT1使用同一个中断服务程序: #pragma interrupt_handler int0_isr:2 #pragma interrupt_handler int0_isr:3 void int0_isr(void) {

中断服务程序内容 }

§2.7 定时/计数器

在自动控制中,常常需要实时时钟来实现定时或延时,也常常要对外部事件进行计数。下面分析定时/计数器的工作原理和Atmega8单片机的定时/计数器。 一、定时/计数器的工作原理

1.定时/计数器的工作原理图:图2—12

振荡器分频器K1K2加1计数器溢出标记寄存器溢出中断请求信号T0或T1图2—12

定时/计数器的工作原理

2.振荡器

振荡器由单片机内部元件或内部元件与相应引脚所接的外部元件构成,产生一定频率(如8MHz)的系统时钟信号clkI/O。

3.分频器

Atmega8中由一个10位预定比例分频器构成,它将振荡器所产生的系统时钟信号按一定比例(如8或64)进行分频,形成符合计数器使用的计数时钟clkT。

4.T0或T1

T0或T1是来自单片机外部引脚T0或T1的时钟信号。 5.K1、K2

K1、K2是两个由定时/计数器控制寄存器TCCR控制的模拟开关。其中,K1控制加1计数器是对内部计数时钟计数(或计时)还是对外部时钟计数(或计时);K2控制加1计数器是否开始计数(或计时)。

6.加1计数器

加1计数器是定时/计数器的核心,它的基本功能就是对输入给它的脉冲进行计数。下面谈谈与加1计数器的有关的几个基本概念。

⑴ 计数器的容量

无论是计数还是定时,都不能无限地进行,应该有一个计数次数、定时时间长短的限制,否则单片机怎么知道计数已满、定时时间已到呢?那么单片机中的计数器有多大容量?对于8位计数器,它的最大计数容量是28=256;对于16位计数器,它的最大计数容量是216=65536。

⑵ 初值

计数器存在一个最大的计数范围、最长的定时时间。但在实际应用场合,往往不需要计数这么多次或定时这么长的时间。这里就涉及到计数器初值的问题。

比如一个空杯最多能装1000滴水,对了就溢出。但如果我想让它滴800滴水就溢出,怎么办呢?“乌鸦喝水”给我们很好的启示,只要在开始滴水之前就先往杯里放入200滴水。

对于计数器,其实也如此。比如说一个8位的计数器,最多能计256个脉冲。如果我想让它计156个脉冲就溢出,只要在计数开始之前在计数器中放入100个脉冲数就达到目的了。这个 100就是计数器的初值。

⑶ 溢出

既然计数器和我们日常使用的水杯一样,有一个最大容量的问题。因此,当计数器计数已满时,如果还继续往里面输入计数脉冲,那么它就会象一个水杯装满水后,如果继续往里面滴水,多余的水就会从水杯中流到地,这就是定时器的溢出。

日常生活中水杯的溢出和单片机中计数器的溢出,有相同的地方,也有不同之处。两者不同之处表现在:当水杯发生溢出现象时,只是使多余的水流到杯外,整个杯中装满了水,而计数器发生溢出时,不仅把多余的脉冲“流”到计数器外,而且会将计数器原来所计有的脉冲数全部清空;另外,水杯发生溢出后,不会自动再往杯中滴水,而计数器产生溢出后,它会自动从0开始计数。如果不想让它从0开始,那么可以对它重新赋初值,从所赋的初值开始计数。 二、Atmega8单片机定时/计数器

Atmega8单片机有3个定时/计数器:8位的定时/计数器0(T/C0)、16位的定时/计数器1(T/C1)、8位的定时/计数器2(T/C2)。这些定时/计数器除了能够实现通常的定时和计数功能外,还具有捕捉、比较、脉宽调制输出和实时时钟计数等功能。这里我们主要介绍它们的定时/计数功能。

㈠ 8位定时/计数器0——T/C0

定时/计数器0是一个单通道计数器,可以实现定时和对外部事件计数,它带有一个10位的预定比例分频器。下面我们看看与定时和计数有关的寄存器。

1.T/C0控制寄存器——TCCR0

位765432CS02R/W01CS01R/W00CS00R/W0TCCR0_R/WR复位值0_R0_R0_R0_R0

TCCR0主要通过不同的控制位来实现:①计数器的开始或停止;②对内部时钟计数(或定时),还是对外部时钟计数(或定时);③如果是对内部时钟计数(或定时),那么采用的预定分频比例是多少。具体定义如表2—12。

表2—12 T/C0时钟源选择 位2 位1 位0 说 明 0 0 0 无计数时钟源(定时/计数器停止) 0 0 1 采用系统时钟作为计数时钟源 0 1 0 采用系统时钟的8分频作为计数时钟源 0 1 1 采用系统时钟的64分频作为计数时钟源 1 0 0 采用系统时钟的256分频作为计数时钟源 1 0 1 采用系统时钟的1024分频作为计数时钟源 1 1 0 采用T0引脚输入的外部时钟(下降沿驱动) 1 1 1 采用T0引脚输入的外部时钟(上升沿驱动) 2.T/C0中断屏蔽寄存器——TIMSK 位76543210TOIE0TIMSKR/W0OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1R/WR/WR/W0R/W0R/W0R/W0R/W0复位值0_R/W0

TIMSK主要功能之一就是控制T/C0溢出中断是开放还是屏蔽。当该寄存器的位0置“1”,且状态寄存器(SREG)的I位置“1”时,开放T/C0的溢出中断,否则,屏蔽T/C0的溢出中断。用C语言定义T/C0开放溢出中断的语句如下:

TIMSK=0X01;// T/C0溢出中断使能 SEI();//全局中断使能

3.T/C0溢出标志寄存器——TIFR

位7OCF26TOV2R/W05ICF1R/W04OCF1AR/W03OCF1BR/W02TOV1R/W010TOV0R/W0TIFR_R/W0R/WR/W复位值0

当T/C0产生溢出时,TIFR的位0变为“1”,向MCU提出溢出中断请求,

这是如果TIMSK的位0也置“1”(T/C0溢出中断使能),SREG的I位置“1”(全局中断使能),那么MCU转入T/C0溢出中断向量,执行中断服务程序,同时TIFR的位0自动清0,为下一次产生溢出中断作准备。写入一个逻辑“1”到TIFR的位0(如:TIFR=0X01),也可以将该位清0。

4.T/C0计数寄存器——TCNT0

TCNT0是一个8位寄存器,主要用于锁存T/C0计数器所记录的脉冲数。在用C编程时,主要利用TCNT0给计数器赋初值,如:TCNT0=0XB1;//给TCNT0赋初值B1。

㈡ 16位定时/计数器1——T/C1

定时/计数器1是一个真正的16位计数器,可以实现定时和对外部事件计数及捕捉、比较、脉宽调制输出的功能,它带有一个与T/C0相同的预定比例分频器。下面我们介绍它与定时和计数有关的寄存器。

1.T/C1控制寄存器A——TCCR1A

TCCRA是一个8位寄存器,其相应的位主要用于控制Atmega8比较输出引脚PB1、PB2的输出行为及波形发生器的工作模式等,有关这些内容我们在其它章节中介绍。

2.T/C1控制寄存器B——TCCR1B

位7654321CS11R/W00CS10TCCR1BR/W0ICNC1ICES1R/WR/WR/W0复位值0_R0WGM13WGM12CS12R/W0R/W0R/W0

TCCR0的位2、位1、位0的不同组合主要用来控制:①计数器的开始或停止;②对内部时钟计数(或定时),还是对外部时钟计数(或定时);③如果是对内部时钟计数(或定时),那么采用的预定分频比例是多少。具体定义如表2—13。

表2—13 T/C1时钟源选择

位2 位1 位0 说 明 0 0 0 无计数时钟源(定时/计数器停止) 0 0 1 采用系统时钟作为计数时钟源 0 1 0 采用系统时钟的8分频作为计数时钟源 0 1 1 采用系统时钟的64分频作为计数时钟源 1 0 0 采用系统时钟的256分频作为计数时钟源 1 0 1 采用系统时钟的1024分频作为计数时钟源 1 1 0 采用T1引脚输入的外部时钟(下降沿驱动) 1 1 1 采用T1引脚输入的外部时钟(上升沿驱动) 2.T/C1中断屏蔽寄存器——TIMSK 位76543210TOIE0TIMSKR/W0OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1R/WR/WR/W0R/W0R/W0R/W0R/W0复位值0_R/W0

TIMSK主要功能之一就是控制T/C1溢出中断是开放还是屏蔽。当该寄存器的位0置“1”,且状态寄存器(SREG)的I位置“1”时,开放T/C1的溢出中断,否则,屏蔽T/C1的溢出中断。用C语言定义T/C1开放溢出中断的语句如下:

TIMSK=0X01;// T/C1溢出中断使能 SEI();//全局中断使能

3.T/C1溢出标志寄存器——TIFR

位7OCF2R/WR/W复位值06TOV2R/W05ICF1R/W04OCF1AR/W03OCF1BR/W02TOV1R/W010TOV0R/W0TIFR_R/W0

当T/C1产生溢出时,TIFR的位0变为“1”,向MCU提出溢出中断请求,

这是如果TIMSK的位0也置“1”(T/C1溢出中断使能),SREG的I位置“1”(全局中断使能),那么MCU转入T/C1溢出中断向量,执行中断服务程序,同时TIFR的位0自动清0,为下一次产生溢出中断作准备。写入一个逻辑“1”到TIFR的位0(如:TIFR=0X01),也可以将该位清0。

4.T/C1计数寄存器——TCNT1H和TCNT1L

TCNT0是一个16位寄存器,分为高8位计数寄存器TCNT1H和低8位计数寄存器TCNT1L,主要用于锁存T/C1计数器所记录的脉冲数。在用C编程时,主要利用它来给计数器赋初值,其中高8位赋给TCNT1H,低8位赋给TCNT1L如:

TCNT1H=0XFF;//给TCNT1H赋初值FF TCNT1L=0X62;//给TCNT1L赋初值62 ㈢ 8位定时/计数器2——T/C2

定时/计数器2是一个单通道计数器,可以实现对内部时钟定时和计数,而不能对外部事件进行计数,它带有一个与T/C0和T/C1不同的预定比例分频器。下面我们介绍与定时和计数有关的寄存器。

1.T/C2控制寄存器——TCCR2

位7FOC2R/W复位值W06WGM20R/W05COM21R/W04COM20R/W03WGM21R/W02CS22R/W01CS21R/W00CS20R/W0TCCR2

TCCR2主要通过位2、位1和位0的不同组合来实现:①计数器的开始或停止;②采用多大分频比例对内部时钟计数(或定时)。具体定义如表2—14。

表2—14 T/C2时钟源选择 位2 0 0 0 0 位1 0 0 1 1 位0 0 1 0 1 说 明 无计数时钟源(定时/计数器停止) 采用系统时钟作为计数时钟源 采用系统时钟的8分频作为计数时钟源 采用系统时钟的32分频作为计数时钟源 1 1 1 1 0 0 采用系统时钟的64分频作为计数时钟源 0 1 采用系统时钟的128分频作为计数时钟源 1 0 采用系统时钟的256分频作为计数时钟源 1 1 采用系统时钟的1024分频作为计数时钟源 2.T/C2中断屏蔽寄存器——TIMSK 位76543210TOIE0TIMSKR/W0OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1R/WR/WR/W0R/W0R/W0R/W0R/W0_R/W0复位值0

TIMSK主要功能之一就是控制T/C2溢出中断是开放还是屏蔽。当该寄存器的位0置“1”,且状态寄存器(SREG)的I位置“1”时,开放T/C2的溢出中断,否则,屏蔽T/C2的溢出中断。用C语言定义T/C2开放溢出中断的语句如下:

TIMSK=0X01;// T/C2溢出中断使能 SEI();//全局中断使能

3.T/C2溢出标志寄存器——TIFR

位7OCF2R/W复位值R/W06TOV2R/W05ICF1R/W04OCF1AR/W03OCF1BR/W02TOV1R/W010TOV0R/W0TIFR_R/W0

当T/C2产生溢出时,TIFR的位6变为“1”,向MCU提出溢出中断请求,

这是如果TIMSK的位0也置“1”(T/C2溢出中断使能),SREG的I位置“1”(全局中断使能),那么MCU转入T/C2溢出中断向量,执行中断服务程序,同时TIFR的位6自动清0,为下一次产生溢出中断作准备。写入一个逻辑“1”到TIFR的位6(如:TIFR=0X40),也可以将该位清0。

4.T/C2计数寄存器——TCNT2

TCNT2是一个8位寄存器,主要用于锁存T/C2计数器所记录的脉冲数。在用C编程时,主要利用TCNT2给计数器赋初值,如:TCNT2=0XB1;//给TCNT2赋初值B1

三、定时/计数器应用C语言编程

㈠ 初始化

由于定时/计数器是可编程的,因此在任何一个定时/计数器开始工作之前,必须对其进行初始化。

1.初始化的步骤

①停止定时/计数器计数工作,即给TCCR0或TCCR1B、 TCCR2赋初值0X00。

②把定时、计数的初值写入TCNT0或TCNT1H、TCNT1L、 TCNT2计数寄存器中。

③通过定时/计数器控制寄存器TCCR0或TCCR1A、

TCCR1B、TCCR2设置该定时/计数器是对内部,还是外部时钟定时(或计数),以及所采用的分频比例,启动定时/计数器计数。

④如果采用溢出中断,还必须置位TIMSK寄存器的相应控 制位允许该定时/计数器溢出中断,同时开放全局中断。

2.注意事项

①若使定时/计数器循环计数,在一次定时或计数结束之

后,应给计数寄存器TCNT0或TCNT1H、TCNT1L、TCNT2重新赋值。

②采用查询方式,要用软件将TIFR溢出标志寄存器清0, 比如对定时/计数器0的TIFR清0,可以设置语句“TIFR=0X01;”。而采用中断方式,则不需要这样,因为执行中断服务程序后,TIFR可以自动清0。

㈡ 定时时间常数的计算 1.计算公式

①8位定时/计数器,定时时间常数的计算公式: t=(256-TCNT初值)×N×TI/O 式中:

t:定时时间,单位:微秒us TCNT初值:计数器的初值 N:分频比例数

TI/O:系统时钟周期,单位:微秒us。如果系统时钟频率为4Mz,则其周期TI/O为0.25us;如果系统时钟频率为8Mz,则其周期TI/O为0.125us。

②16位定时/计数器,定时时间常数的计算公式: t=(65536-TCNT初值)×N×TI/O 式中:

t:定时时间,单位:微秒us TCNT初值:计数器的初值 N:分频比例数

TI/O:系统时钟周期,单位:微秒us。如果系统时钟频率为4Mz,则其周期TI/O为0.25us;如果系统时钟频率为8Mz,则其周期TI/O为0.125us。

由上面两公式计算得到的TCNT初值,是一个十进制数,必须转换成十六进制数才能赋值给单片机的计数器。下面介绍一种简便的转换制式方法:

第一步:如图2—13所示,点击桌面左下角的

按钮,在弹出的开

始菜单中依次选中[程序]、[附件]和[计算器],打开电脑自带的计算器,如图2—14:

图2—13

图2—14

第二步:如图2—15所示,单击选中

主菜单,在弹出的下拉菜单中单击

菜单项,弹出科学型计算器窗口,如图2—16:

图2—15

图2—16

第三步:将光标移动到算器窗口变为图2—17所示:

前的小圆圈中,单击选中十进制项,这是计

图2—17

第四步:将前面计算所得的TCNT初值,十进制数(如2008)键入到科学计算器中,如图2—18:

图2—18

第五步:将光标移动到前的小圆圈中点击选中十六进制项,这是计

算器所显示的数就是我们所需要的十六进制数(如7D8),如图2—19:

图2—19

本文来源:https://www.bwwdw.com/article/wk67.html

Top