标题:
DS3231和AT24C64的Proteus仿真程序
[打印本页]
作者:
51heizlxz
时间:
2019-12-10 20:40
标题:
DS3231和AT24C64的Proteus仿真程序
本帖最后由 51heizlxz 于 2019-12-14 11:40 编辑
使用proteus7.8 SP2,keil4,AT89C51RD2
实现DS3231的时间设置和读取,AT24C64的写入和读取
5.gif
(1.04 MB, 下载次数: 88)
下载附件
2019-12-11 23:17 上传
DS3231 源程序如下:
#include "ds3231.h"
#include "main.h"
#include "I2C.h"
//功能:BCD码转换为十进制
//参数:BCD码
//返回值:十进制数
uchar BCDToDEC(uchar val)
{
return ((val>>4)*10)+(val&0x0f);
}
//功能:十进制数转换为BCD码
//参数:十进制数字
//返回值:BCD码
uchar DECToBCD(uchar val)
{
return (((val%100)/10)<<4)|(val%10);
}
//功能:向DS3231的某个寄存器写入数据
//参数:addr要写入的寄存器地址,write_data 要写入的数据
//返回值: 成功返回1,失败返回0
uchar write_byte(uchar addr, uchar write_data)
{
I2CStart_I2C(); //1发送起始信号
I2CSendByte(DS3231_WriteAddress); //2.发送写指令
if(I2CWaitACK()==NACK ) //如果为非应答
return 0;
I2CSendByte(addr); //3.发送寄存器地址
if(I2CWaitACK()==NACK) //如果为非应答
return 0;
I2CSendByte(write_data); //4.发送数据
if(I2CWaitACK()==NACK) //如果为非应答
return 0;
I2CStop_I2C(); //5.发送停止信号
delayus(4);
return 1; //发送正确返回1
}
//功能:从DS3231某个寄存器中读取数据
//参数:寄存器地址
//返回值:读取的数据
uchar read_random(uchar random_addr)
{
uchar idata read_data;
I2CStart_I2C(); //1.起始信号
I2CSendByte(DS3231_WriteAddress); //2.发送伪写指令
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
I2CSendByte(random_addr); //3.发送寄存器地址
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
I2CStart_I2C(); //4.再次发送起始信号
I2CSendByte(DS3231_ReadAddress); //5.发送读指令
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
read_data = I2CReadByte(); //6.读取数据
I2C_NACK(); //7.给出NACK信号
I2CStop_I2C(); //8.发送停止信号
return read_data;
}
//功能:设置DS3231时间,包括年/月/日/ 时:分:秒 周几
//参数:Time型 t 注意,这里t中的值都是十进制的
//返回值:void
void ModifyTime(Time *t)
{
uchar temp=0;
temp=DECToBCD(t->year);
write_byte(DS3231_YEAR,temp); //修改年
temp=DECToBCD(t->month);
write_byte(DS3231_MONTH,temp); //修改月
temp=DECToBCD(t->day);
write_byte(DS3231_DAY,temp); //修改日
temp=DECToBCD(t->hour);
write_byte(DS3231_HOUR,temp); //修改时
temp=DECToBCD(t->minute);
write_byte(DS3231_MINUTE,temp); //修改分
temp=DECToBCD(t->second);
write_byte(DS3231_SECOND,temp); //修改秒
temp=DECToBCD(t->week);
write_byte(DS3231_WEEK,temp); //修星期
}
//功能:从DS3231读取数据
//参数:Time 型变量t,读出的结构成员都是十进制数
//返回值:void
void GetDS3231Time(Time *t)
{
t->year=read_random(DS3231_YEAR);
t->month=read_random(DS3231_MONTH);
t->hour=read_random(DS3231_HOUR);
t->minute=read_random(DS3231_MINUTE);
t->second=read_random(DS3231_SECOND);
t->year=BCDToDEC(t->year);
t->month=BCDToDEC(t->month);
t->day=BCDToDEC(t->day);
t->hour=BCDToDEC(t->hour);
t->minute=BCDToDEC(t->minute);
t->second=BCDToDEC(t->second);
}
复制代码
所有资料51hei提供下载:
ds3231_2.rar
(166.34 KB, 下载次数: 202)
2019-12-14 11:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
whsbk
时间:
2020-2-26 15:08
谢谢分享,需要操作ds3231模块上的eeprom, 下载参考下。
作者:
Duo2048
时间:
2020-2-26 16:31
谢谢楼主 非常需要
作者:
hzwl2007
时间:
2020-2-26 20:33
优秀 棒棒棒棒
作者:
xlyzhlq
时间:
2021-5-15 09:16
好 顶顶顶顶顶顶顶顶顶顶顶顶顶顶
作者:
yingalstom
时间:
2023-1-14 17:07
学习一下DS3231.
作者:
gzgy
时间:
2024-5-2 14:36
正在学习DS31231,谢谢分享!
作者:
huangjingjie
时间:
2024-5-24 15:37
感谢楼主共享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1