51单片机驱动高精度时钟DS3231源代码

发布者:心想的45号最新更新时间:2015-02-11 来源: 51hei关键字:51单片机  高精度时钟  DS3231 手机看文章 扫描二维码
随时随地手机看文章

本程序一共有2个文件,成功的用stc89c51单片机驱动,完整的代码从 http://www.51hei.com/f/ds3231code.rar 处下载
下面是源码预览(第一个文件):
 ///////////////////////////////////////////////////////////////////////////////////
/*
DS3231.h文件

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

#ifndef _ds3231_h_
#define _ds3231_h_
#define uint unsigned int
#define uchar unsigned char
/**************************************/
extern void IIC_Init(void);
extern uchar l_tmpdate[];
extern uchar l_tmpdisplay[];
extern void delay_IIC(void);
extern void IIC_start(void);
extern void IIC_stop(void);
extern bit IIC_Tack(void);
extern void Read_RTC(void);
extern void Set_RTC(void);
extern void DS1302_Initial();
#endif
///////////////////////////////////////////////////////////////////////////////////
/*
DS3231.C文件

*/
////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include"ds3231.h"
sbit IIC_SDA=P0^3;
sbit IIC_RST=P0^2;
sbit IIC_SCL=P0^1;
code unsigned char rtc_address[7]={0x00,0x01,0x02,0x04,0x05,0x03,0x06}; //秒分时日月周年 最低位读写位


//-------------------------------------------------------------------
void delay_IIC(void)  
{//IIC总线限速延时函数。
//该函数是空函数,延时4个机器周期。
_nop_();_nop_();_nop_();_nop_();
}
//-------------------------------------------------------------------
void IIC_Init(void)
{//IIC总线初始化函数
    IIC_RST=1;
    IIC_SDA=1;//释放IIC总线的数据线。
    IIC_SCL=1;//释放IIC总线的时钟线。
}
//-------------------------------------------------------------------
void IIC_start(void)
{//IIC总线产生起始信号函数
    
     IIC_SDA=1;//拉高数据线
     IIC_SCL=1;//拉高时钟线
     delay_IIC();
     IIC_SDA=0;//在时钟线为高电平时,拉低数据线,产生起始信号。
     delay_IIC();
     IIC_SCL=0;//拉低时钟线
}
//-------------------------------------------------------------------
void IIC_stop(void)
{//IIC总线产生停止信号函数
    IIC_SDA=0;//拉低数据线
    delay_IIC();
    IIC_SCL=1;//拉高时钟线。
    delay_IIC();
    IIC_SDA=1;//时钟时线为高电平时,拉高数据线,产生停止信号。
    delay_IIC();
}
//-------------------------------------------------------------------
bit IIC_Tack(void)
{//接收应答信号函数
    bit ack;//定义一个位变量,来暂存应答状态。
    IIC_SDA=1;//释放数据总线,准备接收应答信号。
    delay_IIC();
    IIC_SCL=1;//拉高时钟线。
    delay_IIC();
    ack=IIC_SDA;//读取应答信号的状态。
    delay_IIC();
    IIC_SCL=0;//拉低时钟线。
    delay_IIC();
    return ack;//返回应答信号的状态,0表示应答,1表示非应答。
}
//-------------------------------------------------------------------
void IIC_write_byte(unsigned char Data)
{//向IIC总线写入一个字节的数据函数
    unsigned char i;
     for(i=0;i<8;i++)//有8位数据
    {
        IIC_SDA=Data&0x80;//写最高位的数据
          delay_IIC();
          IIC_SCL=1; //拉高时钟线,将数写入到设备中。
        delay_IIC();
        IIC_SCL=0;//拉低时钟线,允许改变数据线的状态
        delay_IIC();
        Data=Data<<1;//数据左移一位,把次高位放在最高位,为写入次高位做准备
    }
}
//-------------------------------------------------------------------
unsigned char IIC_read_byte()
{//从IIC总线读取一个字节的数据函数
    unsigned char i;
    unsigned char Data;       //定义一个缓冲寄存器。
    for(i=0;i<8;i++)//有8位数据
    {
        IIC_SCL=1;//拉高时钟线,为读取下一位数据做准备。
        delay_IIC();
        Data=Data<<1;//将缓冲字节的数据左移一位,准备读取数据。
        delay_IIC();
      
        if(IIC_SDA)//如果数据线为高平电平。
            Data=Data|0x01;//则给缓冲字节的最低位写1。
        IIC_SCL=0;//拉低时钟线,为读取下一位数据做准备。
        delay_IIC();
    }
    return Data;//返回读取的一个字节数据。
}
//-------------------------------------------------------------------
void IIC_single_byte_write(unsigned char Waddr,unsigned char Data)
{//向任意地址写入一个字节数据函数
    IIC_start();//产生起始信号
    IIC_write_byte(0xd0);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    IIC_write_byte(Waddr);//写入要操作的单元地址。
    IIC_Tack();//等待设备的应答。
    IIC_write_byte(Data);//写入数据。
    IIC_Tack();//等待设备的应答。
    IIC_stop();//产生停止符号。
}
//-------------------------------------------------------------------
unsigned char IIC_single_byte_read(unsigned char Waddr)
{//从任意地址读取一个字节数据函数
    unsigned char Data;//定义一个缓冲寄存器。
    IIC_start();//产生起始信号
    IIC_write_byte(0xd0);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    IIC_write_byte(Waddr);//写入要操作的单元地址。
    IIC_Tack();//等待设备的应答。
    IIC_stop();//产生停止符号。

    IIC_start();//产生起始信号
    IIC_write_byte(0xd1);//写入设备地址(写)
    IIC_Tack();//等待设备的应答
    Data=IIC_read_byte();//写入数据。
    delay_IIC();
    IIC_stop();//产生停止符号。
    //-------------------返回读取的数据--------------------
    return Data;//返回读取的一个字节数据。
}

void Read_RTC(void)
{
    unsigned char i,*p;
     p=rtc_address;         //地址传递
    for(i=0;i<7;i++)            //分7次读取 秒分时日月周年
    {
      l_tmpdate[i]=IIC_single_byte_read(*p);
      p++;
    }  
}
void Set_RTC(void)
{
    unsigned char i,tmp;
    for(i=0;i<7;i++)
    {       //BCD处理
        tmp=l_tmpdate[i]/10;
        l_tmpdate[i]=l_tmpdate[i]%10;
        l_tmpdate[i]=l_tmpdate[i]+tmp*16;
    }
//    IIC_single_byte_write(0x0e,0X8c);
     for(i=0;i<7;i++)        //7次写入 秒分时日月周年
     {
        IIC_single_byte_write(rtc_address[i],l_tmpdate[i]);
    }
    IIC_single_byte_write(0x0e,0x0c);
}

void DS1302_Initial()
{
    IIC_RST=1;
    IIC_SDA=1;//释放IIC总线的数据线。
    IIC_SCL=1;
    IIC_single_byte_write(0x0e,0x0c);
}

关键字:51单片机  高精度时钟  DS3231 引用地址:51单片机驱动高精度时钟DS3231源代码

上一篇:单片机产生脉宽300MS周期600MS方波
下一篇:四位数码管的加减计数器

推荐阅读最新更新时间:2024-03-16 13:53

51单片机点亮LED灯、流水灯
2-1点亮一个LED灯 1.首先在keil中新建一个工程,这里需要注意,将所写的工程可以统一一个地方进行存储,这样方便查找。之后再右击添加新文件 2.首先右击代码行,引用文件 3.之后再编写主函数 4.以其中亮一个LED灯为例,编写程序如下: P2=0xFE;//1111 1110 转换成十六进制0x表示前缀代表的是十六进制数 P2=0xFE;//1111 1110 下载程序后到STC-ISP中选择单片机的型号,串口号,打开相应的程序文件,进行下载编程 5.实现效果 6.当然,也可以加上循环语句表示让其一直循环下去,实现效果是一样的 通过点亮第一个LED灯,可以知道以八个一组为例改变010
[单片机]
<font color='red'>51单片机</font>点亮LED灯、流水灯
51单片机C语言学习笔记7:关于.c文件和.h文件
1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明; 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。 2)h文件里应该有什么 常量,结构,类型定义,函数,变量申明。 3)h文件不应该有什么 变量定义, 函数定义。 4)extern问题 对于变量需要extern; 对于函数不需要因为函数的缺省状态是extern的.如果一个函数要改变为只在文件内可见,加static。 5)include包含问题 虽然申明和类型定义可以重复,不过推荐使用条件编译。 #ifndef _FILENAME_H, #define _FILE
[单片机]
51 单片机 EEPROM小结(FLASH)
概念先行 RAM:可读可写,掉电消失 ROM:只读,掉电保存,存一些开机引导相关信息 两者同属内存,常说的电脑硬盘属外存。 SRAM就是速度快一点,EEPROM就是可重复编程可擦除,FLASH就是高级的EEPROM。 STC8利用ISP/IAP技术将内部DATA FLASH当EEPROM,可以自己设置,512字节单扇区擦除,每次擦除一个扇区,建议同一次修改的数据在一个扇区内。 寄存器 数据寄存器 IAP_DATA 读:读出的EEPROM的数据保存在其中 写:写之前必须将数据放入其中,再发写指令 地址寄存器 IAP_ADDRH:目标地址高字节 IAP_ADDRL:目标地址低字节 命令寄存器IAP_CMD 低两位置
[单片机]
51 单片机 EEPROM小结(FLASH)
51单片机自动售水机
单片机源程序如下: #include stc.h #include button.h #include smg.h #include AT24C02.h sbit led1=P0^0; sbit bell=P0^6; sbit relay=P0^4; unsigned char flag_s7,flag_s6; int money=0,amount=0;//价格 容量 unsigned char count,flag_count; unsigned char state; //控制数码管两种显示界面 按键控制 #define EXE_EN P2 = (P2&0X1F)|0XA0; P2 &= 0X1F
[单片机]
<font color='red'>51单片机</font>自动售水机
MCS-51单片机在定时中断中的不同应用
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期 。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。 文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。 1 方法1 在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序
[单片机]
51单片机的蜂鸣器写歌的音阶
直接上代码! #include reg51.h sbit LS1=P3^7; //该蜂鸣器为无源蜂鸣器;这是当以它的接口 sbit K0=P1^0; int code L ={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248}; //音阶 int code S ={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3}; int i=0; void DelayMs(int x) //延时 { int i; while(x--) for(i=0;i 120;i++); } void init() //初始化 { // TMOD=
[单片机]
51单片机控制继电器
这是典型的继电器驱动电路图,这样的图在网络上随处可以搜到,并且标准教科书上一般也是这样的电路图.(我们一位老师说过,中国的教科书,大都是你抄我,我抄你,甚至连图也照搬,所谓的教授们只为了增加他们虚伪的学术成果) 为什么要明白这个图的原理? 单片机是一个弱电器件,一般情况下它们大都工作在5V甚至更低.驱动电流在mA级以下.而要把它用于一些大功率场合,比如控制电动机,显然是不行的.所以,就要有一个环节来衔接,这个环节就是所谓的 功率驱动 .继电器驱动就是一个典型的、简单的功率驱动环节.在这里,继电器驱动含有两个意思:一是对继电器进行驱动,因为继电器本身对于单片机来说就是一个功率器件;还有就是继电器去驱动其他负载,比如继电器可以驱
[单片机]
<font color='red'>51单片机</font>控制继电器
51单片机控制步进电机-让电机转起来
摘要: 本节介绍用简单的方式,让步进电机转起来。其目的之一是对电机转动有直观的感受,二是熟悉整个开发流程 本系列教程必要的51单片机基础包括IO口操作、中断、定时器三个部分,相关基础教程网上很多,可以自行学习 一、软件清单 需要用到的软件有keil5编译软件、STC程序烧录软件 二、控制原理 根据TB6600驱动器原理,向PUL口发送脉冲,每发送一个脉冲,电机就转一步。通过单片机延时的方式,切换PUL口电平产生脉冲,从而控制电机转动。 三、程序代码 //毫秒延时函数 void delay(unsigned int z) { unsigned int x,y; for(x=z;x 0;x--) for(y
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved