I2C类 DS1307芯片做时钟实验程序
I2C DS1307
DS1307是DALLAS公司的 一款时钟/日历芯片,采用I2C协议与单片机通讯,是
单片机制作时钟/日历的常用芯片。DS1307为8脚封装的芯片,只需外接一个
32.768KHz的晶振即可工作。本实验将时间信息通过串口显示在PC机上。 关键词:DS1307芯片,时钟程序,实时时钟程序,RTC
DS1307
DS1307串行实时时钟(RTC)是一款低功耗,全BCD码,带56字节非易失SRAM的时钟/日历芯片。地址与数据经I2C双向总线串行传输。该时钟/日历芯片提供秒、分、时、星期、日、月和年等信息,并能自动调整少于31天包括闰年月份的最后一天。时钟可以工作在24小时模式或是12小时带AM/PM模式。DS1307内部嵌入电源传感电路,可探测电源故障并自动转用备用电池供电。在备用电池
供电情况下计时功能继续工作。
本实验硬件非常简单,DS1307外接一个32.768KHz的晶振即可。相应SDA管脚SCL管脚用条线连Atmega48单片机的端口PORTD.7和PORTD.6。通过串口将单片机与PC机连接,用BASCOM自带模拟终端显示时间。
'------------DS1307芯片做时钟BASIC程序-------------------------------- $regfile = "m48def.dat" ' 使用Atmega48单片机 $crystal = 8000000 ' 8MHz
$baud = 19200 ' 串口波特律19200 $lib "mcsbyte.lbx" ' 用字节库节约存储空间 Config Date = Ymd , Separator = - ' 设置日期
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
为年-月-日,分隔符为"-" Config Sda = Portd.7 ' 配置SDA
Config Scl = Portd.6 ' 配置SCL
Const Ds1307w = &HD0 ' Ds1307地址 Const Ds1307r = &HD1 '
Config Clock = User ' 该语句自动定义系统时间变量 Dim Weekday As Byte , Strweekday As String * 10 ' 定义其他变量
Dim I As Byte ' Weekday = 6 ' 初始化星期变量 Time$ = "23:59:50" ' 初始化Time$变量将调用SetTime子程
Date$ = "09-02-28" ' 初始化Date$变量将调用SetDate子程
Do ' I = Weekday - 1 ' Strweekday = Lookupstr(i , Weekdays) ' Print "日期:" ; Date$ ; " " ; Strweekday ; " 时间:" ; Time$ ' Wait 1 ' Loop ' End ' Getdatetime: ' I2cstart ' 启动开始 I2cwbyte Ds1307w ' 发写地址 I2cwbyte 0 ' 1307地址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) ' BCD转十进制 _min = Makedec(_min) ' _hour = Makedec(_hour) ' _day = Makedec(_day) ' _month = Makedec(_month) ' _year = Makedec(_year) ' Return ' Setdate: ' _day = Makebcd(_day) ' 十进制转BCD _month = Makebcd(_month) ' _year = Makebcd(_year) ' I2cstart ' 启动开始 I2cwbyte Ds1307w ' 发送写地址 I2cwbyte 3 ' 从DS1307地址4开始写 I2cwbyte Weekday ' 星期 I2cwbyte _day ' 日期 I2cwbyte _month ' 月份 I2cwbyte _year ' 年 I2cstop '
Return '
Settime: '
_sec = Makebcd(_sec) ' 十进制转BCD _min = Makebcd(_min) '
_hour = Makebcd(_hour) '
I2cstart ' 启动开始 I2cwbyte Ds1307w ' 发送写地址 I2cwbyte 0 ' 从DS1307地址0开始写 I2cwbyte _sec ' 秒
I2cwbyte _min ' 分
I2cwbyte _hour ' 时
I2cstop '
Return '
Weekdays: '
Data "星期一" , "星期二" , "星期三" , "星期四" '
Data "星期五" , "星期六" , "星期日" '
程序通过I2C协议与时钟芯片DS1307通讯获取时间数据。时间信息用PRINT语句在BASCOM的模拟终端显示。程序中使用了CONFIG CLOCK=USER 语句,使得编译器自动定义除“星期”外的时间变量,程序员可直接引用这些变量。DS1307内部有星期的存储位置,初始化后自动随日期的变更而变,很方便。 注意几个子程序的写法,这些子程序是在引用或赋值DATE$、TIME$变量时系统自动调用的。与普通子程序的写法不同,开头没有SUB,结尾用RETURN而不用END SUB,也不用DECLARE声明。
可参照51的实验例程。