不知道哪里出问题了。。调了好久。。调不出来。。帮下。。谢谢
#include<reg52.h>
#include "intrins.h"
#define uchar unsigned char
#define uint undigned int
uchar time_data[7]={10,6,4,17,8,25,30};
uchar write_addr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_addr[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
// 0 1 2 3 4 5 6 7 8 9
uchar code D_smg[11]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,0xbf};
uchar code W_smg[8]={0x00,0x04,0x08,0x0c,0x10,0x14};
uchar disp[8];
uchar time_read[7];
sbit sck=P3^6;
sbit io=P3^4;
sbit rst=P3^5;
/***************************************************/
/**************向DS1302写一个字节*******************/
/***************************************************/
void write_Ds1302_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0; //低电平时将数据送到总线
io=dat&0x01;
dat=dat>>1;
sck=1; //拉高带来一个上升沿,将数据送入DS1302
}
}
/***************************************************/
/***********向DS1302的某一地址定一数据**************/
/***************************************************/
void write_Ds1302(uchar addr,uchar dat)
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_Ds1302_byte(addr);
write_Ds1302_byte(dat);
rst=0;
_nop_();
io=1;
sck=1;
}
/***************************************************/
/**************从DS1302读一个字节*******************/
/***************************************************/
uchar read_Ds1302_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
value=value>>1;
sck=0;
if(io)
value=value|0x80;
sck=1;
/*sck=0;
value=(value<<1)|io;
sck=1;*/
}
return value;
}
/***************************************************/
/**********从DS1302的某一地址读数据*****************/
/***************************************************/
uchar read_Ds1302(uchar addr)
{
uchar value;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_Ds1302_byte(addr);
value=read_Ds1302_byte();
rst=0;
_nop_();
io=1;
sck=1;
return value;
}
/***************************************************/
/****************设置初始时间函数*******************/
/***************************************************/
void set_rtc()
{
uchar i,j;
for(i=0;i<7;i++) //转换为BCD码
{
j=time_data[i]/10; //得出低位。
time_data[i]=time_data[i]%10; //得出高位
time_data[i]=time_data[i]+j*16; //转换为BCD码
}
write_Ds1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write_Ds1302(write_addr[i],time_data[i]);
}
write_Ds1302(0x8e,0x80); //写保护
}
/***************************************************/
/**************读Ds1302中的时间函数*****************/
/***************************************************/
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_read[i]=read_Ds1302(read_addr[i]);
}
}
/***************************************************/
/**************读出的时间处理函数*******************/
/***************************************************/
void time_pros()
{
disp[7]=time_read[6]%16;
disp[6]=time_read[6]/16;
disp[5]=11;
disp[4]=time_read[5]%16;
disp[3]=time_read[5]/16;
disp[2]=11;
disp[1]=time_read[4]%16;
disp[0]=time_read[4]/16;
}
/***************************************************/
/******************数码管显示程序*******************/
/***************************************************/
void display()
{
uchar i;
for(i=0;i<8;i++)
{
P2=W_smg[i];
P0=D_smg[disp[i]];
_nop_();
}
}
void main()
{
set_rtc();
while(1)
{
read_rtc();
time_pros();
display();
}
} |