找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 939|回复: 3
打印 上一主题 下一主题
收起左侧

这是DS1302时钟的程序,烧入后也会变化,但开始显示都是零,搞了好久也没弄成,求大神

[复制链接]
跳转到指定楼层
楼主
ID:752619 发表于 2020-5-18 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主程序:
# include "reg52.h"

# include "DS13.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 DisplayData[8];
u8 code smgduan [10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay (u16 i)
{
while (i--);
}
void datapros ()
{ DS1302ReadTime();
DisplayData[0]=smgduan[TIME[2]/16];   //? ??λ  16???????****1111???????λ?????
DisplayData[1]=smgduan[TIME[2]&0x0f];  //??λ
DisplayData[2]=0x40;            //????
DisplayData[3]=smgduan[TIME[1]/16];  //??   ??λ
    DisplayData[4]=smgduan[TIME[1]&0x0f]; //??λ
DisplayData[5]=0x40;
DisplayData[6]=smgduan[TIME[0]/16];  //??   //??λ
    DisplayData[7]=smgduan[TIME[0]&0x0f];  //??λ
}
void DigDisplay ()
{
u8 i;
for (i=0;i<8;i++)
{
  switch(i)
  {
   case (0):      //???i????0???????????
    LSA=0;LSB=0;LSC=0;break; //break????????case (0)?????switch
   case (1):
    LSA=1;LSB=0;LSC=0;break;
   case (2):
    LSA=0;LSB=1;LSC=0;break;
   case (3):
    LSA=1;LSB=1;LSC=0;break;
   case (4):
    LSA=0;LSB=0;LSC=1;break;
   case (5):
    LSA=1;LSB=0;LSC=1;break;
   case (6):
    LSA=0;LSB=1;LSC=1;break;
   case (7):
    LSA=1;LSB=1;LSC=1;break;
  }
  P0=DisplayData[ i];
  delay (100);
  P0=0x00; //??????????????
}
}
void main ()
{
DS1302Tnit ();
while (1)
{
  datapros ();
  DigDisplay ();
}
}


DS13.c:
# include "DS13.h"   
uchar code READ_RTC_ADDR [7]={0X81,0x83,0x85,0x87,0x89,0x8b,0x8d};   //?????
uchar code WRITE_RTC_ADDR [7]={0X80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //д???
uchar TIME[7]={0,0,0x05,0x14,0x05,0x04,0x20};    //??????????   ?洢????BCD?????滹?????
void DS1302Write (uchar addr,uchar dat)   //??????????????????????????    //??λ????????
{
uchar n;
RST=0;
_nop_();
SCLK=0;//???SCLK?????
_nop_();
RST=1;//???RST(CE)?????
_nop_();
for (n=0;n<8;n++)  //???????8λ???????
{
  DSIO=addr&0x01;   //??????λ???????
  addr>>=1;
  SCLK=1;     //???????????????DS1302?????
  _nop_();
  SCLK=0;       //??????8??
  _nop_();
}
for (n=0;n<8;n++)  //д??8λ????
{
  DSIO=addr&0x01;   //??????λ???????
  dat>>=1;
  SCLK=1;     //???????????????DS1302???????
  _nop_();
  SCLK=0;
  _nop_();
}
RST=0;//???????????
_nop_();
}
uchar DS1302Read (uchar addr)  //??λ???????  //uchar ?????з????
{
uchar n,dat,dat1;
RST=0;
_nop_();
SCLK=0;//???SCLK?????
_nop_();
RST=1;//???RST(CE)?????
_nop_();
for (n=0;n<8;n++)  //???????8λ???????
{
  DSIO=addr&0x01;   //??????λ???????
  addr>>=1;
  SCLK=1;     //???????????????DS1302???????
  _nop_();
  SCLK=0;   
  _nop_();
}
  _nop_();
for (n=0;n<8;n++)  //д??8λ????
{
  dat1=DSIO;       //??????λ???????  
  dat=(dat>>1)|(dat1<<7);
  SCLK=1;     //???????????????DS1302???????
  _nop_();
  SCLK=0;    //DS1302????????????????
  _nop_();
}
RST=0;
_nop_(); //?????DS1302??λ????????????? ?????????
SCLK=1;
_nop_();
DSIO=0;
_nop_();
DSIO=1;
_nop_();
return dat;
}
void DS1302Tnit ()  //?????
{
uchar n;
DS1302Write(0x8e,0x00);  //???д????????????д????????
for (n=0;n<7;n++)  //д?????????????????????????????
{
  DS1302Write (WRITE_RTC_ADDR[n],TIME[n]);  //???  ????
}
DS1302Write (0x8e,0x80); //??д????????
}
void DS1302ReadTime ()
{
uchar n;
for (n=0;n<7;n++) //???7??????????????????????????
{
  TIME[n]=DS1302Read(READ_RTC_ADDR[n]);
}
}



DS13.h
# ifndef _DS13_H_   
# define _DS13_H_
# include <reg52.h>
# include <intrins.h>

# ifndef uchar   
# define uchar unsigned char
# endif
# ifndef uint     //????ж???uint
# define uint unsigned int      //???????uint?unsigned int????
# endif
sbit DSIO=P3^4;    //IO
sbit RST=P3^5;    //CE
sbit SCLK=P3^6;    //SCLK
void DS1302Write (uchar addr,uchar dat);
uchar DS1302Read (uchar dat);
void DS1302Tnit ();
void DS1302ReadTime ();
extern uchar TIME[7];//??????????
# endif

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:752619 发表于 2020-5-18 22:06 | 只看该作者
这个很多的,大家有空再来帮我看,感谢!
回复

使用道具 举报

板凳
ID:282850 发表于 2020-5-19 09:59 | 只看该作者
DS1302一是要设置时间调校,二是要加备用电池。程序太长没看。
回复

使用道具 举报

地板
ID:584814 发表于 2020-5-19 10:55 | 只看该作者
能正常工作但上电初疑似问题,可能始化后硬件有不在状态的,在主程序中DS1302Tnit ();前后加延时试试。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表