实例说明:
假设时钟周期为4MHZ,每隔50MS点亮LED,每隔50MS灭掉LED。这样的程序要如何做到呢。
这50ms如何做到.
1,得到指令周期
4MHz/4=1MHz
1/1MHz=0.0000001s=1us
2,得到预分频
定时器定时的最大时间要超过这50mS,所以预分频器要选择256
预分频X256=最大的定时时间。256X256=65536us=65.536ms 大于50ms
3, 计算定时器初始值
(定时器最大值+1)- (定时时间/预分频)=定时器的初始值。
255+1=256
50000/256=195.3125
256-195.3125=60.6875 四舍五入 定时器初始值为61.
设置相关的寄存器。
OPTION_REG寄存器中我们一般需要设置三处。
PS<2:0>设置用来设置预分频预分频范围从2 ~256
PSA设置成0 讲预分频器分配给Timer0模块
TMR0CS设置成0 内部指令周期时钟。
实例程序:
/*开发环境 MPLAB X IDE 型号PIC16LF1823*/
#include<pic.h>
__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF
&BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);
__CONFIG(PLLEN_OFF&LVP_OFF) ;
#define LED LATA5/*也可用 #define LED RA5,只是PIC16LF1823 输出电平的时候,直接控制LATA5执行速度更快,因为传给RA5的数据最终也是传给LATA5才执行的*/
void init_fosc(void)
{
OSCCON= 0x68;//时钟设置为4MHz
}
void init_gpio(void)
{
PORTA = 0;
LATA = 0;
ANSELA = 0;
TRISAbits.TRISA5=0; //RA5口设置成输出 用来控制LED
}
void init_timer0(void)
{
OPTION_REG=0x87; //预分频为256
}
int main(int argc, char** argv)
{
init_fosc();
init_gpio();
init_timer0();
TMR0IF=0;//清除TMR0中断标志位
TMR0=61;//设置中断初始值61
while(1)
{
if(TMR0IF==1)//定时时间到了吗??
{
LED = ~LED;//改变LED的状态
TMR0IF=0;//清除TMR0中断标志位
TMR0=61;//设置中断初始值61为下次50ms定时做准备
}
}
}
pic代码中 timer0没有设置TMR0值,为什么可以计时呢?
在一些PIC单片机中,TIM0比较特殊,它的运行\/停止是不受控的。只要通电TIM0就会开始运行,中断中代码:if (T0IF&&T0IE) 所以在中断中不仅仅判断中断标志位,还必须判断中断允许位
PIC单片机的TIMER0是不是没有使能位
在上电复位之后,根据OPTION_REG寄存器的初始化设置,T0默认为接收T0CKI引脚上的边沿变化情况(预分频也不给它)。如果你的单片机这个引脚什么也不接悬空并根据设置其IO口默认输入的情况下,T0一直没有接收到到电平边沿变化,所以TMR0是根本不会计数的,也就是说它根本不工作。它是没有像T1那个TCON名义...
PIC单片机编程的问题 刚学 不太懂
movlw 01h ; 使能Timer1中断 01h movwf PIE1 movlw b'00010001' ; AD采用FOSC\/8 时钟,GP2是模拟口, movwf ANSEL ; 其他口为数字IO movlw b'00001000' ; Timer0设置为使用内部指令周期,无预分频 movwf OPTION_REG bcf STATUS, RP0 ; 选择Bank0 movlw b'10000001' ; A\/D是右对齐格式,Vdd为参考,GP0...
单片机PIC18中,TMR0H和TMR0L设置成多少是100毫秒?
假设Timer0用的时钟源是内部的4MHZ,那么每条指令的执行时间就是 1us,设Timer0的预分频系数是1:256,TMR0的初值是0,那么定时时间为:256×(256-0)×1us=65.536,这是内部计数器最大的了,倒不了100ms只能分频才行
PIC单片机用timer0作为timer1的门控信号源时,timer1怎么工作
迷茫,你既然用了TIMER0中断,干嘛还要用TIMER1中断呢。。。你只要在TIMER0里弄个变量计数不就行了。。。
PIC的定时器初始值怎么设置?
你是不是用T0中断做的啊?每次TMR0溢出后都是从零开始计数的,所以你每次进入中断后都要自己加初始值,单片机不自动加的。
选用某型号PIC单片机的CCP模块设计频率计,频率测量范围0.1HZ至100KHz...
例如PIC工作在4MHz时Fcy为1M,Timer1每1uS加一,那么16位的Timer1从0到溢出总共只有65536uS=65毫秒多时间,而0.1Hz的周期等于10秒,怎么办?另外用个变量累加Timer1的溢出次数不就好了嘛。高频率段,100KHz的周期只有10微秒,虽然可以测得出来,但是精度已经很差了,那怎么办?多测些周期不就好了嘛...
单片机求助,不用溢出不用中断,普通IO口 测量矩形波的周期?C语音写的
unsigned char timer ;\/\/ 计定时器值 \/\/PIC12F508硬件配置字,看门狗关,内部RC振荡,GO0\/GP1做I\/O,不加密,MCLR脚做复位 \/\/***初始化函数 void init(){ TRIS=0X04; \/\/设置GP2口为输入,检测方波电平 OPTION=0X07; \/\/TMR0使用主频256分频,即时基为1us*256=256us \/\/ 将预分频器...
,PIC单片机IO口什么时候设置为输入,什么时候设置为输出,这个输入输出...
设置引脚是输出或输入,就是把对应的TRISx的寄存器的位设为0为1,这个容易记住:0象OUTOUT的第一个字母,它就是输出;1象INPUT的第一个字母,它就是输入。单片机,全称单片微型计算机(英语:Single-Chip Microcomputer),又称微控制器(Microcontroller),是把中央处理器、存储器、定时\/计数器(Timer...
懂pic单片机中断函数的帮我看看啊,编译通不过哦,程序中的 "_ISR" 是...
ISR一般是这样定义的 define _ISR __attribute__((interrupt))你可以参考C32使用手册