📄 ds1305c3.c
字号:
/*******************************************************************/
/* 这是用C51高级语言编写的DS1305时钟和RAM读写程序-没有调用汇编语言,*/
/* 文件名 DS1305C3.C */
/* 功能:本程序主要是读DS1305的日历时钟值(共7个字节)、置DS1305 */
/* 的日历时钟值、读DS1305的RAM区特定单元(共96个字节)的内 */
/* 容和写DS1305的RAM区特定单元。本程序中对DS1305 RAM区的读 */
/* 写均为16个字节。 */
/********************************************************************/
#include <stdio.h>
#include <reg52.h>
#define uchar unsigned char
void reset_3w(void);
void wbyte_3w(uchar w_byte);
uchar rbyte_3w(void);
void Initialize();
void TimeWrite();
void BurstReadTime();
void BurstRamRead(void);
void BurstRamWrite(void);
void writebyte1305();
void readbyte1305();
sbit CE = P1^2;
sbit SCLK = P1^1;
sbit SDI_IO = P1^0;
sbit INT0b = P3^2; /* INT0b脚与单片机的P3.2连接*/
uchar mid1[16];
uchar CPOL = 0;
void reset_3w() // DS1305复位
{
SCLK = 0;
CE = 0;
CE = 1;
}
void wbyte_3w(uchar w_byte) /*把w_byte中的数据从高位开始送入ds1305 */
{
uchar i;
for(i = 0; i < 8; ++i)
{
SDI_IO = 0;
if(w_byte & 0x01)
{
SDI_IO = 1;
}
SCLK = 0;
SCLK = 1;
w_byte >>= 1;
}
}
uchar rbyte_3w() /*对DS1305进行读操作程序 */
{
uchar i, R_Byte, TmpByte;
R_Byte = 0x00;
SDI_IO = 1;
for(i = 0; i < 8; ++i)
{
SCLK = 1;
SCLK = 0;
TmpByte = (uchar)SDI_IO;
TmpByte <<= 7;
R_Byte >>= 1;
R_Byte |= TmpByte;
}
return R_Byte;
}
void readbyte1305() /* 从DS1305中指定单元读出一个字节 */
{
uchar Add;
uchar Data;
Add=0x06; /* 指定待读出单元的地址 */
reset_3w();
wbyte_3w(Add);
Data=rbyte_3w(); /* 读出的结果放在Data中 */
reset_3w();
}
void writebyte1305() /* 向DS1305中指定单元写入一个字节 */
{
uchar Add, Data;
Add= 0x06; /* 指定待写入单元的地址 */
Data= 0x07; /* 指定待写入的内容 */
/* User enters read address. Must convert to write address. */
Add |= 0x80;
reset_3w();
wbyte_3w(Add);
wbyte_3w(Data);
reset_3w();
}
void TimeWrite() /* 日历时钟值写入 */
{
uchar yr, mn, dt, dy, hr, min, sec;
reset_3w(); //清时钟写保护位。在写时钟之前,必须清时钟写保护位,否则写不进去。
wbyte_3w(0x8F);
wbyte_3w(0);
reset_3w();
yr=06; /* 置待写入的年、月、日、时、分和秒的压缩的BCD码值 */
mn=0x11;
dt=0x26;
dy=7;
hr=9;
hr = hr & 0x3f;
min=9;
sec=9;
reset_3w();
wbyte_3w(0x80);
wbyte_3w(sec);
wbyte_3w(min);
wbyte_3w(hr);
wbyte_3w(dy);
wbyte_3w(dt);
wbyte_3w(mn);
wbyte_3w(yr);
reset_3w();
}
void BurstReadTime() /* 突发模式时钟读 */
{
uchar Sec, Min, Hrs, Day, Dte, Mon, Yr;
reset_3w();
wbyte_3w(0x00);
Sec = rbyte_3w();
Min = rbyte_3w();
Hrs = rbyte_3w();
Day = rbyte_3w();
Dte = rbyte_3w();
Mon = rbyte_3w();
Yr = rbyte_3w();
reset_3w();
}
void BurstRamRead() /* 突发模式RAM读 */
{
uchar i;
reset_3w();
wbyte_3w(0x20);
for (i = 0; i < 16; ++i)
{
mid1[i]=rbyte_3w() ; //数组mid1[i]中放读出内容
}
reset_3w();
}
void BurstRamWrite() /* 突发模式RAM写 */
{
uchar i, dat;
dat=0x55; // dat中放待写入内容
reset_3w();
wbyte_3w(0xA0);
for (i = 0; i < 16; ++i)
{
wbyte_3w(dat);
}
reset_3w();
}
void Initialize() /* DS1305初始化 */
{
reset_3w();
wbyte_3w(0x8f);
wbyte_3w(0x05); /* 往控制寄存器写0x05*/
reset_3w();
wbyte_3w(0x90);
wbyte_3w(0x01); /* 往状态制寄存器写0x01*/
reset_3w();
wbyte_3w(0x91);
wbyte_3w(0xa5); /* 往涓流充电寄存器写0xa5*/
reset_3w();
}
void main() //主程序
{
while (1)
{
// writebyte1305();
// readbyte1305();
Initialize(); /* 调DS1305初始化 */
TimeWrite(); /* 调日历时钟值写入*/
BurstReadTime(); /* 突发模式时钟读 */
BurstRamWrite(); /* 突发模式RAM写 */
BurstRamRead(); /* 突发模式RAM读 */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -