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