时钟模块ds1302的使用软件_ds1302时钟程序详解

时钟模块ds1302的使用软件_ds1302时钟程序详解  刚刚学习了如何使用ds1302这个时钟芯片的使用,现在我把学习的过程分享出来,虽然整体的过程感觉不算难,但是仍然有难解之处至今未明,因为没有去实际验证,所以也不能确定到底是什么原因。  1.首先,查找ds1302手册,可以在21ic这个网站上下载。如果嫌英文版的自己翻译的很难受(这里还是建议大家硬着头皮看英文版的,毕竟是有好处的,你说呢?),可以在网上找中文版的。  2.通过手册…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

    刚刚学习了如何使用ds1302这个时钟芯片的使用, 现在我把学习的过程分享出来,虽然整体的过程感觉不算难,但是仍然有难解之处至今未明,因为没有去实际验证,所以也不能确定到底是什么原因。

    1.首先,查找ds1302手册,可以在21ic这个网站上下载。如果嫌英文版的自己翻译的很难受(这里还是建议大家硬着头皮看英文版的,毕竟是有好处的,你说呢?),可以在网上找中文版的。

    2.通过手册我们要知道这个芯片能干什么,心中有个大概。

时钟模块ds1302的使用软件_ds1302时钟程序详解

        这是ds1302的主要特点:时钟计数功能,可以对秒、分钟、小时、月、星期、年的计数。年计数可达到2100 年。有31*8 位的额外数据暂存寄存器(即RAM,掉电丢失)等等。

时钟模块ds1302的使用软件_ds1302时钟程序详解

    这是详细描述:ds1302充电计时芯片包含一个实时时钟/日历和31个字节的静态RAW。它通过简单的串行接口与微处理器通信。实时时钟/日历提供秒、分钟、小时、日、日期、月份和年份信息。月底的日期自动调整,少于31天,包括闰年的校正。时钟以24小时或12小时的格式运行,带有am/pm指示器,等等。

        看完以上这些我们大致知道了ds1302这个芯片能干什么,接下来我们就要搞清楚如何使用它。首先要知道各个引脚是干什么用的

时钟模块ds1302的使用软件_ds1302时钟程序详解

    在这里,我们主要是对5 CE、6 I/O、7 SCLK这三个引脚进行操作去驱动ds1302这个芯片。

CE:  输入。 在读取或写入期间,CE信号必须置为高电平。 这个引脚有一个内部40kΩ(典型值)的下拉电阻接地。 注意:以前的数据表修订简称CE为RST。 引脚的功能没有改变;

I/O: 输入/推挽输出。 I / O引脚是3线的双向数据引脚接口。 该引脚有一个内部40kΩ(典型值)下拉电阻接地;

SCLK: 输入。 SCLK用于同步串行接口上的数据移动。 这个引脚有一个内部40kΩ(典型值)下拉电阻接地。

        知道了各个引脚的功能后,我们看时序图,通过时序图来编写驱动程序,对于刚学单片机的同学来说可能一开始看不懂,那就多找几个时序图对应着别人写好的驱动程序好好看看,总结总结,应该就能看懂了,然后再自己试着写写,毕竟我们不是庖丁,要想达到庖丁那样的神技,两个字:多练

时钟模块ds1302的使用软件_ds1302时钟程序详解

  我们可以看到这是一个单字节读写时序图,前面八位读写的是地址,代表着不同的功能,后面八位读写的是数据。读写操作明显的不同之处是后面八位数据位的操作不同,读操作时是SCLK的下降沿锁存数据,也就是说如果我们要想从I/O口读出一位数据,就得先把SCLK引脚拉高,然后再拉低,有一个由高到低的跳变,这样才能读出数据。而写操作时是SCLK的上升沿锁存数据。道理都一样。还有一点就是,我们可以发现读写数据都是从低位到高位:D0-D7

再接着我们要知道如何对寄存器进行操作,我的理解就是一张真值表,不同的值有什么功能:

时钟模块ds1302的使用软件_ds1302时钟程序详解

下面我们来编写ds1302的驱动程序,从实践中加深理解:

/********************************************************************/ 

/*单字节写入一字节*/
void Write_Ds1302_Byte(unsigned char dat) 
{

unsigned char i;
SCLK = 0;
for (i=0;i<8;i++) 

if (dat & 0x01) // 等价于if((dat & 0x01) ==1) 
{

IO_SET; //#define IO_SET IO=1 /*IO口置高电平*/
}
else 
{

IO_CLR; //#define IO_CLR IO=0 /*IO口置低电平*/
}  
SCLK_SET;                 //同上,又因一开始SCLK置零是低电平,现在置高,就是一个上升沿
SCLK_CLR; //准备下一位的传输,完成后SCLK拉低
dat = dat >> 1; 

}

/********************************************************************/ 
/*单字节读出一字节数据*/
unsigned char Read_Ds1302_Byte(void) 
{

unsigned char i, dat=0;
for (i=0;i<8;i++)
{

dat = dat >> 1;
if (IO)   //等价于if(IO==1)     /*读取IO口电平*/
{

dat |= 0x80;
}
else 
{

dat &= 0x7F;
}
SCLK_SET;            //时钟线SCLK置高,再置低,就是一个下降沿,锁存数据
SCLK_CLR;            //                    置低,而且数据传输完成后时钟线SCLK拉低
}
return dat;
}

/********************************************************************/ 
/*单字节写入一字节数据*/
void Ds1302_Single_Byte_Write(unsigned char addr, unsigned char dat)

CE_CLR; /*初始时CE置低电平*/
SCLK_CLR; /*初始时SCLK置低电平*/

CE_SET; /*启动DS1302总线,CE置高电平 */
addr = addr & 0xFE;  
Write_Ds1302_Byte(addr); /*写入目标地址:addr,保证是写操作,写之前将最低位置低*/
Write_Ds1302_Byte(dat); /*写入数据dat*/
CE_CLR; /*停止DS1302总线*/
}

/********************************************************************/ 
/*从DS1302单字节读出一字节数据*/
unsigned char Ds1302_Single_Byte_Read(unsigned char addr) 

unsigned char temp;
CE_CLR; /*CE置低电平,初始化*/
SCLK_CLR;         /*SCLK置低电平,初始化*/

CE_SET; /*启动DS1302总线,CE拉高 */
addr = addr | 0x01;  
Write_Ds1302_Byte(addr);         /*写入目标地址:addr,保证是读操作,写之前将最低位置高*/
temp=Read_Ds1302_Byte();     /*从DS1302中读出一字节数据*/
CE_CLR;     /*停止DS1302总线*/
IO_CLR;        //不太明白为什么要将IO口拉低,少了这句不行,会出错
return temp;
}

针对上面读数据时将IO口拉低网上的解释有:

1.数据线拉低,告诉器件,释放总线(个人认为这个解释站不住脚,因为时序图上没有画最后要拉低,逻辑问题)

2.显示异常可能是读取太快,也可能是传输线过长(有人通过缩短传输线使显示恢复正常)

最后的应用比较简单,比如我们想做一个电子表,显示时、分、秒

void ds1302_init()
{

Ds1302_Single_Byte_Write(0x8e, 0x00);                        //关闭写保护
Ds1302_Single_Byte_Write(ds1302_sec_addr, 0x40);    //写秒地址0x80
Ds1302_Single_Byte_Write(ds1302_min_addr, 0x20);   //写分地址0x82
Ds1302_Single_Byte_Write(ds1302_hr_addr, 0x10);      //写时地址0x84    初始时间为10时20分40秒
Ds1302_Single_Byte_Write(0x8e, 0x80);                        //开写保护
}

void read_ds1302()
{

time[0]=Ds1302_Single_Byte_Read(0x81);                    //读秒地址0x81
time[1]=Ds1302_Single_Byte_Read(0x83);                    //读分地址0x83
time[2]=Ds1302_Single_Byte_Read(0x85);                    //读时地址0x85
}
void main()
{

ds1302_init();
while(1)
{

read_ds1302();
display();

}

}

/*****************************************/

/*显示函数,用数码管显示,不同的单片机数码管操作大同小异,比较简单,自己写吧*/

void display()

{


uchar i=0;


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


{


clock(0xc0,wei[i]);


switch(i)


{


case 0:clock(0xe0,duan[time[2]/16]);break; 


case 1:clock(0xe0,duan[time[2]&0x0f]);break; 


case 2:clock(0xe0,0xbf);break; 


case 3:clock(0xe0,duan[time[1]/16]);break; 


case 4:clock(0xe0,duan[time[1]&0x0f]);break; 


case 5:clock(0xe0,0xbf);break; 


case 6:clock(0xe0,duan[time[0]/16]);break; 


case 7:clock(0xe0,duan[time[0]&0x0f]);break; 


default:break;


}


Delay2ms();


}

}

总结:一点一点积累,一点一点进步,做想做的事,乐在其中……安静

    

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222957.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IntelliJ IDEA常用快捷键汇总

    IntelliJ IDEA常用快捷键汇总在使用IntelliJIdea的时候,使用快捷键是必不可少的。掌握一些常用的快捷键能大大提高我们的开发效率。有些快捷键可以熟练的使用,但是还有另外一些快捷键虽然很好用,但是由于因为没有形成使用习惯或者没有理解快捷键的用法,甚至之前对一些快捷键根本没有概念,导致不会去使用。对于这些快捷键,如果能够用好,编辑代码的效率必能提高一个水平。所以在此梳理出来,加强自己的使用,形成习惯。(注:有些操作的快捷键

    2022年5月15日
    53
  • vue页面刷新_vue强制重置组件

    vue页面刷新_vue强制重置组件vue页面刷新首先我们都知道vue属于单页面应用,默认境况下是不会触发刷新页面操作的,所以这个时候就需要我们通过事件来触发reload()来达到刷新操作接下来我就为大家介绍三种刷新页面的方法1.wiindow.location.reload([bForceGet])该方法强迫浏览器刷新当前页面bForceGet可选参数,默认为false,从客户端缓存里取当前true,则以get方式,从服务器端获取最新的页面,相当于页面f5刷新wiindow.location.replace(URL)

    2022年10月16日
    0
  • 2021vue经典面试题_vue面试题大全

    2021vue经典面试题_vue面试题大全面试题(2020)Vue面试题汇总博客说明文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!1、对于MVVM的理解MVVM是Model-View-ViewModel的缩写。Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。View代表UI组件,它负责将数据模型转化成UI展现出来。ViewModel监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View和Model的对

    2022年10月9日
    0
  • WINDOWS Platform SDK 下载[通俗易懂]

    WINDOWS Platform SDK 下载[通俗易懂]最近由于需要使用IPV6方面的开发资料,下载了WINDWOS网络编程相关的代码,发现在VC6.0上无法编译,猜想可能是SDK的版本较低,于是网上找来个:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm 下载后,安装既可以实现IPV6在VC6.0平台编译调试。

    2022年5月4日
    72
  • Redis分布式锁的三种实现方式_分布式锁解决方案

    Redis分布式锁的三种实现方式_分布式锁解决方案总结写在前面:RLockrLock=redissonClient.getLock(“lbhTestLock”);使用tryLock无参方法时,redisson会自动添加一个定时任务,定时刷新锁的失效时间,如果unlock时失败,则会出现该锁一直不释放的情况。而当tryLock传释放时间时,则不会添加这个定时任务。测试如下:1、tryLock无参数@Testp…

    2022年10月15日
    0
  • AC自动机总结「建议收藏」

    AC自动机总结0.引言:   由于大连现场赛的一道AC自动机+DP的题目(zoj3545RescuetheRabbit)被小媛同学推荐看AC自动机。经过一段时间的努力,终于把shǎ崽神牛的AC自动机专辑题目AK(其实还差那个高中题。。囧。。不让做)。   特别感谢:shǎ崽神牛,并附以链接:   http://www.notonlys

    2022年4月6日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号