📄 ds1302._h
字号:
//ICC-AVR 修改日期: 2007-05-01 15:38:44
// CenWenJiao
// Target : M8
// Crystal: 1.0000Mhz
#define uchar unsigned char
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义DS1302
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
#define DS1302_RESET1 PORTC|=(1<<PC0)
#define DS1302_RESET0 PORTC&=~(1<<PC0)
#define DS1302_CLK1 PORTC|=(1<<PC1)
#define DS1302_CLK0 PORTC&=~(1<<PC1)
#define DS1302_READ_DATA PINC&0X04
#define DS1302_WRITE_DATA1 PORTC|=(1<<PC2)
#define DS1302_WRITE_DATA0 PORTC&=~(1<<PC2)
#define DS1302_DATA_OUTPUT DDRC|=(1<<PC2)
#define DS1302_DATA_INPUT DDRC&=~(1<<PC2)
/*ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义读写单元地址
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
//读
#define Rsec1 0x81 //秒
#define Rmin1 0x83 //分
#define Rhou1 0x85 //时
#define Rdat1 0x87 //日
#define Rmon1 0x89 //月
#define Rwee1 0x8b //周
#define Ryea1 0x8d //年
//写
#define Wsec 0x80 //秒
#define Wmin 0x82 //分
#define Whou 0x84 //时
#define Wdat 0x86 //日
#define Wmon 0x88 //月
#define Wwee 0x8a //周
#define Wyea 0x8c //年
uchar second,minute,hour,date,week,month,year; //读出后的时间存储单元
char WriteAddress[7]={Wyea,Wmon,Wdat,Whou,Wmin,Wsec,Wwee}; //写地址
char WriteTime[7]={0x08,0x12,0x31,0x23,0x50,0x30,0x00};//写的时间
uchar secondtl,secondth,minutetl,minuteth,hourtl,hourth;//定义时钟数据的高低位置
uchar datetl,dateth,monthtl,monthth,yeartl,yearth;
uchar second1,minute1,hour1,date1,week1,month1,year1;
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义DS1302初始化程序
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_set(void)
{ char i;
DS1302_CLK0;
DS1302_RESET0;
for(i=0;i<8;i++)
{
NOP();
}
DS1302_RESET1;
}
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义m8向DS1302发送程序
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_Write(char x)
{
int i;
DS1302_CLK0;
DS1302_DATA_OUTPUT; //控制数据线
for(i=0;i<8;i++)
{ DS1302_CLK0; //输出
if((x&(1<<i)))
DS1302_WRITE_DATA1 ;
else
DS1302_WRITE_DATA0 ;
NOP();
DS1302_CLK1;
NOP();
}
DS1302_CLK0;
}
//单独矫正某个时间单元
void DS1302_WriteT(char ddr,char time)
{
DS1302_set();
DS1302_Write(ddr);
DS1302_Write(time);
}
/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
定义m8由DS1302接收程序
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
uchar DS1302_Read(char addr) //XX
{
uchar i,temp,k;
temp=0;
DS1302_DATA_OUTPUT;
DS1302_RESET0;
DS1302_CLK0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
DS1302_RESET1; //时钟信号低时拉高RST初始化
temp=addr;
for(i=0;i<8;i++)
{
if(temp&(1<<i))
DS1302_WRITE_DATA1 ;
else
DS1302_WRITE_DATA0 ;
asm("nop");
asm("nop");
DS1302_CLK1; //时钟上升沿写入数据
DS1302_CLK0; //时钟拉低电平
}
DS1302_DATA_INPUT;
//以上为写地址
for(i=0;i<8;i++)
{
k=(DS1302_READ_DATA); //k=(T_PIN&T_IO);
if(k==0X04) //if(k==T_IO)
temp|=(1<<i);
else
temp&=~(1<<i);
asm("nop");
asm("nop");
DS1302_CLK1; //上升沿读出数据
DS1302_CLK0; //时钟电平拉低
}
DS1302_DATA_OUTPUT;
DS1302_CLK0;
DS1302_RESET0; //禁止DS1302
return(temp);
}
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
void DataFenli(void)
{
secondtl=second&0x0f; //分离秒
secondth=(second>>4);
minutetl=minute&0x0f; //分离分钟
minuteth=(minute>>4);
hourtl=hour&0x0f; //分离小时
hourth=(hour>>4);
datetl=date&0x0f; //分离日期
dateth=(date>>4);
monthtl=month&0x0f; //分离月份
monthth=(month>>4);
yeartl=year&0x0f; //分离年份
yearth=(year>>4);
}
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义DS1302读出时间程序
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_ReadTime(void)
{
second=DS1302_Read(Rsec1);
minute=DS1302_Read(Rmin1);
hour=DS1302_Read(Rhou1);
date=DS1302_Read(Rdat1);
month=DS1302_Read(Rmon1);
year=DS1302_Read(Ryea1);
/* second=0x12; 用于测试分离程序
minute=0x13;
hour=0x16;
date=0x30;
month=0x05;
year=0x07;*/
DataFenli();
}
/*cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
定义DS1302矫正时间程序
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc*/
void DS1302_WriteTime(void)
{char *ddr,*time;
ddr=WriteAddress;
time=WriteTime;
while(*ddr)
{
DS1302_WriteT(*ddr,*time);
ddr++;
time++;
}
}
///////////////////////////////////////////////////////////////////////////////
//////////////////////////vc++ iccavr 20070502 program////////////////////////
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -