easyeda.com€¦ · web view初次使用easy eda—万年历. 方案介绍:...
TRANSCRIPT
初次使用 Easy EDA—万年历方案介绍:
本设计以 90C52 为主控,DS1302 时钟芯片为核心,DS18B20 温度检测,制作的一款在 12864 上大数显示时间,并可同步显示阴历,阳历以及实时温度。本方案是基于之前在 AD15 的作品导入到 EasyEDA 中的。
关于 AD15 导入 EasyEDA 中出现的一些小问题,在此简单说明。① 导入文件类型错误:
解决方案:AD 中原理图与 PCB 图都默认保存为 binary 类型的,而在 EasyEDA 中支持导入的是 ASCii 格式。故在导入之前,现在 AD 中打开,将文件另存
为箭头所指:
原理图保存类型 PCB 保存类型
②AD 中可以用图片加 LOGO 或者用字符串在某一层加入汉字标识。而在EasyEDA 中不能导入图片,可以先在 AD 中生成 pcb,然后导入。再有EasyEDA 不显示 AD 中的汉字。③ 在生成制造文件时,它会提示未设置边界线
解决方案:点击‘层‘中的边框(箭头所指处)然后使用”PCB 工具”中的线在设计的 PCB 板子周围画出一个框(如果在大的视野画,可能看不到画出来线,放大设计区域就可以看到了)。
④ 保存好的项目,再修改信息 如果相对保存好的项目修改信息,需要再图示选中我的项目,找到相应的项目,右键,修改即可。
原理图总原理图:
PCB 图
PCB 图后点击照片预览就可以看到模拟的打板后的图,非常形象
设计思路一、系统功能说明 :根据家居生活中的实际需要,万年历应该具有如下功能。 1、时间显示
时间显示是万年历设计最重要的功能。万年历应该不仅能准确显示时、
分、秒,而且还要能够显示年、月、日和星期。 2、时间调整
万年历在第一次使用时,需要根据当前时间进行时间调整,设定起初始时间,设置完成之后,它会在设定值基础上进行准确的计时和显示。在万年历断电或出现其他故障排除后,也需要根据当前时间进行时间调整。 3、定时闹钟
定时闹钟是万年历的一个辅助功能。可以通过键盘设定定时时间,这样当万年历运行到设定的定时时间时,会发出语音提示,提示时间为 1 分钟。可以根据需要设定闹钟功能的开启和关闭。 4、温度显示
温度显示是万年历的另外一个辅助功能。万年历上设置有一个温度传感器,用于检测环境温度,提示用户注意温度的变化,做好诸如防寒保暖等措施。 5、掉电运行
万年历采用市电或者电池供电。当发生停电或者电池量耗尽等情况时,它通过内置的纽扣电池给时钟供电以保持正确的时钟数据,但关闭其他部分的电源,这样在来电或者更换电池之后不必重新设定时间。在市电运行正常时,可以根据需要更换备用的纽扣电池而不影响时钟运行。
二、系统方案设计
根据万年历的功能要求和选定的设计方案,设计出如图所示的控制系统结构。
图 万年历系统结构框图
三、程序设计方案1.主程序设计:主程序主要完成系统初始化(包括 I/O口初始化、SD2303 芯片的初始化和DS1722 芯片的初始化)、按键检测和处理、时钟数据的读取和显示、温度数据的读取和显示以及根据条件判断是否需要进行定时报警等工作,以完成人机交互的功能。
主程序设计流程图2.按键设计按键检测和处理程序位设置时间和闹铃提供人机接口。万年历提供 7 个
独立式的按键接口,通过采集按键的电平状态来检测按键的按下与否。在按键检测程序中提供了延时防抖动功能。按键检测程序只有在检测到“时间设置”键或者“闹铃设置”键被按下后方进入处理程序。处理程序结束的条件为检测到“确认”键被按下。 按键检测程序通过在 12864 上闪烁光标提示正在进行设置的是哪一位数
据。处理程序提供了对闹铃时间设置的合法性检测,而不提供对时间设置的合法性检测。只有合法的闹铃时间设置方能启动闹铃功能,任何非法的闹铃时间设置将关闭闹铃功能。
按键设计与检测流程图效果图
物料清单
程序清单/*********************************************
功能:使用 DS1302 测得日期、时间,DS18B20 测得温度 并在 12864 显示
*********************************************/
#include"main.h"
#include"LCD12864.h"
#include"delay.h"
#include"DS1302.h"
#include"DS18B20.h"
#include"NONGLICONVERSION.H"
#include"keyscan.h"
#include"bell.h"
#include"zk.h"
sbit style=P1^5;
sbit knz =P1^1;
void main()
{
Init_1302();
init_12864();
displaypicture_12864(0,0,qqt,64,128);
delayms(2000);
displaypicture_12864(0,0,kj,64,128);
delayms(1500);
writecom_12864(0x01);
displaypicture_12864(0,0,kong,64,128);
delayms(100);
//bell2();
while(1)
{
uint a,n,s,Year,Month,Day;
Year=ReadYear_1302();
Month=ReadMoon_1302();
Day=ReadDay_1302();
a=Conver_week(Year,Month,Day);
displayDigital_12864(1,0,20);
displayDigital_12864(1,1,Year);
writedat_12864('-');
writedat_12864(Month/10+0x30);
writedat_12864(Month%10+0x30);
writedat_12864('-');
displayDigital_12864(1,4,Day);
if(a==0){display_12864(1,6,"周日");} //0=星期日if(a==1){display_12864(1,6,"周一");}
if(a==2){display_12864(1,6,"周二");}
if(a==3){display_12864(1,6,"周三");}
if(a==4){display_12864(1,6,"周四");}
if(a==5){display_12864(1,6,"周五");}
if(a==6){display_12864(1,6,"周六");}
if(style==0)
delayms(20);
if(style==0)
{
bell1();
while(style==0);
s++;
}
if(s%4==1)
{
displaypicture_12864(16,0,num16321[ReadHour_1302()/10],32,16);
displaypicture_12864(16,1,num16321[ReadHour_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,2,num16321[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,2,kong3216,32,16);}
displaypicture_12864(16,3,num16321[ReadMinute_1302()/10],32,1
6);
displaypicture_12864(16,4,num16321[ReadMinute_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,5,num16321[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,5,kong3216,32,16);}
displaypicture_12864(16,6,num16321[ReadSecond_1302()/10],32,1
6);
displaypicture_12864(16,7,num16321[ReadSecond_1302()
%10],32,16);
}
if(s%4==2)
{
displaypicture_12864(16,0,num16322[ReadHour_1302()/10],32,16);
displaypicture_12864(16,1,num16322[ReadHour_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,2,num16322[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,2,kong3216,32,16);}
displaypicture_12864(16,3,num16322[ReadMinute_1302()/10],32,1
6);
displaypicture_12864(16,4,num16322[ReadMinute_1302()
%10],32,16);
if(ReadSecond_1302()%2==1)
{displaypicture_12864(17,5,num16322[10],32,16);}
if(ReadSecond_1302()%2==0)
{displaypicture_12864(17,5,kong3216,32,16);}
displaypicture_12864(16,6,num16322[ReadSecond_1302()/10],32,1
6);
displaypicture_12864(16,7,num16322[ReadSecond_1302()
%10],32,16);
}
if(s%4==3)
{
displaypicture_12864(16,0,num16323[ReadHour_1302()/10],32,16);
displaypicture_12864(16,1,num16323[ReadHour_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,2,num16323[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,2,kong3216,32,16);}
displaypicture_12864(16,3,num16323[ReadMinute_1302()/10],32,1
6);
displaypicture_12864(16,4,num16323[ReadMinute_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,5,num16323[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,5,kong3216,32,16);}
displaypicture_12864(16,6,num16323[ReadSecond_1302()/10],32,1
6);
displaypicture_12864(16,7,num16323[ReadSecond_1302()
%10],32,16);
}
if(s%4==0)
{
displaypicture_12864(16,0,num16324[ReadHour_1302()/10],32,16);
displaypicture_12864(16,1,num16324[ReadHour_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,2,num16324[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,2,kong3216,32,16);}
displaypicture_12864(16,3,num16324[ReadMinute_1302()/10],32,1
6);
displaypicture_12864(16,4,num16324[ReadMinute_1302()
%10],32,16);
if((ReadSecond_1302())%2==1)
{displaypicture_12864(17,5,num16324[10],32,16);}
if((ReadSecond_1302())%2==0)
{displaypicture_12864(17,5,kong3216,32,16);}
displaypicture_12864(16,6,num16324[ReadSecond_1302()/10],32,1
6);
displaypicture_12864(16,7,num16324[ReadSecond_1302()
%10],32,16);
}
a=read_temp();
writecom_12864(0x98+5);
writedat_12864(a%1000/100+0x30);
writedat_12864(a%100/10+0x30 );
writedat_12864('.');
writedat_12864(a%10+0x30);
displaypicture_12864(47,7,wd,16,16);
displaypicture_12864(48,4,wdj,16,16);
Conversion(Year,Month,Day);
writecom_12864(0x98);
if(month_moon==1) {display_12864(4,0,"正");}
if(month_moon==2) {display_12864(4,0,"二");}
if(month_moon==3) {display_12864(4,0,"三");}
if(month_moon==4) {display_12864(4,0,"四");}
if(month_moon==5) {display_12864(4,0,"五");}
if(month_moon==6) {display_12864(4,0,"六");}
if(month_moon==7) {display_12864(4,0,"七");}
if(month_moon==8) {display_12864(4,0,"八");}
if(month_moon==9) {display_12864(4,0,"九");}
if(month_moon==10) {display_12864(4,0,"十");}
if(month_moon==11) {display_12864(4,0,"冬");}
if(month_moon==12) {display_12864(4,0,"腊");}
display_12864(4,1,"月");
if(day_moon==1){display_12864(4,2,"初一");}
if(day_moon==2){display_12864(4,2,"初二");}
if(day_moon==3){display_12864(4,2,"初三");}
if(day_moon==4){display_12864(4,2,"初四");}
if(day_moon==5){display_12864(4,2,"初五");}
if(day_moon==6){display_12864(4,2,"初六");}
if(day_moon==7){display_12864(4,2,"初七");}
if(day_moon==8){display_12864(4,2,"初八");}
if(day_moon==9){display_12864(4,2,"初九");}
if(day_moon==10){display_12864(4,2,"初十");}
if(day_moon==11){display_12864(4,2,"十一");}
if(day_moon==12){display_12864(4,2,"十二");}
if(day_moon==13){display_12864(4,2,"十三");}
if(day_moon==14){display_12864(4,2,"十四");}
if(day_moon==15){display_12864(4,2,"十五");}
if(day_moon==16){display_12864(4,2,"十六");}
if(day_moon==17){display_12864(4,2,"十七");}
if(day_moon==18){display_12864(4,2,"十八");}
if(day_moon==19){display_12864(4,2,"十九");}
if(day_moon==20){display_12864(4,2,"二十");}
if(day_moon==21){display_12864(4,2,"廿一");}
if(day_moon==22){display_12864(4,2,"廿二");}
if(day_moon==23){display_12864(4,2,"廿三");}
if(day_moon==24){display_12864(4,2,"廿四");}
if(day_moon==25){display_12864(4,2,"廿五");}
if(day_moon==26){display_12864(4,2,"廿六");}
if(day_moon==27){display_12864(4,2,"廿七");}
if(day_moon==28){display_12864(4,2,"廿八");}
if(day_moon==29){display_12864(4,2,"廿九");}
if(day_moon==30){display_12864(4,2,"三十");}
keyscan();
if(knz==0)
delayms(20);
if(knz==0)
{
while(knz==0);
n++;
}
if(n%2==1)
{
displaypicture_12864(0,5,nz,16,16);
if(bellscan()==1) bell1();
}
if(n%2==0)
{
displaypicture_12864(0,5,kong,16,16);
}
}
}
/*延时函数*/
#include"main.h"
#include"delay.h"
void delayus(uint t) //延时微妙函数{
while(t--);
}
void delayms(uint t) //延时毫秒函数{
uint i,j;
for(i=t;i>0;i--)
for(j=0;j<120;j++);
}
/**************头文件**********************/
#include "main.h"
#include "DS1302.h"
#include "delay.h"
/*******************************************
写数据到 1302(底层)
********************************************/
void WriteByte_1302(uchar dat)
{
uchar i;
SCLK = 0; //时钟信号拉低delayus(20);
for(i=0;i<8;i++) //一个字节八个数{
if(dat&0x01)
DATA = 1;
else
DATA = 0;
delayus(20);
dat>>=1;
SCLK = 1; //拉高写入数据delayus(20);
SCLK = 0; //为下一次准备}
}
/*******************************************
读数据到 1302(底层)
********************************************/
uchar ReadByte_1302(void)
{
uchar i,dat;
for(i=0;i<8;i++)
{
dat>>=1;
if(DATA==1)
dat|=0x80;
SCLK=1;
delayus(20);
SCLK=0;
delayus(20);
}
return dat;
}
/*******************************************
单字节地写命令和数据********************************************/
void Write_1302(uchar com,uchar dat)
{
RST=0;
delayus(20);
RST=1; //开始传输delayus(20);
WriteByte_1302(com);
WriteByte_1302(dat);
RST=0; //传输结束}
/*******************************************
单字节地根据命令读数据
********************************************/
uchar Read_1302(uchar com)
{
unsigned char dat;
RST=0; //拉低 RST
SCLK=0; //确保写数居前 SCLK被拉低 RST=1; //启动数据传输 WriteByte_1302(com); //写入命令字 dat=ReadByte_1302(); //读出数据 SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回}
/*******************************************
给 1302 初始化********************************************/
void Init_1302(void)
{
uchar flag;
flag=Read_1302(0x81); //取秒寄存器数值,若为 0则 1302 处于工作状态,若为 1则 1302 处于非工作状态
if(flag&0x80) //判断其是否为工作状态,若不是,则重新设置时间
{
Write_1302(0x8e,0x00); //解除保护Write_1302(0x8e,0x00); //确保解除Write_1302(0x8c,((11/10)<<4|(11%10))); //设置年Write_1302(0x88,((2/10)<<4|(2%10))); //设置月Write_1302(0x86,((25/10)<<4|(25%10))); //设置日Write_1302(0x84,((21/10)<<4|(21%10))); //设置时Write_1302(0x82,((48/10)<<4|(48%10))); //设置分Write_1302(0x80,((55/10)<<4|(55%10))); //设置秒Write_1302(0x90,0xa5);//打开充电功能,设置为一个二极
管,2k 电阻充电Write_1302(0x8e,0x80);//写上保护
}
}
/********************************************
以下是设置时间的函数入口参数为写入的时间值无返回值
********************************************/
/*******给 1302 设置年*******/
void WriteYear_1302(uchar year)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x8c,((year/10)<<4|(year%10)));// 数 据转换成 BCD
码Write_1302(0x8e,0x80);//写上保护
}
/*******给 1302 设置月*******/
void WriteMoon_1302(uchar moon)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x88,((moon/10)<<4|(moon%10)));// 数 据转换成
BCD码Write_1302(0x8e,0x80);//写上保护
}
/*******给 1302 设置日*******/
void WriteDay_1302(uchar day)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x86,((day/10)<<4|(day%10)));//数据转换成 BCD码Write_1302(0x8e,0x80);//写上保护
}
/*******给 1302 设置时*******/
void WriteHour_1302(uchar hour)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x84,((hour/10)<<4|(hour%10)));//数据转换成 BCD
码Write_1302(0x8e,0x80);//写上保护
}
/*******给 1302 设置分*******/
void WriteMinute_1302(uchar minute)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x82,((minute/10)<<4|(minute%10)));//数据转换成
BCD码Write_1302(0x8e,0x80);//写上保护
}
/*******给 1302 设置秒*******/
void WriteSecond_1302(uchar second)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x80,((second/10)<<4|(second%10)));//数据转换成
BCD码Write_1302(0x8e,0x80);//写上保护
}
/******给 1302 设置星期*********/
void WriteWeek_1302(uchar week)
{
Write_1302(0x8e,0x00);//解除保护Write_1302(0x8e,0x00);//确保解除Write_1302(0x8a,week);
Write_1302(0x8e,0x80);//写上保护}
/*******************************************
总地址设置(总时间设置)********************************************/
void WriteAllTime_1302(uchar year,uchar moon,uchar day,
uchar hour,uchar minute,uchar second)
{
WriteYear_1302(year);
WriteYear_1302(moon);
WriteDay_1302(day);
WriteHour_1302(hour);
WriteMinute_1302(minute);
WriteSecond_1302(second);
}
/*******************************************
以下是读时间的函数无入口参数出口参数即为读出来处理好的数据(十进制数)
********************************************/
/*******读年**********/
uchar ReadYear_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x8d);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)return dat;
}
/*******读月**********/
uchar ReadMoon_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x89);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)
return dat;
}
/*******读日**********/
uchar ReadDay_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x87);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)return dat;
}
/*******读时**********/
uchar ReadHour_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x85);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)return dat;
}
/*******读分**********/
uchar ReadMinute_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x83);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)return dat;
}
/*******读秒**********/
uchar ReadSecond_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x81);//读出数据temp=(dat>>4)*10; //取出十位
dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数(BCD码转十进制)
return dat;
}
/*******读周**********/
uchar ReadWeek_1302(void)
{
uchar dat,temp;
dat=Read_1302(0x8b);//读出数据temp=(dat>>4)*10; //取出十位dat=(dat&0x0f)+temp; //取个位,加上十位,得到完整的数
(BCD码转十进制)return dat;
}
/**************头文件**********************/
/******单片机速度不一样延时要相应的变化****/
#include "main.h"
#include "DS18B20.h"
#include "delay.h"
uint tvalue; //温度值uchar tflag;
/*************ds1820复位***************/
void ds1820rst()
{
unsigned char x=0;
D18b20 = 1; //DQ复位delayus(10); //延时D18b20 = 0; //DQ拉低delayus(400); //精确延时大于 480us
D18b20 = 1; //拉高delayus(200);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ D18b20 = 0; //给脉冲信号 dat>>=1;
D18b20 = 1; //给脉冲信号 if(D18b20)
dat|=0x80;
delayus(40);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ D18b20 = 0;
D18b20 = wdata&0x01;
delayus(40);
D18b20 = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0x44); //*启动温度转换*/
ds1820rst();
ds1820wr(0xcc); //*跳过读序列号*/
ds1820wr(0xbe); //*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//温度值扩大 10倍,精确到 1位小数return(tvalue);
}
#include"main.h"
#include"LCD12864.h"
#include"delay.h"
#include"DS1302.h"
#include"DS18B20.h"
#include"NONGLICONVERSION.H"
#include <intrins.h>
/****************************************************/
/* 获取当前日期的农历及星期*/
/****************************************************/
/*==================================================*/
/*公历年对应的农历数据,每年三字节, 格式: */
/*第一字节 BIT7-4 位表示闰月月份,值为 0 为无闰月, */
/*BIT3-0 对应农历第 1-4 月的大小*/
/*第二字节 BIT7-0 对应农历第 5-12 月大小, */
/*第三字节 BIT7 表示农历第 13 个月大小月份对应的位*/
/*为 1 表示本农历月大(30 天),为 0 表示小(29 天) */
/*第三字节 BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期*/
/*类型:Byte:unsigned char Word:unsigned int */
/*本代码中 Tim[0]/Tim[1]/Tim[2]分别为当前年月日数据*/
/*其中 Tim[0]Bit7 表示世纪,1 为 20 世纪 19xx,0 为 21 世纪 20xx*/
/*Tim[10]为周数据/Tim[7]/Tim[8]/Tim[9]为农历数据,根据需要自行更换*/
/*==================================================*/
/*--------------------------------- 公 历 转 换 阴 历 年 份 数 据表--------------------------------*/
static uchar code year_code[597]={
0x04,0xAe,0x53,0x0A,0x57,0x48,0x55,0x26,0xBd, // 1901-1903
0x0d,0x26,0x50,0x0d,0x95,0x44,0x46,0xAA,0xB9, // 1904-1906
0x05,0x6A,0x4d,0x09,0xAd,0x42,0x24,0xAe,0xB6, // 1907-1909
0x04,0xAe,0x4A,0x6A,0x4d,0xBe,0x0A,0x4d,0x52, // 1910-1912
0x0d,0x25,0x46,0x5d,0x52,0xBA,0x0B,0x54,0x4e, // 1913-1915
0x0d,0x6A,0x43,0x29,0x6d,0x37,0x09,0x5B,0x4B, // 1916-1918
0x74,0x9B,0xC1,0x04,0x97,0x54,0x0A,0x4B,0x48, // 1919-1921
0x5B,0x25,0xBC,0x06,0xA5,0x50,0x06,0xd4,0x45, // 1922-1924
0x4A,0xdA,0xB8,0x02,0xB6,0x4d,0x09,0x57,0x42, // 1925-1927
0x24,0x97,0xB7,0x04,0x97,0x4A,0x66,0x4B,0x3e, // 1928-1930
0x0d,0x4A,0x51,0x0e,0xA5,0x46,0x56,0xd4,0xBA, // 1931-1933
0x05,0xAd,0x4e,0x02,0xB6,0x44,0x39,0x37,0x38, // 1934-1936
0x09,0x2e,0x4B,0x7C,0x96,0xBf,0x0C,0x95,0x53, // 1937-1939
0x0d,0x4A,0x48,0x6d,0xA5,0x3B,0x0B,0x55,0x4f, // 1940-1942
0x05,0x6A,0x45,0x4A,0xAd,0xB9,0x02,0x5d,0x4d, // 1943-1945
0x09,0x2d,0x42,0x2C,0x95,0xB6,0x0A,0x95,0x4A, // 1946-1948
0x7B,0x4A,0xBd,0x06,0xCA,0x51,0x0B,0x55,0x46, // 1949-1951
0x55,0x5A,0xBB,0x04,0xdA,0x4e,0x0A,0x5B,0x43, // 1952-1954
0x35,0x2B,0xB8,0x05,0x2B,0x4C,0x8A,0x95,0x3f, // 1955-1957
0x0e,0x95,0x52,0x06,0xAA,0x48,0x7A,0xd5,0x3C, // 1958-1960
0x0A,0xB5,0x4f,0x04,0xB6,0x45,0x4A,0x57,0x39, // 1961-1963
0x0A,0x57,0x4d,0x05,0x26,0x42,0x3e,0x93,0x35, // 1964-1966
0x0d,0x95,0x49,0x75,0xAA,0xBe,0x05,0x6A,0x51, // 1967-1969
0x09,0x6d,0x46,0x54,0xAe,0xBB,0x04,0xAd,0x4f, // 1970-1972
0x0A,0x4d,0x43,0x4d,0x26,0xB7,0x0d,0x25,0x4B, // 1973-1975
0x8d,0x52,0xBf,0x0B,0x54,0x52,0x0B,0x6A,0x47, // 1976-1978
0x69,0x6d,0x3C,0x09,0x5B,0x50,0x04,0x9B,0x45, // 1979-1981
0x4A,0x4B,0xB9,0x0A,0x4B,0x4d,0xAB,0x25,0xC2, // 1982-1984
0x06,0xA5,0x54,0x06,0xd4,0x49,0x6A,0xdA,0x3d, // 1985-1987
0x0A,0xB6,0x51,0x09,0x37,0x46,0x54,0x97,0xBB, // 1988-1990
0x04,0x97,0x4f,0x06,0x4B,0x44,0x36,0xA5,0x37, // 1991-1993
0x0e,0xA5,0x4A,0x86,0xB2,0xBf,0x05,0xAC,0x53, // 1994-1996
0x0A,0xB6,0x47,0x59,0x36,0xBC,0x09,0x2e,0x50, // 1997-1999
0x0C,0x96,0x45,0x4d,0x4A,0xB8,0x0d,0x4A,0x4C, // 2000-2002
0x0d,0xA5,0x41,0x25,0xAA,0xB6,0x05,0x6A,0x49, // 2003-2005
0x7A,0xAd,0xBd,0x02,0x5d,0x52,0x09,0x2d,0x47, // 2006-2008
0x5C,0x95,0xBA,0x0A,0x95,0x4e,0x0B,0x4A,0x43, // 2009-2011
0x4B,0x55,0x37,0x0A,0xd5,0x4A,0x95,0x5A,0xBf, // 2012-2014
0x04,0xBA,0x53,0x0A,0x5B,0x48,0x65,0x2B,0xBC, // 2015-2017
0x05,0x2B,0x50,0x0A,0x93,0x45,0x47,0x4A,0xB9, // 2018-2020
0x06,0xAA,0x4C,0x0A,0xd5,0x41,0x24,0xdA,0xB6, // 2021-2023
0x04,0xB6,0x4A,0x69,0x57,0x3d,0x0A,0x4e,0x51, // 2024-2026
0x0d,0x26,0x46,0x5e,0x93,0x3A,0x0d,0x53,0x4d, // 2027-2029
0x05,0xAA,0x43,0x36,0xB5,0x37,0x09,0x6d,0x4B, // 2030-2032
0xB4,0xAe,0xBf,0x04,0xAd,0x53,0x0A,0x4d,0x48, // 2033-2035
0x6d,0x25,0xBC,0x0d,0x25,0x4f,0x0d,0x52,0x44, // 2036-2038
0x5d,0xAA,0x38,0x0B,0x5A,0x4C,0x05,0x6d,0x41, // 2039-2041
0x24,0xAd,0xB6,0x04,0x9B,0x4A,0x7A,0x4B,0xBe, // 2042-2044
0x0A,0x4B,0x51,0x0A,0xA5,0x46,0x5B,0x52,0xBA, // 2045-2047
0x06,0xd2,0x4e,0x0A,0xdA,0x42,0x35,0x5B,0x37, // 2048-2050
0x09,0x37,0x4B,0x84,0x97,0xC1,0x04,0x97,0x53, // 2051-2053
0x06,0x4B,0x48,0x66,0xA5,0x3C,0x0e,0xA5,0x4f, // 2054-2056
0x06,0xB2,0x44,0x4A,0xB6,0x38,0x0A,0xAe,0x4C, // 2057-2059
0x09,0x2e,0x42,0x3C,0x97,0x35,0x0C,0x96,0x49, // 2060-2062
0x7d,0x4A,0xBd,0x0d,0x4A,0x51,0x0d,0xA5,0x45, // 2063-2065
0x55,0xAA,0xBA,0x05,0x6A,0x4e,0x0A,0x6d,0x43, // 2066-2068
0x45,0x2e,0xB7,0x05,0x2d,0x4B,0x8A,0x95,0xBf, // 2069-2071
0x0A,0x95,0x53,0x0B,0x4A,0x47,0x6B,0x55,0x3B, // 2072-2074
0x0A,0xd5,0x4f,0x05,0x5A,0x45,0x4A,0x5d,0x38, // 2075-2077
0x0A,0x5B,0x4C,0x05,0x2B,0x42,0x3A,0x93,0xB6, // 2078-2080
0x06,0x93,0x49,0x77,0x29,0xBd,0x06,0xAA,0x51, // 2081-2083
0x0A,0xd5,0x46,0x54,0xdA,0xBA,0x04,0xB6,0x4e, // 2084-2086
0x0A,0x57,0x43,0x45,0x27,0x38,0x0d,0x26,0x4A, // 2087-2089
0x8e,0x93,0x3e,0x0d,0x52,0x52,0x0d,0xAA,0x47, // 2090-2092
0x66,0xB5,0x3B,0x05,0x6d,0x4f,0x04,0xAe,0x45, // 2093-2095
0x4A,0x4e,0xB9,0x0A,0x4d,0x4C,0x0d,0x15,0x41, // 2096-2098
0x2d,0x92,0xB5, // 2099
};
//月份天数数据表uchar code
day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
uchar code day_code2[3]={0x111,0x130,0x14e};
//月修正数据表uchar code table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};
uchar c_moon,year_moon,month_moon,day_moon;
uchar GetMoonDay(unsigned char month_p,unsigned short
table_addr)
/*读取数据表中农历月的大月或小月 ,如果该月大返回 1,小返回0*/
{
switch (month_p)
{
case 1:
if((year_code[table_addr]&0x08)==0) return(0);
else return(1);
case 2:
if((year_code[table_addr]&0x04)==0) return(0);
else return(1);
case 3:
if((year_code[table_addr]&0x02)==0) return(0);
else return(1);
case 4:
if((year_code[table_addr]&0x01)==0) return(0);
else return(1);
case 5:
if((year_code[table_addr+1]&0x80)==0) return(0);
else return(1);
case 6:
if((year_code[table_addr+1]&0x40)==0) return(0);
else return(1);
case 7:
if((year_code[table_addr+1]&0x20)==0) return(0);
else return(1);
case 8:
if((year_code[table_addr+1]&0x10)==0) return(0);
else return(1);
case 9:
if((year_code[table_addr+1]&0x08)==0) return(0);
else return(1);
case 10:
if((year_code[table_addr+1]&0x04)==0) return(0);
else return(1);
case 11:
if((year_code[table_addr+1]&0x02)==0) return(0);
else return(1);
case 12:
if((year_code[table_addr+1]&0x01)==0) return(0);
else return(1);
case 13:
if((year_code[table_addr+2]&0x80)==0) return(0);
else return(1);
}
return(0);
}
/*-------------------------------- 公 历 转 农 历 函数-----------------------------------------*/
void Conversion(uchar year,uchar month,uchar day)
{
uchar temp1,temp2,temp3,month_p;
uint temp4,table_addr;
bit flag2,flag_y,c;
table_addr=(year+0x64-1)*0x3; //定位数据表地址temp1=year_code[table_addr+2]&0x60; //取当年春节所在的公
历月份temp1=_cror_(temp1,5);
temp2=year_code[table_addr+2]&0x1f; //取当年春节所在的公历日
//取当年春节所在的公历日完成 //计算当年春年离当年元旦的天数,春节只会在公历 1 月或 2
月 if(temp1==0x1) { temp3=temp2-1; }
else { temp3=temp2+0x1f-1; }
// 计算当年春年离当年元旦的天数完成 //计算公历日离当年元旦的天数,为了减少运算,用了两个表 //day_code1[9],day_code2[3]
//如果公历月在九月或前,天数会少于 0xff,用表 day_code1[9],
//在九月后,天数大于 0xff,用表 day_code2[3]
// 如输入公历 日 为 8 月 10 日 ,则公历 日离元旦天数 为day_code1[8-1]+10-1
// 如输入公历 日 为 11 月 10 日 ,则公历 日离元旦天数 为
day_code2[11-10]+10-1
if(month<10) { temp4=day_code1[month-1]+day-1; }
else { temp4=day_code2[month-10]+day-1;}
// if ((month>0x2)&&(year%0x4==0)&&(year!=0)) // 此 语句造 成2000 年 3 月 1 日—12 月 31 日之间
//计算农历少算一天,应删除判断语句“&&(year!=0)”
if ((month>0x2)&&(year%0x4==0))
temp4+=1; //如果公历月大于 2 月并且该年的 2 月为闰月,
天数加 1
//计算公历日离当年元旦的天数完成
//判断公历日在春节前还是春节后if (temp4>=temp3)
{
temp4-=temp3; month=0x1;
month_p=0x1; //month_p 为月份指向,公历日在春节前或就是春节当日 month_p 指向首月
flag2=GetMoonDay(month_p,table_addr); // 检查该农历 月为大小还是小月,大月返回 1,小月返回 0
flag_y=0;
if(flag2==0)temp1=0x1d; //小月 29天 else temp1=0x1e; //大月 30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4); //从数据表中取该年的闰月月份,
如为 0则该年无闰月while(temp4>=temp1)
{
temp4-=temp1; month_p+=1;
if(month==temp2)
{
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
flag2=GetMoonDay(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else
{
temp3-=temp4;
if (year==0x0){year=0x63;c=1;}
else year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4);
if (temp2==0)month_p=0xc;
else month_p=0xd;
flag_y=0;
flag2=GetMoonDay(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1)
{
temp3-=temp1;
month_p-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
flag2=GetMoonDay(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=c;
year_moon=year;
month_moon=month;
day_moon=day;
}
/
********************************************************
********************
算法:日期+年份+所过闰年数+月较正数之和除 7 的余数就是星期但如果是在 闰年又不到 3 月份上述之和要减一天再除 7
星期日数为 0
********************************************************
*********************/
uchar Conver_week(uchar cyear,uchar cmonth,uchar cday)
{
uchar temp,week;
cyear=100+cyear;
temp=cyear+(cyear/4); //如果为 21世纪,年份数加 100
temp=temp%7; //为节省资源,先进行一次取余,避免数大于0xff,避免使用整型数据
temp=temp+cday+table_week[cmonth-1]; //日期+年份+所过闰年数+月较正数之和除 7
if(cyear%4==0&&cmonth<3)
{temp=temp-1;}//如果是在闰年又不到 3 月份上述之和要减一天再除 7
week=temp%7;
return week;
}
#include"main.h"
#include"keyscan.h"
#include"LCD12864.h"
#include"delay.h"
#include"DS1302.h"
#include"DS18B20.h"
#include"zk.h"
#include"NONGLICONVERSION.H"
#include"bell.h"
uchar Nhour,Nminute;
void keyscan()
{
uint flag=0,Year,Month,Day,Hour,Minute,Second;
if(menu==0)
delayms(10);
if(menu==0)
{
bell1();
Year=ReadYear_1302();
Month=ReadMoon_1302();
Day=ReadDay_1302();
Hour=ReadHour_1302();
Minute=ReadMinute_1302();
Second=ReadSecond_1302();
displaypicture_12864(0,0,kong,64,128);
writecom_12864(0x01);
display_12864(1,2,"QQT-MENU");
display_12864(2,0," 时间");
display_12864(2,4," 闹钟");
while(dec==1);
if(dec==0)
delayms(10);
if(dec==0)
{
bell1();
while(right==1&menu==1)
{
displaypicture_12864(16,5,kong,16,32);
l: displaypicture_12864(16,1,yi,16,32);
}
if(menu==0)
delayms(10);
if(menu==0)
{
bell1();
writecom_12864(0x01);
display_12864(1,0," ·┭ 时间设置· ");┮
while(confirm==1)
{
Year=ReadYear_1302();
Month=ReadMoon_1302();
Day=ReadDay_1302();
Hour=ReadHour_1302();
Minute=ReadMinute_1302();
Second=ReadSecond_1302();
displayDigital_12864(2,0,20);
displayDigital_12864(2,1,Year);
display_12864(2,2,"年");
displayDigital_12864(2,3,Month);
display_12864(2,4,"月");
displayDigital_12864(2,5,Day);
display_12864(2,6,"日");
displayDigital_12864(3,0,Hour);
display_12864(3,1,"时");
displayDigital_12864(3,2,Minute);
display_12864(3,3,"分");
displayDigital_12864(3,4,Second);
display_12864(3,5,"秒");
if(menu==0)
delayms(10);
if(menu==0)
{
bell1();
while(menu==0);
flag++;
displaypicture_12864(0,0,kong,64,128);
}
if(flag%6==1)
{displaypicture_12864(16,0,yi,16,32);}
if(flag%6==2)
{displaypicture_12864(16,3,yi,16,16);}
if(flag%6==3)
{displaypicture_12864(16,5,yi,16,16);}
if(flag%6==4)
{displaypicture_12864(32,0,yi,16,16);}
if(flag%6==5)
{displaypicture_12864(32,2,yi,16,16);}
if(flag%6==0)
{displaypicture_12864(32,4,yi,16,16);}
if(dec==0)
delayms(10);
if(dec==0)
{
bell1();
while(dec==0);
if(flag%6==1)
{if(Year==0)Year=100;WriteYear_1302(Year-1);}
if(flag%6==2)
{if(Month==1)Month=13;WriteMoon_1302(Month-1);}
if(flag%6==3)
{
if(Month==2&&Year%4!=0)
{if(Day==1)Day=29;}//平年 2 月 28天
if(Month==2&&Year%4==0)
{if(Day==1)Day=30;}//闰年 2 月 29天if(Month==1||Month==3||Month==5||
Month==7||Month==8||Month==10||Month==12)
{if(Day==1)Day=32;}//31天的月份if(Month==4||Month==6||Month==9||
Month==11){if(Day==1)Day=31;}//30天的月份WriteDay_1302(Day-1);
}
if(flag%6==4)
{if(Hour==0)Hour=24;WriteHour_1302(Hour-1);}
if(flag%6==5)
{if(Minute==0)Minute=60;WriteMinute_1302(Minute-1);}
if(flag%6==0)
{if(Second==0)Second=60;WriteSecond_1302(Second-1);}
}
if(add==0)
delayms(10);
if(add==0)
{
bell1();
while(add==0);
if(flag%6==1)
{if(Year==99)Year=0;WriteYear_1302(Year+1);}
if(flag%6==2)
{if(Month==12)Month=0;WriteMoon_1302(Month+1);}
if(flag%6==3)
{
if(Month==2&&Year%4!=0)
{if(Day==28)Day=0;}//平年 2 月 28天if(Month==2&&Year%4==0)
{if(Day==29)Day=0;}//闰年 2 月 29天if(Month==1||Month==3||Month==5||
Month==7||Month==8||Month==10||Month==12)
{if(Day==31)Day=0;}//31天的月份if(Month==4||Month==6||Month==9||
Month==11){if(Day==30)Day=0;}//30天的月份WriteDay_1302(Day+1);
}
if(flag%6==4){Hour+
+;if(Hour==24)Hour=0;WriteHour_1302(Hour);}
if(flag%6==5){Minute+
+;if(Minute==60)Minute=0;WriteMinute_1302(Minute);}
if(flag%6==0){Second+
+;if(Second==60)Second=0;WriteSecond_1302(Second);}
}
}
writecom_12864(0x01);
displaypicture_12864(0,0,kong,64,128);
flag=0;
}
}
if(right==0)
delayms(10);
if(right==0)
{
bell1();
while(menu==1)
{
if(left==0)
delayms(10);
if(left==0){bell1();goto l;}
displaypicture_12864(16,1,kong,16,32);
displaypicture_12864(16,5,yi,16,32);
}
if(menu==0)
delayms(10);
if(menu==0)
{
bell1();
writecom_12864(0x01);
display_12864(1,0," ·┭ 闹钟设置· ");┮
while(confirm==1)
{
displayDigital_12864(2,2,Nhour);
display_12864(2,3,"时");
displayDigital_12864(2,4,Nminute);
display_12864(2,5,"分");
if(menu==0)
delayms(10);
if(menu==0)
{
bell1();
while(menu==0);
flag++;
displaypicture_12864(0,0,kong,64,128);
}
if(flag%2==1)
{displaypicture_12864(16,2,yi,16,16);}
if(flag%2==0)
{displaypicture_12864(16,4,yi,16,16);}
if(dec==0)
delayms(15);
if(dec==0)
{
bell1();
while(dec==0);
if(flag%2==1){if(Nhour==0)Nhour=24;Nhour--;}
if(flag%2==0)
{if(Nminute==0)Nminute=60;Nminute--;}
}
if(add==0)
delayms(15);
if(add==0)
{
bell1();
while(add==0);
if(flag%2==1){Nhour+
+;if(Nhour==24)Nhour=0;}
if(flag%2==0){Nminute+
+;if(Nminute==60)Nminute=0;}
}
}
displaypicture_12864(0,0,kong,64,128);
writecom_12864(0x01);
flag=0;
}
}
}
//displaypicture_12864(0,0,kong,64,128);
//writecom_12864(0x01);
}
uchar bellscan()
{
if(ReadHour_1302()==Nhour)
{
if(ReadMinute_1302()==Nminute)
{
bell1();
return 1;
}
}
else
return 0;
return 2;
}
#include"main.h"
#include"delay.h"
#include"bell.h"
void bell1()
{
bell=0;
delayms(500);
bell=1;
}
void bell2()
{
bell=0;
delayms(100);
bell=1;
delayms(100);
bell=0;
delayms(200);
bell=1;
delayms(200);
bell=0;
delayms(400);
bell=1;
delayms(400);
bell=0;
delayms(800);
bell=1;
delayms(800);
bell=0;
delayms(1600);
bell=1;
delayms(1600);
}