#include <reg51.h>
#include <intrins.h>
#include ".\ds1302.h"
#define uchar unsigned char
#define uint unsigned int
sbit reset = P3^4;
sbit io = P3^5;
sbit sclk = P3^6;
void delay_nop(uchar daa)
{
while(daa--)
{
_nop_();
}
}
//*******************************************************************************
void write_byte(uchar inbyte)
{
uchar i;
for(i = 0;i<8;i++)
{
sclk = 0; //写的时候低电平改变数据
delay_nop(2);
if(inbyte&0x01)
io = 1;
else
io = 0;
delay_nop(2);
sclk = 1; //写的时候高电平,把数据写入ds1302
delay_nop(2);
inbyte = inbyte>>1;
}
}
//*******************************************************************************
uchar read_byte() //sclk的下跳沿读数据
{
uchar i,temp = 0;
io = 1; //设置为输入口
delay_nop(2);
for(i = 0;i<7;i++)
{
sclk = 0;
delay_nop(2);
if(io == 1)
temp = temp|0x80;
else
temp = temp&0x7f;
delay_nop(2);
sclk = 1; //产生下跳沿
delay_nop(2);
temp = temp>>1;
}
return (temp);
}
//*******************************************************************************
void write_ds1302(uchar cmd,uchar indata)
{
sclk = 0;
delay_nop(2);
reset = 1;
write_byte(cmd);
write_byte(indata);
sclk = 0;
delay_nop(2);
reset = 0;
}
//*******************************************************************************
uchar read_ds1302(uchar addr)
{
uchar backdata;
sclk = 0;
delay_nop(2);
reset = 1;
write_byte(addr); //先写地址
backdata = read_byte(); //然后读数据
sclk = 0;
delay_nop(2);
reset = 0;
return (backdata);
}
//*******************************************************************************
void set_ds1302(uchar *p) //写入n个数据
{
uchar addr = 0x80;
uchar n = 7;
write_ds1302(0x8e,0x00); //写控制字,允许写操作
for(;n>0;n--)
{
write_ds1302(addr,*p);
p++;
addr = addr+2;
}
write_ds1302(0x8e,0x80); //写保护,不允许写
}
//*******************************************************************************
void read_nowtime(uchar *p)
{
uchar addr = 0x81;
uchar n = 7;
for(;n>0;n--)
{
*p = read_ds1302(addr);
p++;
addr = addr+2;
}
}
//*******************************************************************************
void init_ds1302()
{
reset = 0;
sclk = 0;
write_ds1302(0x80,0x00);
write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
write_ds1302(0x8e,0x80);
}
/*******************************************************************************
void main()
{
init_ds1302(); //初始化ds1302
set_ds1302(0x80,init2,7); //设置初始时间,日期,年月
while(1)
{
if(~k1)
Play_nowtime();
}
}
void Play_nowtime()
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
P2 = init[0]; //秒
P1 = init[1]; //分
}
*******************************************************************************/
//===============DS1302 TEXT .C
/*******************************************************************************
*******************************************************************************/
#include <reg51.h>
#include ".\ds1302.h"
#define uchar unsigned char
#define uint unsigned int
uchar init [] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //
uchar init2[] = {0x00,0x59,0x23,0x01,0x05,0x01,0x06}; //
//秒, 分, 时, 日, 月,星期,年
//秒, 分, 时
sbit k1 = P3^7;
void Play_nowtime() ;
void main()
{
init_ds1302(); //初始化ds1302
set_ds1302(init2); //设置初始时间,日期,年月
while(1)
{
Play_nowtime();
}
}
void Play_nowtime()
{
read_nowtime(init); //读出当前时间,读出7个字节
P2 = init[0]; //秒
P1 = init[0]; //秒
// P1 = init[1]; //分
}
//============TEXT1.C
/*
sbit reset = P3^4;
sbit sclk = P3^6;
sbit io = P3^5;
*/
#define uchar unsigned char
#define uint unsigned int
#define rtc_on 1
void init_ds1302();
void set_ds1302(uchar *p) ;//写入n个数据
void read_nowtime(uchar *p);//读取n个数据
//================DS1302.H
文章评论(0条评论)
登录后参与讨论