仿真图:
功能简介:
单片机采用AT89C51,最小系统由晶振和复位电路组成
液晶显示采用LCD1602用于显示该项目的参数信息
仿真内时钟采用DS3232,在没有使用SRAM的前提下,DS3232可以和DS3231互换
设计有eeprom芯片,型号是FM24C64。用于掉电保存
主程序:
#include "main.h"
void main()
{
Time system;
Time time;
uchar xdata disptemp[17];
uchar xdata add=0,read=0;
I2C_Init();
lcd1602_ini();
LCD_StrDisp(0x00,"just test");
add=88;
//写入AT24C64
WriteByte_Addr(0x02,0x00,add);
//读取
read=ReadByte_Addr(0x02,0x00);
//显示
sprintf(disptemp,"R=%d ",(int)read);
LCD_StrDisp(0x40,disptemp);
delay1s(1);
system.year=22;
system.month=12;
system.day=13;
system.hour=18;
system.minute=45;
system.second=0;
system.week=5;
//设置系统时间
ModifyTime(&system);
lcd_clr();
while(1)
{
//获取系统时间
GetDS3231Time(&time);
//显示日期,时间
sprintf(disptemp,"20%02bd/%02bd/%02bd", time.year,time.month,time.day);
LCD_StrDisp(0x00,disptemp);
sprintf(disptemp,"%02bd:%02bd:%02bd", time.hour,time.minute,time.second);
LCD_StrDisp(0x40,disptemp);
}
}
ds3231程序:
#include "ds3231.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();
I2CSendByte(DS3231_WriteAddress);
if(I2CWaitACK()==NACK ) //如果为非应答
return 0;
I2CSendByte(addr);
if(I2CWaitACK()==NACK) //如果为非应答
return 0;
I2CSendByte(write_data);
if(I2CWaitACK()==NACK) //如果为非应答
return 0;
I2CStop();
delayus(4);
return 1;
}
//功能:从DS3231某个寄存器中读取数据
//参数:寄存器地址
//返回值:读取的数据
uchar read_random(uchar random_addr)
{
uchar idata read_data;
I2CStart(); //1.起始信号
I2CSendByte(DS3231_WriteAddress); //2.发送伪写指令
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
I2CSendByte(random_addr); //3.发送寄存器地址
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
I2CStart(); //4.再次发送起始信号
I2CSendByte(DS3231_ReadAddress); //5.发送读指令
if(I2CWaitACK()==NACK) //等待从机应答
return 0;
read_data = I2CReadByte(); //6.读取数据
I2C_NACK(); //7.给出NACK信号
I2CStop(); //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->day=read_random(DS3231_DAY);
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);
}
设计文件: