//-------STC12C5A60S2--外置晶振11.0592M-2023/1/16/CSDN短枪王博客

//ModifyTime();修改日期函数,上电初始化时写一次即可,电池会保持写入的参数

//get_show_time(void);获取时间函数,主程序里直接调用即可

// get_show_date(void)  ;获取日期函数,主程序里直接调用即可

//get_show_Temperature(void);温度转换函数,主程序里直接调用即可

uint  xdata NIAN1,YUE1,DAY1,SHI1,FEN1,MIAO1,WEN1,WEN2;//时间+温度变量定义

sbit SDA=P0^1;     //I2C数据传送位SDA,配置DS3231接口,         
sbit SCL=P0^0;     //I2C时钟控制位SCL

bit  ack;          //应答标志位   
#define DS3231_WriteAddress 0xD0    //器件写地址
#define DS3231_ReadAddress  0xD1    //器件读地址
#define DS3231_SECOND       0x00    //秒
#define DS3231_MINUTE       0x01    //分
#define DS3231_HOUR         0x02    //时
#define DS3231_WEEK         0x03    //星期
#define DS3231_DAY          0x04    //日
#define DS3231_MONTH        0x05    //月
#define DS3231_YEAR         0x06    //年
#define OSF                 7       //振荡器停止标志
#define DS3231_XTAL         0x10    //晶体老化寄存器
#define DS3231_TEMPERATUREH 0x11    //温度寄存器高字节(8位)
#define DS3231_TEMPERATUREL 0x12    //温度寄存器低字节(高2位)     
uchar code dis_code[11]={0xc0,0xf9,0xa4,0xb0,   // 0,1,2,3             
0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};       // 4,5,6,7,8,9,off
uchar data dis_buf[8];
uchar data dis_index;
uchar data dis_digit;   
//================================================
uchar BCD2HEX(uchar val)    //BCD转换为Byte
{      uchar temp;     
temp=val&0x0f;     
val>>=4;     
val&=0x0f;     
val*=10;     
temp+=val;       
return temp;
}   
uchar HEX2BCD(uchar val)    //B码转换为BCD码
{      uchar i,j,k;     
i=val/10;     
j=val%10;     
k=j+(i<<4);     
return k; }   
void delayus(uint us)
{      while (us--);
}   
void Start_I2C()
{      SDA=1;                  //发送起始条件的数据信号     
delayus(1);     
SCL=1;     
delayus(5);             //起始条件建立时间大于4.7us,延时
SDA=0;                  //发送起始信号     
delayus(5);             // 起始条件锁定时间大于4μs       
SCL=0;                  //钳住I2C总线,准备发送或接收数据     
delayus(2);
}
void Stop_I2C()
{      SDA=0;                  //发送结束条件的数据信号     
delayus(1);             //发送结束条件的时钟信号     
SCL=1;                  //结束条件建立时间大于4us     
delayus(5);       
SDA=1;                  //发送I2C总线结束信号     
delayus(4);
}   
void SendByte(uchar c)
{      uchar BitCnt;       
   for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位     
    {          if((c<<BitCnt)&0x80)             
        SDA=1;                          //判断发送位         
     else               SDA=0;                         
delayus(1);           
SCL=1;                            //置时钟线为高,通知被控器开始接收数据位           
delayus(5);                       //保证时钟高电平周期大于4μs             
SCL=0;     }       
delayus(2);     
SDA=1;                                  //8位发送完后释放数据线,准备接收应答位     
delayus(2);       
SCL=1;     
delayus(3);     
if(SDA==1)         
ack=0;
else          ack=1;                              //判断是否接收到应答信号     
SCL=0;     
delayus(2);
}
//------------------------------------------------------------------------------------------------------------
uchar RcvByte()
{     uchar retc;   
uchar BitCnt;     
retc=0;     
SDA=1;                           //置数据线为输入方式   
   for(BitCnt=0;BitCnt<8;BitCnt++)   
  {         
   delayus(1);           
   SCL=0;                      //置时钟线为低,准备接收数据位           
    delayus(5);                 //时钟低电平周期大于4.7μs           
    SCL=1;                      //置时钟线为高使数据线上数据有效         
    delayus(3);         
    retc=retc<<1;         
    if(SDA==1)  retc=retc+1;            //读数据位,接收的数据位放入retc中         
    delayus(2);   
   }     
SCL=0;   
delayus(2);   
return(retc);
}   
//------------------------------------------
void Ack_I2C(bit a)
{       if(a==0)          SDA=0;              //在此发出应答或非应答信号     
else          SDA=1;     
delayus(3);         
SCL=1;       
delayus(5);             //时钟低电平周期大于4μs
SCL=0;                  //清时钟线,钳住I2C总线以便继续接收     
delayus(2);   
}   
//=========================================================================================

uchar write_byte(uchar addr, uchar write_data)
{      Start_I2C();     
     SendByte(DS3231_WriteAddress);   
    if (ack == 0)         
      return 0;       
      SendByte(addr);       
    if (ack == 0)         return 0;     
     SendByte(write_data);     
    if (ack == 0)         return 0;       
      Stop_I2C();     
      delayus(10);           
    return 1;
}   
//------------------------------------------
uchar read_current()
{     
    uchar read_data;     
   Start_I2C();     
   SendByte(DS3231_ReadAddress);   
   if(ack==0)         return(0);       
   read_data = RcvByte();     
   Ack_I2C(1);     
   Stop_I2C();     
   return read_data;
}   
//-----------------------------------------
uchar read_random(uchar random_addr)
{
  Start_I2C();     
  SendByte(DS3231_WriteAddress);     
  if(ack==0)         return(0);       
  SendByte(random_addr);     
  if(ack==0)         return(0);       
  return(read_current());
}   
//-----------------------------------------
void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
{      uchar temp=0;       
temp=HEX2BCD(yea);     
write_byte(DS3231_YEAR,temp);   //修改年       
temp=HEX2BCD(mon);     
write_byte(DS3231_MONTH,temp);  //修改月       
temp=HEX2BCD(da);     
write_byte(DS3231_DAY,temp);    //修改日       
temp=HEX2BCD(hou);     
write_byte(DS3231_HOUR,temp);   //修改时       
temp=HEX2BCD(min);     
write_byte(DS3231_MINUTE,temp); //修改分       
temp=HEX2BCD(sec);     
write_byte(DS3231_SECOND,temp); //修改秒
}   
//---
//----------------------------------------------------------------------------
void get_show_time(void)
{     
   uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;       
  Htemp1=read_random(DS3231_HOUR);       
  Htemp1&=0x3f;                       
  Htemp2=BCD2HEX(Htemp1);     
   SHI1=Htemp2;
  
  Mtemp1=read_random(DS3231_MINUTE);  
  Mtemp2=BCD2HEX(Mtemp1);     
   FEN1=Mtemp2;
   
  Stemp1=read_random(DS3231_SECOND);       
  Stemp2=BCD2HEX(Stemp1);     
   MIAO1=Stemp2;
   
}   
//-----------------------------------------------------------------------------
void get_show_date(void)  
{     
  uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;       
  Ytemp1=read_random(DS3231_YEAR);           
  Ytemp2=BCD2HEX(Ytemp1);
  NIAN1=Ytemp2;
  Mtemp1=read_random(DS3231_MONTH);          
  Mtemp2=BCD2HEX(Mtemp1);       
  YUE1=Mtemp2;
  Dtemp1=read_random(DS3231_DAY);          
  Dtemp2=BCD2HEX(Dtemp1);       
  DAY1=    Dtemp2;
}   
//-------------------------------------------------------------------------------
void get_show_Temperature(void)
{     
   uchar Ttemp1,Ttemp2,Ttemp3,Ttemp4;       
   Ttemp1=read_random(DS3231_TEMPERATUREH);        
   Ttemp2=BCD2HEX(Ttemp1);       
    WEN1=Ttemp2;     
   Ttemp3=read_random(DS3231_TEMPERATUREL);   
   Ttemp4=BCD2HEX(Ttemp3);       
       WEN2 =Ttemp4;
}

DS3231_STC15W型51单片机读写日期+温度,模拟IIC相关推荐

  1. 24c512 c语言程序,24C32~24C512的51单片机读写程序

    24C32~24C512的51单片机读写程序 来源:-- 作者:-- 浏览:3875 时间:2016-08-10 14:18 标签: 摘要: AT89S52 晶振频率为11.0592MHz 指令周期: ...

  2. 51单片机NTC热敏电阻温度采集及控制ADC0832 LCD1602

    实践制作DIY- GC0051-NTC热敏电阻温度采集及控制 一.功能说明: 基于51单片机设计-NTC热敏电阻温度采集及控制 功能介绍: STC89C52单片机(STC89C51/52 AT89C5 ...

  3. 51单片机计算器_基于51单片机的倒计时温度检测报警器

    基于51单片机的倒计时温度检测报警器 学习单片机断断续续半年了,在学长学姐的教学帮助下,完成了51单片机的入门学习,开始实践做项目,在一周时间内设计和制作出个人项目.起初,我设计和选择的是12864显 ...

  4. 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟

    今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...

  5. 51单片机数码管交通灯倒计时c语言,51单片机数码管倒计时模拟交通灯汇编程序...

    /********************************************************************** 51单片机数码管倒计时模拟交通灯汇编程序 LED数码管为 ...

  6. 51单片机自学--交通红绿灯模拟

    51单片机自学--交通红绿灯模拟(黄灯闪烁与不闪两种模式) ABC东西红黄绿DEF南北红黄绿S时间K选择模式 或许看这文章的是初学者,有些话还是要说的,就是要使用本代码,需要把对应的端口进行更改为你连 ...

  7. 基于51单片机的倒计时温度检测报警器

    广西河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院:OpenWRT无线路由组 写作时间:2020年8月12日16:00:03   基于51单片机的倒计时温度检 ...

  8. 基于51单片机的多路温度检测调节串口传输系统

    本设计基于51单片机的多路温度检测调节串口传输系统(仿真+源码+视频讲解) 仿真:proteus8.9 程序编译器:keil 4 编程语言:C语言 编号C0009 [腾讯文档]C0009 网盘链接 资 ...

  9. 【001】基于51单片机的DS18B20温度检测与报警装置的proteus仿真设计

    一.设计资料内容(私信获取) 1. 包含proteus仿真一份: 2. keil源代码一份: 3. 包含基于51单片机的DS18B20温度监测与报警的proteus仿真设计课程报告一份: 4. 包含基 ...

最新文章

  1. 操作系统学习1:操作系统概述
  2. 一次字节面试,被二叉树的层序遍历捏爆了
  3. php ci url,URL路由设置-CI(codeigniter)PHP框架再探
  4. 大数据算法与分析技术国家工程实验室将建设
  5. MapInfo开发心得——控件篇
  6. .net 4 环境调用 .net 2 编译的DLL
  7. 4WD机器人运动控制MDK工程(实现ROS与STM32F407通信)
  8. Spark 调优 ——cache(persist)与 checkpoint
  9. 分布式为什么使用python
  10. 打造自己的VC++ 6.0免安装简版
  11. PHP error_log 新认知
  12. Linux安装GIMP
  13. 5G WIFI DFS介绍
  14. C语言作业解决,c语言作业9
  15. 用计算机信息术语感恩老师,感恩老师的祝福语(精选50句)
  16. 面对人生这道程序,该如何编码?
  17. OCP 11G 053题库解析汇总链接(1-200)
  18. 数据结构与算法-普利姆算法(Prim) | 尚硅谷韩顺平
  19. 自己为什么活着,活着的意义是什么?
  20. 什么是大数据分析?大数据分析要学什么?

热门文章

  1. 为什么有时我会用妻子的电话
  2. 基于SpringBoot 的CMS系统,拿去开发企业官网真香(附源码)
  3. 按照高等代数的传统解法编写c++程序实现N(N256)元的线性方程组的求解
  4. 采购协议内容有哪些?
  5. vanilla js_本周我们的雷达上:黑色星期五赠品和Vanilla JS
  6. 链表、结构体和数组对比
  7. 【递归】子串反向——递归
  8. ACM题目————数独
  9. Python file read方法:读取文件
  10. 当“手绘”遇上“码绘”——静态绘作分析