找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds3231单片机程序 时间和温度发送到串口显示

[复制链接]
跳转到指定楼层
楼主
  1. #include<global.h>

  2. void DS3231WriteByte(unsigned char addr,unsigned char dat)
  3. {
  4.         bit ack;
  5.         IICStart();
  6.         ack = IICWrite(0xD0);//写设备地址+写操作
  7.         while(~ack);
  8.         ack = IICWrite(addr);//内部寄存器指针
  9.         while(~ack);
  10.         ack = IICWrite(dat);//写数据
  11.         while(~ack);
  12.         IICStop();
  13. }
  14. void DS3231ReadByte(unsigned char addr,unsigned char *buf)
  15. {
  16.         bit ack;
  17.         IICStart();
  18.         ack = IICWrite(0xD0);//写设备地址+写操作
  19.         while(~ack);
  20.         ack = IICWrite(addr);//内部寄存器指针
  21.         while(~ack);
  22.         IICStop();
  23.         
  24.         IICStart();
  25.         ack = IICWrite(0xD1);//写设备地址+读操作
  26.         while(~ack);
  27.         *buf = IICReadNAK();//读一个字节数据
  28.         IICStop();
  29. }
  30. void DS3231Read7Byte(unsigned char *buf)
  31. {
  32.         bit ack;
  33.         unsigned char i;
  34.         IICStart();
  35.         ack = IICWrite(0xD0);//写设备地址+写操作
  36.         while(~ack);
  37.         ack = IICWrite(0x00);//秒寄存器地址
  38.         while(~ack);
  39.         IICStop();
  40.         
  41.         IICStart();
  42.         ack = IICWrite(0xD1);//写设备地址+读操作
  43.         while(~ack);
  44.         for(i=0;i<6;i++)
  45.         {                                                //上面写了秒寄存器地址,内部寄存器指针会自动+1
  46.                 *buf++= IICReadACK();//所以只需要发送一个开始地址
  47.         }                                                //读数据,发送还需要读数据的应答位
  48.         *buf= IICReadNAK();//读数据,不需要再读取数据应答位
  49.         IICStop();
  50.         
  51. }
  52. void DS3231Write7Byte(unsigned char *dat)
  53. {
  54.         bit ack;
  55.         unsigned char i;
  56.         IICStart();
  57.         ack = IICWrite(0xD0);//写设备地址+写操作
  58.         while(~ack);
  59.         ack = IICWrite(0x00);//秒寄存器地址
  60.         while(~ack);
  61.         for(i=0;i<7;i++)
  62.         {
  63.                 ack = IICWrite(dat[i]);//连续写入数据7次,和上面同理
  64.                 while(~ack);
  65.         }
  66.         IICStop();        
  67. }
  68. void GetRealTime(struct sTime *time)
  69. {
  70.         unsigned char buf[8];
  71.         
  72.         DS3231Read7Byte(buf);
  73.         time->year = buf[6];
  74.         time->mon =        buf[5];
  75.         time->day =        buf[4];
  76.         time->hour = buf[2];
  77.         time->min = buf[1];
  78.         time->sec = buf[0];
  79.         time->week = buf[3];
  80. }
复制代码
  1. #include<global.h>
  2. sbit SDA = P2^1;
  3. sbit SCL = P2^0;
  4. void Delay5us()                //@11.0592MHz
  5. {
  6.         unsigned char i;

  7.         _nop_();
  8.         i = 11;
  9.         while (--i);
  10. }
  11. void IICStart()
  12. {
  13.         SDA = 1;        //确保sda为高电平为开始信号做准备        
  14.         SCL = 1;        //scl一直保持高电平等待读取sda由高向低切换        
  15.         Delay5us();        //协议规定:sda高电平状态时间大于4.7us
  16.         SDA = 0;        //协议规定:在scl为高时sda由高向低切换,为iic开始信号
  17.         Delay5us();        //协议规定:sda低电平状态时间大于4us
  18.         SCL = 0;        //拉低scl为后面sda数据做准备
  19. }
  20. void IICStop()
  21. {
  22.         SDA = 0;        //确保sda为低电平为结束信号做准备
  23.         SCL = 1;        //scl一直保持高电平等待读取sda由低向高切换        
  24.         Delay5us(); //协议规定:sda低电平时间大于4us
  25.         SDA = 1;        //协议规定:在scl为高时sda由低向高切换,为iic结束信号
  26.         Delay5us(); //协议规定:sda高电平状态时间大于4.7us
  27. }
  28. bit IICWrite(unsigned char dat)
  29. {
  30.         bit ack;        //暂时存应答值
  31.         unsigned char mask;        //用于探测字节内一位的值
  32.         for(mask = 0x80; mask!=0; mask>>=1)        //从高位到低位依次进行
  33.         {
  34.                 if ((dat & mask) == 0)        //将该位值输出到引脚
  35.                         SDA = 0;
  36.                 else
  37.                         SDA = 1;
  38.                 Delay5us();        //稳定数据
  39.                 SCL = 1;        //拉高时钟
  40.                 Delay5us();        //维持时钟时间大于4us
  41.                 SCL = 0;        
  42.         }
  43.         
  44.         SDA = 1; //释放总线准备接收数据
  45.         Delay5us();
  46.         SCL = 1;//开始读取应答位
  47.         ack = SDA;
  48.         Delay5us();
  49.         SCL = 0;
  50.         
  51.         return ~ack;
  52. }
  53. unsigned char IICReadNAK()
  54. {
  55.         unsigned char dat;
  56.         unsigned char mask;
  57.         SDA = 1;//释放总线准备接收数据
  58.         for(mask = 0x80; mask != 0; mask >>= 1)
  59.         {
  60.                 SCL = 1;
  61.                 if(SDA == 1)
  62.                         dat |= mask;
  63.                 else
  64.                         dat &= ~mask;
  65.                 Delay5us();
  66.                 SCL = 0;        
  67.         }
  68.         
  69.         SDA = 1;
  70.         Delay5us();
  71.         SCL = 1;
  72.         Delay5us();
  73.         SCL = 0;
  74.         
  75.         return dat;
  76. }
  77. unsigned char IICReadACK()
  78. {
  79.         unsigned char dat;
  80.         unsigned char mask;
  81.         SDA = 1;//释放总线准备接收数据
  82.         for(mask = 0x80; mask != 0; mask >>= 1)
  83.         {
  84.                 SCL = 1;
  85.                 if(SDA == 1)
  86.                         dat |= mask;
  87.                 else
  88.                         dat &= ~mask;
  89.                 Delay5us();
  90.                 SCL = 0;        
  91.         }
  92.         
  93.         SDA = 0;
  94.         Delay5us();
  95.         SCL = 1;
  96.         Delay5us();
  97.         SCL = 0;
  98.         
  99.         return dat;        
  100. }
复制代码

全部资料51hei下载地址:
ds3231.rar (58.74 KB, 下载次数: 79)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:117402 发表于 2020-5-6 21:52 | 只看该作者
谢谢楼主分享!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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