pic单片机timer0怎么用啊?

比如我想具体定时多长时间如 50微妙 或者100微妙

实例说明:

   假设时钟周期为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定时做准备

        }


    }


}


  

   

温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-23
先看你振荡频率是多少了。比如:4MHz晶振的话,执行一条命令就是1us,50us就是50句,不设置预分频器的话,只要在设置TMR0的时候置初值256-50+2=208,+2为补偿同步延时的两个指令周期。建议看看张明峰的PIC单片机入门与实战,很详细。本回答被提问者采纳

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使用手册

相似回答