📄 1302.h
字号:
#ifndef _DS1302_H__ //防止重载
#define _DS1302_H__
#define uchar unsigned char
#define uint unsigned int
#define ds1302_second 0x80
#define ds1302_minute 0x82
#define ds1302_hour 0x84
#define ds1302_day 0x86
#define ds1302_week 0x8a
#define ds1302_month 0x88
#define ds1302_year 0x8c
/**端口定义**/
sbit IO=P1^6;
sbit CLK=P1^7;
sbit RST=P1^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
uchar datastring[13]; ////存放时间的数组1302.h
/***********主函数*************/
sbit ringout=P3^7; //闹钟信号输出端,0为关闭
uchar idata datatemp[96];//数据暂存
uchar idata ringtime[5]={1,1,1,1,0};
uint ringdelay=0; //闹钟时长
bit ringflag=0,ringoff=0; //正在闹钟标志、闹钟关闭标志
/*********1802.h****************/
sbit DQ=P3^0;
uchar temp[2];
uchar flag1820=0;
/************12864**************/
sbit E=P1^2; //使能端
sbit RW=P1^1; //读写端
sbit RS=P1^0; //数据命令端口
sbit CS1=P1^3;
sbit CS2=P1^4;
/*****************************/
void ds1302_write(uchar dat)
{
uchar i,j;
j=dat;
for(i=0;i<8;i++) //这里有一个让我郁闷了几天的问题,如果把j都改为ACC这句改为
{ //for(i=0;i<8;i++)仿真就会不成功,高手指点下!!
IO=j&0x01;
CLK=1;
CLK=0;
j>>=1;
}
}
/**实时时钟读出一个字节**/
uchar ds1302_read()
{
uchar i;
for(i=0;i<8;i++)
{
ACC=ACC>>1;
ACC7=IO;
CLK=1;
CLK=0;
}
return(ACC);
}
/**写入数据**/
void dat_write(uchar addr,uchar dat) //addr为要写数据的地址,dat为要写的数据
{
RST=0;
CLK=0;
RST=1;
ds1302_write(addr);
ds1302_write(dat);
CLK=1;
RST=0;
}
/**读出数据**/
uchar dat_read(uchar addr)
{
uchar dat;
RST=0;
CLK=0;
RST=1;
ds1302_write(addr|0x01);
dat=ds1302_read();
CLK=1;
RST=0;
return(dat);
}
/**是否写保护**/
void ds1302_protect(bit flag)
{
if(flag)
dat_write(0x8e,0x10); //禁止写
else
dat_write(0x8e,0x00); //允许写
}
/**时间设置**/
void settime(uchar addr,uchar value)
{
ds1302_protect(0);
dat_write(addr,value);
ds1302_protect(1);
}
/**时间增减设置**
void set(uchar adr,bit flag)
{
uchar dat;
dat=dat_read(adr);
if(flag)
dat_write(adr,dat+1);
else
dat_write(adr,dat-1);
}
/**12/24小时时间设置**/
void day_set(bit flag) //flag为1为12时制,为0则为24小时制
{
uchar hour;
hour=(dat_read(0x85)&0x7f); //保留小时寄存器中原有的时间值
ds1302_protect(0) ;
if(flag)
{
dat_write(0x84,0x80|hour);
}
else
{
dat_write(0x84,0x00|hour);
}
ds1302_protect(1);
}
/**取时间**/
void gettime()
{
uchar readvalue;
readvalue=dat_read(ds1302_second);
datastring[10]=((readvalue&0x70)>>4); //取秒:高4位的低3位为十位,低4位为个位
datastring[11]=readvalue&0x0f;
readvalue=dat_read(ds1302_minute);
datastring[8]=((readvalue&0x70)>>4); //取分:高4位的低3位为十位,低4位为个位
datastring[9]=(readvalue&0x0f);
readvalue=dat_read(ds1302_hour);
datastring[6]=((readvalue&0x30)>>4); //取时:高4位的低2位为十位,低4位为个位
datastring[7]=readvalue&0x0f;
readvalue=dat_read(ds1302_day);
datastring[4]=((readvalue&0x30)>>4); //取日:高4位的低2位为十位,低4位为个位
datastring[5]=readvalue&0x0f;
readvalue=dat_read(ds1302_week);
datastring[12]=(readvalue&0x07); //取星期:低3位
readvalue=dat_read(ds1302_month);
datastring[2]=((readvalue&0x10)>>4); //取月: 高4位的低1位为十位,低4位为个位
datastring[3]=readvalue&0x0f;
readvalue=dat_read(ds1302_year);
datastring[0]=((readvalue&0xf0)>>4); //取年:高4位为十位,低4位为个位
datastring[1]=readvalue&0x0f;
}
/**初始时间设置为2008-08-08 08时08分08秒**/
void init_time(void)
{
day_set(0);
settime(ds1302_second,0x08);
settime(ds1302_minute,0x08);
settime(ds1302_hour,0x18);
settime(ds1302_day,0x10);
settime(ds1302_month,0x12);
settime(ds1302_year,0x08);
settime(ds1302_week,0x05);
}
/**DS1302初始化**/
void init_ds1302(void)
{
uchar second=dat_read(ds1302_second);
if(second&0x80)
settime(ds1302_second,0);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -