基于51单片机DS3232 DS3231可调时钟12864显示

仿真图:

功能简介:

单片机采用AT89C51,最小系统由晶振和复位电路组成
液晶显示采用LCD12864用于显示该项目的参数信息
四个功能按键,分别是设置、加、减和确认按键
仿真内时钟芯片采用DS3232,在没有使用SRAM的前提下,DS3232可以和DS3231互换

芯片特点:

DS3232特点:
DS3232是Maxim Integrated(现已更名为Maxim Integrated)公司生产的一款实时时钟(Real-Time Clock,RTC)芯片。以下是DS3232的一些特点:

  1. 高精度计时:DS3232采用温度补偿的晶体振荡器,可以提供非常准确的时间计时,精度可达到±2分钟/年。
  2. 低功耗设计:它采用低功耗时钟模式,在电池供电模式下仅需消耗少量电流,适用于对功耗要求较高的应用。
  3. 温度补偿:DS3232具有温度传感器,可以实时监测环境温度,并通过温度补偿技术对时钟的频率进行精确调整,以确保时间的准确性。
  4. 时钟和日历功能:它提供完整的时钟和日历功能,包括年、月、日、时、分和秒的计时,以及闰年判断和闹钟功能等。
  5. 多种接口:DS3232支持I2C(TWI)和SPI接口,可以与主控器件(如微处理器、微控制器)进行通信和数据交互。
  6. 电池备份:该芯片支持电池备份,可以使用外部电池供电以保持时钟数据的持久保存,在主电源断电时仍能正常工作。
  7. 集成温度补偿充电器:DS3232集成了温度补偿充电器电路,可实现对外部电池的智能充电和管理。
  8. 高可靠性和稳定性:DS3232采用工业级温度范围内的测试和质量控制,能够提供稳定可靠的性能。

主程序:

#include 
#include "12864.h"
#include "1302.h"
#include "wenzi.h"
#define uchar unsigned char
#define uint unsigned int

//===============接口定义===============
sbit key1 = P3^2; //确定/设置 按键
sbit key2 = P3^3; //减  键 
sbit key3 = P3^4; //加  键
sbit key4 = P3^5; //返回键
sbit LED = P2^0;  //背光
sbit beep = P2^1; //喇叭
sbit GY=P3^7;
//======================================
uchar year,month,date,xq,hour,minute,second,shi,ge,ge1,shi1,ddd; 						//时间/闹钟相关
uchar t_ss,t_ss1,t_mm,t_hh,t_dd,t_xq,t_yf,t_yy;    						//走时变量
uchar idata t,danian; 			//农历  t:节日显示跳转时间 danian判断12月份大小月

bit idata f0,f1,f2,f3;								  					//反白相关标志
uchar idata setk,setc;							
uchar e,k,n;
uchar idata kk,kk1,bgk,bsj,bld;
bit idata w;
uchar idata ta,tb;
bit idata dinga;
 


//==============延时函数===================
void Delay(int num)	
{
	while(num--) ;
}


//============反白标志================
void f_qc(void)
{
	f0=f1=f2=f3=0;
}

void displaytime(void)
{
  year=read_random(DS3231_YEAR);//调用3231时钟数据中的年数据,从地址0x8d中
  WRITE_STRING(3,0,0,year/10,0);	
  WRITE_STRING(3,1,0,year%10,0);	
	WRITE_STRING(3,1,1,8,0);	 //年	
	
	month=read_random(DS3231_MONTH);//调用3231时钟数据中的月数据,从地址0x05中
	WRITE_STRING(3,4,0,month/10,0);	 
  WRITE_STRING(3,5,0,month%10,0);	
	WRITE_STRING(3,3,1,7,0);	 //月	
	
	date=read_random(DS3231_DAY);//从3231芯片中读取日数据,从地址0x04中
	WRITE_STRING(3,8,0,date/10,0);	
  WRITE_STRING(3,9,0,date%10,0);	
	WRITE_STRING(3,5,1,6,0);	 	 //日
	
  xq=read_random(DS3231_WEEK);//从3231芯片中读取日数据,从地址0x04中
	WRITE_STRING(3,7,1,xq-1,0);	


    //小时
	hour =read_random(DS3231_HOUR);	//从3231芯片中读取小时数据,从地址0x02中
	WRITE_STRING(0,0,2,hour/10,0);	 
  WRITE_STRING(0,1,2,hour%10,0);	
	WRITE_STRING(0,2,2,10,0);	 	 //时
	//分钟
	minute= read_random(DS3231_MINUTE); //从3231芯片中读取分钟数据,从地址0x01中
	WRITE_STRING(0,3,2,minute/10,0);	 
  WRITE_STRING(0,4,2,minute%10,0);	
	WRITE_STRING(0,5,2,10,0);	 	 //分
	//秒钟
	second =read_random(DS3231_SECOND); //从3231芯片中读取秒钟数据,从地址0x01中
	WRITE_STRING(0,6,2,second/10,0);	 
  WRITE_STRING(0,7,2,second%10,0);	

	
	//WRITE_STRING(3,7,1,xq,c);

}
	
	void Set_time(uchar sel)
{ 
  	signed char address,item;
  	signed char max,mini;

	if(sel==0) {WRITE_STRING(2,7,1,8,0);address=DS3231_YEAR; max=99; mini=0;}  //年?????
	if(sel==1) {WRITE_STRING(2,7,1,7,0);address=DS3231_MONTH; max=12; mini=1;}  //月
	if(sel==2) {WRITE_STRING(2,7,1,6,0);address=DS3231_DAY; max=31; mini=1;}  //日
	if(sel==3) {WRITE_STRING(2,7,1,9,0);address=DS3231_WEEK; max=7;mini=1;}//星
	if(sel==4) {WRITE_STRING(2,7,1,11,0);address=DS3231_HOUR; max=23;mini=0;}//时
	if(sel==5) {WRITE_STRING(2,7,1,12,0);address=DS3231_MINUTE; max=59;mini=0;}//钟 
	

  //读取3231某地址上的数值转换成10进制赋给item 
  	item=(read_random(address));
  	if(key3 == 0){item++;}
  	if(key4 == 0){item--;}
  	if(item>max) item=mini;   
  	if(item= 6 ){e = 0;}
				Set_time(e);       //调整				
			}			
			if(key1 == 0 && w == 0)  //当是正常状态时就进入调时状态
			{
	      Lcd12864_ClearScreen();   //清屏
				w=1;	           //进入调时				
				Set_time(e);       //调整
			}
		   	while(key1 == 0);        //等待键松开 
		}
//确认,返回键-------------------------------------------------------------------		
		if (key2 == 0)               //在调时状态时就退出调时
		{
			DelayM(20);            //按键消抖
			if(key2 == 0 && w == 1)
			{				
				w = 0;	           //退出调时
				e = 0;		       //"下一项"计数器清0								
			}
			if(key2 == 0 && w == 0) 
			{				
	      Lcd12864_ClearScreen();   //清屏			
				while(key2 == 0);   
			}
     	Lcd12864_ClearScreen();   //清屏
			displaytime();		   //显示时间

			while(key2 == 0);  
		}
//加调整------------------------------------------------------------------------		
		if (key3 == 0 && w == 1)
		{ 							 
			DelayM(20);
			if(key3 == 0 && w == 1) {	Set_time(e); }
			while(key3 == 0);
		}
//减调整------------------------------------------------------------------------		
		if (key4 == 0 && w == 1) 
		{       	
			DelayM(20);
			if(key4 == 0 && w == 1) { Set_time(e); }
			while(key4 == 0);
		}
	}
/*液晶背光控制,按一下亮,再按一下灭----------------------------------------
		if(K5 == 0)        
		{
			DelayM(20); q = ~q;      //标志位取反
		 	if(q){BLK = BLK | 1;}   
		 		else {BLK = BLK & 0;}   
			while(K5 == 0);           
		}																	*/
}
  



设计文件:

链接:https://pan.baidu.com/s/1vZ5eASNl7_BkiBAi91vtdA?pwd=19ks

你可能感兴趣的:(51单片机,嵌入式硬件,单片机)