|
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
uchar time1[8];
code seven_tab[15]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0--9,-,
sbit rtc_clk=P3^6; //ds1302的串行时钟,控制数据的输入与输出
sbit rtc_data=P3^4; //双向数据线
sbit rtc_rst=P3^5; //复位引脚
sbit p2_2=P2^2;
sbit p2_3=P2^3;
sbit p2_4=P2^4;
/*ds1302读,写都要先执行读地址
ds1302的双向数线是以为一位执行
*/
void write1302(uchar address,uchar date) //向ds1302写
{
uchar n;
rtc_rst=0; //复位引脚低电平
_nop_(); //延迟一个周期
rtc_clk=0; //时钟为低电平
_nop_();
rtc_rst=1; //复位引脚置高,开始执行
_nop_();
for(n=0;n<8;n++) //开始传送八位地址命令
{
rtc_data=address&0x01; // 数据从低位开始传送
address>>=1; //地址数据向右移一位
rtc_clk=1; //串行时钟拉高,执行写入数据
_nop_();
rtc_clk=0; //串行时钟拉高,为下一个数据写入做准备
_nop_();
}
for(n=0;n<8;n++) //开始传送八位地址数据
{
rtc_data=date&0x01; //数据从低位开始传送
date>>=1; //地址数据向右移一位
rtc_clk=1;
_nop_();
rtc_clk=0;
_nop_();
}
rtc_rst=0; //结束复位拉低
_nop_();
}
uchar read1302(uchar address) //向ds1302读
{
uchar n,dat,dat1;
rtc_rst=0;
_nop_();
rtc_clk=0;
_nop_();
rtc_rst=1;
_nop_();
for(n=0;n<8;n++) //开始传送八位地址命令
{
rtc_data=address&0x01; //数据从低位开始传送
address>>=1; //地址数据向右移一位
rtc_clk=1;
_nop_();
rtc_clk=0;
_nop_();
}
_nop_();
for(n=0;n<8;n++) //读取8位数据
{
dat1=rtc_data;
dat=(dat>>1)|(dat1<<7);
rtc_clk=1;
_nop_();
rtc_clk=0;
_nop_();
}
rtc_rst=0;
_nop_();
rtc_clk=1;
_nop_();
rtc_data=0;
_nop_();
rtc_data=1;
_nop_();
return dat;
}
|
|