zoukankan      html  css  js  c++  java
  • PIC16F877A 定时器实验1

    /*********************
    Forum:http://bbs.cepark.com
    Author:hnrain
    Date:2010-12-28
    Email:hnrain1004@gmail.com
    ***************************
    TMR0用作定时器时,定时器时钟=系统时钟/4;
    写TMR0时,会产生2个周期的的延时,如果不使用前置分频器,可通过设置
    初值进行补偿。
    例如 需要定时200个时钟周期时,TMR0 = 256 -200 + 2= 58

    OPTION_REG:

    bit5 T0CS:TMR0 Clock Source Select bit

           1 = Transition on T0CKI pin

           0 = Internal instruction cycle clock(CLKO)

    bit 4 T0SE:TMR0 Source Edge Select bit

           1 = Increment on high-to-low transition on T0CKI pin

           0 = Increment on low-to-high transition on T0CKI pin

    bit 3 PSA:Prescaler Assignment bit

          1 = Prescaler is assigned to the WDT

          0 = Prescaler is assigned to the Timer0 module

    bit2-0 PS2:PS0:Prescaler Rate Select bits

    给大家一个意见:如果想用TMR0实现精确的定时,一旦用了预分频器后就不要对TMR0做任何写操作。

    注意:在中断服务程序中查询TMR0中断时,既要查询T0IE位,还要查询T0IF位。
    ***********************/
    #include <pic.h>
    #include "../head/config.h"

    __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
    //HS振荡,禁止看门狗,低压编程关闭,启动延时定时器

    uint16 count = 0;
    void main(void)
    {
        PSA = 1;//prescaler is assigned to the WDT
        T0CS  = 0;//Internal instruction cycle clock

        TMR0 = 58;//timer 200 cycle clock

        GIE = 1;//global interrupt enable
        T0IE = 1;//TMR0 interrupt enable

        PORTD = 0x00;
        TRISD = 0x00;

        while(1)
        {}
    }

    void interrupt ISR(void)
    {
        if(T0IE && T0IF)
        {
            T0IF = 0;
            count++;
            if(count == 1000)
            {
            count = 0;
            PORTD = ~PORTD;
            }
            TMR0 = TMR0 + 58;
        }
    }

    /*********************
    Forum:http://bbs.cepark.com
    Author:hnrain
    Date:2010-12-28
    Email:hnrain1004@gmail.com
    ***************************
    TMR0用作定时器时,定时器时钟=系统时钟/4;
    写TMR0时,会产生2个周期的的延时,如果不使用前置分频器,可通过设置
    初值进行补偿。
    例如 需要定时200个时钟周期时,TMR0 = 256 -200 + 2= 58
    
    
    OPTION_REG:
    
    bit5 T0CS:TMR0 Clock Source Select bit
    
           1 = Transition on T0CKI pin
    
           0 = Internal instruction cycle clock(CLKO)
    
    bit 4 T0SE:TMR0 Source Edge Select bit
    
           1 = Increment on high-to-low transition on T0CKI pin
    
           0 = Increment on low-to-high transition on T0CKI pin
    
    bit 3 PSA:Prescaler Assignment bit
    
          1 = Prescaler is assigned to the WDT
    
          0 = Prescaler is assigned to the Timer0 module
    
    bit2-0 PS2:PS0:Prescaler Rate Select bits
    
    给大家一个意见:如果想用TMR0实现精确的定时,一旦用了预分频器后就不要对TMR0做任何写操作。
    
    注意:在中断服务程序中查询TMR0中断时,既要查询T0IE位,还要查询T0IF位。
    ***********************/
    #include <pic.h>
    #include "../head/config.h"
    
    
    __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);
    //HS振荡,禁止看门狗,低压编程关闭,启动延时定时器
    
    uint16 count = 0;
    void main(void)
    {
    	PSA = 1;//prescaler is assigned to the WDT
    	T0CS  = 0;//Internal instruction cycle clock
    
    	TMR0 = 58;//timer 200 cycle clock
    
    	GIE = 1;//global interrupt enable
    	T0IE = 1;//TMR0 interrupt enable
    
    	PORTD = 0x00;
    	TRISD = 0x00;
    
    	while(1)
    	{}
    }
    
    void interrupt ISR(void)
    {
    	if(T0IE && T0IF)
    	{
    		T0IF = 0;
    		count++;
    		if(count == 1000)
    		{
    		count = 0;
    		PORTD = ~PORTD;
    		}
    		
    		TMR0 = TMR0 + 58;
    	}
    }
  • 相关阅读:
    [每日一题系列] LeetCode 1071. 字符串的最大公因子
    [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分
    git diff (19)
    WinDbg探究CLR底层(1)
    使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象
    转MySQL遇到的语法差异及解决方案
    批量拼脚本神器-NimbleText
    Visual Studio 2017中使用正则修改部分内容
    如何使用ILAsm与ILDasm修改.Net exe(dll)文件
    在Windows上安装Elasticsearch v5.4.2
  • 原文地址:https://www.cnblogs.com/hnrainll/p/1918449.html
Copyright © 2011-2022 走看看