DS1302读/写地址(注意储存在DS1302中的数据是BCD码):
例程代码:
实验现象:上电后时钟按设定时间运行,按键4暂停,按键5开启
main.c
#include "main.h"
#include "ds1302.h"
/************* 本地常量声明 **************/
uchar code duanma[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black - H J K L N o P U t G Q r M y
0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46}; //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
uchar W_TIME[7]={55,59,11,6,4,3,22};
uchar R_TIME[7]={0};
uchar smg_hour,smg_min,smg_sec,ls_sec,zt_flag;
void main()
{
Sys_Init();//系统初始化
DS1302_Init();
while(1)
{
if(zt_flag==0)
Read_DS1302();
display();
key_scan();
}
}
void key_scan()
{
if(S4==0)//暂停
{
Sys_delay(1000);
if(S4==0)
{
Write_Ds1302_Byte(0x8E,0X00);//关闭写保护
ls_sec=DEC_BCD(R_TIME[0]);Write_Ds1302_Byte(0x80,0X80);//将sec保存并暂停时钟
Write_Ds1302_Byte(0x8E,0X80);//开启写保护
open_relay();zt_flag=1;
while(S4==0)
{
display();
}
}
}
if(S5==0&&zt_flag==1)//开始
{
Sys_delay(1000);
if(S5==0)
{
Write_Ds1302_Byte(0x8E,0X00);
Write_Ds1302_Byte(0x80,ls_sec&0X7f);//重新写入sec并开启时钟
Write_Ds1302_Byte(0x8E,0X80);
close_relay();zt_flag=0;
while(S5==0)
{
display();
}
}
}
}
void open_relay()
{
Y5;
P0=0X10;
Y0;
}
void close_relay()
{
Y5;
P0=0X00;
Y0;
}
void display()
{
seg_one(0,smg_hour/10);
seg_one(1,smg_hour%10);
seg_one(2,17);
seg_one(3,smg_min/10);
seg_one(4,smg_min%10);
seg_one(5,17);
seg_one(6,smg_sec/10);
seg_one(7,smg_sec%10);
}
void seg_one(uchar wei,dat)//wei:0~7位 dat:段码数组
{
Y6; P0=0X01<<wei; Y0; //使能位选
Y7; P0=~duanma[dat]; //使能段选
Sys_delay(500); //延时
P0=0XFF; //消影
Y0;
}
void Sys_delay(uint t)
{
while(t--);
}
void Sys_Init()
{
Y4 P0=0XFF; Y0;//关闭LED
Y5 P0=0X00; Y0;//关闭蜂鸣器和继电器
Y6; P0=0X00; Y0;//关闭SEG
}
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
#include "STC15F2K60S2.h"
#define uchar unsigned char //为了偷懒
#define uint unsigned int
sbit S4 = P3^3;
sbit S5 = P3^2;
#define Y0 P2=(P2&0X1F)|0X00; //为了偷懒
#define Y1 P2=(P2&0X1F)|0X20;
#define Y2 P2=(P2&0X1F)|0X40;
#define Y3 P2=(P2&0X1F)|0X60;
#define Y4 P2=(P2&0X1F)|0X80;
#define Y5 P2=(P2&0X1F)|0XA0;
#define Y6 P2=(P2&0X1F)|0XC0;
#define Y7 P2=(P2&0X1F)|0XE0;
void Sys_Init();//函数声明
void Sys_delay(uint t);
void seg_one(uchar wei,dat);//wei:0~7位 dat:段码数组
void display();
void DS1302_Init();
void Read_DS1302();
void key_scan();
void open_relay();
void close_relay();
#endif
ds1302.c
#include "ds1302.h"
#include <intrins.h>
extern uchar W_TIME[7];
extern uchar R_TIME[7];
extern uchar smg_hour,smg_min,smg_sec,ls_sec;
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);
}
void Read_DS1302()
{
uchar add=0x81,i=0;
for(i=0;i<7;i++)
{
R_TIME[i]=BCD_DEC(Read_Ds1302_Byte(add));
add=add+2;
}
smg_sec=R_TIME[0];
smg_min=R_TIME[1];
smg_hour=R_TIME[2];
}
void DS1302_Init()
{
uchar add=0x80,i=0;
Write_Ds1302_Byte(0x8E,0X00);
for(i=0;i<7;i++)
{
Write_Ds1302_Byte(add,DEC_BCD(W_TIME[i]));
add=add+2;
}
Write_Ds1302_Byte(0x8E,0X80);
}
/*******************************************************************************
* 函 数 名 : BCD_DEC
* 函数功能 : BCD码转十进制码
* 输 入 : 待转换数据BCD码
* 输 出 : 转换后的十进制码
*******************************************************************************/
unsigned char BCD_DEC(unsigned char dat)
{
return( (dat>>4)*10+(dat&0x0f) );
}
/*******************************************************************************
* 函 数 名 : DEC_BCD
* 函数功能 : 十进制码转BCD码
* 输 入 : 待转换数据十进制码
* 输 出 : 转换后的BCD码
*******************************************************************************/
unsigned char DEC_BCD(unsigned char dat)
{
return( ((dat/10)<<4) + (dat%10) );
}
ds1302.h
#ifndef __DS1302_H
#define __DS1302_H
#include "main.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
void Write_Ds1302(unsigned char temp);
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte( unsigned char address );
unsigned char BCD_DEC(unsigned char dat);
unsigned char DEC_BCD(unsigned char dat);
#endif