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

数码管显示万年历时钟数码管显示万年历时钟功能介绍一、功能说明: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

万年历数码管显示及其键盘控制设计组长:康智勇组员:王辉王玉王天龙付晓蓉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单片机课程设计——电子万年历

电子万年历的设计学院计算机与控制工程学院专业班级自动化学生姓名指导教师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;//置按键标志位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;}}。