历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2018年07月30日 | PIC单片机入门_定时器/计数器TMR0详解与实例

2018-07-30 来源:eefocus

1.前言:

PIC 系列单片机内部配备有数量不等的定时器/计数器模块:例如PIC17CX系列和PIC18CX系列都都配置了4个定时器/计数器模块;而PIC16F87X系列都配置了3个定时器/计数器模块,分别记为TMR0、TMR1和TMR2。
TMR0、TMR1和TMR2在电路上均不相同,而且用途也各有所异,但是三者也存在许多共同之处。这里主要介绍的是TMR0,TMRl和TMR2将在后面介绍。

其实定时器都是一个由时钟信号触发的递增的计数器;都是从预先设定的初始值开始累计,在累计数超过最大值,或者超过预先设定的值时便产生溢出,并同时会建立一个相应的溢出标志(即中断标志位)。        

2.TMR0的特性

①核心部分是一个8位宽,在时钟信号上升沿触发的循环累加计数寄存器TMR0;最大位数:256
②TMR0是一个特殊功能寄存器,地址为01H或101H;
③有一个可选用的8位可编程分频器; 

④信号源可以是内部时钟信号源(定时器模式),也可以是外部时钟信号源(计数器模式)。    

⑤当使用外部触发信号作为时钟信号源时,可定义触发方式,即上升沿触发或下降沿触发;
⑥具有溢出中断功能。

3.与TMR0模块相关的寄存器

与TMR0模块有关的特殊功能寄存器有四个:8位的累加寄存器TMR0、中断控制寄存器INTCON、选项寄存器OPTION_REG和端口RA方向控制寄存器TRISA,如下表所列。



以上4个寄存器都是特殊功能寄存器,可以把它们当做普通RAM单元来进行读写访问。我挑几个起控制作用的寄存器进行介绍。

3.1 选项寄存器OPTION_REG      


选项寄存器是一个可读、写的寄存器,与TMR0有关各位的含义如下: 
⑴PS2~PS0:分频器分频比选择位。如下表所列:

⑵PSA:分频器分配位。  1=分频器分配给WDT;0=分频器分配给TMR0。  

⑶T0SE:TMR0时钟源触发边沿选择位,只有当TMR0工作于计数器模式时,该位才有效。1=外部时钟T0CKI下降沿触发TMR0递增; 0=外部时钟T0CKI上升沿触发TMR0递增。

⑷T0CS:TMR0的时钟源选择位;1=由T0CKI外部引脚输入的脉冲作为TMR0时钟源;0=由内部提供的指令周期信号作为TMR0时钟源。

3.2 中断控制寄存器INTCON


中断控制寄存器也是一个可读/写的寄存器,与TMR0有关的各位的含义如下:    
⑴T0IF:TMR0溢出标志位(也就是溢出中断标志)。l=TMR0发生溢出;0=TMR0未发生溢出。
⑵T0IE:TMR0溢出中断使能位。l=允许TMR0溢出后产生中断;    0=屏蔽TMR0溢出后产生中断。

⑶GIE:全局中断总使能位。1=允许CPU响应所有外围设备产生的中断请求;0=禁止CPU响应所有外围设备产生的中断请求。

3.3 端口RA方向控制寄存器TRISA(外部触发引脚复用)

TRISA4:由于TMR0的外部输入信号T0CKI与端口RA4是复合在同一条脚上的,当TMR0工作于计数模式时,要求该脚必须设置为输入方式,作为T0CKI信号专用输入引脚。1=引脚RA4设为输入,以便从该脚送进T0CK1信号。

4.TMR0的电路结构和工作原理

定时器/计数器TMR0的结构方框图如图所示:


在图可以将整个电路按功能简化为三个相对独立的主要组成部分:计数寄存器TMR0、分频器和看门狗定时器WDT。因为看门狗在电路上与TMR0之间共同分享同一个分频器,于是两者就有了同时出现在同一张图上。

4.1 分频器

看门狗定时器WDT与TMR0共同分享一个分频器,但两者不能同时使用。即在同一时刻,分频器只能分配给两者中之一。分频器也是一个8位累加计数器,不过它不能像TMR0那样直接进行读、写操作,它只能配合TMR0或WDT起分频作用。当PSA=0时,分频器归TMR0所有,进入累加器TMR0的时钟信号,都要先经过分频器;而当PSA=1时,分频器与TMR0隔离,进入TMR0的时钟信号,不再经过分频器。

当分频器分配给TMR0时,任何以TMR0为目标的写操作指令(如CLRF TMR0 , MOVWF TMR0 )都会将分频器清0;当分频器分配给WDT时,执行CLRWDT的指令将会同时将其分频器清零。注意分频器清零时,而分频比和分配对象并不会改变。

4.2 TMR0 累加计数寄存器

定时器/计数器TMR0 既可以作为定时器使用,也可以作为计数器使用,即TMR0有定时和计数两种工作模式。

两种模式的差异就是进入TMR0的时钟信号源不同,TMR0的工作模式由T0CS位,即选项寄存器OPTION_REG位5决定。


1.定时器模式: 当T0CS=0时,TMR0为定时器模式, TMR0的触发信号来自于内部的指令周期信号。在定时器模式下,一旦往TMR0中写入初始值,TMR0便启动累加计数。未使用分频器时,TMR0会在每个指令周期信号到来时自动加1;使用了分频器时,TMR0会在收到n个指令周期信号后自动加1, n 由分频比决定。

2.计数器模式:工作在计数器模式时,T0SE位决定了外部时钟信号的触发边沿:T0SE=1,下降沿触发;T0SE=0,上升沿触发。TMR0工作于计数器模式时,一旦往计数寄存器中写入初始值后,TMR0立即开始新一轮的累加计数。

没有使用分频器时,TMR0会在每个T0CKI信号的上升沿或下降沿到来时自动加1。在此模式下,外部随机送入的脉冲信号和内部的工作时钟之间存在一个同步的问题。也就是说,并不是外部触发信号一进入,TMR0就立即加1,而是要经过一个同步逻辑,外部信号与系统时钟同步之后,方能进入累加计数器TMR0,引发 一次加1操作。

5.TIMER0应用实例

前面介绍了用软件方式实现延时,下面利用定时器TMR0来实现硬件延时。

把PIC单片机演示板上的8只LED发光二极管,设计为轮流发光,也就是在下图所示 16 个状态间轮流切换,并且在各个状态之间切换时,插入256 ms的延时。


8只LED的亮灭规律符合数据结构中的队列操作规则:“最先移入队列的亮灯,最先移出队列”。即开始亮灯的顺序是:LED0→ LED1 LED0 →…. LED7… LED0 。熄灯的顺序也是以上顺序。 

软件设计:

⒈延时时间设计:
 当8个LED在16个状态之间切换时,要插入256 ms的延时;每个灯在发光时有闪烁,即每个灯不断在“亮-灭”, “亮-灭”之间的延时为64 ms ,这些延时要求由TMR0产生。
⒉  定时器/计数器TMR0控制字设计:
将分频器配置给TMR0使用,即PSA=0;分频比设定为最大(1:256),即PS2~PS0=111;那么OPTION_REG=07H (00000111B)。

TMR0的初值X计算(假设Tcyc=1μs) :
                 256*(256-X)*Tcyc =64000μs
                 X=256-64000/256=6 (关键是要找到这个初值,启动定时器的时候,把它装进去)
⒊设计一个查表子程序READ ,在表中预先存储要显示的状态, LED显示码可以调用READ获取。
⒋程序流程图如下:


程序清单:


TMR0            EQU 01H      ;定义寄存器的位置

PCL             EQU 02H      ;定义程序计数器低字节寄存器地址

STATUS          EQU 03H      ;定义状态寄存器地址

OPTION          EQU 81H      ;定义选项寄存器位置

INTCON          EQU 0BH      ;定义中断寄存器位置

PORTC           EQU 07H      ;定义PORTC的存储位置

TRISC           EQU 87H 

TMR0B           EQU 6       ;定义TMR0寄存器初始值

COUNT           EQU 20H     ;定义一个计数器变量

RP0             EQU 5          ;定义RAM的页选位RP0  

      ORG     000H          

      BSF STATUS, RP0          ;转向RAM的体1

      MOVLW 00H                ;将端口C设为输出     

      MOVWF TRISC 

;**********TMR0延时子程序(64 MS)*************

DELAY BCF INTCON,2           ;清除TMR0溢出标志位

             MOVLW TMR0B     ;TMR0赋初值

             MOVWF TMR0      ; 并重新启动定时计数

LOOP1 BTFSS INTCON,2         ;检测TMR0溢出标志位

             GOTO LOOP1      ; 没有溢出,循环检测

             RETURN          ; 子程序返回

;********** 读取显示信息的查表子程序************

READ

       ADDWF   PCL,1           ; 地址偏移量加当前PC值

       RETLW   B'00000001'     ;显示信息码,下同

       RETLW   B'00000011'

       RETLW   B'00000111 '        

       RETLW   B'00001111'    

       RETLW   B'00011111'

       RETLW   B'00111111'       

       RETLW   B'01111111'

       RETLW   B'11111111'

       RETLW   B'11111110'

       RETLW   B'11111100'

       RETLW   B'11111000'

       RETLW   B'11110000'

       RETLW   B'11100000'

       RETLW   B'11000000'

       RETLW   B'10000000'

       RETLW   B'00000000'

  END    


推荐阅读

史海拾趣

Aearo Technologies公司的发展小趣事

在发展过程中,Aearo Technologies经历了一次重要的收购事件。3M公司看中了Aearo在能量控制领域的领先地位和技术实力,于XXXX年将其收购。收购后,Aearo Technologies成为了3M旗下的一家子公司,继续保留其品牌和技术优势。通过业务整合和资源共享,Aearo Technologies在3M的支持下实现了更快速的发展。

博通集成(BEKEN)公司的发展小趣事

博通集成自成立以来,始终致力于无线通讯技术的研发与创新。公司团队不断攻克技术难关,推出了多款具有市场竞争力的产品。其中,公司自主研发的首款Wi-Fi宽带收发样片在2015年成功通过测试,这一技术突破为公司在无线通讯领域的发展奠定了坚实基础。此后,公司不断推出创新产品,涵盖无线数传芯片和无线音频芯片等多个领域,广泛应用于智能家居、智能交通等领域。

ETC公司的发展小趣事

速通科技始终将用户体验放在首位。公司不断完善ETC系统的服务功能,提高了系统的稳定性和易用性。同时,速通科技还建立了完善的客户服务体系,为用户提供24小时不间断的在线客服支持。这些举措大大提高了用户对ETC系统的满意度和信任度。

CalRamic Technologies Llc公司的发展小趣事

在巩固了国内市场地位后,CalRamic Technologies开始将目光投向国际市场。公司积极参加各类国际电子元器件展览会,与多家国际知名企业建立了合作关系。通过与国际大厂的深入交流,公司不仅拓宽了销售渠道,还引进了国际先进的生产技术和管理经验,进一步提升了自身的竞争力。

Fuji Electric Co Ltd公司的发展小趣事

在21世纪初,随着电子行业的蓬勃发展,对于微型化、高性能电子元器件的需求日益增加。在这样的时代背景下,CalRamic Technologies Llc公司应运而生。公司由几位在电子行业有着丰富经验的工程师创立,他们看到了陶瓷电容器等元器件的巨大市场潜力。初创时期,公司面临着资金紧张和技术瓶颈等挑战,但团队凭借对市场的深刻理解和技术的不断创新,逐渐在电子元器件市场上占据了一席之地。

ENPIRION公司的发展小趣事

随着ENPIRION公司产品的不断推出和市场的逐步扩大,公司开始寻求与各大电子制造商的合作。通过与小米、OPPO、vivo等知名品牌建立合作关系,ENPIRION公司的电源管理解决方案得到了更广泛的应用,进一步提升了其市场影响力和竞争力。这些合作伙伴关系的建立不仅为ENPIRION公司带来了更多的商业机会,也为其技术创新和产品升级提供了更广阔的平台。

问答坊 | AI 解惑

程控三相精密线性功率源的设计

  摘要:针对某些领域对三相程控高精度电源的需求,提出了一种三相功率源的设计方法。该方法主要利用单片EPROM实现三相稳定信号源的产生,采用同步跟随电源技术进行线性功率放大,采用功率合成技术实现大功率输出。测试结果表明该功率源波形失 ...…

查看全部问答>

威盛694XB公版主板电路图(INTEL810E)

威盛694XB公版主板电路图,需要的朋友看看吧.... 威胜的那套图被黑客给黑掉了,我也没有了.换一套INTEL810E的吧.再过几天我会陆续在上一些PC主板的图的. [ 本帖最后由 西门 于 2009-5-15 22:32 编辑 ]…

查看全部问答>

【新手指南】论坛帮助帖汇总

最近抽空整理了一些论坛的帮助帖,希望能对大家有帮助,不断完善中........ 大家多提意见,多问问题,我会帮大家找到答案并在帖子中逐步完善!                   一、 &nbs ...…

查看全部问答>

wince5.0怎样才能收到蓝牙耳机按键消息?

修改C:\\WINCE500\\PRIVATE\\WINCEOS\\COMM\\BLUETOOTH里面的代码,进行全编译都编不进去 有什么办法可以截获蓝牙耳机按键消息吗?…

查看全部问答>

高手进来指导下。我用C语言写了两天的日历时钟,有闹钟功能、计时功能。

#include #include #define UCHAR unsigned char #define UINT unsigned int void init(); void delay(UINT); void displayWeek(UCHAR week); void displayTime(UCHAR first, UCHAR second); void writeCmd(UCHAR cmd); void writeData(UCHAR dat) ...…

查看全部问答>

请问AT91RM9200的网络DMA

它的EMC的传输方式是不是就称为DMA?  还是说他另外有一种DMA的传输方式可以选择?…

查看全部问答>

帮个忙!!

本人搞软件的,会几门编程语言。比较熟悉的有vb、vc++,现在想往单片机方面靠靠。以前上学时学过单片机,汇编语言,计算机组成等,对单片机还特意学了一段时间(都是理论的,没实践过),毕业后因为工作的事就在也没接触过。现在想学的话从什么地方 ...…

查看全部问答>

段寄存器左移四位后,前四位不是溢出了吗?

8086微处理器课程中,在介绍存储器20位地址的形成时,说16位段寄存器中数据左移四位后再与偏移值相加,那么左移四位后前四位不是溢出了吗?如原来是ABCDH,左移后为BCD0H,不会为ABCD0H啊?…

查看全部问答>

cyclone2 FPGA 开发板转让

  [ 本帖最后由 wenhuawu 于 2011-6-3 10:57 编辑 ]…

查看全部问答>