PIC定时器中断


-----------------------------------------------------------------------------------

#ifndef __PIC18F4580_h
#define __PIC18F4580_h

#include<p18f4580.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define InterruptEnable  INTCONbits.PEIE = 1,INTCONbits.GIE = 1
#define InterruptDisable INTCONbits.PEIE = 0,INTCONbits.GIE = 0
extern void IntTimer0(void);

#endif

--------------------------------------------------------------------------------------

#include"PIC18F4580.h"
#pragma interrupt SelectHPrioInt
#pragma code HiPrio_Int = 0x08
void HighPrioInt(void)
{
 _asm
  goto SelectHPrioInt
 _endasm
}
#pragma code

void SelectHPrioInt (void)
{
 if(INTCONbits.TMR0IF) 
 {
  IntTimer0(); 
 }
}

---------------------------------------------------------------------------------------------

#include"PIC18F4580.h"
#pragma config OSC =IRCIO67, WDTPS = 1024, WDT = ON,PBADEN = OFF,DEBUG = OFF,MCLRE = OFF,LVP = OFF
#define u16 unsigned int
#define u8 unsigned char
#define LED LATCbits.LATC2


void WdtReset(void)
{
 _asm
  CLRWDT
 _endasm
}

void delay_n_ms(u16 n)//8MHz时钟下的ms延时
{
 T1CON = 0xB0; //16位定时器,系统8分频
    while(n!=0)
    {
        TMR1L = 0x31;
     TMR1H = 0xF8;
        PIR1bits.TMR1IF = 0;   //标志位清空
     T1CONbits.TMR1ON = 1;  //使能定时器
        n--;
        while(!PIR1bits.TMR1IF){;}
        T1CONbits.TMR1ON =0; //关闭定时器
    }
}

void InitTimer0(void)
{
 T0CON = 0x05; //系统64分频
 TMR0L = 0XEF; //1秒中断
 TMR0H = 0x85;
 INTCONbits.TMR0IE = 1;  //打开定时器0中断
 INTCON2bits.TMR0IP = 1; //设置优先级为最高
 T0CONbits.TMR0ON =1;    //打开定时器0
 INTCONbits.TMR0IF = 0;  //标志位清空
 T0CONbits.TMR0ON = 1;
}
void IntTimer0(void)

 TMR0L = 0XEF;
 TMR0H = 0x85;
 T0CONbits.TMR0ON =1;
 LED=~LED;
    WdtReset();
 INTCONbits.TMR0IF = 0;
}

void main(void)
{
    OSCCON = 0x72;//OSCCON = 0x72;设置OSC时钟输出=8M
                  //OSCCON = 0x62;设置OSC时钟输出=4M
                  //OSCCON = 0x52;设置OSC时钟输出=2M
                  //OSCCON = 0x42;设置OSC时钟输出=1M
                  //OSCCON = 0x32;设置OSC时钟输出=500KHz
                  //OSCCON = 0x22;设置OSC时钟输出=250KHz
                  //OSCCON = 0x12;设置OSC时钟输出=125KHz
                  //OSCCON = 0x02;设置OSC时钟输出=31KHz(from either INTOSC/256 or INTRC directly)

    InterruptDisable;
    InitTimer0();
    InterruptEnable;

    TRISC=0X00; //TRISC寄存器被赋值,PORTC每一位都为输出
    LED=0;
    for(;;)
    {
        //LED=0;
        //delay_n_ms(500);
        //LED=1;
        //delay_n_ms(500);
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 PIC16F877A 定时器中断,我可以给您一些基本的信息。 首先,PIC16F877A 是一款 8 位微控制器,它有多个定时器/计数器模块,包括 Timer0、Timer1 和 Timer2。每个定时器/计数器模块都有自己的控制寄存器和中断标志。 在使用定时器中断之前,您需要对定时器进行配置。具体来说,您需要设置计数器模式、时钟源、预分频器和计数器初始值。这些设置可以通过相应的寄存器进行配置,例如 OPTION_REG、T0CON、T1CON 和 T2CON。 一旦定时器配置完成,您就可以启用定时器中断。通过设置相应的中断使能位,您可以指示当定时器计数器达到预设值时触发中断。在中断服务子程序中,您可以执行所需的操作,例如更新计数器值、清除中断标志等。 下面是一个简单的示例代码,演示如何在 PIC16F877A 上使用 Timer0 定时器中断: ```c #include <xc.h> // 中断服务子程序 void __interrupt() isr() { // 判断是否为 Timer0 中断 if (T0IF) { // 清除中断标志 T0IF = 0; // 执行所需操作 // ... } } // 主程序 void main() { // 配置 Timer0 T0CS = 0; // 使用内部时钟源 PSA = 0; // 分配预分频器给 Timer0 PS2 = 1; // 预分频器设置为 1:128 PS1 = 1; PS0 = 1; TMR0 = 0; // 计数器初始值为 0 // 启用 Timer0 中断 T0IE = 1; // 允许 Timer0 中断 GIE = 1; // 允许全局中断 // 主循环 while (1) { // ... } } ``` 请注意,上述代码仅供参考,具体的定时器配置和中断处理方式可能会因应用场景而有所不同。如果您需要更详细的信息,请参考 PIC16F877A 数据手册和相关参考资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值