[51 汇编例程]I2C类 DS1307芯片做时钟实验程序 - 单片机应用 - 博趣

  无线电   专题策划 行业动态 测试测量 单片机 精彩制作 精品套件 基础入门 试阅与下载 往期目录 官方淘宝店 制汇节
当前位置:博趣 -> 无线电 -> 单片机应用

TOP

[51 汇编例程]I2C类 DS1307芯片做时钟实验程序
发表日期:2012-03-02 08:48:18 来源:麦克鼠单片机学习网 作者: 【 】 浏览:4717次 评论:0
实验目的

DS1307是DALLAS公司的 一款时钟/日历芯片,采用I2C协议与单片机通讯,是单片机制作时钟/日历的常用芯片。DS1307为8脚封装的芯片,只需外接一个32.768KHz的晶振即可工作。本实验将时间信息通过串口显示在PC机上。

关键词:DS1307芯片,时钟程序,实时时钟程序,RTC


难度等级:高级

DS1307简介

DS1307串行实时时钟(RTC)是一款低功耗,全BCD码,带56字节非易失SRAM的时钟/日历芯片。地址与数据经I2C双向总线串行传输。该时钟/日历芯片提供秒、分、时、星期、日、月和年等信息,并能自动调整少于31天包括闰年月份的最后一天。时钟可以工作在24小时模式或是12小时带AM/PM模式。DS1307内部嵌入电源传感电路,可探测电源故障并自动转用备用电池供电。在备用电池供电情况下计时功能继续工作。
 

DS1307与单片机接线图

DS1307内部寄存器地址分频图

DS1307时间/日历数据寄存器位图

硬件搭建
本实验硬件非常简单,DS1307外接一个32.768KHz的晶振即可。相应SDA管脚SCL管脚用条线连Atmega48单片机的端口PORTD.7和PORTD.6。通过串口将单片机与PC机连接,用BASCOM自带模拟终端显示时间。

程序代码
'------------DS1307芯片做时钟BASIC程序--------------------------------
$regfile = "m48def.dat"
$crystal = 8000000
$baud = 19200
$lib "mcsbyte.lbx"
Config Date = Ymd , Separator = -
Config Sda = Portd.7
Config Scl = Portd.6
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Config Clock = User
Dim Weekday As Byte , Strweekday As String * 10
Dim I As Byte
Weekday = 6
Time$ = "23:59:50"
Date$ = "09-02-28"
Do
I = Weekday - 1
Strweekday = Lookupstr(i , Weekdays)
Print "日期:" ; Date$ ; " " ; Strweekday ; " 时间:" ; Time$
Wait 1
Loop
End
Getdatetime:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec)
_min = Makedec(_min)
_hour = Makedec(_hour)
_day = Makedec(_day)
_month = Makedec(_month)
_year = Makedec(_year)
Return
Setdate:
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Return
Settime:
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Return
Weekdays:
Data "星期一" , "星期二" , "星期三" , "星期四"
Data "星期五" , "星期六" , "星期日"
' 使用Atmega48单片机
' 8MHz
' 串口波特律19200
' 用字节库节约存储空间
' 设置日期格式为年-月-日,分隔符为"-"
' 配置SDA
' 配置SCL
' Ds1307地址
'
' 该语句自动定义系统时间变量
' 定义其他变量
'
' 初始化星期变量
' 初始化Time$变量将调用SetTime子程
' 初始化Date$变量将调用SetDate子程
'
'
'
'
'
'
'
'
' 启动开始
' 发写地址
' 1307地址0
' 启动开始
' 发送读地址
' 秒
' 分
' 时
' 星期
' 日期
' 月份
' 年
'
' BCD转十进制
'
'
'
'
'
'
'
' 十进制转BCD
'
'
' 启动开始
' 发送写地址
' 从DS1307地址4开始写
' 星期
' 日期
' 月份
' 年
'
'
'
' 十进制转BCD
'
'
' 启动开始
' 发送写地址
' 从DS1307地址0开始写
' 秒
' 分
' 时
'
'
'
'
'

程序讲解
程序通过I2C协议与时钟芯片DS1307通讯获取时间数据。时间信息用PRINT语句在BASCOM的模拟终端显示。程序中使用了CONFIG CLOCK=USER 语句,使得编译器自动定义除“星期”外的时间变量,程序员可直接引用这些变量。DS1307内部有星期的存储位置,初始化后自动随日期的变更而变,很方便。
注意几个子程序的写法,这些子程序是在引用或赋值DATE$、TIME$变量时系统自动调用的。与普通子程序的写法不同,开头没有SUB,结尾用RETURN而不用END SUB,也不用DECLARE声明。
可参照51的实验例程
观看演示>>
拓展思考
该实验也可不用打印语句,改用6位数码管或是LCD等显示设备进行,可以试试。

 > 相关内容:

 
Tags:汇编 I2C DS1307 芯片 时钟 实验 程序 责任编辑:博趣
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[ICCAVR C 例程]双色二极管实验 C.. 下一篇[51 汇编例程]用DS18B20做温度表..

赞助商链接

最新文章

热门文章

推荐文章