![]() |
#2
朱三哥2013-03-02 22:05
|

#include <reg51.h>
sbit ds1302_nf=P1^2; // p1.2控制CE
sbit ds1302_clk=P3^6; // p3.6控制时序
sbit ds1302_io=P3^7; // p3.7控制的是IO口
void ds1302_init() //准备传输数据的初始化,CE拉高,clk拉低
{
ds1302_nf=1;
ds1302_clk=0;
// ds1302_io=0;
}
void ds1302_close() //关闭数据传输 ,CE拉高,CLK拉低
{
ds1302_nf=0;
//ds1302_clk=0;
//ds1302_io=0;
}
void ds1302_write_byte(unsigned char addr) //写一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
ds1302_io=addr&1;
ds1302_clk=0;
addr>>=1;
ds1302_clk=1;
}
}
unsigned char ds1302_read_byte() //读一个字节
{
unsigned char i,datanum=0;
for(i=0;i<8;i++){
datanum>>=1;
ds1302_clk=1;
ds1302_clk=0;
if(ds1302_io==1)
datanum|=0x80;
}
return(datanum);
}
void ds1302_write_data(unsigned char addr,unsigned char datanum) //数据的写入分两部分,寄存器的选择和读写方式这个是一个字节 后面是一个字节的数据
{
ds1302_init();
ds1302_write_byte(addr);
ds1302_write_byte(datanum);
ds1302_close();
}
unsigned char ds1302_read_data(unsigned char addr) //数据的读入分两步,第一步写入 寄存器 的选择控制部分数据,第二步读出一个字节的内容
{
unsigned char datanum;
ds1302_init();
ds1302_write_byte(addr);
datanum=ds1302_read_byte();
ds1302_close();
return(datanum);
}
void ds1302_wp_set() //写保护位的设置
{
ds1302_init();
ds1302_write_data(0x8e,0x80);
ds1302_close();
}
void ds1302_wp_clear() //清楚保护位
{
ds1302_init();
ds1302_write_data(0x8e,0);
ds1302_close();
}
void delay(unsigned char i) //延时函数
{
unsigned char j;
for(i;i>0;i--)
for(j=0;j<255;j++);
}
//从DS1302里面读出秒表的数据给P2口 P2口连接的是8个LED灯,看灯的效果
void main()
{
ds1302_wp_clear();
ds1302_write_data(0x80,0);
ds1302_wp_set();
while(1){
delay(1000);
P2=ds1302_read_data(0x81);
}
}
sbit ds1302_nf=P1^2; // p1.2控制CE
sbit ds1302_clk=P3^6; // p3.6控制时序
sbit ds1302_io=P3^7; // p3.7控制的是IO口
void ds1302_init() //准备传输数据的初始化,CE拉高,clk拉低
{
ds1302_nf=1;
ds1302_clk=0;
// ds1302_io=0;
}
void ds1302_close() //关闭数据传输 ,CE拉高,CLK拉低
{
ds1302_nf=0;
//ds1302_clk=0;
//ds1302_io=0;
}
void ds1302_write_byte(unsigned char addr) //写一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
ds1302_io=addr&1;
ds1302_clk=0;
addr>>=1;
ds1302_clk=1;
}
}
unsigned char ds1302_read_byte() //读一个字节
{
unsigned char i,datanum=0;
for(i=0;i<8;i++){
datanum>>=1;
ds1302_clk=1;
ds1302_clk=0;
if(ds1302_io==1)
datanum|=0x80;
}
return(datanum);
}
void ds1302_write_data(unsigned char addr,unsigned char datanum) //数据的写入分两部分,寄存器的选择和读写方式这个是一个字节 后面是一个字节的数据
{
ds1302_init();
ds1302_write_byte(addr);
ds1302_write_byte(datanum);
ds1302_close();
}
unsigned char ds1302_read_data(unsigned char addr) //数据的读入分两步,第一步写入 寄存器 的选择控制部分数据,第二步读出一个字节的内容
{
unsigned char datanum;
ds1302_init();
ds1302_write_byte(addr);
datanum=ds1302_read_byte();
ds1302_close();
return(datanum);
}
void ds1302_wp_set() //写保护位的设置
{
ds1302_init();
ds1302_write_data(0x8e,0x80);
ds1302_close();
}
void ds1302_wp_clear() //清楚保护位
{
ds1302_init();
ds1302_write_data(0x8e,0);
ds1302_close();
}
void delay(unsigned char i) //延时函数
{
unsigned char j;
for(i;i>0;i--)
for(j=0;j<255;j++);
}
//从DS1302里面读出秒表的数据给P2口 P2口连接的是8个LED灯,看灯的效果
void main()
{
ds1302_wp_clear();
ds1302_write_data(0x80,0);
ds1302_wp_set();
while(1){
delay(1000);
P2=ds1302_read_data(0x81);
}
}
[ 本帖最后由 朱三哥 于 2013-3-2 22:09 编辑 ]