PIC16F1937之定时器

发布者:科技创客最新更新时间:2017-01-10 来源: eefocus关键字:PIC16F1937  定时器 手机看文章 扫描二维码
随时随地手机看文章

这篇文章是谈谈关于1937的定时器的,刚开始被晶振频率、时钟频率、振荡周期、振荡频率、指令周期、指令频率等等的名词绕晕了。先来解决这个问题。


晶振频率是代表振荡器的频率,说的是晶振这个器件的频率,因为一个单片机有内部外部晶振,比如你选择了内部晶振,那么这个晶振的频率就是你单片机的时钟频率,


振荡频率和晶振频率说的是一回事。振荡周期是1/(晶振频率),T = 1/f 嘛。指令周期这个根据单片机的不同会不同,8位的PIC单片机(PIC10/12/16/18系列)是4个时钟周期为一个指令周期。16位的PIC24单片机和dsPIC数字处理芯片和32位PIC32处理器是2个时钟周期为一个指令周期。(以上关于指令周期的内容是百度到的,内容较可靠http://zhidao.baidu.com/link?url=uEnsn0C-bb-xdDNG_qEI0HmhIpoDNVc4d2lheztGKsQMpflMcpbnlWAGdXyeMz05fJAhXardxSrQDLHEdDrCx_)


理清上面的内容,就开始我们的正题。


TIMER0


/*

* TIMER0是一个8位定时器/计数器,有8位预分频器(1:2-1:256),是所有定时器中预分频最大的(可以这么说吧。。)

* 可编程的内外部时钟源,可编程的外部时钟边沿选择。

* 溢出时中断

* TMR0可用于门控Timer1(还没试过。。)

* 休眠模式中无法工作

* 此时选择内部晶振8mhz,预分频1:16,每2.04s灯状态改变一次。TMR0从0计数到255

* 所以是255*16*1000/(Fosc(晶振频率)/4) = 2.04

*/


这些是我写在单片机程序开头的内容,大致描述了TIMER0模块,接下来告诉你们怎么使用它吧。(只写关于初始化TIMER0的,CPU的初始化之类的略过)


1.先初始化时钟源,在OSSCON寄存器中设置SCS位来选择内部振荡模块,IRCF设置内部频率


2.现在初始化TIMER0,还是一样,先选择时钟源,TMR0CS = 0;表示内部指令周期(注意是指令周期,fosc/4)


3.选择预分频,PSA位来选择需不需要预分频,PS<2:0>来设置预分频


4.时钟都和中断有关,所以这里要允许有效中断,GIE = 1;


5.然后允许TIM0IE中断,TIM0IE = 1;


6.最后是溢出中断标志位,TMR0IF = 0;表示未溢出,当定时器开启的时候TMRO就会开始计数,一个指令周期加一,从0-255.当加到255后再加一使TMR0IF = 1;计数会跳到0继续。


7.TMR0可以不用使能,自动计数,但因为执行时会延迟2个指令周期,所以TMR0的初值需要设置,来抵消这个延迟。


还是上代码吧


 1 void InitTime();

 2 void Init_fosc(); //设置内部振荡器,不过好像没用。。

 3 

 4 unsigned int count = 0;

 5 

 6 int main(int argc, char** argv) 

 7 {

 8 InitCPU();

 9 Init_fosc();

10 InitTime();

11 TRISC = 0x00;

12 // LATC = 0x00;

13 while(1);

14 return (EXIT_SUCCESS);

15 }

16 

17 void InitTime()

18 {

19 // INTEDG = 0; //bit6 中断边沿选择位,1 = 上升沿,0 = 下降沿

20 TMR0CS = 0; //bit5 Timer0时钟源选择位,0 = 内部指令周期时钟(Fosc/4)

21 TMR0SE = 0; //bit4 Timer0时钟源边沿选择位,1 = 在T0CKI引脚电平下降沿时递增,0 = 上升沿时递增

22 PSA = 0; //bit3 预分频器分配位,1 = 不分给Timer0,0 = 预分频器分给Timer0

23 PS0 = 1;

24 PS1 = 1;

25 PS2 = 0; //1:16

26 //PS<2:0>,预分频器分频比选择位

27 GIE = 1; //允许所有有效中断

28 PEIE = 0; //禁止所有外设中断,有待考虑

29 TMR0IE = 1; //允许TMR0中断 

30 TMR0IF = 0; //溢出中断标志位,未溢出

31 TMR0 = 1;

32 }

33 

34 void Init_fosc()

35 {

36 // OSCCON = 0x6a; 下面的设置为设置内部振荡器频率的

37 SCS0 = 1;

38 SCS1 = 0; //1x内部振荡器模块

39 IRCF0 = 0;

40 IRCF1 = 1;

41 IRCF2 = 1;

42 IRCF3 = 0; //1101 = 250kHz

43 

44 }

45 

46 void interrupt ISR()

47 {

48 TMR0 = 1;

49 count++;

50 if(count ==10)

51 {

52 LATC = ~LATC;

53 count = 0;

54 }

55 TMR0IF = 0;

56 }

 


TMR0是不用使能的,其他的时候也许不用管他,就算它在计数,没有允许它中断(TMR0IE位),也是没啥用的啊,残念ね。。

 


接下来是TIMER1模块,TIMER1模块的特殊的地方是带门控,是16位的定时计数器,有专用32kHz的振荡器电路。


这次先上代码吧,感觉会更有条理些


 1 void InitTime();

 2 void Init_fosc(); //设置内部振荡器,不过好像没用。。

 3 

 4 unsigned int count = 0;

 5 

 6 int main(int argc, char** argv) 

 7 {

 8 InitCPU();

 9 Init_fosc();

10 InitTime();

11 TRISC = 0x00;

12 // LATC = 0x00;

13 while(1);

14 return (EXIT_SUCCESS);

15 }

16 

17 void InitTime()

18 {

19 // INTEDG = 0; //bit6 中断边沿选择位,1 = 上升沿,0 = 下降沿

20 TMR0CS = 0; //bit5 Timer0时钟源选择位,0 = 内部指令周期时钟(Fosc/4)

21 TMR0SE = 0; //bit4 Timer0时钟源边沿选择位,1 = 在T0CKI引脚电平下降沿时递增,0 = 上升沿时递增

22 PSA = 0; //bit3 预分频器分配位,1 = 不分给Timer0,0 = 预分频器分给Timer0

23 PS0 = 1;

24 PS1 = 1;

25 PS2 = 0; //1:16

26 //PS<2:0>,预分频器分频比选择位

27 GIE = 1; //允许所有有效中断

28 PEIE = 0; //禁止所有外设中断,有待考虑

29 TMR0IE = 1; //允许TMR0中断 

30 TMR0IF = 0; //溢出中断标志位,未溢出

31 TMR0 = 1;

32 }

33 

34 void Init_fosc()

35 {

36 // OSCCON = 0x6a; 下面的设置为设置内部振荡器频率的

37 SCS0 = 1;

38 SCS1 = 0; //1x内部振荡器模块

39 IRCF0 = 0;

40 IRCF1 = 1;

41 IRCF2 = 1;

42 IRCF3 = 0; //1101 = 250kHz

43 

44 }

45 

46 void interrupt ISR()

47 {

48 TMR0 = 1;

49 count++;

50 if(count ==10)

51 {

52 LATC = ~LATC;

53 count = 0;

54 }

55 TMR0IF = 0;

56 }



再来写下总结的步骤


1.初始时钟源


2.在Timer1的初始中先选择时钟源


3.设置预分频


4.允许中断和溢出位清零


5.使能Timer1


虽然看起来简单,但是Timer1的功能比Timer0多,好些自己也没有用到过,有一个注意的地方,TMR1H和TMR1L的初值设定最好刚刚把延时拿回来就行了。使能也应该放最后,刚好需要起振时间


 


 最后最后,1937里面最多的定时器,数量超过我的想象,竟然多达,,竟然拥有3个!!何等的数量啊。。。。。好了,不装怪了,他是TIMER2/4/6葫芦三兄弟。


/*1937共含有3个相同的Timer2模块,分别为Timer2、Timer4、Timer6

* 8位定时器和周期寄存器(TMRx和PRx)

* 可读写、预分频(1:1:4:16:64)后分频(1:1至1:16)

* TMRx与相应的PRx分别匹配时中断、可选择作为MSSP模块的移位时钟(仅Timer2)

*/


看到了吗,这里是TMRx与相应的PRx分别匹配时中断,不像前面两个あほ(TIMER0与TIMER1)是溢出中断


还是先上代码吧,,,这里直接上初始化Timer2/4/6的程序了,



 1 void Init_Timer2() //时钟是系统指令时钟 Fosc/4,沿边沿递增计数。

 2 {

 3 T2CON = 0x0d; //设置后分频,使能Timer2,设置预分频

 4 TMR2 = 0;

 5 PR2 = 100; //TMR2与PR2的值越相近,进入中断越快

 6 GIE = 1; //允许所有有效中断,!!!!实验无此语句能否运作

 7 PEIE = 1;

 8 TMR2IE = 1; //允许Timer2中断

 9 TMR2IF = 0; //溢出标志位,未溢出

10 }

 


TIMER2/4/6是无法自己选择内外部时钟的,系统选什么他就得选什么,作为对比,TIMER0和TIMER1是可以自己选的,素晴らしい!



所有的时钟设置总结来说,必须考虑的要素有以下几条


1.设置时钟,系统时钟和定时器要用的时钟(TIMER0和TIMER1是可以选的)

2.预分频及后分频,所有时钟里TIMER0的预分频最大(1:2-1:256),TIMER2/4/6既有预分频又有后分频

3.TMRxIE、PEIE、GIE(允许TIMERx中断、允许外设中断、允许所有有效中断),这三个的赋值。除PEIE在TIMER0中没有也可以运作外,其他两个在每个定时器中必须有

4.TMRxIF,溢出的标志位,一般会在中断程序里面清零,所以在初始化里面可有可无。

5.计数的设置TIMER0中的TMRO(0-255),TIMER1中的TMR1H和TMR1L,TIMER2/4/6中的TMRx(0-PRx),PRx(0-255)


关键字:PIC16F1937  定时器 引用地址:PIC16F1937之定时器

上一篇:PIC18系列单片机I/O端口操作寄存器及应用
下一篇:pic的第一个测试程序

推荐阅读最新更新时间:2024-03-16 15:29

单片机定时器/计数器的基本结构及工作原理
本文主要学习定时器/计数器的基本结构。对结构的学习首先要明确定时器/计数器的功能,可参考第一节的内容来理解。目前常用的单片机中往往都配备了定时器/计数器。在AT89S52芯片内包含有三个16位的定时器/计数器:T0、T1和T2,其核心是加1计数器。我们主要要求掌握T0和T1的结构和功能。学习中要注意从电路结构上来理解功能的实现。定时器/计数器方式寄存器TMOD和定时器/计数器控制寄存器TCON是用以设定定时器/计数器的工作方式、定时或计数功能,控制启动或停止以及产生溢出中断的重要模块,应该对这两个寄存器中的逐位的定义和功能进行学习和掌握。 一、定时器/计数器的功能 AT89S52单片机定时器/计数器的基本部件是两个8位的计数器(
[单片机]
单片机<font color='red'>定时器</font>/计数器的基本结构及工作原理
C51单片机学习(二):中断系统和定时器
中断系统: 中断概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。 中断的结构图 其中一些说明: 1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降 沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时, 中断标志IE0(TCON.1)置1,向CPU申请中断。 2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中
[单片机]
C51单片机学习(二):中断系统和<font color='red'>定时器</font>
STM32f103 定时器配置和中断处理函数
// IAR 7.1 定时器中断时间依赖系统外部时钟 #include stm32_timer.h uint8_t tick = 0; void stm32_timer_init(void) { uint16_t PrescalerValue = 0; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / COUNT_CLK) - 1;
[单片机]
三菱定时器、计数器常见问题解析
1、我想在程序中20个地方使用定时器的常开触点可以吗?如果定时器定时时间到,这20个常开触点是一起动作吗? 答:可以,因为定时器的触点(常开或常闭)是一个编程软元件。它可以在程序中使用无限次。相当于有无线个触点供你使用。这20个触点不是一起动作的。PLC的程序运行是逐行逐行扫描执行的,扫描到那一行,那一行的触点才动作。因此,严格地讲,这20个触点是动作有限有后的,不是一起动作的。 2、书上说,定时器只有通电延时触点,我想用断电延时触点怎么办? 答:定时器只有通电延时触点,如果想使用断电延时触点,只有通过编制断电延时程序才能做到,下图为一断电延时断开的程序,供参考。 3、我在他人程序中看到T5 D100,我不明白这个T5的定时时间设
[嵌入式]
STM32用SysTick来做定时器
1 硬件电路配置 这里还是借用前面LED电路我就不贴图片。 2 时钟说明 SysTick和HCK的时钟频率是一样的库函数代码如下 /** * @brief Initialize and start the SysTick counter and its interrupt. * * @param ticks number of ticks between two interrupts * @return 1 = failed, 0 = successful * * Initialise the system tick timer and its interrupt and start the
[单片机]
80C51单片机内部定时器和计数器的结构及原理解析
80C51单片机内部设有两个16位的可编程定时器/计数器。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 定时器/计数器的结构: 图片1 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是通过
[单片机]
80C51单片机内部<font color='red'>定时器</font>和计数器的结构及原理解析
7、PIC32系列 定时器TMR-16位外部同步定时器的使用
1、PIC32参考资源 PIC32系列参考手册 中文版 链接地址:PIC32系列参考手册 第14章 定时器 2、16位同步外部定时器方案说明 步骤1:TMR3产生固定频率的脉冲信号; 步骤2:TMR2设置为外部时钟输入; 步骤3:将TMR3产生的脉冲信号呈现到引脚电平变化上,并将引脚接入到TMR2的外部时钟输入引脚上; 步骤4:TMR2中断中设置为固定时间设置LED电平翻转; 3、16位同步外部定时器Harmony3配置 1、定时器3配置分频系数为2,内部时钟源,定时时间为0.5ms,频率为1Khz; 2、定时器2配置分频系数为1,时钟源选择外部时钟源,时钟频率填写1000Hz,定时时间填写500ms;
[单片机]
7、PIC32系列 <font color='red'>定时器</font>TMR-16位外部同步<font color='red'>定时器</font>的使用
博通重磅产品发布,引领PCI-e交换机和重定时器市场
如果我们有两年甚至四年更长的时间暂停向机器添加更快的计算引擎,那么服务器设计的情况将会好得多。 这样,我们就可以让内存子系统和 I/O 子系统赶上并更好地利用这些计算引擎,并且还需要更少的内存组和 I/O 卡来满足这些计算引擎的需求。 事实上,从 8 Gb/秒 PCI-Express 3.0(其规范于 2010 年发布)到 16 Gb/秒 PCI-Express 4.0 互连(本应在 2013 年发布)的转变延迟了四年,直到 2017 年才进入该领域。主要原因是计算引擎真正需要的 I/O 带宽与 PCI-Express 互连可以提供的带宽之间造成了阻抗不匹配。 这种不匹配一直延续下去,导致 PCI-Express 永远落后
[嵌入式]
博通重磅产品发布,引领PCI-e交换机和重<font color='red'>定时器</font>市场
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved