本帖最后由 mxl0323 于 2011-5-22 09:42 编辑
以下是程序 运行的结果是 都是0 不知道高手们有没有时间帮着看看 我自己 昨天想了一天也没找出问题在哪 晕了
#include <reg52.h>
#include <intrins.h>
unsigned char rec_init[7]={11,7,5,21,21,51,58}; // 时间初值
unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80}; //写地址
unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81}; //读地址
unsigned char read_date[7]; //读出数据数组
unsigned char dis[14]; //显示数组
unsigned char dis_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管段码
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code weix_code[]={0x7f,0xbf,0xef,0xf7,0xfd,0xfe}; //数码管位码
sbit sclk=P2^2; //时钟
sbit io=P2^3; //数据
sbit rst=P2^4; //使能
sbit duanx=P2^7; //段选
sbit weix=P2^6; //位选
void daley() //延时子程序
{
unsigned char i,j;
for (i=20;i>0;i--)
{
for (j=20;j>0;j--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void write_ds1302_byte(unsigned char a) // 写一个字节
{
unsigned char i;
for(i=0;i<7;i++)
{
sclk=0;
io=a&0x01;
a=a>>1;
sclk=1;
}
}
void write_ds1302(unsigned char add, unsigned char date) //完整写操作
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
_nop_();
write_ds1302_byte(add); //写地址
write_ds1302_byte(date); //写数据
rst=0;
_nop_();
sclk=1;
io=1;
}
unsigned char read_ds1302_byte(unsigned char add) //读操作
{
unsigned char j;
unsigned char value;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
_nop_();
write_ds1302_byte(add); //写入读地址
for(j=0;j<7;j++)
{
value=value>>1;
sclk=0;
if(io)
{
value=value|0x80;
}
}
rst=0;
_nop_();
sclk=1;
io=1;
return (value);
}
void set_rec() //初值设置程序
{
unsigned char i,j;
for (i=0;i<7;i++) // 转换为BCD码
{
j=rec_init/10;
rec_init=rec_init%10;
rec_init=rec_init+j*16;
}
write_ds1302(0x8e,0x00); //去除写保护
for (i=0;i<7;i++) //写入初值
{
write_ds1302(write_add,rec_init);
}
write_ds1302(0x8e,0x80);
//加上写保护
}
void read_rec() //读时间
{
unsigned char i;
for (i=0;i<7;i++) //读出数据
{
read_date=read_ds1302_byte(read_add);
}
//数值转换
dis[0]=read_date[0]%16; // 年
dis[1]=read_date[0]/16;
dis[2]=read_date[1]%16; //星期
dis[3]=read_date[1]/16;
dis[4]=read_date[2]%16; //月
dis[5]=read_date[2]/16;
dis[6]=read_date[3]%16; // 日
dis[7]=read_date[3]/16;
dis[8]=read_date[4]%16; // 小时
dis[9]=read_date[4]/16;
dis[10]=read_date[5]%16; //分钟
dis[11]=read_date[5]/16;
dis[12]=read_date[6]%16; //秒
dis[13]=read_date[6]/16;
}
void display() //时间显示子程序
{
unsigned char i,a;
for (i=0;i<5;i++)
{
a=dis[i+8];
P0=dis_code[a];
duanx=1;
duanx=0;
P0=weix_code;
weix=1;
weix=0;
daley();
}
}
void main()
{
duanx=0;
weix=0;
set_rec();
while(1)
{
read_rec();
display();
}
} |