⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c.bak

📁 ISD1700语音芯片放音的ISP实现
💻 BAK
字号:
#include <iom64v.h>
#include <macros.h>
#include "main.h"
#include "com.h"

extern UART uart[2];
extern unsigned char PD_DataOut; //PD口输出数据
extern unsigned long WhileCont;
static unsigned long PreWhileCont = 0; //上一个while循环记数
static unsigned char tcont = 0; //用于记录定时器中断的次数
unsigned char flag = 0;


unsigned char WdtTimer = 0; //外部看门狗定时器
volatile unsigned int Timer1BaseClk = 0; //Timer1基准时钟

// 看门狗初始化函数
// prescale: 512K cycles,overtime 417ms
void watchdog_init(void)
{
    WDR(); //this prevents a timout on enabling
    WDTCR = 0x18;	//WDCE、WDE位置1,再改变超时时间
    WDTCR = 0x0D; 	//WATCHDOG ENABLED - dont forget to issue WDRs
}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 2000Hz
// actual value: 2000.000Hz (0.0%)
void timer1_init(void)
{
    TCCR1B = 0x00; //stop
    TCNT1H = 0xFC; //setup
    TCNT1L = 0x18;
    OCR1AH = 0x03;
    OCR1AL = 0xE8;
    OCR1BH = 0x03;
    OCR1BL = 0xE8;
    OCR1CH = 0x03;
    OCR1CL = 0xE8;
    ICR1H = 0x03;
    ICR1L = 0xE8;
    TCCR1A = 0x00;
    TCCR1B = 0x02; //start Timer
}

//-------------------------------------------------------------------------

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
    //TIMER1 has overflowed
    static unsigned char timer1int = 0;

    TCNT1H = 0xFC; //reload counter high value
    TCNT1L = 0x18; //reload counter low value

    timer1int++;
    if (timer1int >= 2)
    {
        //1ms
        timer1int = 0;
        Timer1BaseClk++;
        if (Timer1BaseClk >= 60000)
        {
            Timer1BaseClk = 0;
        }

        WdtTimer++;
		}
    PD_DataOut ^= 0x80;

    if (tcont >= 100)
    {
        //100ms
        tcont = 0;
        if (PreWhileCont == WhileCont)
        {
            flag = 1;
        }
        else
        {
            flag = 0;
        }
        PreWhileCont = WhileCont;
    }

    if (flag == 0){
        PORTD = PD_DataOut; //PD7输出脉冲给变压器
    }
}

unsigned int GetTime(void)
{
	unsigned int iTime1,iTime2;
	do{
		iTime1 = Timer1BaseClk;
		iTime2 = Timer1BaseClk;
	}while(iTime2 != iTime1);
	return iTime2;
}
//-------------------------------------------------------------------------

unsigned int GetPassTime(unsigned int iPreTime)
{
    unsigned int temp_i = 0;
		unsigned int iCurTime = GetTime();

    if (iCurTime >= iPreTime)
    {
        return (iCurTime - iPreTime);
    }
    else
    {
        return (60000 - iPreTime + iCurTime);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -