51单片机ds1302万年历代码
时间: 2023-07-02 14:14:05 浏览: 107
以下是51单片机DS1302万年历代码,供参考:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCLK=P1^0;
sbit RST=P1^1;
sbit IO=P1^2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};//共阴数码管显示0~F的值
uchar time[7]; //用来存储日期时间数据
void delay(uchar i)
{
while(i--);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
IO=dat&0x01;
dat>>=1;
SCLK=1;
}
}
uchar read_byte()
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
SCLK=0;
dat>>=1;
if(IO)
{
dat|=0x80;
}
SCLK=1;
}
return dat;
}
void ds1302_single_write(uchar reg,uchar dat)
{
RST=0;
SCLK=0;
RST=1;
write_byte(reg);
write_byte(dat);
RST=0;
}
uchar ds1302_single_read(uchar reg)
{
uchar dat;
RST=0;
SCLK=0;
RST=1;
write_byte(reg|0x01);
dat=read_byte();
RST=0;
return dat;
}
void ds1302_init()
{
ds1302_single_write(0x8e,0x00);//禁止写保护
ds1302_single_write(0x80,0x00);//秒清零
ds1302_single_write(0x82,0x00);//分清零
ds1302_single_write(0x84,0x00);//时清零
ds1302_single_write(0x86,0x01);//日期设为1号
ds1302_single_write(0x88,0x01);//星期设为星期一
ds1302_single_write(0x8c,0x00);//年月日写保护打开
}
void ds1302_read_time()
{
uchar i;
for(i=0;i<7;i++)
{
time[i]=ds1302_single_read(0x81+i);
}
}
void display_time()
{
uchar i;
P2=0xff;//关闭所有数码管
for(i=0;i<6;i++)
{
if(i==0||i==2)
{
P2=table[time[i]/16];//显示十位数
P2=(P2<<1)|0x01;//点亮小数点
delay(5);
P2=table[time[i]%16];//显示个位数
P2=(P2<<1)|0x01;//点亮小数点
}
else if(i==4)
{
P2=table[time[i]/16];//显示十位数
P2=(P2<<1)|0x01;//点亮小数点
delay(5);
P2=table[time[i]%16];//显示个位数
P2=(P2<<1)|0x01;//点亮小数点
}
else
{
P2=table[time[i]/16];//显示十位数
delay(5);
P2=table[time[i]%16];//显示个位数
}
if(i==1||i==3)
{
P2=(P2<<1)|0x01;//点亮小数点
}
delay(5);
P2=0xff;//关闭所有数码管
}
}
void main()
{
ds1302_init();//DS1302初始化
while(1)
{
ds1302_read_time();//读取时间
display_time();//显示时间
}
}
```
阅读全文