📄 ds1302.c
字号:
///创建者毛毛虫
////创建时间07 11 06
#pragma small
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit clk1302=P1^0;//7
sbit data1302=P1^2;//6
sbit cs1302=P1^1;//5
sbit clk=P2^0;
sbit IO =P2^1;
sbit P02=P2^2;
sbit P03=P2^3;
sbit P04=P2^4;
sbit P05=P2^5;
uint a[4];
uchar year ;
unsigned char led[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void write1302(uchar order,uchar byte);
uchar read1302(uchar address);
void init1302();
uchar set_time[7]={0x00,0x48,0x14,0x31,0x07,0x07,0x07};
void write1302(uchar order,uchar byte)
{
uchar i;
cs1302 =0;
clk1302 =0;
cs1302 =1;
for(i=0;i<8;i++) //写入地址
{
clk1302=0;
data1302=order&0x01;
clk1302=1;
order=order>>1;
}
for(i=0;i<8;i++) //对相应的地址写入数据
{
clk1302=0;
data1302=byte&0x01;
clk1302=1;
byte=byte>>1;
}
clk1302 =0;
cs1302 =0;
}
uchar read1302(uchar address)
{
uchar i,shuju,shiwei;
cs1302 =0;
clk1302 =0;
cs1302 =1;
for(i=0;i<8;i++) //写入地址命令
{
clk1302=0;
data1302=address&0x01;
clk1302=1;
address=address>>1;
}
shuju=0;
for(i=0;i<8;i++) //读出当前地址的内容
{
shuju=shuju>>1;
clk1302=0;
if(data1302==1)
shuju=shuju|0x80;
clk1302=1;
}
clk1302=0;
cs1302=0;
shiwei=shuju/16; //数据整合 因为1302的高4为
shuju=shuju%16; //默认放的十位
shuju=shiwei*10+shuju;
return shuju;
}
void init1302()
{
uchar n;
uchar address=0x80;
cs1302 = 0;
clk1302 = 0;
write1302(0x8e,0x00); //允许写入数据
write1302(0x90,0x00); //禁止涡流充电
for(n=0;n<7;n++)
{
write1302(address,set_time[n]);
address=address+2;
}
write1302(0x8e,0x80); //写保护,不允许读写
}
void allout(uchar x)
{
uchar i;
for(i=0;i<8;i++)
{
if((x&0x80)==0)
IO=0;
if((x&0x80)!=0)
IO=1;
clk=0;clk=1;
x<<=1;
}
}
void t2_10()
{
uint k;
a[3]=year/1000;
k=year%1000;
a[2]=k/100;
k=k%100;
a[1]=k/10;
a[0]=k%10;
}
void delay10ms()
{
uchar m,n,j;
for(j=2;j>0;j--)
for(m=10;m>0;m--)
for(n=100;n>0;n--);
}
void display()
{
t2_10();
allout(led[a[3]]);
P02=0&0x01;
P03=0&0x02;
P04=0&0x04;
P05=0&0x08;
delay10ms();
allout(led[a[2]]);
P02=1&0x01;
P03=1&0x02;
P04=1&0x04;
P05=1&0x08;
delay10ms();
allout(led[a[1]]);
P02=2&0x01;
P03=2&0x02;
P04=2&0x04;
P05=2&0x08;
delay10ms();
allout(led[a[0]]);
P02=3&0x01;
P03=3&0x02;
P04=3&0x04;
P05=3&0x08;
delay10ms();
delay10ms();
}
void main()
{
while(1)
{
init1302();
year=read1302(0x8d);
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -