• 1.02 MB
  • 34页

单片机三级项目报告

  • 34页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'基于单片机的智能电子钟系统仿真设计(Designan(fSimulationOf^CectronicC^oc^(BasedonSingCe-cfiipSystem教务处2015年10月 基于单片机的智能电子钟系统仿真设计(Designan(fSimulationOf^CectronicC^oc^(BasedonSingCe-cfiipSystem教务处2015年10月 基于单片机的智能电子钟系统仿真设计(燕山大学信息科学与工程学院)摘要关键词:摘要:本课程三级项目是基于MCS-51系列单片机利用Protues软件仿真设计一个简单的电子钟系统。以MCS-51系列单片机为核心,通过吋钟芯片DS1302提供实吋时间数据,通过温度传感器DS18B20提供实时温度数据,通过LCD1602液晶显示屏显示时间温度等信息,以及蜂呜器、指示灯等提供闹钟和上下午、半秒闪烁等信息。我们采用C语言,利用keil软件编写C语言程序并生成HEX文件,用Protues设计电路,将程序在Protues中仿真,最终实现电子钟的设1十。89c51单片机、闹钟报警、Proteus、DS1302、时钟前g本三级项目要求基于MCS-51系列单片机利用Protues软件仿真设计一个具有时间显示、按键调时、闹钟报警、温度测量等功能的电子钟系统。我们对电子钟的开发手段进行了分析,最终决定采川51系列单片机技术实现多功能智能电子钟系统,这种实现方法的优点是电路简单、性能可靠、实时性好、吋间精确、操作简单、编程容易。我们利用Proteus软件进行仿真设汁,这样不用制作实际电路便可以得出结果,便于检验电路及软件正确性,可以为以后制作实际电路做准备。另外这样制作出的电子钟系统以应用到日常工作和生活中,也可以通过改装来提高性能或者进行功能扩充等操作。 该项0预期完成温度实吋测量显示、时间实时显示、可设定闹钟、可调时、上下午指示、半秒指示等功能。1、课程设计题目与要求1.1设计题目基于单片机的简单电子钟系统仿真设计。1.2设计要求要求基于51系列单片机利用Pmuies软件仿真设计一个具有时间显示、按键调时、闹钟报警、温度测量等功能的电子钟系统,可实现六项基本功能分别如下:1)时间显示:显示当前时间:小时、分钟、秒。2)温度显示:显示当前环境温度。3)上下午指示:采用两个发光二极管来指示上下午。4)半秒提示:采用两个发光二极管,每隔半秒闪烁。5)调时功能:采用三个按键(K1-K3)来调整时间,步骤如下:a)按下K1键,开始调小时,同时2个小时数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好后,再按下K1键,开始调分钟,同时分钟数码管闪烁。d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K1键,调时结來。6)闹钟功能:采用三个按键(K2-K4)來调整闹钟,步骤如下:a)按下K4键,开始调小吋,同吋2个小吋数码管闪烁。b)按下K2键,小时加;按下K3键,小时减。c)小时调整好,再按下K4键,开始调分钟,同时分钟数码管闪烁。 d)按下K2键,分钟加;按下K3键,分钟减。e)调整好分钟后,再按下K4键,定闹结束。闹钟定时的时间到后,蜂鸣器/扬声器发出提示音。用户按K2-k4键来収消闹钟警告。2、系统的功能分析与设计2.1系统的主要功能利用51单片机内部的定时/计数器、中断系统、以及按键和时钟芯片DS1302、DS18B20温度传感器、LCD1602液晶显示屏等元件,利用Pmtiies软件仿真设计一个具有时间显示、按键调吋、闹钟报警、温度测量等功能的电子钟系统。2.2系统的设计方案整个系统采川应用广泛的AT89C51作力控制芯片,利用DS1302获収时间,采川DS18B20实现温度的测量,利用LCD1602液晶显示屏显示温度,时间等参数,利用羊片机P、J部的定时器来实现数据的定时刷新。它的处理过程如下:首先初始化定时器以及温度传感器和时钟芯片,设定单片机内部的一个定时器为50ms产生一次中断,对时间和温度参数实现周期性刷新,然后读取温度,将温度值与设置的闹钟值等参数进行比较,并做出相应的动作。然后读収按键值,如果是设置键,则改变标志位,并进入相应项进行设置,若标志位为初始状态,则显示时间及温度参数。在程序屮,定时器采用中断方式工作,在中断服务程序屮实现时间获取、温度获取、上1午判断、闹钟报警、以及半秒闪烁等功能。在主程序中需要对定时器、DS1302、DS18B20、LCD1602进行初始化,然后循环进行按键检测并执行相应的功能。2.3系统硬件设计2.3.1原理框图此设计原理框阁如下图所示,此电路包括以下九个部分:单片机,时钟电路,测温电 路,按键电路,LED指示灯,复位电路,晶振电路,显示电路及蜂鸣器。单片机晶振电路单片机复位电路时钟芯片DS1302蜂鸣器图2-3-1电子钟系统硬件电路组成框图2.3.2Proteus电路图设计我们利用Proteus软件进行电路仿真。Proteus软件不仅具有其它EDA工具软件的仿真功能,而且还能仿真单片机及外围器件。是0前比较好用的仿真单片机及外围器件的工具。下阁为我们设计的简单电子时钟的电路仿真阁。 图2-3-2Proteus中设计的电子时钟系统原理图3、系统模块设计3.1主控模块AT89C51AT89C51是美国Atmel公司生产的低功耗,高性能CMOS八位单片机。片闪ROM全部采用FLASHROM技术,片内含4KB的可系统编程的Flash只读程序存储器,器件采用Atmel公司的高密度、非易失性存储技术生产,完全兼容Intel公司生产的MCS-51系列单片机的指令系统及引脚。 1918929303712345678>XTAL1P0.0/AD0P01/AD1P0.2/AD2XTAL2P03/AD3P0.4/AD4P05/AD5P0.6/AD6RSTP0.7/AD7P2.0/A8P2.1/A9P2.2/A10PSENP2.3/A11ALEP2.4/A12EAP2.5/A13P2.6/A14P2.7/A15P1.0/T2P3.0/RXDP1.1/T2EXP3.1/TXDP1.2P3.2/INT0P1.3P3.3/INT1P1.4P3.4/T0P1.5P3.5/T1P1.6P3.6/WRP1.7P3.7/RDAT89C523837363534333221222324252627281011121314151617图3+1AT89C51单片机3.2时钟模块我们采用DS1302实现时间显示,DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V〜5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的吋钟信号或RAM数据。DS1302内部有一个31X8的用于临时性存放数据的RAM寄存器。芯片引脚及在系统屮连接如下图 图3-2-1.DS1302芯片接线图3.3温度显示模块此模块我们采用DS18B20温度传感器,它是美国DALLAS公司推出的DS系列数字温度传感器,每一个DS18B20包括一个唯一的64位长的序号,该序号值存放在DS18B20内部的ROM(只读存储器)中,开始8位是产品类型编码(DS18B20编码均为10H),接着的48位是每个器件唯一的序号,最后8位是前面56位的CRC(循环冗余校验)码,DS18B20中还有用于贮存测得的温度值的两个8位存储器RAM,编号为0号和1号,1号存储器存放温度值的符号,如果温度为负,则1号存储器8位全为1,否则全为0;0号存储器用于存放温度值的补码,LSB(最低位)的1表示0.5,将存储器中的二进制数求补再转换成十进制数并除以2就得到被测温度值(-55°〜125°)。芯片引脚及在系统屮连接如下图图3-3-1DS18B20芯片接线图 3.43.4.1复位、指示灯和按键模块复位电路复位电路主要由型号为10uF的电解电容和220的电附以及微动开关构成,当开关按下时引脚RST为高电平1,断开时引脚为低电平0。系统中S位电路连接如下图图3-4-1位电路3.4.2半秒显示和上下午显示电路指示灯电路主要由四个发光二极管组成,低电平有效,灯的亮灭显示控制端,P3.0口控制上午指示灯,P3.1口控制下午指示灯,P3.6口控制前半秒指示灯,P3.7口控制后半秒指示灯。由于二极管压降小,承受电流能力弱。所以加上一个1K的限流电阻,防止二极管被烧坏。系统中指示灯电路连接如下图D1图3-4-2指示灯电路3.4.3按键电路吋钟、力[I、减、闹钟键分别接P3.2、P3.3、P3.4、P3.5端,时钟键(Kl)选择设置的 年、月、日、时、分、秒、星期,闹钟键(K4)对闹钟的定时的时、分、秒进行设置,加键(K2)对选屮的项的数据加1,减键(K3)对选屮的项的数据减1。系统中按键电路连接如下图3.5闹钟模块此模块我们利用扬声器电路力系统闹钟部分的发声部分,采用灌电流的方式,省去了外加驱动的麻烦,同时能够获得更大的驱动功率。扬声器电路连接如下图Lsi-5O-UM--••••••图3-5H扬声器电路 4、软件设计4.1主程序设计在主程序中首先初始化定时器以及时钟芯片和温度传感器,没定单片机内部的一个定时器为50ms产生一次中断,以便对时间和温度参数实现周期性刷新。然后读取按键值,如果是设置键,则改变标志位,并进入相应的项进行设置,若标志位为初始状态,则显示吋间及温度参数。主程序流程阁:图4-1-1系统程序流程图4.2定时器中断子程序设计定时器每隔50ms产生一次屮断,调用一次屮断子程序。程序首先获取温度、时间、然后将计数器伉加1,判断计数器依是否等于1(),如果等于则清空计数器并将半秒指示灯取 反。然后判断时间是否等于定时时间,如果等于则使蜂鸣器响,否则关闭蜂鸣器。然后判断是否为下午,如果为下午,则关闭上午指示灯,打开下午指示灯,否则关闭下午指示灯打开上午指示灯,之后返回主程序。图4-2-1为中断子程序流程图。 阁4-2-1中断子程序流程阁 5、系统调试5.1软件调试KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(UVision)将这些部分组合在一起。如果使用C语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会使得编程效率大大提高。KeilC51进行程序编写调试1=1FileEditViewProjectDebugFlashPeripheralsToolsSVCSWindowHelpie)HE):□Target1B"63SourceGroup1因STARTUP.A5.[3[±]chengxu.c匿IFilesUJS三]典遒昼级mia也沏奶魯逾豳夂▲XS|T-S.t1-d*2dpinclude#includc♦defineucharunsignedchar"宏走义♦defineuincunsignedint♦definechann^cenp60sbirTenp_char3iing-PlA1;abitLCDwi=P2*0:"定义下无通过LCDWR来操作P2*0C,1602读写迭择期sbizLCDRST=P2*1;//定义选5ft推寄存《送指令寄存器控考abitLCDEN-P2*2;//定义下无遶过LCDD】来磉作?2、2匚,1602液品使峙挖制qsbirDS1302IOP1*7;"定义DS1302数括总线sbizDS1302_RST-PlA5;//DS1320a:fe3biZDS1302二SCLi<=P11;//定义时钤总线sbirBUTTCN_TIME_SET-P31;//SJtSQabitBUTTCN二TIME二PLU5=P3A2;//定义汤对按钽sbitBUTTON_TIME_DEOP3*3;//定义确定按aabitBU7TCNJTIM::KG-P3"4;//定义设*闹钟按确定按SsbirDQ=P1*O;//定义D518B20通笮均口abitACC0-ACC*0;sbitACC7=ACC^7;sbirBELL-P3*7;abitAM=P2*3;3bizPM=P2*4;abitOUT-P3-0;//定义OUT掩出增口charKl_HumrK2」Iura,K4_Nu»,flagl,flag2tSET_KO(JRrSET_MI!lUTEfminute,hour,second,day,monthsyear,wee记:ucharcodeCalendar(]•{"2014-•};//要写入1602液存阅提ucharcodeCLOCK_LCD1602[]={-SETCLOCKTIME"};ucharcodeCLOCK1_LCD1602[]-(":"};ucharcodeCalendar1[]=("::.•};//麥思入1602液托日历数括ucharcodeCalendar^[]=("Css一two一nuzn一one!");•IIBuildtarget"Target1"linking...ProgramSize:dota=32.0xdoto=0code=3832creatinghexfilefromHshanjixiangm1"..."shanjixiangm"-0Error(s),0Warning(s).图5-1-1软件调试图在软件调试上既没有错误也没有警告,说明我们的程序没有语法错误,逻辑问题需要进行软硬件联调仿真后可知 5.2Proteus进行系统仿真在ProteusISIS的Debug菜单屮选择Execute,运行程序,系统仿真结果如下阁所示:图5-2-1系统联调仿真结果图实验结果基本按照预期实现要求,在系统的显示中我们没有利用数码管,而是利用LCD1602进行显示。虽然LCD1602驱动起来更加麻烦,但它显示的字符多,而且清晰,功能较为齐全,所以我们使用LCD1602进行显示。6、设计总结经过儿周时间对单片机的知识学习及总结,通过该项目的实施使我们加深对单片机基础知识的理解,并初步具备运用所学知识进行电子钟系统设计的能力,相关标准、手册的查阅能力等,通过团队合作与沟通,培养我们的责任感和团队合作精神,以及项hl组织与管理、交流表达能力。 在此过程中我们把项目分成了硬件和软件两大模块分工合作。硬件部分好入手,电路也较简单,主要涉及的是简单的核心电路以及DS1302、DS18B20、LCD1602电路,连接起来并不复杂。整个设计过程中遇到的最大问题是软件的编写,软件部分细分为了时钟芯片驱动程序、温度传感器驱动程序、显示模块驱动程序等儿大难点,最后把儿个模块整合在主程序模块屮,最终实现了电子时钟的功能。在此次过程中,我们将在课程中学到的理论知识运用到实际作品设计、操作屮,更进一步地熟悉了单片机芯片的结构及掌握了其工作原理和具体的使用方法与相关元器件的参数计算方法、使用方法,了解了电路的开发和制作及课程设计报告的编写。加深了对相关理论知识及专业知识的掌握度,增强自身的动手能力,锻炼及提高了理解问题、分析问题、解决M题的能力,更深刻的体会到了理论联系实际的重要性,在整个设计过程屮还学到了团体合作精祌和分析、解决问题的重要性。7参考文献[1]黄正谨.综合电子设计与实践[M].东南大学出版社.2002-3[2]张毅刚《新编MSC-51单片机应用设计》,哈尔滨工业大学岀版社,2003[3]蔡希彪,曹洪奎;单片机电子时钟系统的设计与仿真[.1];屮国科技信息;2007年04期[4]杨欣等,《电子设计从零开始》,清华大学出版社,2005[5]胡汉才单片机原理及其接口技术[M].北京:清华大学出版社,1996.89〜110. 8程序#includc”rcg52.h”#include"intrins.h"#include"math.h"#defineucharunsignedchar#defineuintunsignedint#defineLCD.DBPO//LCD1602液品数据/地址引脚sbitLCD_RS=P2A0;//LCD1602读shitLCD_RW=P2A1;//LCD1602写sbitLCDJSN=P2A2://LCD1602使能sbitDSA=PIA3;//DS18B20温度传感器引脚//吋钟芯片引脚定义sbitIO=PiA0;sbitSCLK二Pl八1;sbitRST=PIA2;//独立按键引脚定义sbitKcy_Choscn=P3A2;sbitKEY„ADD=P3A3;sbitKEY_SUB=P3A4;sbitKey_Alarm=P3A5;//第0位第八位位操作sbitACC0=ACC八0;sbitACC7=ACC八7;//报聱指示引脚定义sbitRed=P3A6;//半秒指示灯sbitGreen=P3A7;sbitled_red=P3A0;//上下午指示灯sbitled_green=P3Al;sbitBeep=PlA4;//闹钟//时钟芯片寄存器定义#definewrite_second0x80#definewri(e_minute0x82#definewrite_hour0x84#dcfincwritc_day0x86#definewrite—month0x88#definewrite_week0x8a#definewrite.year0x8ccnumKEYSTART//按键状态{KEY一DOWN,KEY一UP,};enuniKEYCONFIG//按键键伉KEYJNIT,KEY_YEAR,KEY.MONTH,KEY一DAY,KEY_WEEK,KEY—HOUR,KEY_MINTH,KEY.ALARH,KEY一ALARM,/冰冰氺冰冰冰氺冰氺冰冰冰氺冰攻攻冰冰冰冰冰攻冰冰冰攻冰攻冰攻冰攻冰攻冰冰冰攻y氺氺**氺氺氺氺氺*氺*氺*氺*氺氺氺*氺*氺氺氺***氺氺**氺*氺氺*/uintTempVal=0,num=0,flag=0;//定义温度仍变呈ucharYcarData=0,MonthData=0,DayData=0,WeckData=0,Hour0£仙=0^“川比03山=0,八1£1117114=0,人1217111^1=0;//定义闹钟变帝:ucharmiao=0,shi=0,fen=0,ri=0,yue=0,nian=0,week=0;//〉i£义时间变量 冰冰本华冰冰本华本华冰冰本华奉奉冰冰冰冰冰奉冰冰冰奉冰奉冰奉冰奉冰奉冰冰冰奉M&伞本农本本本本申伞氺伞氺伞氺伞本本申伞氺伞本本申孝本氺本本孝本氺伞本本伞氺, voidDelayus(uintn)//@12MHz品振,n微秒精确软件}延吋fvoidLCD_wdata(uchardat)//LCD1602写数据函数1uinti=0;iDelayus(lOO);for(i=n;i>0;i-)LCD_RS=1;{LCD_RW=0:』op」);LCD一EN=1;_nop_();LCD一DB=dat;-nop_();Delayus(lOO);-nop.O;LCDJEN=0;}IDelayus(lOO);i1voidDelayms(intn)//@12MHz晶振,n奄秒精确软IvoidLCD_disp_ehar(ucharx,uchary,uchar件延吋fdat)//LCD1602写字符函数X:0~15Y:l,211inti,j;ucharaddrcss=O;for(i=n;i>0;i-){if(y==Daddress=()x8()+x;i=12;elsej=!69;address=Oxc(Hx;doLCD_wcmd(address);{LCD_wdata(dat);while(—j);}}while(—i);voidLCD_disp_str(ucharx,uchary,uchar*str)//LCD1602}1写一串字符X:0〜15Y:l,2f1y*H:****.t*****.t****.t.*****.t.***********.t.L(20J6O2|^|Iucharaddrcss=O;**********************************/if(y==l)voidLCD_wcmd(uchardat)//LCD1602写命令函数address=0x80+x;{elseDelayus(lOO);address=OxcO+x;LCD_RS=0;LCD_wcmd(address);LCD_RW=0;whiIe(*str!=,O,)LCD_EN=1;{LCDJDB二dat;LCD_wdata(*str);Delayus(l00);str++;LCD_EN=0;}Delayus(K)O);} voidLCD_init(void)//LCD1602液品初始化{Delayus(lOO);LCD.wcmd(0x38);Delayus(lOO);LCD一wcmd(OxOc);Delayus(100);LCD一wcmd(0x06);Delayus(lOO);LCD_wcmd(0x01);Dclayms(1);}氺***氺*氺***氺*氺氺氺**氺氺*氺**氺氺*氺氺氺氺氺*g响数部分*******************************/voidDS18B20_Dclay(uintn)〃温度传感器最小单位延时{inti=0,j=0;for(i=n;i>():i--)forG=120;j>0;j-);}voidDS18B20_Reset()//温度传感器复位操作{inti=0;DSA=0:i=103;while(i>0)i--;I)SA=1;i=4;while(i>0)}bitDS18B20_Readbit()//读温度传感器一位数据信息uinti=();bitdat=O;DSA=0;i++;DSA=1;i++;i++:dat=DSA;i=8;while(i>0)i--;return(da();}ucharDS18B20_Read()//读温度传感器八位数据信总{uchari=O,j=O,dat=();for(i=l;i<=8:i++){j=DS18B2(LReadbit();dat=(j«7)|(dat»l);}return(dat);}voidDS18B20_Writebyte(uchardat)"写温度传感器八位数据信息{uinti=0;ucharj=0;bittestb=O;for0=l;j<=8;j++){testb=dat&OxOI;dat=dat»l;if(testb)//写1{DSA=();i++;i++;DSA=1; i=8:whilc(i>0)i—;}else{DSA=O;//写0i=8;while(i>0)i--;DSA=I;i++;i++;}}}voidDSI8B2(LChange()//温度转换{DS18B20—ResetO;DS18B20—Delay(l);DS18B20一Writebyte(Oxcc);DS18B20_Writebyte(0x44);}uintDS18B20_Get()〃读取温度寄存器转换数倨{floattt=O;uchara=0.b=0;uinttempA=();DS18B20—Reset();DS18B20_Delay(l);DS18B20一Writebyte(Oxcc);DS18B2O_Writebyte(Oxbe);a=DS18B20_Read();b=DS18B20_Read();tempA=b;tempA«=8;tcmpA=tcmpA|a;tt=tempA:J:0.0625;tcmpA=tt*IO+O.5;returntcinpA;,»木**•冰•木冰•木•冰•木冰**冰冰冰冰**冰-»»»冰**1片闲*******************************/voidDS1302_wbytc(uchardat)//写时钟芯片八位数据信息uchara=0;ACC=dat;RST=1;for(a=8;a>0;a-){IO=ACCO;SCLK=0;SCLK=I;ACC=ACC»1;ucharDSI3O2_rbyte()//读吋钟芯片八位数据信息uchara=0;RST=I;for(a=8;a>0;a—)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC»1;return(ACC);}voidDS1302_write(ucharadd,uchardat)//在时钟芯片指定位置写指定数据{RST=O;SCLK=0; RST=1;DS1302.wbytc(add);DS1302_wbyte(dat);SCLK=1;RST=O;}ucharDS1302_read(ucharadd)//读収时钟芯片指定地址的数据信总{uchartemp;RST=O;SCLK=O;RST=1;DS1302_wbyte(add);temp=DS1302_rbyte();SCLK=1;RST=O;return(temp);}ucharBCD_Decimal(ucharbed)//时钟芯片数据转换{ucharDecimal;Decimal=bcd»4;return(Decimal=DecimaH:10+(bcd&=0x0F));}voidDS1302_Init()//时钟芯片初始化操作{rsp=o;SCLK=0;DS1302_write(0x8e,0x00);DS1302_write(0x8e,0x80);}voidDS1302_Set(ucharaddress,uchartemp)//设锐时钟芯片参数信息{uchartmp=0;tmp=temp/10;tcmp=tcmp%IO:temp=temp+tmp*16;DS1302—write(0x8E,0X00);DS1302_write(address,temp&0x7f);DS1302_write(0x8E,0x80);}voidDS13()2_Ge(Time()//提取时钟芯片时间信总{miao=BCD.Decimal(DS1302_read(0x81));fen=BCD一Decimal(DS1302一read(Ox83));shi=BCD_Dccimal(DSI302_rcad(0x85));ri=BCD_Decimal(DS1302_read(0x87));yue=BCD—Decimal(DS1302_read(0x89));nian=BCD_Decimal(DS1302—read(0x8d));wcck=BCD^Dccimal(DSI302_rcad(0x8b));}/冰冰氺冰冰冰氺冰氺冰冰冰氺冰氺氺冰冰冰冰冰氺冰冰冰氺冰氺冰氺冰MlMMl水水*本水水水水水*水*水*水*水水水*水*水水水氺氺氺水水voidshow_Data()//年月Id信息显示{uchardis_Data[161={0};disJData[0>2";disJDatafl]=•()•;dis_Data[2]=(nian/10)+0x30;disJData[3]=(nian%10)+0x30;disj)ata[4f;dis_Data[5]=(yue/10)+0x30;dis_Dah46J=(yue%1())+0x30;disJ)ata|7|=*-dis.Data[8J=(ri/10)+0x30;dis一Data[91=(ri%10)+0x30;dis一DaMW;dis一DataflfW;disJData[12]=126;dis一Data[13J=’<;disJData[15]=’>*; LCD_disp_str(0,1,dis.Data);DS13O2_Set(write—year,YearData):voidshow_Time(void)"时分秒温度信息显示{uchardis_Time|16|={0};dis一Time[01=M;disJTime[1l=(shi/l0)+0x30;dis_Time[2]=(shi%10)+0x30;dis_Time^3]=^:,;disJTime[4]=(fen/10)+0x30;dis.Timel5J=(fen%l0)+0x30;dis一Time|6|=7;dis_Time[7J=(miao/10)+0x30;dis_Timef8]=(miao%10)+0x30;dis一Time|9|=’’;dis.Time[l01=TempVaV100+,0,;dis.Timcl11|=TcmpVal%100/10十’()•;dis—Time[12]=?;dis一Timel13J=TempVaI%lO+V;dis.Time[14]=223;disJTimelOC’;LCD.disp^st^O^Jis.Time);y*氺斗m氺氺斗m氺氺氺氺斗n氺斗•氺斗n氺斗氺斗氺氺氺*##@Hl^j#氺寒本本本水水寒本本垵水水寒本本本垵水寒水本水本本本本本水本本yfvoidSct_Year()//设S年参数YearData=DSl302_read(0x8D);YearData=(YearData»4)*10+(YearData&OxOf);if(KEY一SUB==K卜:YJ)0WN){Delayus(500);if(KEY一SUB==KEY一DOWN)while(KEY_SUB==KEY.DOWN);if(YearData<=0)YcarData=I;if(KEY_ADD==KHY_DOWN){Delayus(500);if(KEY_ADD==KEY_DOWN){while(KEY_ADD==KEY_DOWN);if(YearData>=99)YearData=98;YcarData+=l;DS1302_Set(vrite_year,YearData);}}LCD」isp_str(O,I,nSETYEAR”);LCD_disp_char(4,2;2,);LCD-disp_char(5,2/(T);LCD—disp—chai(6,2,YearData/10+0x30);LCD-disp-char(7,2,YearData%10+0x30);}voidSetMonth()//设拽参数{MonthData=DS1302_read(0x89);MonthData=(MonthData»4)*10+(MonthData&0xOf);if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY_SUB==KKY_DOWN){while(KEY_SUB==KEY_DOWN);if(MonthDa(a<=l)MonthData=2;MonthData-=l;YearData-=l;DS1302_Set(write_monlh,MonthData); if(KEY一ADD==KEY_DOWN){Delayus(500);if(KEY_ADD==KEY-DOWN){whilc(KEY_ADD==KEY_DOWN);if(MonthData>=12)MonthData=11:MonthData+=l;DS1302_Set(write_nionth,MonthData);})LCD一disp—str(0,1,••SETMONTH");LCD.disp_char(6,2tMonthData/10+0x30);LCD一disp_char(7,2,MonthData%10+0x30);}voidSetDayO//设罝U参数{DayData二DS1302_read(0x87);DayData=(DayData»4)*10+(DayData&0x0f);if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY-SUB==KEY一DOWN){whilc(KEY_SUB==KEY_DOWN);if(DayData<=l)DayData=2;DayDala-=l;DS1302一Set(write一day,DayData);}}if(KEY_ADD==KEY_DOWN){Delayus(500);while(KEY—ADD==KEY一DOWN);if(DayData>=30)DayData=29;DayData+=l;DS1302—Set(write一day,l)ayl)ata);LCD—disp—str(0,1,••SETDAY••);LCD—disp—char(6,2,DayData/10+0x30);LCD一disp.char(7,2,DayData%10+0x30);voidSetWeekO//设过周期参数{WeekData=DS1302_read(0x8b);WeekData=(WeekData»4)*10+(WeekData&OxOf)if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY一SUB==KEY一DOWN)whiIe(KEY_SUB==KEY_DOWN);if(WeekData<=l)WeekData=2;WeekData-=l;DS1302_Sct(writc_wcckAVcckData);}}if(KEY_ADD==KHY_DOWN)Delayus(500);if(KEY_ADD==KEY_DOWN){while(KEY_ADD==KEY_DOWN);if(WeekData>=7) DS13O2_Set(write_weekAVeekData);WeekData=6;LCD_disp_str(0,1,••SETWEEK••);LCD—disp—char(6,2,WeekData/10+0x30);LCD—disp—char(7,2,WeekI)ata%10+0x30);}voidSetHourO//设贸.小时参数{HourData=DSl302—read(0x85);HourData=(HourData»4)*10+(HourData&0x0f);if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY_SUB==KEY_DOWN){whilc(KEY_SUB==KEY_DOWN);if(HourData<=0)HourData=1;HourData-=l;DS1302^Set(write—hour,HourData);}}if(KEY_ADD==KEY_DOWN){Delayus(500);if(KEY—ADD==KEY—DOWN){while(KEY_ADD==KEY_DOWN);if(HourData>=23)HourData=22;HourData+=I:DS1302_Set(write_hour.HourData);}}LCD—dispj?tr(0,1,••SETHOUR”);LCD_disp_char(6,2,HourData/10+0x30);LCD_disp—char(7,2,HourData%10+0x30);voidSctMinutcO//设置分钟参数{MinuteData=DSl302_read(0x83);MinuteData=(MinuteData»4)*10+(MinuteData&OxOf);if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY_SUB==KEY_DOWN)whiIe(KEY_SUB==KEY_DOWN);if(MinuteData<=0)MinuteData=l;MinuteData-=l;DS1302_Set(write_minute,MinuteData);}}if(KEY—ADD==KEY—DOWN){Delayus(5()0);if(KEY_ADD==KEY_DOWN){whiIe(KEY_ADD==KEY_DOWN);if(MinuteData>=59)MinuteData=58;MinutcData+=l;DS13O2_Sct(writc_rninutc,MinutcData);}>LCD—disp—str(O,l,"SETMINUTE••);LCD_disp.char(6,2,MinuteData/10+0x30);LCD_disp—char(7,2,MinuteData%10+0x30);}voidSetHourAlarmO//设皆闹钟小时参数 Delayus(500);if(KEY_SUB==KEY_DOWN){while(KEY_SUB==KEY_DOWN);if(AlarmH<=0)AlarmH=l;Alarn)H-=I;Delayus(500);if(KEY_ADD==KEY_DOWN){while(K卜:Y_ADI)==KHYJ)OWN);if(AlarmM>=59)AlarmM=58;AlarmM+=l;if(KEY一ADD==KEYJDOWN)Delayus(500);if(KEY_ADD==KEY_DOWN){while(KEY_AI)l)==KKY」)OWN);if(AlarmH>=23)AlarmH=22;AlarmH+=l;LCD_disp_str(0,1,"SETALARMHLCD一disp—char(6,2,AlarmH/l0+0x30);LCD_disp_char(7,2,AlarmH%10+0x30);"设置闹钟分钟参数voidSetMinuteAIarm(){if(KEY_SUB==KEY_DOWN){Delayus(500);if(KEY_SUB==KHY_DOWN){while(KEY_SUB==KEY_DOWN);if(AlarmM<=0)AlarmM=l;AlarmM-=l;LCD_disp—str(O,I,"SETALARMMM);LCD_disp_char(6,2,AIarmM/l0+0x30);LCD—disp_char(7,2,AlarmN4%10+0x30);}氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺氺M本水水水水水水水水水水水水水水水水水水水水水水水水水水水水水水/ucharKeyProcess()//渎取按饼键值{staticucharKeyVai=KEYJNIT;if(Key_Chosen==KEYJDOWN){Delayus(500);if(Key.Chosen==KEY_DOWN){while(Key.Chosen==KEY_DOWN);if(KcyVal>KEY_ALARM-2)KcyVal=KEYJNIT;LCD—disp—str(O,l,NH);LCD-disp一str(0,2,M••);KeyVal++;if(KeyVal>KEY_ALARM-2)KeyVal=KEY_INIT; Delayus(500);if(Key_Alarm==KEY_DOWN) M))elsewhilc(Kcy_Alarm==KEY_DOWN);if(KeyValKEY_ALARM)KeyVal=KEY—ALARM-2;returnKcyVal;氺斗m氺氺斗m氺氺氺氺斗n氺斗•氺斗n氺斗氺斗氺氺氺*Hjj*/J?/J?j{Cj{Cj{Cj{CvoidlnitO//记时器、计数器设S函数TMOD=0x01;//指定定吋川•数器的工作方式为3,5()MSTH0=0x3c;//定吋器TO的高四位=0TL0=0xb0;//定时器TO的低四位=0EA=1;//系统允许有开放的中断ETO=1;//允许T0中断TR0=l;//开启中断,启动定时器IvoidtimcrOOinterruptI//巾断涵数,取得井品示H历和吋间TH0=0x3c;//定吋器TO的高四位=0TL0=0xb();//定时器TO的低四位=()DSI8B20—Change();TempVaI=DSl8B20_Get();DS1302一GetTimeO;num++;if(num==10){Rcd=-flag;Grccn=flag;HourData=DSl302_read(0x85);HourData=(HourData»4)*10+(HourData&0x0f);MinutcData=DSI302_rcad(0x83);MinuteData=(Minu(eData»4)*10十(MinuteData&Ox()f);if((HourData==AlarmH)&&(MinuteData==AlarmBccp=l;//Beep=!Beep;Bccp=O;if(shi>=12){led_red=O;Ied_green=1;}else{lcd_rcd=1;lcd_grccn=O;}}z*************料*科**料**料料料糾始仆咏|数部分...•:.•:.•:.•:.••.•:.•:.•:.•:.•:.•:.•:.•:.•:.•:.•:.•:.••.•:.•:.••J*/voidHandlnit()//外围硬件初始化{LCD_init();DSI302Jnit();Init();Green=0;num=0; flag=〜flag: y.7t•*****■!€■****t:t:******•**•****•**•***J|£****************************yvoidmaine{Handlnhc);whiles{ucharstartchange=KmYJNIT;startchange=Keyprocess(xswhchcstartchange){caseKEYIIZIT:shcWIDatao;ShowlTimeo;brsk;caseKEYIYEAR:selYCJs);break:sctsinutcAlarmo;break;tiefault:break; caseKEYIMOZTX:setsontho;brsk;caseKEYIDAY:SetDayO;break;caseKEYIWEEK:SctWcckO;brsk;caseKEYIHOUK:setH§r();o-reak;caseKEYIN4INTH:setMincteo;hrsk;caseKEYIALAKH:SetHourAlarniO;break;caseKELALA穴M: '