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

📄 icoc.c

📁 本程序已经调试通过
💻 C
字号:
/**********************************************************************
* FileName:  icoc.c
* Compiler:  MPLAB C30
**********************************************************************/
#if defined(__dsPIC33F__)
#include "p33fxxxx.h"
#endif

#include "icoc.h"
#include "rx8583.h"

unsigned char Next[6];
unsigned char count=0, pulse=0, cnt=0;
unsigned int impp=0;

//因无信号源,故设置一个IO输出端口GPS,由T3控制脉冲频率,
//用做调试对时程序时所需的秒脉冲信号
//其脉宽为0.1s,期望占空比为1:10
#define GPS	PORTDbits.RD0

void InitCPU(void) 
{
	INTCON1bits.NSTDIS = 0;
	CORCONbits.IPL3 = 0;
	SRbits.IPL = 1;	
	InitTmr3();
	InitIC8();
}
/*******************************************************************************
函数功能:定时器3初始化
*******************************************************************************/
void InitTmr3(void)
{
	T3CONbits.TON = 0;
	TMR3 = 0;
	PR3 = 49999;			// 0.1秒中断
	T3CONbits.TGATE = 0;    // 禁止门控时间累加    
	T3CONbits.TCS = 0;      // 内部时钟
	T3CONbits.TCKPS = 2;    // 预分频比1:64
	IPC2bits.T3IP = 5;
	IFS0bits.T3IF = 0;
	
	IEC0bits.T3IE = 1;
	T3CONbits.TON = 1;		// Start Timer 3
}
/*******************************************************************************
输入捕捉模块8初始化:每16个上升沿捕捉一次 每4次捕捉事件中断一次
*******************************************************************************/
void InitIC8(void)
{    
  /*********IC8 配置 捕捉GPS上升沿***************/
    TRISDbits.TRISD15 = 1;	//PULSE
    TRISDbits.TRISD0 = 0;	//GPS
    IC8CONbits.ICM = 0;
    IC8CONbits.ICTMR = 0;
    IC8CONbits.ICI = 3;
    IC8CONbits.ICM = 5;
    IPC5bits.IC8IP = 5;
    IFS1bits.IC8IF = 0;
    IEC1bits.IC8IE = 1;
}
void __attribute__((__interrupt__, no_auto_psv)) _T3Interrupt(void)
{
	if(count==0){GPS = 1;pulse ++;}
	else GPS = 0;
		
	count++;
	if(count>=10)count=0;//T3中断10次才产生一个高电平脉冲
	
	IFS0bits.T3IF = 0;
}
/*******************************************************************************
每16个上升沿乘以4次捕捉事件中断一次,即每64秒(64个脉冲)中断一次
读时钟函数,并与上一次中断逻辑计算的时间值比较,若不等,写时钟
*******************************************************************************/  
void __attribute__((__interrupt__, no_auto_psv)) _IC8Interrupt(void)
{
	unsigned char i, add = 0;
	static unsigned char first = 1;
	
	cnt = pulse;//调试 检验是否为64个脉冲输入后IC8产生中断
	if(pulse>=64)pulse=0;
	ReadTime();
	if(first)
	{
		for(i=0;i<6;i++)	{Next[i] = clock[i];}
		first = 0;
	}
	for(i=0; i<6; i++)
	{
		if(clock[i] != Next[i])
		{
			clock[i] = Next[i];
			WriteTime();
		}
	}
	//计算下次中断时刻的准确时间
	Next[5] = clock[5]+64;
	add = Next[5]/60;
	Next[5] = Next[5]%60;//秒
	Next[4] = clock[4]+add;//分
	if(Next[4]>=60)
	{
		Next[4] = 0;Next[3]++;//时			
		if(Next[3]>=24)
		{
			Next[3] = 0;Next[2]++;//日				
			switch(Next[1])
			{
				case 1:
				case 3:
				case 5:
				case 7:
				case 8:
				case 10:
				case 12:
					if(Next[2]>31){Next[2] = 1; Next[1]++;}
					break;
				case 2:
					if((Next[0]%4!=0)&&(Next[2]>29)){Next[2] = 1; Next[1]++;}
					if((Next[0]%4==0)&&(Next[2]>28)){Next[2] = 1; Next[1]++;}
					break;
				case 4:
				case 6:
				case 9:
				case 11:
					if(Next[2]>30){Next[2]=1;Next[1]++;}
					break;
				default:
					break;
			}
			if(Next[1]==13){Next[1]=1;Next[0]++;}		
		}
	}
	IFS1bits.IC8IF = 0;
}

⌨️ 快捷键说明

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