• PIC16F877A TIMER1计数操作


    /**********************
    Title:PIC16F877A TIMER1计数操作
    Author:hnrain
    Date:2010-12-28

    使用前置分频器
    T1CKPS1  T1CKPS1  
       0        0        1  分频  TMR1时钟为晶振时钟/(4*1)
       0        1        2  分频  TMR1时钟为晶振时钟/(4*2)
       1        0        4  分频  TMR1时钟为晶振时钟/(4*4)
       1        1        8  分频  TMR1时钟为晶振时钟/(4*8)
       TMR1是16位宽度的TMR1由2个8位的可读写的寄存器TMR1H和TMR1L组成。

    TMR1有专门的启停控制位TMR1ON,通过软件可以任意启动或暂停TMR1计数功能。

    T1CON:TIMER1 CONTROL REGISTER

    bit7-6 unimplemented :Read as ‘0’

    bit5-4 T1CKPS1:T1CKPS0:Timer1 input Clock Prescale Select bits

              11=1:8 prescale value

              10=1:4 prescale value

              01=1:2 prescale value

              00=1:1 prescale value

    bit3   T1OSCEN:Timer1 Oscillator Enable Control bit

             1 = Oscillator is enable

             0 = Oscillator is shut-off

    bit2 T1SYNC:Timer1 External Clock Input Synchronization Control bit

            when TMR1CS = 1

            1= Do not synchronize external clock input

            0= Synchronize external clock input

            when TMR1CS = 0

            This bit is ignored .Timer1 uses the internal clock when TMR1CS = 0.

    bit1 TMR1CS:Timer1 Clock Source Select bit

           1 = External clock from pin RC0/T1OSO/T1CKI

           0 = Internal clock

    bit0 TMR1ON:Timer1 on bit

         1 = enables timer1

         0 = stops timer1
    说明:作用在TMR1的计数状态,计数信号从RC0/T1CKI输入,
    当来一个上升沿时,采集到一个有效的信号,计数到TMR1L,TMR1H中。
    当计满时就会产生中断信号。
    ***********************/
    #include <pic.h>
    #include "../head/config.h"

    __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);

    void main(void)
    {
        T1CKPS0 = 0;
        T1CKPS1 = 0;//不分频

        TMR1L = (65536 - 1)%256;//TMR1L,TMR1H赋初值
        TMR1H = (65536 - 1)/256;
        T1SYNC = 1;//TMR1异步计数器
        TMR1CS = 1;
        GIE = 1;//打开全局中断
        PEIE = 1;//打开外部中断
        TMR1IE = 1;//TMR1中断打开
        TMR1ON = 1;
        PORTD = 0x00;
        TRISD = 0x00;
        while(1){}
    }

    void interrupt ISR(void)
    {
        TMR1L = (65536 - 1)%256;//重新赋值
        TMR1H = (65536 - 1)/256;
        if(TMR1IE && TMR1IF)
        {
            TMR1IF = 0;
            PORTD = ~PORTD;
        }   
    }

    /**********************
    Title:PIC16F877A TIMER1计数操作
    Author:hnrain
    Date:2010-12-28
    
    使用前置分频器
    T1CKPS1  T1CKPS1   
       0        0        1  分频  TMR1时钟为晶振时钟/(4*1)
       0        1        2  分频  TMR1时钟为晶振时钟/(4*2)
       1        0        4  分频  TMR1时钟为晶振时钟/(4*4)
       1        1        8  分频  TMR1时钟为晶振时钟/(4*8)
       
       TMR1是16位宽度的TMR1由2个8位的可读写的寄存器TMR1H和TMR1L组成。
    
    TMR1有专门的启停控制位TMR1ON,通过软件可以任意启动或暂停TMR1计数功能。
    
    
    
    T1CON:TIMER1 CONTROL REGISTER
    
    bit7-6 unimplemented :Read as ‘0’
    
    bit5-4 T1CKPS1:T1CKPS0:Timer1 input Clock Prescale Select bits
    
              11=1:8 prescale value
    
              10=1:4 prescale value
    
              01=1:2 prescale value
    
              00=1:1 prescale value
    
    bit3   T1OSCEN:Timer1 Oscillator Enable Control bit
    
             1 = Oscillator is enable
    
             0 = Oscillator is shut-off
    
    bit2 T1SYNC:Timer1 External Clock Input Synchronization Control bit
    
            when TMR1CS = 1
    
            1= Do not synchronize external clock input
    
            0= Synchronize external clock input
    
            when TMR1CS = 0
    
            This bit is ignored .Timer1 uses the internal clock when TMR1CS = 0.
    
    bit1 TMR1CS:Timer1 Clock Source Select bit
    
           1 = External clock from pin RC0/T1OSO/T1CKI
    
           0 = Internal clock
    
    bit0 TMR1ON:Timer1 on bit
    
         1 = enables timer1
    
         0 = stops timer1
    说明:作用在TMR1的计数状态,计数信号从RC0/T1CKI输入,
    当来一个上升沿时,采集到一个有效的信号,计数到TMR1L,TMR1H中。
    当计满时就会产生中断信号。
    ***********************/
    #include <pic.h>
    #include "../head/config.h"
    
    __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
    
    void main(void)
    {
    	T1CKPS0 = 0;
    	T1CKPS1 = 0;//不分频
    
    	TMR1L = (65536 - 1)%256;//TMR1L,TMR1H赋初值
    	TMR1H = (65536 - 1)/256;
    	
    	T1SYNC = 1;//TMR1异步计数器
    	TMR1CS = 1;
    	
    	GIE = 1;//打开全局中断
    	PEIE = 1;//打开外部中断
    	TMR1IE = 1;//TMR1中断打开
    	
    	TMR1ON = 1;
    	
    	PORTD = 0x00;
    	TRISD = 0x00;
    	
    	while(1){}
    	
    }
    
    void interrupt ISR(void)
    {
    	TMR1L = (65536 - 1)%256;//重新赋值
    	TMR1H = (65536 - 1)/256;
    	
    	if(TMR1IE && TMR1IF)
    	{
    		TMR1IF = 0;
    		PORTD = ~PORTD;
    	}	
    }
  • 相关阅读:
    咖啡豆(JavaBean)•香
    SOC FPGA篇之 如何使用VNC 扩展桌面
    C指针地址运算
    nasm 指令学习
    CPL DPL RPL 及特权间的跳转
    ubuntu终端命令
    自动动手写操作系统 中 _disp_int 堆栈保护错误
    makefile 详解1
    [ 转载] Linux/Unix环境下的make和makefile详解2
    汇编指令: LGDT、LIDT、LLDT、LMSW、LOADALL、LOADALL286、LOCK、LODSB、LODSW、LODSD
  • 原文地址:https://www.cnblogs.com/hnrainll/p/1919168.html
Copyright © 2020-2023  润新知