仿真图:
功能简介:
单片机采用AT89C51,最小系统由晶振和复位电路组成
液晶显示采用LCD12864用于显示该项目的参数信息
四个功能按键,分别是设置、加、减和确认按键
仿真内时钟芯片采用DS3232,在没有使用SRAM的前提下,DS3232可以和DS3231互换
芯片特点:
DS3232特点:
DS3232是Maxim Integrated(现已更名为Maxim Integrated)公司生产的一款实时时钟(Real-Time Clock,RTC)芯片。以下是DS3232的一些特点:

- 高精度计时:DS3232采用温度补偿的晶体振荡器,可以提供非常准确的时间计时,精度可达到±2分钟/年。
- 低功耗设计:它采用低功耗时钟模式,在电池供电模式下仅需消耗少量电流,适用于对功耗要求较高的应用。
- 温度补偿:DS3232具有温度传感器,可以实时监测环境温度,并通过温度补偿技术对时钟的频率进行精确调整,以确保时间的准确性。
- 时钟和日历功能:它提供完整的时钟和日历功能,包括年、月、日、时、分和秒的计时,以及闰年判断和闹钟功能等。
- 多种接口:DS3232支持I2C(TWI)和SPI接口,可以与主控器件(如微处理器、微控制器)进行通信和数据交互。
- 电池备份:该芯片支持电池备份,可以使用外部电池供电以保持时钟数据的持久保存,在主电源断电时仍能正常工作。
- 集成温度补偿充电器:DS3232集成了温度补偿充电器电路,可实现对外部电池的智能充电和管理。
- 高可靠性和稳定性:DS3232采用工业级温度范围内的测试和质量控制,能够提供稳定可靠的性能。
主程序:
#include <reg52.H> #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<mini) item=max; //write_byte(0, 0x98);//允许写操作 write_byte(address,(item/10)*16+item%10);//转换成10进制写入3231 // write_byte(0x8e,0x80);//写保护,禁止写操作 DelayM(20); displaytime(); } void main() { uchar e=0; LCD_ST7565_INIT(); //液晶初始化 Lcd12864_ClearScreen(); //清屏 while(1) { if(w==0) { displaytime();//显示时间 } //正常走时 else {} //否则启动调时 //设置键------------------------------------------------------------------------ if (key1 == 0) // 设置时间 { DelayM(20); //按键消抖 if(key1 == 0 && w == 1) //当是调时状态 本键用于调整下一项 { e++; if (e >= 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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/70469.html