基于51单片机DS3231时钟驱动lcd1602显示

仿真图:

在这里插入图片描述

功能简介:

单片机采用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);
}

设计文件:

链接:https://pan.baidu.com/s/1QTkmJo63rx86qb0TxMUNyw?pwd=8kld

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值