电子万年历(数码管显示)

合集下载

数码管显示万年历时钟

数码管显示万年历时钟

数码管显示万年历时钟数码管显示万年历时钟功能介绍一、功能说明:1.整体功能达到了市售电子日历效果,显示内容包括年、月、日、星期、时、分、秒、室温;2.实时时钟芯片采用了两种:DS12C887+和DS1302。

可供学习和使用过程中进行选择;3.数码管控制采用了MAX7219专用扫描驱动芯片,可通过PS/2键盘对数码管的显示亮度进行15级调节;4.电路板上留有PS/2键盘接口,用于调节当前时间、数码管显示亮度、闹铃时间。

这一点和变通电子日历用明显区别,以达到一个有点专业的电子钟的要求;5.电路板上安装有继电器,可作为简单的时间控制(定时控制)或温度控制装置;二、待改进之处:1.可在板上合适的位置增加几个独立按键,日常使用调节更方便些;2.显示内容可增加农历和湿度;3.可以用光敏电阻配合串行A/D转换芯片实现显示亮度的自动调节,以适应环境光线的变化,这样子就更加具有专业性了。

三、PS/2键盘调整说明:1.使用PS2键盘F1进入运行时间设定、F2进入数码管显示亮度设定、F3进入闹铃时间设定、F4启动闹铃、F5关闭闹铃2.按下F1然后依次设定年、月、日、星期、时、分、秒时间信息,中途可以按小键盘区的ENTER键,退出设定状态3.按下F2然后选择小键盘区0-9和字符A-F可设定16级显示亮度,按下选择参数自动恢复走时状态4.按下F3然后依次设定时、分、秒三个闹铃时间参数,设定好任一参数可按小键盘区的ENTER键退出设定状态5.按下F4开启闹铃,继电器吸合其下方工作指示LED点亮,按下F5关闭闹铃,继电器释放同时LED熄灭,如蜂鸣器已经开始闹铃,可按F6或复位键6.按下F1或F2或F3但不想设定任何参数,都可按ESC退出相应的设定状态。

万年历数码管显示设计及键盘控制设计final

万年历数码管显示设计及键盘控制设计final

万年历数码管显示及其键盘控制设计组长:康智勇组员:王辉王玉王天龙付晓蓉2008年08月08日目录前言 (3)一、总体方案设计(方案的对比) (4)二.单元模块设计(设计细节) (5)(一)烧写板 (5)(二) 单片机最小系统板 (7)(三) 4-16译码器驱动数码管控制板 (12)(四) 数码管显示板 (13)(五) 键盘控制板 (14)(六) DS12C887功能板 (14)三、系统功能说明(结果说明) (20)四、设计总结(心得体会) (20)五、改进方案: (21)附录: (22)【参考文献】: (22)【电路原理图】: (23)【程序清单】: (28)【流程图】: (47)【键盘使用说明】 (49)前言目前,计算机技术的发展分为两大分支:通用计算机系统与嵌入式计算机系统。

嵌入式计算机系统是面向测控对象嵌入到应用系统中的计算机系统的统称,而单片机则是一种经典的嵌入式系统。

从广义上讲,将微型计算机的主要功能部件集中在一块单芯片上的微型计算机称为单片机,这一类计算机又称为微控制器MCU(Micro Control Unit)。

由于单片机集成度高、体积小、功能强、速度快、功耗低、抗干扰能力强等优点,它在智能仪器、工业测控、日常生活及家电中等得到了广泛的应用。

万年历的数码管显示及键盘控制就是单片机的开发过程中的一个经典的应用。

在国内市场中存在着很多种不同厂家生产的不同类型的单片机,在本次设计中我们选用Atmel公司MCS-51系列兼容单片机中的AT89S51单片机。

AT89S51单片机是一个低功耗高性能CMOS 8位单片机,40个引脚,片内含4KB Flash ROM和128B ROM,32个外部双向输入输出(I/O)接口,同时内含两个外中断口,两个16为可编程定时计数器,两个全双工串行通信口,它的最大的一个特点就是支持在线更新程序(In System Programmable,ISP)功能。

本设计中除了选用了单片机进行显示和键盘控制外,还需要一个主要的芯片就是美国DALLAS公司的新型时钟日历芯片DS12C887。

带温度显示的万年历_数码管显示(附电路图和源代码)

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。

并能准确计算闰年闰月的显示。

设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。

独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示:程序如下:ReadOneChar(void){unsigned char i=0;// 定义i用于循环unsigned char dat = 0;// 读取的8位数据for (i=8;i>0;i--)//8次循环{DQ = 0;// 拉低DQ总线开始读时序dat>>=1;// dat左移一位DQ = 1; //释放DQ总线if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据)//DQ=0,就跳过dat|=0x80;Tdelay(4);// 延时以完成此次读时序,之后再读下一数据}return(dat); 返回读取的dat}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;//for (i=8; i>0; i--)//{DQ = 0;//DQ = dat&0x01;//Tdelay(5);//延时以完成此次读时序,之后再读下一数据DQ = 1;//dat>>=1;//}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;//Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0x44);// 启动温度转换Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0xBE);// 写指令,读暂存存储器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;//t<<=8;//t=t|a;//tt=t*0.0625;//t= tt*10+0.5;//return(t); //获得0.01°C 的精度并返回}LED数码管的选择LED数码管分为共阴和共阳两种,以利用STC89C51的P0口作为LED显示的数据部分,以P2口的七个口作为显示部分的位选,通过三八译码器和4-16译码器扩展为17位的位选分别接在一个四位数码管和13个数码管的位选部分。

电子万年历的电路原理与设计

电子万年历的电路原理与设计

湖南信息科学职业学院毕业论文(设计)电子万年历电路原理与设计学生姓名:刘文明学号:08120126年级专业:二00八级计算机控制技术专业指导老师:凌双明湖南·长沙提交日期:2011年5月目录摘要 (3)1前言 (3)2设计要求与方案论证 (3)2.1设计要求 (4)2.2系统基本方案选择和论证 (4)2.2.1 显示模块选择方案和论证 (4)2.2.2单片机串口通信的选择方案和论证 (4)3 系统的硬件设计与实现 (5)3.1 电路设计框图 (5)3.1.1万年历显示设计框图 (5)3.1.2液晶显示设计框图 (5)3.1.3单片机之间、电脑单片机联机设计图 (5)3.2 系统硬件概述 (6)3.3主要单元电路的设计 (6)3.3.1万年历单片机主控制模块的设计 (7)3.3.2光控开关模块的设计 (7)3.3.3万年历显示模块的设计 (7)3.3.4温度感应模块的设计 (8)3.3.5串口通信模块的设计 (9)4结束语 (9)参考文献 (10)附录 (10)附录1系统使用说明书 (11)附录2万年历实物图 (12)电子万年历的电路原理与设计作者:刘文明指导老师:凌双明(湖南信息科学职业学院电子信息系2008级计算机控制技术专业,长沙410128)摘要:随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中。

日历是人们不可或缺的日常用品。

但一般日历都为纸制用品,使用不便,寿命不长。

电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。

万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:单片机89C52,串口通信,控制模块,显示模块,发声模块, 12864LCD 液晶1.前言万年历可以显示年、月、日、时、分、秒、星期等,具有日期和时间校准、闰年补偿、温度显示、闹钟、光控开关,秒表等多种功能,万年历串口通信具有电脑一键校准时间,利用电脑联机,设置心情语悟,增加名片等功能。

电子万年历

电子万年历

电子万年历设计摘要随着现代生活节奏的不断加快,时间对于我们每个人来说也越来越重要,我们都需要有工具来度量时间。

电子万年历作为一种应用广泛的日常计时工具,由于它具有读取方便、显示直观、价格低廉等诸多优点,在当代社会中的应用也越来越广泛,大大方便了人们的生活和工作。

本设计是基于单片机技术原理,采用AT89S52单片机芯片作为主控制器,并采用时钟芯片DS1302来实现时钟,通过硬件电路的制作及软件程序的编制,利用单片机的控制作用通过共阳极数码管显示时间,实现显示阳历的年、月、日、星期、时、分、秒以及阴历的月、日的功能,还具有掉电继续计时的功能。

本设计主要由按键模块、显示模块、DS1302时钟模块、AT89S52主控制系统组成,其中按键电路采用3个按键构成独立连接式键盘,显示电路采用19个共阳极数码管构成,并利用74LS164译码器将二进制代码转化为对应的高低电平信号,并利用74LS138芯片来实现数码管的动态选择。

时钟模块采用DS1302芯片,它的使用寿命长、误差小,满足电子万年历需要精确计时的要求。

关键词:AT89S52,DS1302,数码管,译码器THE DESIGN OF ELECTRONIC CALENDARABSTRACTAs the pace of modern life continues to increase,time is becoming more and more important for us. We all need the tools to measure time. As a widely used timing tool, Electronic calendar has many advantages, such as easy to read, direct display and low cost. In modern society, it is becoming more and more extensive and makes our life and work easier.This design is based on principles of single-chip computer, using chip AT89S52 as the core controller and clock chip DS1302 as the clock. By combining the hardware circuits and software programs preparation, using common anode LED to display time under the control of single-chip computer. It can display the date of solar calendar and lunar calendar. It can continue to measure time after power lost.This design consists of four main parts, including key module, display module, DS1302 clock module and AT89S52 master control system. Buttons circuit uses three buttons to make up the independent keyboard. Display circuit consists of 19 common anodes LED. It uses 74LS164 to translate binary code into the corresponding high level signal and uses 74ls138 to choose the corresponding digital tube. The clock module uses clock chip DS1302, DS1302 meets the requirement of accurate timekeeping because of its long service life and small error.KEY WORDS:AT89S52,DS1302,Digital tube,Decoder目录前言 (1)第1章系统设计方案的选择 (3)§1.1电子万年历的设计意义 (3)§1.2 国内外同类设计的发展概况 (3)§1.3 设计要求 (4)§1.4 设计方案的选择与论证 (5)§1.4.1 单片机芯片的选择 (5)§1.4.2 时钟芯片的选择 (5)§1.4.3 显示模块的选择 (6)§1.4.4 键盘模块的选择 (6)§1.5 本设计的最终方案 (6)第2章系统的硬件设计与实现 (7)§2.1 电路设计总框图 (7)§2.2 系统的硬件概述 (7)§2.3 主要单元电路的设计 (8)§2.3.1 AT89S52主控制系统设计 (8)§2.3.2 键盘模块设计 (13)§2.3.3 时钟模块设计 (14)§2.3.4 显示模块的设计 (18)第3章系统的软件设计 (23)§3.1 主程序流程图 (23)§3.2 阳历程序设计 (24)§3.2.1 DS1302初始化 (24)§3.2.2 BCD码转化为十进制子程序 (27)§3.3 时间调整程序的设计 (27)§3.4 阴历程序的设计 (29)§3.4.1 计算阳历天数的程序设计 (29)§3.4.2 阳历转阴历程序 (32)结论 (33)参考文献 (34)致谢 (36)附录 (37)前言在当代繁忙的工作与生活中,时间与我们每个人都有非常密切的关系,每个人都受到时间的影响。

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。

51单片机课程设计——电子万年历

51单片机课程设计——电子万年历

电子万年历的设计学院计算机与控制工程学院专业班级自动化学生姓名指导教师2010年6月25日引言随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。

为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。

第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。

第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。

第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步……我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。

商家生产的电子万年历更从质量,价格,实用上考虑,不断的改进电子万年历的设计,使其更加的具有市场。

本设计主要采用AT89C51单片机作为主控核心,由DS1302时钟芯片提供时钟、LED 动态扫描显示屏显示。

AT89C51单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。

电子万年历源程序

电子万年历源程序

电子万年历源程序IO口程序#include <reg52.h>//*****数码管引脚*****sbit L1 = P2^0;sbit L2 = P2^1;sbit L3 = P2^2;sbit LEDC= P2^3;#define LED_DA TA P0//按键接口定义#define K_Port P2sbit K_D = P3^3; //外部中断1//*****PCF8563接口定义****sbit PCF8563CLK=P1^0;sbit PCF8563SDA=P1^1;// 24c02接口定义sbit E2PCLK=P1^5;sbit E2PSDA=P1^6;//蜂鸣器接口定义sbit BEEP = P1^2主程序#include <main.h>void Delay_1ms(unsigned int time){unsigned char temp;while(time--)for(temp=127;temp>0;temp--)_nop_();}//系统初始化void Sys_Init(){TMOD=0x01;TH0=(65535-20000)/256;//给定时器初值。

TL0=(65535-20000)%256;TR0=1;//启动定时器T0ET0=1;//允许T0中断EA=1;LEDC=0; //138正常工作Beep_Flag=1;//闹铃开}//刷新数码管显示void Fresh_Display(){static unsigned char Num;unsigned char temp;static unsigned int Flash_Time;Num++;if(Num>=8)Num=0;LED_DATA=0x00; //P0口全部为零if(Num==0){L3=1;L2=1;L1=1; //第八个数码管亮}else if(Num==1){L3=1;L2=1;L1=0;//第七个数码管亮}else if(Num==2){L3=1;L2=0;L1=1;//第六个数码管亮}else if(Num==3){L3=1;L2=0;L1=0;//第五个数码管亮}else if(Num==4){L3=0;L2=1;L1=1;//第四个数码管亮}else if(Num==5){L3=0;L2=1;L1=0;//第二个数码管亮}else if(Num==6){L3=0;L2=0;L1=1;//第一个数码管亮}else if(Num==7){L3=0;L2=0;L1=0;//第零个数码亮}Flash_Time++;LED_ON=0xff;if(Flash_Time<200){LED_ON=~Flash_Number;}else if(Flash_Time>400)Flash_Time=0;temp=(1<<Num);if( ( LED_ON & temp)>0 ){if((Beep_Flag==1)&&(Num==0))LED_DATA=Dis_Tab[Dis_Buffer[Num] ]+0x20;elseLED_DATA=Dis_Tab[Dis_Buffer[Num] ];}elseLED_DA TA=0x00;}void Test_Ring() //这个函数有什么作用?{unsigned char i,temp_m,temp_h;temp_m=(F8563RWBuff[2]>>4)*10+(F8563 RWBuff[2]&0x0f); //分temp_h=(F8563RWBuff[3]>>4)*10+(F8563R WBuff[3]&0x0f); //时for(i=0;i<5;i++){if((temp_m==Ring_Buffer[i][0])&&(tem p_h==Ring_Buffer[i][1])){Ringing=1;//Ring_Buffer[i][1]和Ring_Buffer[i][0]break;}elseRinging=0;}}//定时器0 2.5ms中断void Timer0()interrupt 1{static unsigned char key_Down_Time; TH0=(65535-2500)/256;TL0=(65535-2500)%256;Fresh_Display(); //动态扫描数码管if(K_D==0) //扫描按键{key_Down_Time++;if(key_Down_Time>3){Key_Value=K_Port>>5;if(Key_Bak==10) //对于前一次按键值,怎么处理?{Key_Flag=1;//置按键标志位。

基于单片机的数码管万年历

基于单片机的数码管万年历

.c文件#include<reg52.h>#include<intrins.h>#include<1302.h>#include<18B20.h>#include<nl_week.h>uchar code digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x8f,0x00}; uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;uchar count=0;uchar nz;sbit SET=P3^7;sbit ADD=P3^6; //增加sbit RED=P3^5; //减小sbit CANL=P3^4;sbit le=P2^6;sbit oe=P2^7;sbit en=P1^4;sbit beep=P2^4;void delay1ms( int x){unsigned char i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}void display_Year(unsigned char year) //显示年{unsigned char i,j;i=year/10;j=year%10;P0=digit[2];P1=0;delay1ms(2);P0=digit[0];P1=1;delay1ms(2);P0=digit[i];P1=2;delay1ms(2);P0=digit[j];P1=3;delay1ms(1);}void display_Month(unsigned char month) //显示月{unsigned char i,j;i=month/10;j=month%10;P0=digit[i];P1=4;delay1ms(3);P0=digit[j];P1=5;delay1ms(1);}void display_Day(unsigned char day) //显示日{unsigned char i,j;i=day/10;j=day%10;P0=digit[i];P1=6;delay1ms(3);P0=digit[j];P1=7;delay1ms(1);}void display_Hour(unsigned char hour) //显示时{unsigned char i,j;i=hour/10;j=hour%10;P0=digit[i];P1=8;delay1ms(2);P0=digit[j]+n*0x80;P1=9;delay1ms(1);}void display_Minute(unsigned char minute) //显示分{unsigned char i,j;i=minute/10;j=minute%10;P0=digit[i];P1=10;delay1ms(3);P0=digit[j];P1=11;delay1ms(1);}void display_Week(void){unsigned char i=0;WEEK=GetWeekFromDay(years,months,days); P1=12;switch(WEEK){case 1:P0=digit[1];// P1=12;delay1ms(2);break;case 2:P0=digit[2] ;// P1=12;delay1ms(2);break;case 3:P0=digit[3];// P1=12;delay1ms(2);break;case 4:P0=digit[4];// P1=12;delay1ms(2);break;case 5:P0=digit[5];// P1=12;delay1ms(2);break;case 6:P0=digit[6];// P1=12;delay1ms(2);break;case 7:P0=digit[8];// P1=12;delay1ms(2);break;}}void display_Time(void) //显示实时时间{unsigned char value;value=ReadSet1302(0x83);minutes=(((value&0x70)>>4)*10+(value&0x0f));display_Minute(minutes);value=ReadSet1302(0x85);hours=(((value&0x70)>>4)*10+(value&0x0f));display_Hour(hours);value=ReadSet1302(0x87);days=(((value&0x70)>>4)*10+(value&0x0f));display_Day(days);value=ReadSet1302(0x89);months=(((value&0x70)>>4)*10+(value&0x0f));display_Month(months);value=ReadSet1302(0x8D);years=(((value&0xf0)>>4)*10+(value&0x0f));display_Year(years);display_Week();}/*****************时间调整部分*********************/void hourset(void) //调时{unsigned char timevalue,hour;delay1ms(500); //防止多次触发WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302timevalue=ReadSet1302(0x85); //读取此时的数值hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){hour++;delay1ms(100);while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){hour--;delay1ms(100);if(hour==0) hour=23;while(RED==0);}}if(hour>=24) hour=0;timevalue=(((hour)/10)<<4|(hour%10));WriteSet1302(0x84,timevalue);delay1ms(2);display_Hour(hour);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void minuteset(void) //调分{unsigned char timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){minute++;if(minute>=60) timevalue=0;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){minute--;if(minute==0) minute=59;delay1ms(300);while(RED==0);}}if(minute>=60) minute=0;timevalue=((minute/10)<<4|(minute%10));WriteSet1302(0x82,timevalue);delay1ms(2);display_Minute(minute);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void yearset(void) //调年{unsigned char datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){year++;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){year--;delay1ms(100);while(RED==0);}}datevalue=((year/10)<<4|(year%10));WriteSet1302(0x8c,datevalue);delay1ms(5);display_Year(year);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void monthset(void) //调月{unsigned char datevalue,month;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){month++;if(month>12) month=1;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){month--;delay1ms(100);if(month==0) month=12;while(RED==0);}}datevalue=((month/10)<<4|(month%10));WriteSet1302(0x88,datevalue);delay1ms(5);display_Month(month);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void dayset(void) //调日{unsigned char datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(10);if(ADD==0){day++;if(day>31) day=1;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){if(day==0) day=31;day--;delay1ms(300);while(RED==0);}}datevalue=((day/10)<<4|(day%10));WriteSet1302(0x86,datevalue);delay1ms(5);display_Day(day);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void TimeSet(void) //时间调整函数{display_Time();if(SET==0){delay1ms(20);if(SET==0){ while (!SET) ;mode++;delay1ms(20);switch(mode){case(1):{hourset(); delay1ms(20);} break;case(2):{minuteset();delay1ms(20);} break;case(3):{yearset();delay1ms(20);} break;case(4):{monthset();delay1ms(20);} break;case(5):{dayset();delay1ms(20 );} break;}if(mode==6) mode=0;}}}/***************显示温度模块********************/unsigned char flag;/*********************显示温度整数部分*************************/ void Display_Integer(unsigned char x){unsigned char s,g;s=x%100/10;g=x%10;P0=digit[s];P1=13;delay1ms(3);P0=digit[g];P1=14;delay1ms(3) ;P0=digit[10];P1=15;delay1ms(1);}void display_Temperature(void){ReadyreadDS18B20();TL=ReadDS18B20();TH=ReadDS18B20();if((TH&0XF8)!=0X00){flag=1;TL=~TL;TH=~TH;TL+=1;if(TL>255) TH+=1;TN=TH*16+TL/16;// TD=(TL%16)*10/16;}TN=TH*16+TL/16;// TD=(TL%16)*10/16;Display_Integer(TN);}/**************** 设置模块******************/ void Set(void){if(SET==0){delay1ms(5);if(SET==0){delay1ms(50);while (!SET) ;while(1){TimeSet();if(CANL==0){break;}}}}}void InitTimer0(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0x0B0;EA = 1;ET0 = 1;TR0 = 1;}/***************主函数**********************/ void main(){int i;P0=0;// beep=0;InitTimer0();InitTimer0();IntDS1302(); //初始化DS1302delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1){for (i=1000;i>0;i--){Set( );display_Time( );Display_Integer(TN);if(hours==7||hours==8||hours==9||hours==10||hours==11||hours==12||hours==14||hours==15||hours==16||hours==17||hours==18||hours==19||hours==20||hours==21||hours==22||hours==23){if(minutes==0x00){uchar value;value=ReadSet1302(0x81);seconds=(((value&0x70)>>4)*10+(value&0x0f));if(seconds>0&&seconds<2)beep=0;else beep=1;}}}display_Temperature();}}void t0() interrupt 1{TH0 = 0x3C;TL0 = 0x0B0;count++;if(count==10){n=0;}if(count==20){ count=0;n=1;}}.h文件/*******DS1302模块*************/#define uchar unsigned char#define uint unsigned intsbit SCLK=P2^0; //DS1302时钟输入sbit DATE=P2^1; //DS1302数据输入sbit REST=P2^2; //DS1302复位端口void delaynus(unsigned char n) //延时若干微秒{unsigned char i;for(i=0;i<n;i++);}void Write1302(unsigned char date)//向1302写数据{unsigned char i;SCLK=0;delaynus(2);for(i=0;i<8;i++){DATE=date&0x01;SCLK=1;delaynus(2);SCLK=0;delaynus(2);date>>=1;}}void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据{REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);Write1302(date);SCLK=1;REST=0;}unsigned char Read1302(void) //读取1302数据{unsigned char i,date;delaynus(2);for(i=0;i<8;i++){date>>=1;if(DATE==1) /////////////////////////////////////date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);}return date;}unsigned char ReadSet1302(unsigned char cmd)//根据命令读取1302相应的值{unsigned char date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;}void IntDS1302(void) //DS1302初始化{unsigned char flag;flag= ReadSet1302(0x81);if(flag&0x80) { //判断时钟芯片是否关闭WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((0/10)<<4|(0%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((0/10)<<4|(0%10))); //根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((0/10)<<4|(0%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写年寄存器命令字,写入年的初始值// WriteSet1302(0x90,0xa5); //打开充电功能选择2K电阻充电方式WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令}}sbit DQ=P2^3;unsigned char time;void delayms(unsigned char x){ unsigned char i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}/**********************DS18B20初始化****************************/ bit IntDS18B20(void){bit temp;DQ=1;for(time=0;time<2;time++);DQ=0;for(time=0;time<200;time++);DQ=1;for(time=0;time<10;time++);temp=DQ;for(time=0;time<200;time++);return temp;}/**************************读DS18B20**********************/ unsigned char ReadDS18B20(void){unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;_nop_();DQ=1;for(time=0;time<2;time++);dat>>=1;if(DQ==1)dat=dat|0x80;elsedat=dat|0x00;for(time=0;time<10;time++);}return dat;}void WriteDS18B20(unsigned char date){unsigned char i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;DQ=date&0x01;for(time=0;time<10;time++);DQ=1;for(time=0;time<1;time++);date>>=1;}for(time=0;time<4;time++);}/*******************为读取温度做好准备************************/ void ReadyreadDS18B20(void){IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0X44);IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0XBE);}// 计算2000~2099年任一天星期几 // year : 00-99 // month: 01-12 // day : 01-31unsigned char GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day) {if( month == 1 || month == 2 ) {month += 12; if( year> 0 ) year--; elseyear = 4; }// 返回星期几(星期一用1表示,而星期天用7表示)return 1+(( day + 2*month + 3*(month+1)/5 + year + year/4 ) %7); }///////////////////////////////////////////////////////////////////////////////以上程序 你懂得////////////////////////////////////////////1234567ab cd ef g 8dp9GND a bf cg de dp 时1234567ab cd ef g 8dp9GNDa bf cg de dp 分1234567a b cd ef g 8dp9GNDa b f c g d e dp WEE K1234567a b cd e f g 8d p9G N Dabf cg de d p1234567ab cd ef g 8dp9GNDa b f c gde dp 温度1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 1234567ab cd ef g 8dp9GND a bf cg de dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 月1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 日1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 年1234567a b cd ef g 8dp9GNDa b f c g d e dp A B C D E F G DPA B C D E F G DP A B C D E F G DP A B C D E F G DPA B C D E F G DPA B C D E F G DPW1W2W3W4W5W6W7W8W9W10W11W12W13W14W15W16A B C D E F G DPDP G F E D C B AVcc21X12X23GND 4RST 5I/O6SCL K 7Vcc8DS1302EA/VPP 31XT AL119XT AL218RST /VPD 9P3.7/RD 17P3.6/WR 16P3.2/INT 012P3.3/INT 113P3.4/T 014P3.5/T 115P1.0/T 1P1.1/T 2P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN29AL E/PROG30P3.1/T XD 11P3.0/RXD 10Vcc 40Gnd20STC89C52RE SETRE DSETADDCANL10K2001K30pf 10uf 30pf10uf10ufOC 1C 111D 22D 33D 44D 55D 66D 77D 88D91Q 192Q 183Q 174Q 165Q 156Q 147Q 138Q1274HC573A 23B 22C 21D20G118G21901122334455667788991010111112121313141415151674LS15412MHz 32768HzVCCA B C D E F G DPP2_6P2_7P2_7P2_6VCC3V8550BUZZE RVCCV C C3D Q2G N D1DS18b20VCCW1W2W3W4W5W6W7W8W9W10W11W12W13W14W15W16VCC仅供参考 谢谢合作另外本人还有 中断刷屏的万年历程序 包含时间显示阴历农历 温度显示功能 实物也制作出来 !!。

电子万年历(数码管显示)

电子万年历(数码管显示)

程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC#define start 0x44#define readdata 0xBEsbit dq=P1^7;sbit w1=P0^6;sbit w2=P0^5;sbit w3=P0^4;sbit w4=P0^7;sbit wela=P0^3;sbit A=P0^0;sbit b=P0^1;sbit C=P0^2;sbit SCLK=P1^0; //DS1302通讯线定义sbit DIO=P1^1;sbit RST=P1^2;sbit k1=P1^6;sbit k2=P1^5;sbit add=P1^4;sbit sub=P1^3;uchar code smgw[]={0,1,2,3,4,5,6,7};uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//uchar code tab[]={0x077,0x12,0x0c7,0x0d3,0x0b2,0x0f1,0x0f4,0x13,0x0f7,0x0b3,0x00}; uchar temperature[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code xingqi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f};uchar tab1[9];uchar tab2[9];uchar nian,yue,ri,zhou,shi,fen,miao,a,shan,tt,shan;uchar knum;uchar q,j,tempp;void display();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=55;y>0;y--);}void delay1(int useconds){int s;for(s=0;s<useconds;s++);}uchar resetds(void){uchar presencesignal;dq=0;delay1(30);dq=1;delay1(3);presencesignal=dq;delay1(30);return presencesignal;}void writebit(char val){ dq=0;if(val==1)dq=1;elsedq=0;delay1(5);dq=1;}void writebyte(char val) {uchar i;uchar temp;for(i=0;i<8;i++){temp=val>>i;temp&=0x01;writebit(temp);}delay1(5);}uchar readbit(void) {uchar i;dq=0;dq=1;for(i=0;i<3;i++)return dq;}uchar readbyte(void) {uchar i;uchar value=0;for(i=0;i<8;i++) {if(readbit())value|=0x01<<i;delay1(7);}return (value);}void temper(){uchar get[9];uchar k,lsb,msb,n;int m;float t;m=0;resetds();writebyte(jump_ROM);writebyte(start);delay1(5);resetds();writebyte(jump_ROM);writebyte(readdata);display();for(k=0;k<9;k++){get[k]=readbyte();}msb=get[1];lsb=get[0];if((msb&0x80)!=0) // /取补码/ {m=1;msb=~msb;lsb=( ~lsb)+1;if(lsb==0){msb++;}}display();n=lsb;msb=msb<<4;lsb=lsb>>4;tempp=msb|lsb;n=n&0x0f;t=(float )(n);t=t*0.0625;j=(int)(t*100);P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;}void write(uchar date) //写入DS1302一个字节{uchar temp,i;RST=1;SCLK=0;temp=date;for(i=0;i<8;i++){SCLK=0;if(temp&0x01)DIO=1;elseDIO=0;SCLK=1;temp>>=1;}}uchar read() //读出DS1302一个字节{uchar a,temp;RST=1;for(a=8;a>0;a--){temp>>=1;SCLK=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();SCLK=0;if(DIO){temp=temp|0x80;}else{temp=temp|0x00;}}return (temp);}void write_1302(uchar add,uchar dat) //写DS1302数据{RST=0;SCLK=0;RST=1;write(add);write(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //读DS1302数据{uchar dat1,dat2;RST=0;SCLK=0;RST=1;write(add);dat1=read();SCLK=1;RST=0;dat2=dat1/16; //数据进制转换dat1=dat1%16;dat1=dat1+dat2*10; //十六进制转十进制return(dat1);}void ds1302_init() //1302初始化{RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写入write_1302(0x80,0x00);//设置初始值SECwrite_1302(0x82,0x59);//设置初始值MINwrite_1302(0x84,0x23);//设置初始值HRwrite_1302(0x86,0x20);//设置初始值DA TEwrite_1302(0x88,0x4);//设置初始值MONTH write_1302(0x8A,0x03);//设置初始值DAYwrite_1302(0x8C,0x12);//设置初始值YEARwrite_1302(0x8e,0x80);}void display(){ P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;miao=read_1302(0x81); //读秒fen=read_1302(0x83); //读分shi=read_1302(0x85);//&0x3f; //读时ri=read_1302(0x87); //读日yue=read_1302(0x89); //读月nian=read_1302(0x8d); //读年zhou=read_1302(0x8B); //读星期if(knum==7){wela=0; //年A=0;b=1;C=1;P2=0x5b&shan;delay(2);A=1;b=1;C=1;P2=0x3f&shan;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10]&shan;delay(2);A=1;b=0;C=0;P2=smgd[nian%10]&shan;delay(2);}else{wela=0; //年A=0;b=1;C=1;P2=0x5b;delay(2);A=1;b=1;C=1;P2=0x3f;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10];delay(2);A=1;b=0;C=0;P2=smgd[nian%10];delay(2);}if(knum==6){ wela=1;A=0;b=1;C=0; // 月P2= smgd [yue/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [yue%10]&shan;delay(2);}else{ wela=1;A=0;b=1;C=0; // 月P2=smgd [yue/10];delay(2);A=1;b=1;C=0;P2= smgd [yue%10];delay(2);}if(knum==4){ wela=1;A=0;b=1;C=1; // 星期P2=xingqi[zhou%10]&shan;delay(2);}else{A=0;b=1;C=1; // 星期P2=xingqi[zhou%10];delay(2);}if(knum==5){wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [ri%10]&shan;delay(2);}else{ wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10];delay(2);A=1;b=0;C=1;P2= smgd [ri%10];delay(2);}if(knum==3){ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10]&shan;delay(2);A=1;b=0;C=0;P2= smgd [shi%10]&shan;delay(2);}else{ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10];delay(2);A=1;b=0;C=0;P2= smgd [shi%10];delay(2);}if(knum==2){ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [fen%10]&shan;delay(2);}else{ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10];delay(2);A=1;b=1;C=0;P2= smgd [fen%10];delay(2);}if(knum==1){ wela=0;A=0;b=0;C=1; // 秒P2= smgd [miao/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [miao%10]&shan;delay(2);wela=1;A=1;b=1;C=1;}else{ wela=0;A=0;b=0;C=1; //秒P2= smgd [miao/10];delay(2);A=1;b=0;C=1;P2= smgd [miao%10];delay(2);wela=1;A=1;b=1;C=1;}}void key(){uchar temp;display();if(k1==0){delay1(20);if(k1==0){while(!k1);knum++;if(knum==8){knum=1;}}}if(k2==0){delay1(20);if(k2==0){while(!k2);knum--;if(knum==0){knum=7;}}}if(knum!=0){if(add==0){delay1(20);if(add==0){while(!add);switch(knum){case 1: miao++;if(miao==60){miao=0;}temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);write_1302(0x8e,0x80); //打开写保护break;case 2:fen++;if(fen==60)fen=0;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);write_1302(0x8e,0x80); //打开写保护}break;case 3: shi++;if(shi==24){shi=0;}temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);write_1302(0x8e,0x80); //打开写保护break;case 5:ri++;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==32)ri=1;break;case 4:case 6:case 9:case 11:if(ri==31)ri=1;break;case 2:if(nian%4==0||nian%400==0){if(ri==30)ri=1;}elseif(ri==29)ri=1;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);write_1302(0x8e,0x80); //打开写保护break;case 4:zhou++;if(zhou==8)zhou=1;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue++;if(yue==13)yue=1;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp);write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))+1;if(nian==99)nian=0;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}if(sub==0){delay1(20);if(sub==0){while(!sub);switch(knum){case 1: miao--;if(miao==-1)miao=59;temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);//write_1302(0x80,((miao/10)<<4)+((miao%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 2:fen--;if(fen==-1)fen=59;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);//write_1302(0x82,((fen/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护}break;case 3:shi--;if(shi==-1)shi=23;temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);//write_1302(0x84,((shi/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 5:ri--;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==0)ri=31;break;case 4:case 6:case 9:case 11:if(ri==0)ri=30;break;case 2:if(nian%4==0||nian%400==0){if(ri==0)ri=29;}else{if(ri==0)ri=28;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);//write_1302(0x86,((ri/10)<<4)+((ri%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 4:zhou--;if(zhou==0)zhou=7;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue--;//yue=(((yue>>4)&0x01)*10+(yue&0x0f))-1;if(yue==0)yue=12;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))-1;if(nian==-1)nian=99;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}}}}void main(){ds1302_init();IT0=1;EX0=1;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shan=0x00;temper();while(1){temper();for(q=0;q<230;q++)key();display();}}void int0() interrupt 0{TR0=~TR0;knum=0;shan=0x0ff;}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==9){tt=0;shan=~shan;}}。

基于51单片机的数码管万年历

基于51单片机的数码管万年历

宜宾学院物理与电子工程学院课题论文单片机(期末)课程设计题目:基于51单片机的数码管万年历院(系):物理与电子工程学院专业年级: 2012级硕勋励志班指导老师:****名:***学号: *********2014年6月目录摘要 (2)第一章绪论 (3)1、1 万年历的背景 (3)1、2 万年历的应用 (4)第二章设计原理 (5)第三章实现过程 (6)3、1 方案选择 (6)3、2 系统框图 (6)3、3 说明 (6)3、4 电路模块说明 (7)3、5 软件设计模块 (8)3、5、1 万年历的算法 (8)3、5、2 时间处理 (9)3、5、3 日期处理 (10)第四章最终结果 (11)第五章收获与体会 (13)5、1 设计过程中遇到的问题及解决方法 (13)5、2 收获与体会 (13)致谢 (14)参考文献 (15)摘要随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。

现在所使用的万年历,即:包括若干年或适用于若干年的历书。

万年只是一种象征,表示时间跨度大。

本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。

利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。

关键字:51单片机、万年历、数码管、动态显示、定时/计数T0第一章绪论1、1 万年历的背景万年历是我国古代传说中最古老的一部太阳历。

为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。

相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。

一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。

可是,天阴雨雾,影响测量。

后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。

基于FPGA的多功能电子万年历

基于FPGA的多功能电子万年历

基于FPGA的多功能电子万年历电子万年历可以显示日期、星期、时间以及其他的一些信息。

近几年,随着FPGA技术的发展,基于FPGA的电子万年历已经被广泛使用。

基于FPGA的电子万年历除了具备传统电子万年历的基本功能外,还具有诸多的优点。

采用FPGA做万年历,集成度高、抗电磁干扰性能好、可编程性强,且易于扩展。

本文将主要讲述基于FPGA的多功能电子万年历的设计原理、实现细节以及相关应用。

设计原理基于FPGA的多功能电子万年历主要由FPGA芯片、时钟模块、数码管显示模块以及按键扫描模块组成。

1.FPGA芯片:大体上分为输入、输出、内存和运算4个部分。

通过采用FPGA芯片可以实现逻辑门的优化布局和资源分配,从而实现万年历的多种功能。

2.时钟模块:利用时钟模块产生震荡脉冲,驱动万年历的各种操作。

时钟模块还可以产生各种频率的时钟信号,如秒钟、分频、时钟、日历等,从而实现多种功能。

3.显示模块:显示模块主要通过数码管来显示日期、星期、时间等信息。

具体实现方法是将数码管的数码码表和时序参数存储在内存中,通过编程控制数码管的显示方式,实现数据的输出。

4.按键扫描模块:按键扫描模块主要通过扫描键盘来接受用户的输入,并根据用户的操作控制万年历的功能。

实现细节基于FPGA的多功能电子万年历的实现细节主要包括万年历的功能实现、按键扫描和电路部署。

1.万年历的功能实现多功能电子万年历主要支持年、月、日的日期显示、星期显示、时间显示、时钟多种功能。

具体实现方法是每秒读取系统时间,并将时间转换成5V逻辑电平数据,然后通过编程控制数码管的显示方式,实现数据的输出。

2.按键扫描按键扫描模块主要通过接收按下按键后输出电平并进行数值编码,与计算机进行数值比对,然后根据用户的操作控制万年历的功能。

比如,按下设置键后,进入设置模式,按一次将秒数置零,按2次进行月日年设置,按3次进行时间设置,按4次重新返回当前时间界面。

3.电路部署电路部署主要包括FPGA芯片与其他模块、模块与模块之间的连接。

51单片机电子万年历设计带有proteus仿真

51单片机电子万年历设计带有proteus仿真

湖南文理学院课程设计课程名称:单片机课程设计设计题目:电子万年历教学院部:电气与信息工程学院专业班级:自动化09101班指导教师:张晓虎(学生姓名:邵泽学号: 0120完成时间: 2012 年6月12日报告成绩:{摘要:电子万年历是一种非常广泛日常计时工具,对现代社会越来越流行。

它可以对年、月、日、周日、时、分和秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。

对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。

该电路采用AT89C52单片机作为核心,功耗小,能在3V的低压工作,电压可选用3到5V电压供电。

万年历的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89C52单片机,液晶显示电路,复位电路,时钟电路,稳压电路电路以及串口下载电路等组成。

在单片机的选择上使用了AT89C52单片机,该单片机适合于许多较为复杂控制应用场合。

显示器使用液晶LCD1602。

软件方面主要包括日历程序、液晶驱动程序,显示程序等。

程序采用汇编语言编写。

所有程序编写完成后,在Keil C51软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

关键词时钟电钟,DS1302,液晶LCD1602,单片机Abstract:…Electronic calendar is a very extensive daily timing tool for modern society is more and more popular. It can be to year, month, day, Sunday, when, minutes, and seconds for the time, also has a leap year compensation and other functions, and the DS1302 long service life and small error. For digital electronic calendar using intuitive digital display, can also shows that year, month, day, Sunday, when the information such as, minutes and seconds, still have time calibration etc. Function. The AT89C52 single chip microcomputer as circuit adopts core, power consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 to 5 V voltage power supply. The design process of the calendar in the hardware and software design of synchronization. Mainly by AT89C52 single chip microcomputer hardware part, liquid crystal display circuit, reset circuit, clocking circuit on the circuit circuit and serial download circuit etc. The processor on the choice of the single chip microcomputer AT89C52 use, the single chip microcomputer suitable for many more complex control applications. Use of liquid crystal display LCD1602. Software is mainly including calendar program, liquid crystal driver, show program, etc. Program using assembly language. All programming, after the completion of Keil C51 software in commissioning, make sure no, after Proteus software embedded in within the singlechip microcomputer simulation.Key words DianZhong clock, DS1302, liquid crystal LCD1602, microcontroller目录1设计要求与方案论证 (3)设计要求 (3)系统基本方案选择和论证 (3)单片机芯片的选择方案和论证 (3)"时钟芯片的选择方案和论证: (4)电路设计最终方案决定 (5)2系统的硬件设计与实现 (5)电路设计框图 (5)系统硬件概述 (5)主要单元电路的设计 (5)单片机主控制模块的设计 (6)时钟电路模块的设计 (6)}显示模块电路 (7)串口下载电路 (8)复位电路 (9)稳压电路 (10)3系统的软件设计 (11)程序流程框图 (11)子程序的设计 (11)读写DS1302子程序 (11)】读写LCD1602子程序 (12)4软件测试及分析 (14)分析与结论 (14)调试分析 (14)调试和结论 (15)5总结 (15)1设计要求与方案论证设计要求—①能够显示年、月、日、时、分。

数码万年历

数码万年历

数码万年历是采用独立芯片控制内部数据运行,以LED夜光数码显示日期、时间、星期、节气倒计,以及温度等日常信息,糅合了多项先进电子技术及现代经典工艺打造的现代数码计时产品。

数码万年历分类一、以LED显示方式1、静态显示:静态的每一位数码管是一直处于通电状态,只需输入一个新的信号就会更新旧的数据并显示2、动态显示:动态的每一位数码管在新数据输入之前是处于断电状态,当输入一个新的信号后再给所需点亮的数码管通电方能点亮显示,其他的数码管以同样的方式在短时间内依次扫描点亮。

二、以时间显示方式1、数字式:日期、时间、星期、节气倒计、温度等显示全部为LED数码管;2、数字、指针混合式:日期、星期、节气倒计、温度等信息以LED数码管显示,时间部分以指针显示三、以外观方式1、全数码显示万年历:以LED夜光数码显示日期、时间、星期、节气倒计,以及温度等日常信息,无附加信息2、带画面数码万年历:除以LED夜光数码显示日期、时间、星期、节气倒计,以及温度等日常信息,糅合了多项先进电子技术及现代经典工艺,带有艺术画面的产品。

数码万年历正常工作的基本要求1、工作电压:万年历在a.c.(220+33)v或a.c.(110+17)v的电压范围内不应停走,显示正常2、工作温度:万年历在-10℃——50℃的温度范围内不应停走,显示正常。

数码万年历的选购1、从产品外观工艺方面在选购数码万年历时,首先从产品的外观着眼,产品有无缺陷和破损(例如玻璃和底壳等),面版印刷是否整洁、有光泽,线条是否清晰;显示窗口有无明显的异物遮挡等;2、其次从产品标识方面产品标识是指表明产品的名称、产地、生产者名称、地址、产品的质量状况、保存期限、使用说明等信息情况的表述和指示,产品标识的标注不当或者标注带有欺骗性的标识,会给用户、消费者造成误解,给他人以不便,严重的还会造成侵权损害,引起产品质量责任纠纷。

所以,消费者在选购产品时一定要注意看产品标识。

3、从产品认证方面当今的消费者在购买令人放心的商品时。

万年历ds1302

万年历ds1302

1 引言随着微电子技术和超大规模集成电路技术的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,单片微型计算机体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域得到了广泛的应用。

电子万年历是一种应用非常广泛的日常计时工具,数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用。

LED数字显示的日历钟显示清晰直观、走时准确、可以进行夜视,并且还可以扩展出多种功能。

功能也越来越齐全,除了公历年月日、时分秒、星期显示及闹铃。

但通过我们对各种电子钟表、历的不断观察总结发现目前市场的钟、历都存在一些不足之处,比如:时钟不精确、产品成本太高、无环境温度显示等,这都给人们的使用带来了某些不便。

为此设计了一种功能全面、计时准确、成本低廉的基于51单片机的万年历。

2 功能要求1. 万年历能用数码管显示阳历年、月、日、星期、[小]时、分、秒并设置指定时间的闹铃。

2. 数字式温度计要求测温范围-50~100°C,LED数码管直读显示。

3 方案论证与设计3.1 控制部分的方案选择1. 用可编程逻辑器件设计。

可采用ALTERA公司的FLEX10K系列PLD器件。

设计起来结构清晰,各个模块,从硬件上设计起来相对简单,控制与显示的模块间的连接也会比较方便。

但是考虑到本设计的特点,EDA在功能扩展上比较受局限,而且EDA占用的资源也相对多一些。

从成本上来讲,用可编程逻辑器件来设计也没有什么优势。

2. 用凌阳16位单片机设计。

凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。

它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。

I/O口功能也比较强大,方便使用。

用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。

这些都方便对设计进行扩展,使设计更加完善。

成本也相对低一些。

但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高。

电子万年历

电子万年历

绪论近年来,电子技术和计算机应用领域不断扩大,单片机技术已经成为电子技术领域中的一个新的亮点;电子产品已应用到各个行业,电子产品也逐步人性化,以各种方式显示出来,非常醒目,让人一下就能感受到这是个电子产品。

单片机不仅体积小、成本低、可靠性高,而单片机还易于扩展,控制功能很强,使用灵活,很容易构成各种规模的应用系统,目前单片机在各个领域中都得到了广泛的应用。

MCS---51系列单片机以其优越的性能,成熟的技术及高可靠性和性能价格比迅速占领了工业测控和智能化等领域,成为国内单片机应用的主流。

万年历设计是用单片机通过外接扩展电路及必要的通道接口构成的计算机应用系统。

由于时钟芯片的出现可以将芯片与单片机结合起来,通过单片机对芯片的控制可以使走时更加的准确,也可以直接通过单片机的编写达到以上效果。

现在的单片机发展相当迅速,进而万年历所显示的功能也越来越多从而使使用的人更加方便。

对于设计者来说采用单片机来实现万年历的各种功能主要是因为单片机集成度体积小、有很高的可靠性。

单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力正是如此才使设计者能够更多的实现万年历的功能扩展。

本设计的主要设计思想是通过设计硬件控制电路和软件控制程序,从而实现能够正确地显示某年某月某日某时某分某秒,万年历应具有校时功能,定时功能,报时功能。

可能除了上边的功能还有其他的功能,如果需要还可以不断的向上加功能。

在万年历电子表的上面还有调整时间和定时用的几个功能键(复位键、选择位键、各个位数值的增大和减小两个键等)硬件控制电路主要用了80S51芯片处理器、74LS164移位寄存器、LED显示器等。

根据各自芯片的功能互相连接成万年历电子表的控制电路。

软件控制程序主要有主控程序、万年历电子表的时间控制程序。

主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是万年历电子表中比较重要的部分。

多功能电子万年历

多功能电子万年历
闹钟音量调节
用户可以根据自己的需求,调节闹 钟的音量大小,确保及时唤醒。
温度显示功能
01
02
03
温度传感器
多功能电子万年历内置温 度传感器,可以实时显示 室内温度,方便了解室内 环境温度情况。
温度单位切换
用户可以根据自己的需求 ,在摄氏度与华氏度之间 自由切换温度显示单位。
温度预警
根据用户设定的温度范围 ,多功能电子万年历可以 发出预警声音或提示信息 ,提醒您注意温度变化。
课外活动安排
多功能电子万年历可以记录学生 的课外活动安排,如社团活动、 义工活动等,方便学生合理安排 时间。
学习备忘录
多功能电子万年历可以作为学生 的学习备忘录,记录学习笔记、 心得体会等,方便学生随时回顾 和总结。
06
产品未来展望
技术创新方向
智能化升级
引入人工智能技术,实现万年历的语音交互 、智能推荐等功能,提升用户体验。
功能丰富
除了基本的日期和时 间显示外,还具备闹 钟、计算器、备忘录 等多种实用功能。
易于操作
配备触摸屏或按键操 作,简单易懂,方便 用户使用。
耐用性强
采用高品质材料制造 ,经久耐用,适合家 庭和办公场所使用。
产品的重要性
提高生活品质
多功能电子万年历可以提醒用 户重要日期和时间,避免错过
重要事件,提高生活品质。
计时的时间范围。
倒计时提醒
02
在倒计时结束之前,多功能电子万年历会发出提醒声音或提示
信息,避免错过重要时刻。
倒计时进度显示
03
多功能电子万年历会实时显示倒计时的剩余时间,让您可以随
时掌握时间进度。
03
产品使用说明
操作界面说明
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC#define start 0x44#define readdata 0xBEsbit dq=P1^7;sbit w1=P0^6;sbit w2=P0^5;sbit w3=P0^4;sbit w4=P0^7;sbit wela=P0^3;sbit A=P0^0;sbit b=P0^1;sbit C=P0^2;sbit SCLK=P1^0; //DS1302通讯线定义sbit DIO=P1^1;sbit RST=P1^2;sbit k1=P1^6;sbit k2=P1^5;sbit add=P1^4;sbit sub=P1^3;uchar code smgw[]={0,1,2,3,4,5,6,7};uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//uchar code tab[]={0x077,0x12,0x0c7,0x0d3,0x0b2,0x0f1,0x0f4,0x13,0x0f7,0x0b3,0x00}; uchar temperature[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code xingqi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f};uchar tab1[9];uchar tab2[9];uchar nian,yue,ri,zhou,shi,fen,miao,a,shan,tt,shan;uchar knum;uchar q,j,tempp;void display();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=55;y>0;y--);}void delay1(int useconds){int s;for(s=0;s<useconds;s++);}uchar resetds(void){uchar presencesignal;dq=0;delay1(30);dq=1;delay1(3);presencesignal=dq;delay1(30);return presencesignal;}void writebit(char val){ dq=0;if(val==1)dq=1;elsedq=0;delay1(5);dq=1;}void writebyte(char val) {uchar i;uchar temp;for(i=0;i<8;i++){temp=val>>i;temp&=0x01;writebit(temp);}delay1(5);}uchar readbit(void) {uchar i;dq=0;dq=1;for(i=0;i<3;i++)return dq;}uchar readbyte(void) {uchar i;uchar value=0;for(i=0;i<8;i++) {if(readbit())value|=0x01<<i;delay1(7);}return (value);}void temper(){uchar get[9];uchar k,lsb,msb,n;int m;float t;m=0;resetds();writebyte(jump_ROM);writebyte(start);delay1(5);resetds();writebyte(jump_ROM);writebyte(readdata);display();for(k=0;k<9;k++){get[k]=readbyte();}msb=get[1];lsb=get[0];if((msb&0x80)!=0) // /取补码/ {m=1;msb=~msb;lsb=( ~lsb)+1;if(lsb==0){msb++;}}display();n=lsb;msb=msb<<4;lsb=lsb>>4;tempp=msb|lsb;n=n&0x0f;t=(float )(n);t=t*0.0625;j=(int)(t*100);P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;}void write(uchar date) //写入DS1302一个字节{uchar temp,i;RST=1;SCLK=0;temp=date;for(i=0;i<8;i++){SCLK=0;if(temp&0x01)DIO=1;elseDIO=0;SCLK=1;temp>>=1;}}uchar read() //读出DS1302一个字节{uchar a,temp;RST=1;for(a=8;a>0;a--){temp>>=1;SCLK=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();SCLK=0;if(DIO){temp=temp|0x80;}else{temp=temp|0x00;}}return (temp);}void write_1302(uchar add,uchar dat) //写DS1302数据{RST=0;SCLK=0;RST=1;write(add);write(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //读DS1302数据{uchar dat1,dat2;RST=0;SCLK=0;RST=1;write(add);dat1=read();SCLK=1;RST=0;dat2=dat1/16; //数据进制转换dat1=dat1%16;dat1=dat1+dat2*10; //十六进制转十进制return(dat1);}void ds1302_init() //1302初始化{RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写入write_1302(0x80,0x00);//设置初始值SECwrite_1302(0x82,0x59);//设置初始值MINwrite_1302(0x84,0x23);//设置初始值HRwrite_1302(0x86,0x20);//设置初始值DA TEwrite_1302(0x88,0x4);//设置初始值MONTH write_1302(0x8A,0x03);//设置初始值DAYwrite_1302(0x8C,0x12);//设置初始值YEARwrite_1302(0x8e,0x80);}void display(){ P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;miao=read_1302(0x81); //读秒fen=read_1302(0x83); //读分shi=read_1302(0x85);//&0x3f; //读时ri=read_1302(0x87); //读日yue=read_1302(0x89); //读月nian=read_1302(0x8d); //读年zhou=read_1302(0x8B); //读星期if(knum==7){wela=0; //年A=0;b=1;C=1;P2=0x5b&shan;delay(2);A=1;b=1;C=1;P2=0x3f&shan;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10]&shan;delay(2);A=1;b=0;C=0;P2=smgd[nian%10]&shan;delay(2);}else{wela=0; //年A=0;b=1;C=1;P2=0x5b;delay(2);A=1;b=1;C=1;P2=0x3f;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10];delay(2);A=1;b=0;C=0;P2=smgd[nian%10];delay(2);}if(knum==6){ wela=1;A=0;b=1;C=0; // 月P2= smgd [yue/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [yue%10]&shan;delay(2);}else{ wela=1;A=0;b=1;C=0; // 月P2=smgd [yue/10];delay(2);A=1;b=1;C=0;P2= smgd [yue%10];delay(2);}if(knum==4){ wela=1;A=0;b=1;C=1; // 星期P2=xingqi[zhou%10]&shan;delay(2);}else{A=0;b=1;C=1; // 星期P2=xingqi[zhou%10];delay(2);}if(knum==5){wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [ri%10]&shan;delay(2);}else{ wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10];delay(2);A=1;b=0;C=1;P2= smgd [ri%10];delay(2);}if(knum==3){ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10]&shan;delay(2);A=1;b=0;C=0;P2= smgd [shi%10]&shan;delay(2);}else{ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10];delay(2);A=1;b=0;C=0;P2= smgd [shi%10];delay(2);}if(knum==2){ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [fen%10]&shan;delay(2);}else{ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10];delay(2);A=1;b=1;C=0;P2= smgd [fen%10];delay(2);}if(knum==1){ wela=0;A=0;b=0;C=1; // 秒P2= smgd [miao/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [miao%10]&shan;delay(2);wela=1;A=1;b=1;C=1;}else{ wela=0;A=0;b=0;C=1; //秒P2= smgd [miao/10];delay(2);A=1;b=0;C=1;P2= smgd [miao%10];delay(2);wela=1;A=1;b=1;C=1;}}void key(){uchar temp;display();if(k1==0){delay1(20);if(k1==0){while(!k1);knum++;if(knum==8){knum=1;}}}if(k2==0){delay1(20);if(k2==0){while(!k2);knum--;if(knum==0){knum=7;}}}if(knum!=0){if(add==0){delay1(20);if(add==0){while(!add);switch(knum){case 1: miao++;if(miao==60){miao=0;}temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);write_1302(0x8e,0x80); //打开写保护break;case 2:fen++;if(fen==60)fen=0;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);write_1302(0x8e,0x80); //打开写保护}break;case 3: shi++;if(shi==24){shi=0;}temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);write_1302(0x8e,0x80); //打开写保护break;case 5:ri++;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==32)ri=1;break;case 4:case 6:case 9:case 11:if(ri==31)ri=1;break;case 2:if(nian%4==0||nian%400==0){if(ri==30)ri=1;}elseif(ri==29)ri=1;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);write_1302(0x8e,0x80); //打开写保护break;case 4:zhou++;if(zhou==8)zhou=1;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue++;if(yue==13)yue=1;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp);write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))+1;if(nian==99)nian=0;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}if(sub==0){delay1(20);if(sub==0){while(!sub);switch(knum){case 1: miao--;if(miao==-1)miao=59;temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);//write_1302(0x80,((miao/10)<<4)+((miao%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 2:fen--;if(fen==-1)fen=59;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);//write_1302(0x82,((fen/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护}break;case 3:shi--;if(shi==-1)shi=23;temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);//write_1302(0x84,((shi/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 5:ri--;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==0)ri=31;break;case 4:case 6:case 9:case 11:if(ri==0)ri=30;break;case 2:if(nian%4==0||nian%400==0){if(ri==0)ri=29;}else{if(ri==0)ri=28;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);//write_1302(0x86,((ri/10)<<4)+((ri%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 4:zhou--;if(zhou==0)zhou=7;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue--;//yue=(((yue>>4)&0x01)*10+(yue&0x0f))-1;if(yue==0)yue=12;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))-1;if(nian==-1)nian=99;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}}}}void main(){ds1302_init();IT0=1;EX0=1;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shan=0x00;temper();while(1){temper();for(q=0;q<230;q++)key();display();}}void int0() interrupt 0{TR0=~TR0;knum=0;shan=0x0ff;}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==9){tt=0;shan=~shan;}}。

相关文档
最新文档