【单片机】【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的初值需要设置,来抵消这个延迟。

还是上代码吧,哈哈嘞

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

unsigned int count = 0;

int main(int argc, char** argv)
{
InitCPU();
Init_fosc();
InitTime();
TRISC = 0x00;
// LATC = 0x00;
while(1);
return (EXIT_SUCCESS);
}

void InitTime()
{
// INTEDG = 0; //bit6 中断边沿选择位,1 = 上升沿,0 = 下降沿
TMR0CS = 0; //bit5 Timer0时钟源选择位,0 = 内部指令周期时钟(Fosc/4)
TMR0SE = 0; //bit4 Timer0时钟源边沿选择位,1 = 在T0CKI引脚电平下降沿时递增,0 = 上升沿时递增
PSA = 0; //bit3 预分频器分配位,1 = 不分给Timer0,0 = 预分频器分给Timer0
PS0 = 1;
PS1 = 1;
PS2 = 0; //1:16
//PS<2:0>,预分频器分频比选择位
GIE = 1; //允许所有有效中断
PEIE = 0; //禁止所有外设中断,有待考虑
TMR0IE = 1; //允许TMR0中断
TMR0IF = 0; //溢出中断标志位,未溢出
TMR0 = 1;
}

void Init_fosc()
{
// OSCCON = 0x6a; 下面的设置为设置内部振荡器频率的
SCS0 = 1;
SCS1 = 0; //1x内部振荡器模块
IRCF0 = 0;
IRCF1 = 1;
IRCF2 = 1;
IRCF3 = 0; //1101 = 250kHz

}

void interrupt ISR()
{
TMR0 = 1;
count++;
if(count ==10)
{
LATC = ~LATC;
count = 0;
}
TMR0IF = 0;
}

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

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

unsigned int count = 0;

void Init_Timer1();
void Init_Fosc();
void interrupt ISR();

int main(int argc, char** argv)
{
InitCPU();
Init_Fosc();
Init_Timer1();
TRISC = 0x00;
LATC = 0x00;
while(1);

return (EXIT_SUCCESS);
}

void Init_Timer1()
{

TMR1GE = 0; //都为1时使能计数。
TMR1CS0 = 0;
TMR1CS1 = 0; //这两位来选择时钟源,选择指令时钟
T1CKPS0 = 1;
T1CKPS1 = 0; //T1CKPS为预分频选择位
// T1OSCEN = 0; //使能专用的振荡器
// TMR1H = 0xd8; //延时为振荡器稳定
// TMR1L = 0xf0; //同上
TMR1IE = 1;
PEIE = 1; //外设中断允许位
GIE = 1; //允许所有有效中断
TMR1IF = 0;
// TMR1L = 0;
TMR1ON = 1; //为1时Timer1开启 因为Timer1振荡器需要一段起振和稳定时间
}

void Init_Fosc()
{
// OSCCON = 0x6a; 下面的设置为设置内部振荡器频率的
SCS0 = 1;
SCS1 = 0; //1x内部振荡器模块
IRCF0 = 1;
IRCF1 = 0;
IRCF2 = 1;
IRCF3 = 1; //1101 = 250kHz
}

void interrupt ISR()
{
TMR1H = 0xd8;
TMR1L = 0xf0;
count++;
if(count == 100)
{
LATC = ~LATC;
count = 0;
}

TMR1IF = 0;
}

再来写下总结的步骤

1.初始时钟源

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

3.设置预分频

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

5.使能Timer1

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

时间: 2024-10-16 12:45:56

【单片机】【PIC16F1937】之定时器的相关文章

51单片机中断机制(定时器/计数器)

单片机中断简介 52单片机一共有6个中断源,它们的符号,名称以及各产生的条件分别如下: INT0 - 外部中断0,由P3.2端口线引入,低电平或下降沿引起 INT1 - 外部中断1,由P3.3端口线引入,低电平或下降沿引起 T0    - 定时器/计数器0中断, 由T0计数器计满回零引起 T1    - 定时器/计数器1中断, 由T1计数器计满回零引起 T2    - 定时器/计数器2中断, 由T2计数器计满回零引起 TI/RI - 串行口中断,串行端口完成一帧字符发送/接收后引起 其中T2是5

26.单片机中利用定时器中断,在主流程while(1){}中设置每隔精确时间计量

void Timer0_ISR( ) interrupt 5 { CountMilliseconds++;//只负责自加,加到最大又重新从0开始 } u16 setDelay(u16 t) { return(CountMilliseconds + t - 1); } u8 checkDelay (u16 t)//返回非零表示计时结束 { return(((t - CountMilliseconds) & 0x8000) >> 8);//当(t - CountMilliseconds)为

单片机的定时器与计数器

计数器 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中.水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满.那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536. 定时器 计数器除了能作为计数之用外,还能用作时钟,计数器是如何作为定时器来用? 计数和时间之间的确十分相关,一个闹钟将它定时在1个小时后闹响,也能说是秒针走

单片机 定时器/计数器

一.什么是定时器/计数器 在51单片机中,定时器/计数器是用来实现定时功能,并且具有计数的功能,来实现对外部信号的计数. 二.定时器/计数器有什么类型 在51单片机中,分为软件定时器,不可编程硬件定时器,可编程定时器. 软件定时:CPU每执行一条指令时,是需要固定时间的,所以,通过执行空指令可以达到延时的效果,这样子做的代价是占用CPU时间,所以一般很少这么做. 不可编程硬件定时器:是由电路和硬件来完成定时功能的,一般采用基电路,外接定时部件(电阻和电容),通过改变电阻的阻值和电容的电容值来修改

重拾单片机 第三天 中断讲解(一)

52单片机: 中断源: INTO0--外部中断0,由P3.2端口线引入,低电平或下降沿引起. INTO1--外部中断1,有P3.3端口线引入,低电平或下降沿引起. T0--定时器/计数器0中断,由T0计数器计满回零引起. T1--定时器/计数器1中断,由T1计数器计满回零引起. T2--定时器/计数器2中断,由T2计数器计满回零引起. TI/RI--串口中断,串行端口完成一帧字符发送/接收后引起. 单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器: ①中断允许寄存器IE ②中断优先级寄

单片机特殊功能寄存器

计数器 从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中.水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满.那么单片机中的计数器有多大的容量呢?8031单片机中有两个计数器,分别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都是16位的计数器,最大的计数量是65536. 定时器 计数器除了能作为计数之用外,还能用作时钟,计数器是如何作为定时器来用? 计数和时间之间的确十分相关,一个闹钟将它定时在1个小时后闹响,也能说是秒针走

单片机与控制实验(1)——数码管显示

一.实验目的和要求 初步学习和掌握MCS-51的体系结构和汇编语言,了解Keil编程环境和程序下载工具的使用方法.了解数码管输出的原理及编程方式. 二.实验设备 单片机测控实验系统 STC-ISP程序下载工具 Keil开发环境 三.实验内容 使用MCS-51汇编语言编写程序,完成如下功能: 1. 使用三个数码管显示十进制数值(001~999,可任意设置): 2. 每隔1秒,该数值自动减一,直到归零; 3. 归零后的下一秒,显示一个新的十进制数值(001~999,可任意设置): 4. 每隔1秒,新

【007】AVR单片机中断系统

AVR单片机的21个中断源 I/O端口的第二功能 AVR单片机共有单个定时器,定时/计数器1是16bit的,其余的定时/计数器0和定时/计数器2都是8bit的定时器. 定时器的工作模式 普通模式 CTC模式 快速PWM模式 相位修正PWM模式 相位频率修正PWM模式 输入捕获模式 和51单片机的定时计数器类似,根据设定的时钟频率,每过一个时钟,计数寄存器数值加1. 用到的寄存器 T/C1控制寄存器B:(控制时钟的来源和频率) 后三位的设置,1表示定时器停止,2~6表示不同频率的内部时钟,7~8表

单片机(4)

定时器和计数器 外接晶振为12MHz时,51单片机相关周期的具体值为: 振荡周期=1/12us; 状态周期=1/6us; 机器周期=1us; 指令周期=1~4us; 定时器/计数器和单片机的CPU是相互独立的.定时器/计数器工作的过程是自动完成的,不需要CPU的参与. 51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1. 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理.CPU转而处理一些复杂的事情.同时可以实

舵机及转向控制

1.概述 2.舵机的组成 3.舵机工作原理 4.舵机选购 5.舵机使用中应注意的事项 6.辉盛S90舵机简介 7. 如何利用程序实现转向 8.51单片机舵机测试程序   1.概述 舵机也叫伺服电机,最早用于船舶上实现其转向功能,由于可以通过程序连续控制其转角,因而被广泛应用智能小车以实现转向以及机器人各类关节运动中,如图1 .图2 所示. 图1 舵机用于机器人 图2 舵机用于智能小车中 舵机是小车转向的控制机构,具有体积小.力矩大.外部机械设计简单.稳定性高等特点,无论是在硬件设计还是软件设计,