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

📄 manager.c

📁 C8051F020对实时时钟的读写
💻 C
字号:
//***********************************************************************************
//	头文件
//***********************************************************************************

//-------------------------------------------------------------------------
// 包含文件
//-------------------------------------------------------------------------
#include <c8051f020.h>          //SFR declarations
#include <intrins.h>			//未知

//------------------------------------------------------------------------------------
// 数据类型定义
//------------------------------------------------------------------------------------

#define uchar unsigned char 
#define uint unsigned int 

//------------------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//------------------------------------------------------------------------------------

sfr16 DP       = 0x82;                    // data pointer
sfr16 TMR3RL   = 0x92;                    // Timer3 reload value
sfr16 TMR3     = 0x94;                    // Timer3 counter
sfr16 ADC0     = 0xbe;                    // ADC0 data
sfr16 ADC0GT   = 0xc4;                    // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                    // ADC0 less than window
sfr16 RCAP2    = 0xca;                    // Timer2 capture/reload
sfr16 T2       = 0xcc;                    // Timer2
sfr16 RCAP4    = 0xe4;                    // Timer4 capture/reload
sfr16 T4       = 0xf4;                    // Timer4
sfr16 DAC0     = 0xd2;                    // DAC0 data
sfr16 DAC1     = 0xd5;                    // DAC1 data

//------------------------------------------------------------------------------------
// 全局常数
//------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------
// 数据类型定义
//------------------------------------------------------------------------------------

struct time			//时-分-秒结构
{
	int hour;
	int minute;
	int second;
};

//------------------------------------------------------------------------------------
// 全局变量
//------------------------------------------------------------------------------------

int present_time[17];		//当前时间,RTC取得的数据
int present_second;			//当前时间-秒
int present_minute;			//当前时间-分
int present_hour;			//当前时间-时
int present_date;			//当前时间-日
int present_month;			//当前时间-月
int present_year;			//当前时间-年

uint rtc_read_write;		//RTC读写码
uint rtc_register;			//RTC寄存器地址
uint rtc_data;				//向RTC写的数据
uint rtc_data_flag;			//RTC


//------------------------------------------------------------------
// 函数声明
//------------------------------------------------------------------

// RTC-实时时钟部分

void rtc_int(void);				//RTC中断
void send_rtc_command(uint rtc_register_local, uint rtc_data_local);	//向RTC写数据
void init_rtc(void);			//RTC初始化
void delay(int time);

//*************************************************************************************
// RTC-实时时钟部分
// 
// void rtc_int(void);				//RTC中断
// void send_rtc_command(uint rtc_register_local, uint rtc_data_local);	//向RTC写数据
// void init_rtc(void);				//RTC初始化
// void read_rtc_data(void);		//读取RTC的数据
//*************************************************************************************

//================================================================ 
// RTC串行中断
//================================================================

void rtc_int(void) interrupt 7 
{
	//EA=0;

	switch(SMB0STA)
	{
		case 0x08:
		{
			SMB0DAT=rtc_read_write;
			STA=0;
			break;
		}
		case 0x10:
		{
			STO=1;///
			break;
		}
		case 0x18:
		{
			SMB0DAT=rtc_register;
			break;
		}
		case 0x20:
		{			
			STO=1;///
			break;
		}
		case 0x28:
		{
			if(rtc_data_flag==0)
			{
				SMB0DAT=rtc_data;
				rtc_data_flag=1;
			}
			else
			{
				STO=1;
				rtc_data_flag=0;
			}
			break;
		}
		case 0x30:
		{
			STO=1;///
			break;
		}
		case 0x38:
		{
			STO=1;///
			break;
		}
		case 0x40:
		{
			AA=1;
			break;
		}
		case 0x48:
		{
			STO=1;///
			break;
		}
		case 0x50:
		{
			present_time[rtc_data_flag]=SMB0DAT;	
			if(rtc_data_flag==15)
			{
				AA=0;
			}
			rtc_data_flag=rtc_data_flag+1;
			break;
		}
		case 0x58:
		{
			STO=1;
			break;
		}
		default:
		{
			STO=1;///
			break;
		}
	}
	SI=0;

	//EA=1;
} 

//================================================================ 
// 向RTC写数据
//================================================================

void send_rtc_command(uint rtc_register_local, uint rtc_data_local)
{	
	rtc_read_write=0xd0;
	rtc_register=rtc_register_local;
	rtc_data=rtc_data_local;
	rtc_data_flag=0;

	STA=1;
}

//================================================================ 
// 初始化RTC
//================================================================

void init_rtc(void)
{	
	send_rtc_command(0x00,0x00);delay(1000);		//second	
	send_rtc_command(0x01,0x32);delay(1000);		//minute
	send_rtc_command(0x02,0x08);delay(1000);		//hour
	send_rtc_command(0x03,0x04);delay(1000);		//day
	send_rtc_command(0x04,0x14);delay(1000);		//date
	send_rtc_command(0x05,0x04);delay(1000);		//month
	send_rtc_command(0x06,0x05);delay(1000);		//year
	send_rtc_command(0x07,0x00);delay(1000);
	send_rtc_command(0x08,0x00);delay(1000);
	send_rtc_command(0x09,0x00);delay(1000);
	send_rtc_command(0x0a,0x00);delay(1000);
	send_rtc_command(0x0b,0x00);delay(1000);
	send_rtc_command(0x0c,0x00);delay(1000);
	send_rtc_command(0x0d,0x00);delay(1000);
	send_rtc_command(0x0e,0x18);delay(1000);		//control
	send_rtc_command(0x0f,0x00);delay(1000);		//status
	send_rtc_command(0x10,0xa5);delay(1000);		//trickle charge
}

//================================================================ 
// 延时函数 
//================================================================

void delay(int time) 
{     
	int i;  
	for(i=0;i<time;i++){;}         
} 

//********************************************************************
// 主程序部分
//********************************************************************

void main (void) 
{
	int i;

	P0MDOUT=0xff;
	P1MDOUT=0x00;
	P3MDOUT=0xff;		//端口设置

	WDTCN = 0xde;	WDTCN = 0xad;	// 关闭看门狗

	//启动外部时钟
	OSCXCN=0x27;					//外部时钟允许
	for(i=0;i<100;i++) delay(500);	//等待至少1ms
	//while(!(OSCXCN&0x80));
	OSCICN=0x88;	
	
	XBR0 = 0x01;		//SDA-P0.0, SCL-P0.1
	XBR1 = 0x14;		//INT0-P0.2,  INT1-P0.3
	XBR2 = 0x40;		//交叉开关允许

	EX0 = 1;	//INT0允许
	EX1 = 1;	//INT1允许
	EIE1=0x02;	//MSBus中断允许

	IT0=1;		//INT0下降沿触发
	IT1=0;		//INT1电平触发

	EA = 1;		//允许所有中断

	SMB0CR=0x00;		//时钟速率寄存器
	ENSMB=1;
	SMBFTE=0;
	SMBTOE=1;

	TMR3CN=0x87;
	TMR3RLL=0xff;

	init_rtc();		//初始化时钟

	while(1)
	{
	}
	
}














⌨️ 快捷键说明

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