找回密码
 立即注册

QQ登录

只需一步,快速开始

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

avr单片机读写时钟芯片DS3231程序(通过测试)

[复制链接]
跳转到指定楼层
楼主
ID:71407 发表于 2015-1-1 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wudawei 于 2015-1-1 16:45 编辑

实时时钟芯片DS3231,该款芯片是目前世界上精度最高的集成,也是业内最先推出、采用简单音叉晶体和集成电路即可提供±2分钟/年时间保持精度的芯片。

  1. //程序由AT24C系列的读写程序改写而来,不同点只在于器件地址的不同</span>
  2. #include <iom16v.h>
  3. #include <macros.h>
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. void DelayUs(uchar i);
  7. void CLK(uchar PD);//设置SCL的电平
  8. void IO(uchar PD);//设置IO的电平
  9. void SetIO(uchar i);//设置IO为输入输出
  10. //IIC读写函数供外部main函数调用
  11. void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata);
  12. unsigned char ReadDs3231_OneByte(unsigned char addr);
  13. void DelayMs(uchar i)
  14. {
  15. uint count;
  16. for(;i!=0;i--)for(count=100;count!=0;count--);
  17. }
  18. //设置SCL的电平
  19. void CLK(uchar PD)
  20. {if(PD==1) PORTD|=0x08;//SCL置1
  21. else       PORTD&=~0x08;//SCL置0
  22. }
  23. //设置IO的电平
  24. void IO(uchar PD)
  25. {if(PD==1) PORTD|=0x04;//IO置1
  26. else       PORTD&=~0x04;//IO置0
  27. }
  28. /////////////////////////////////
  29. //IIC
  30. //*******************Start条件****************//
  31. void Start(void)
  32. {
  33. CLK(0);DelayMs(2);
  34. IO(1); DelayMs(2);
  35. CLK(1);DelayMs(2);
  36. IO(0); DelayMs(2);
  37. CLK(0);DelayMs(2);
  38. }
  39. //*******************Stop条件****************//
  40. void Stop(void)
  41. {
  42. CLK(0);  DelayMs(2);
  43. IO(0);   DelayMs(2);
  44. CLK(1);  DelayMs(2);
  45. IO(1);   DelayMs(2);
  46. CLK(0);  DelayMs(2);
  47. }
  48. //********************发送数据************//
  49. void SendData(uchar Xdata)  
  50. {uchar count;
  51. for(count=0;count!=8;count++)
  52.   {
  53.   CLK(0); DelayMs(2);
  54.   if(Xdata&0x80)
  55.    IO(1);
  56.   else
  57.    IO(0);
  58.   DelayMs(2);
  59.   CLK(1); DelayMs(2);
  60.   Xdata<<=1;
  61. }
  62. //以下把SDA置1释放总线
  63. CLK(0);DelayMs(2);
  64. CLK(1);DelayMs(2);
  65. CLK(0);DelayMs(2);
  66. }
  67. /////////////接收数据///////////////////
  68. uchar  ReceiveData(void)  
  69. {
  70. uchar count;
  71. uchar temp;
  72. uchar value=0;
  73. DDRD&=~0x04;//设置为输入
  74.   for(count=0;count!=8;count++)
  75.   {
  76.   value<<=1;
  77.   CLK(1); DelayMs(2);
  78.   temp=PIND;//读引脚
  79.   if((temp&0x04)==0x04) value++;
  80.   DelayMs(2);
  81.   CLK(0); DelayMs(2);
  82. }
  83. DDRD|=0x04;//设置为输出
  84. //以下输出NOACK
  85. CLK(0);DelayMs(2);
  86. IO(1);DelayMs(2);
  87. CLK(1);DelayMs(2);
  88. CLK(0);DelayMs(2);
  89. return value;
  90. }
  91. //////////////以下供main调用/////////////////
  92. //向addr写一个数据
  93. void WriteDs3231_OneByte(unsigned char addr,unsigned char ddata)
  94. {
  95.     Start();
  96. SendData(0xd0);//器件寻址
  97. SendData(addr);//存储器寻址
  98. SendData(ddata);//写入数据
  99. Stop();
  100. DelayMs(2000);
  101. }
  102. ///////////////////////////////
  103. //从addr读一个数据
  104. unsigned char ReadDs3231_OneByte(unsigned char addr)
  105. {
  106.     uchar temp;
  107.     Start();
  108. SendData(0xd0);//器件寻址
  109. SendData(addr);//存储器寻址
  110. Start();
  111.     SendData(0xd1);   //设置读
  112. temp = ReceiveData();//读取数据
  113. Stop();
  114. DelayMs(2000);
  115. return temp;   
  116. }
复制代码


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

使用道具 举报

沙发
ID:72323 发表于 2015-1-16 14:50 | 只看该作者
好,感谢楼主分享
回复

使用道具 举报

板凳
ID:418417 发表于 2018-10-31 14:00 | 只看该作者
好,感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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