微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机的新手DS1302程序有几个问题不懂,哪位大神指点一下

单片机的新手DS1302程序有几个问题不懂,哪位大神指点一下

时间:10-02 整理:3721RD 点击:
#include"ds1302.h"
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; //问题1
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//
void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
_nop_();
SCLK = 0;
_nop_();
RST = 1;
_nop_();
for (n=0; n<8; n++)
{
  DSIO = addr & 0x01;
  addr >>= 1;
  SCLK = 1;
  _nop_();
  SCLK = 0;
  _nop_();
}
for (n=0; n<8; n++)
{
  DSIO = dat & 0x01;
  dat >>= 1;
  SCLK = 1;
  _nop_();
  SCLK = 0;
  _nop_();
}
   
RST = 0;
_nop_();
}
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;
_nop_();
RST = 1;
_nop_();
for(n=0; n<8; n++)
{
  DSIO = addr & 0x01;
  addr >>= 1;
  SCLK = 1;
  _nop_();
  SCLK = 0;
  _nop_();
}
_nop_();
for(n=0; n<8; n++)
{
  dat1 = DSIO;
  dat = (dat>>1) | (dat1<<7);       //问题2
  SCLK = 1;
  _nop_();
  SCLK = 0;
  _nop_();
}
RST = 0;
_nop_();
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00);   
for (n=0; n<7; n++)
{
  Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);    //问题3
}
Ds1302Write(0x8E,0x80);   
}
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)
{
  TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);       //问题4
}
}

问题一:时钟芯片的寄存器位置,存放时间,如0x81放的的秒数,0x是十六进制的意思
问题二:DS1302写一数据时,CLK要产生一负脉冲,每次移位一位,将前一个下降沿读出的数据右移一位从而读出该次读出的数放入dat,或左移7位
问题三:DS1302的初始化程序,初始化写程序
问题四:DS1302的初始化程序,初始化计时程序


第二张图上面有清楚解释读写地址的问题,希望能帮到你。C:\Users\Arilick\Desktop\实验室板子\1302时钟寄存器.png

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top