打印

菜鸟求助 关于ds1302 一天也没想明白怎么回事

[复制链接]
2093|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxl0323|  楼主 | 2011-5-22 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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();
}

}

相关帖子

沙发
yuyi21ic| | 2011-5-22 11:57 | 只看该作者
LZ想表达什么意思

使用特权

评论回复
板凳
mxl0323|  楼主 | 2011-5-22 12:32 | 只看该作者
2# yuyi21ic
我不知道程序哪有问题  怎么运行不了呢 数码管上显示的都是零  而且还少一位              我找了一天也没找到问题在哪

使用特权

评论回复
地板
jmlosy| | 2011-5-22 12:39 | 只看该作者
学习

使用特权

评论回复
5
csfwan123| | 2011-5-22 13:28 | 只看该作者
要先设定初始值吧,烧两次

使用特权

评论回复
6
mxl0323|  楼主 | 2011-5-23 12:41 | 只看该作者
5# csfwan123

设定了初值   不知道设定进去没有  还是读不出来  晕了

使用特权

评论回复
7
还是坚信| | 2013-3-10 12:22 | 只看该作者
写一字节的时候for(<7?还是<8?

使用特权

评论回复
8
refee| | 2013-3-10 12:42 | 只看该作者
还是坚信 发表于 2013-3-10 12:22
写一字节的时候for(

for (i=0; i<8; i++)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

36

帖子

1

粉丝