📄 manager.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 + -