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

📄 wdcal_lib.c

📁 单片机开发软件KEIL
💻 C
字号:
// wdcal_lib.c
// Library with functions for the self-calibration

// This file contains asm directives:
// Set the Compiler options (Keil uVision2) for this file to:
// - Generate Assembler SRC File
// - Assemble SRC File

#include <REG932.H>
#include "WDCAL_lib.h"
#include "CSTM_lib.h"

unsigned char WDTcnt=0;

void WDcal()
{
	// state machine
	unsigned char calStat=0;		
	calStat=EEPROMread(ADRSTAT);		// get current state 
	switch(calStat)
	{
		case MESWD:	// this is the very first powerup:
					EEPROMwrite(ADRSTAT, calStat+1);	

					// Set timer0 16bit Mode 1
					TAMOD=0x00;			// set mode 1, 16bit timer
					TMOD=0x01;
					TH0=0x3E;			// setup 13.44ms until overflow @ fosc=7.374MHz (RCosc)
					TL0=0x74;				
					IP0H|=0x02;			// interrupt priority level 2
					IP0&=0xFD;

					// Set watchdog
					WDL=0x00;			// WDT reloadvalue=0 -> OverFlowPeriod=80us@400kHz
					WDCON=0x05;			// Start WDT, use WDTosc
					IP0H&=0xBF;			// interrupt priority level 1
					IP0|=0x40;		

					// Enable both timers
					msec(11);			// wait for WDT update (wait for next underflow)
					ET0=1;				// enable timer0 interrupt
					EC=1;				// enable WDT interrupt
					EA=1;
					TR0=1;				// start TR0
					WDTcnt=0;			// reset overflow counter
					while(EC);			// wait until measurement is done
					setUCFG(WDTOSC);	// select WDTosc and reset
					break;
		case USERC:	break;				// this is a 'following' powerup:
										//  now execute user code
	}
}

void EEPROMwrite(unsigned int adr, unsigned char dat)
{
	EA=0;									// disable interrupts during write
	DEECON=(unsigned char)((adr>>8)&0x01);	// set byte write mode
	DEEDAT=dat;								// write data to buffer
	DEEADR=(unsigned char) adr;				// start write
	EA=1;
	while((DEECON&0x80)==0);				// wait until write complete
}

unsigned char EEPROMread(unsigned int adr)
{
	DEECON=(unsigned char)((adr>>8)&0x01);	 
	DEEADR=(unsigned char) adr;				// start byte read
	while((DEECON&0x80)==0);				// wait until read complete
	return DEEDAT;							// copy data from buffer
}

void WDT_ISR() interrupt 10
{
	WDTcnt++;				// count WDT overflows
	WDCON&=0x0FD;			// reset WDT interrupt flag
}

void T0_ISR() interrupt 1
{
	EC=0;							// Deactivate all timers,
	ET0=0;							
	EEPROMwrite(ADRWDFQ, WDTcnt);	// Save WDTcnt to EEPROM	
}

void setUCFG(unsigned char ucfg)
{
	EA=0;				// disable interrupt during IAP
	ACC=ucfg;			// 0x43: RCosc, 0x44: WDTosc, 0x40: Crystal
	#pragma asm
	MOV R5,A			;IAP parameter
	MOV A,#02h
	MOV R7,#00h
	CALL 0FF00h			;call IAP
	MOV AUXR1, #08h		;software reset
	#pragma endasm
	EA=1;
}

void msec(int x)	 // delays x msec (at fosc=11.0592MHz)
{
	int j=0;
	while(x>=0)
	{
		for (j=0; j<1350; j++);
		x--;
	}
}

⌨️ 快捷键说明

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