5# joyme
我之前改过,没改过来,上传的时候没注意到,就是加上i了,也是那样的
124563328 发表于 2011-5-26 21:38
我再传一遍
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit io=P3^4;
sbit rst=P3^5;
sbit sck=P3^6;
uchar time_data[7]={11,1,4,25,11,39,30}; //年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //写地址
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //读地址
uchar disp[8]; //用来存放时分秒
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40
};
uchar code smg_we[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void delay(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_ds1302_byte(uchar date) //单字节的写操作
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
io=date&0x01; //表明数字是从第一位开始传送的
date=date>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar date) //写多字节
{
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
write_ds1302_byte(date);
rst=0;_nop_();
io=1;sck=1;
}
uchar read_ds1302(uchar add)
{
uchar i,value;
rst=0;_nop_();
sck=0;_nop_();
rst=1;_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
value=value|0x08;
sck=1;
}
rst=0;_nop_();
sck=0;_nop_();
rst=1;io=1;
return value;
}
void set_rtc() //设置初始时间
{
uchar i,j;
for(i=0;i<7;i++) //转化为BCD码
{
j=time_data/10; //存储十位
time_data=time_data%10; //存储个位
time_data=j*16+time_data; //整合成十六进制数
}
write_ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++) //向ds1302中写保护数据
{
write_ds1302(write_add,time_data);
}
write_ds1302(0x8e,0x80); //加写保护
}
void read_rtc() //读初始时间
{
uchar i;
for(i=0;i<7;i++)
{
time_data=read_ds1302(read_add);
}
}
void time_pros()
{
disp[0]=time_data[4]%16; //时个位
disp[1]=time_data[4]/16; //时十位
disp[2]=10;
disp[3]=time_data[5]%16; //分个位
disp[4]=time_data[5]/16; //分十位
disp[5]=10;
disp[6]=time_data[6]%16; //秒个位
disp[7]=time_data[6]/16; //秒十位
}
void display()
{
uchar i;
for(i=0;i<8;i++)
{
P2=smg_we;
P0=smg_du[disp];
delay(1);
}
}
void main()
{
set_rtc();
while(1)
{
read_rtc();
time_pros();
display();
}
} |