驱动
#include <ds1302.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
自己添加的
ds1302.c:
unsigned char code addr_write[3]={0X80,0X82,0X84}; //写地址
unsigned char code addr_read[3]={0X81,0X83,0X85}; //读地址
unsigned char time[3]={0X50,0X59,0X23};
//初始化的时间:23:59:50
/**
* @Function ds1302_wrtie_time
* @Description: 写时间
* @param void
* @return void
*/
void ds1302_write_time(void)
{
unsigned char i=0;
EA=0;
Write_Ds1302(0X8E,0X00); //清除写保护
for(i=0;i<3;i++)
{
Write_Ds1302(addr_write[i],time[i]);
}
Write_Ds1302(0X8E,0X80); //开启写保护
EA=1;
}
/**
* @Function ds1302_read_time
* @Description: 读时间
* @param void
* @return void
*/
void ds1302_read_time(void)
{
unsigned char i=0;
EA=0;
for(i=0;i<3;i++)
{
time[i]=Read_Ds1302 (addr_read[i]);
}
EA=1;
}
ds1302.h:
#ifndef _DS1302_H_
#define _DS1302_H_
#include <STC15F2K60S2.H>
void ds1302_write_time(void);
void ds1302_read_time(void);
extern unsigned char time[3];
#endif
main.c
void main(void)
{
ds1302_write_time();
while(1)
{
ds1302_read_time();
/********显示*********/
dspbuf[0]=time[2]/16;
dspbuf[1]=time[2]%16;
dspbuf[2]=10;
dspbuf[3]=time[1]/16;
dspbuf[4]=time[1]%16;
dspbuf[5]=10;
dspbuf[6]=time[0]/16;
dspbuf[7]=time[0]%16;
}
}
扩展(一些考过的应用)
- 调成12小时制
if(time[2]>0X12) //如果大于12小时,就减去12个小时
{
dspbuf[0]=(time[2]-0X12)/16;
dspbuf[1]=(time[2]-0X12)%16;
}
else //其他正常显示
{
dspbuf[0]=time[2]/16;
dspbuf[1]=time[2]%16;
}
dspbuf[2]=10;
dspbuf[3]=time[1]/16;
dspbuf[4]=time[1]%16;
dspbuf[5]=10;
dspbuf[6]=time[0]/16;
dspbuf[7]=time[0]%16;
- 时间的暂停和开始
比如时间停止显示,按下K4后开始
原理:秒位的寄存器第0位CH
当CH为1时时间停止
则在再写对应的秒位或上“1000 0000” 能让第0位“CH”置1
从而达到停止时间的目的
if(k4_press)
{
k4_press=0;
if(k4_count==0)
{
flag_time=1;
k4_count=!k4_count;
}
else if(k4_count==1)
{
flag_time=0;
k4_count=!k4_count;
}
}
if(flag_time==0) //上电初始值为0,按键按下后变为1
Write_Ds1302(0X80,time[0]|0X80); //上电为CH=1;
3.调整时间(以调小时为例)
unsigned time_set //设置一个中间变量
if(按键按下)
{
time_set=time[2]/16*10+time[2]%16; //把当前的时间读成10进制
time_set++; //加一个小时
if(!(time_set>=0 && time_set<24)) //判断是否在0~24小时之间
time_set=0;
time[2]=time_set/10*16+time_set%10; //变回16进制
Write_Ds1302(0X8E,0X00); //清除写保护
Write_Ds1302(addr_write[2],time[2]); //写时间
Write_Ds1302(0X8E,0X80); //开启写保护
}
- 闹钟
if(time[2]==time_alarm[2])
{
if(time[1]==time_alarm[1])
{
if(time[0]==time_alarm[0])
flag_alarm=1; //闹钟标志位置1
else
flag_alarm=0; //闹钟标志位置0
}
}