easyeda.com€¦  · web view初次使用easy eda—万年历. 方案介绍:...

80
初初初初 Easy EDA—初初初 本本本本 90C52 本本本 DS1302 本本本本本本本 DS18B20 本 本 本 ,一 12864本 本本本本本 ,,。 本本本本本 AD15 本本本本本本 EasyEDA 本 本本 AD15 本本 EasyEDA 本 本 本 一,。 本本本本本本本本 本本本本 AD 本本本本本 PCB 本本本本本本本 binary 本 本 EasyEDA 本 本本本本本本 ASCii本 本本本 。, AD 本 本 ,: 本本本本本本本 PCB 本本本本 AD 本本本本本本本LOGO 本本本本本本 一。 EasyEDA 本 本 AD 本本本 pcb 本本 ,。 EasyEDA 本本本 AD

Upload: others

Post on 22-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

初次使用 Easy EDA—万年历方案介绍:

本设计以 90C52 为主控,DS1302 时钟芯片为核心,DS18B20 温度检测,制作的一款在 12864 上大数显示时间,并可同步显示阴历,阳历以及实时温度。本方案是基于之前在 AD15 的作品导入到 EasyEDA 中的。

关于 AD15 导入 EasyEDA 中出现的一些小问题,在此简单说明。① 导入文件类型错误:

解决方案:AD 中原理图与 PCB 图都默认保存为 binary 类型的,而在 EasyEDA 中支持导入的是 ASCii 格式。故在导入之前,现在 AD 中打开,将文件另存

为箭头所指:

原理图保存类型 PCB 保存类型

Page 2: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

②AD 中可以用图片加 LOGO 或者用字符串在某一层加入汉字标识。而在EasyEDA 中不能导入图片,可以先在 AD 中生成 pcb,然后导入。再有EasyEDA 不显示 AD 中的汉字。③ 在生成制造文件时,它会提示未设置边界线

解决方案:点击‘层‘中的边框(箭头所指处)然后使用”PCB 工具”中的线在设计的 PCB 板子周围画出一个框(如果在大的视野画,可能看不到画出来线,放大设计区域就可以看到了)。

④ 保存好的项目,再修改信息 如果相对保存好的项目修改信息,需要再图示选中我的项目,找到相应的项目,右键,修改即可。

Page 3: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

原理图总原理图:

PCB 图

Page 4: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

PCB 图后点击照片预览就可以看到模拟的打板后的图,非常形象

设计思路一、系统功能说明 :根据家居生活中的实际需要,万年历应该具有如下功能。 1、时间显示

时间显示是万年历设计最重要的功能。万年历应该不仅能准确显示时、

Page 5: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

分、秒,而且还要能够显示年、月、日和星期。 2、时间调整

万年历在第一次使用时,需要根据当前时间进行时间调整,设定起初始时间,设置完成之后,它会在设定值基础上进行准确的计时和显示。在万年历断电或出现其他故障排除后,也需要根据当前时间进行时间调整。 3、定时闹钟

定时闹钟是万年历的一个辅助功能。可以通过键盘设定定时时间,这样当万年历运行到设定的定时时间时,会发出语音提示,提示时间为 1 分钟。可以根据需要设定闹钟功能的开启和关闭。 4、温度显示

温度显示是万年历的另外一个辅助功能。万年历上设置有一个温度传感器,用于检测环境温度,提示用户注意温度的变化,做好诸如防寒保暖等措施。 5、掉电运行

万年历采用市电或者电池供电。当发生停电或者电池量耗尽等情况时,它通过内置的纽扣电池给时钟供电以保持正确的时钟数据,但关闭其他部分的电源,这样在来电或者更换电池之后不必重新设定时间。在市电运行正常时,可以根据需要更换备用的纽扣电池而不影响时钟运行。

Page 6: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

二、系统方案设计

根据万年历的功能要求和选定的设计方案,设计出如图所示的控制系统结构。

图 万年历系统结构框图

三、程序设计方案1.主程序设计:主程序主要完成系统初始化(包括 I/O口初始化、SD2303 芯片的初始化和DS1722 芯片的初始化)、按键检测和处理、时钟数据的读取和显示、温度数据的读取和显示以及根据条件判断是否需要进行定时报警等工作,以完成人机交互的功能。

Page 7: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

主程序设计流程图2.按键设计按键检测和处理程序位设置时间和闹铃提供人机接口。万年历提供 7 个

独立式的按键接口,通过采集按键的电平状态来检测按键的按下与否。在按键检测程序中提供了延时防抖动功能。按键检测程序只有在检测到“时间设置”键或者“闹铃设置”键被按下后方进入处理程序。处理程序结束的条件为检测到“确认”键被按下。 按键检测程序通过在 12864 上闪烁光标提示正在进行设置的是哪一位数

Page 8: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

据。处理程序提供了对闹铃时间设置的合法性检测,而不提供对时间设置的合法性检测。只有合法的闹铃时间设置方能启动闹铃功能,任何非法的闹铃时间设置将关闭闹铃功能。

按键设计与检测流程图效果图

Page 9: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

物料清单

程序清单/*********************************************

Page 10: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

功能:使用 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);

Page 11: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 12: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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++;

}

Page 13: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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)

Page 14: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

{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)

Page 15: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

{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()

Page 16: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

%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()

Page 17: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

%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()

Page 18: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

%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

Page 19: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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,"四");}

Page 20: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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,"初九");}

Page 21: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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,"廿八");}

Page 22: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

}

Page 23: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

}

/*延时函数*/

#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"

Page 24: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

#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);

Page 25: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 26: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

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; //传输结束}

/*******************************************

单字节地根据命令读数据

Page 27: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

********************************************/

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)

{

Page 28: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);//写上保护

}

Page 29: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

/********************************************

以下是设置时间的函数入口参数为写入的时间值无返回值

********************************************/

/*******给 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 设置月*******/

Page 30: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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 设置时*******/

Page 31: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);//写上保护

}

Page 32: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

/*******给 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);//写上保护}

Page 33: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

/*******************************************

总地址设置(总时间设置)********************************************/

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);

}

/*******************************************

以下是读时间的函数无入口参数出口参数即为读出来处理好的数据(十进制数)

Page 34: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

********************************************/

/*******读年**********/

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码转十进制)

Page 35: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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; //取个位,加上十位,得到完整的数

Page 36: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

(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; //取出十位

Page 37: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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"

Page 38: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

Page 39: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

Page 40: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

}

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;

Page 41: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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>

/****************************************************/

/* 获取当前日期的农历及星期*/

/****************************************************/

/*==================================================*/

Page 42: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

/*公历年对应的农历数据,每年三字节, 格式: */

/*第一字节 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

Page 43: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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

Page 44: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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

Page 45: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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

Page 46: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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)

Page 47: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

/*读取数据表中农历月的大月或小月 ,如果该月大返回 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);

Page 48: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 49: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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; //取当年春节所在的公

Page 50: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

历月份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 日 ,则公历 日离元旦天数 为

Page 51: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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 指向首月

Page 52: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

Page 53: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

Page 54: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

}

Page 55: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

/

********************************************************

********************

算法:日期+年份+所过闰年数+月较正数之和除 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

Page 56: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;

Page 57: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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)

Page 58: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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)

{

Page 59: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 60: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);}

Page 61: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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天

Page 62: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 63: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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||

Page 64: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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)

Page 65: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

{

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)

{

Page 66: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 67: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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;}

}

Page 68: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

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;

}

Page 69: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}

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;

Page 70: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

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);

Page 71: easyeda.com€¦  · Web view初次使用Easy EDA—万年历. 方案介绍: 本设计以90C52为主控,DS1302时钟芯片为核心,DS18B20温度检测,制作的一款在12864上大数显示时间,A

}