2024—2024学年第二学期 电子系统课程设计.docx

上传人:夺命阿水 文档编号:1060614 上传时间:2024-03-12 格式:DOCX 页数:38 大小:563.13KB
返回 下载 相关 举报
2024—2024学年第二学期 电子系统课程设计.docx_第1页
第1页 / 共38页
2024—2024学年第二学期 电子系统课程设计.docx_第2页
第2页 / 共38页
2024—2024学年第二学期 电子系统课程设计.docx_第3页
第3页 / 共38页
2024—2024学年第二学期 电子系统课程设计.docx_第4页
第4页 / 共38页
2024—2024学年第二学期 电子系统课程设计.docx_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《2024—2024学年第二学期 电子系统课程设计.docx》由会员分享,可在线阅读,更多相关《2024—2024学年第二学期 电子系统课程设计.docx(38页珍藏版)》请在课桌文档上搜索。

1、HUBEINORMALUNIVERSITY电工电子实验报告课程名称电子系统课程设计选题名称基于STC89C52单片机设计的万年历选题性质设计性试验学号姓名2024312024243吴朋乌专业名称电子信息科学与技术所在院系物理与电子科学学院完成时间2024年6月25日电工电子中心2024年6月绘制电子系统课程设计综合试验总结报基于STC89C52单片机设计的万年历摘要:本次做的数字钟是以单片机(STC89C52)为核心,用带字库的LCD12864液晶来显示的万年历,并且这个万年历不仅能够显示公历、农历、时间和温度,还能通过蜂鸣器进行报时,同时通过按键还可以调整时间。另外通过Proteus软件进行

2、电路仿真及KEIL编译软件编译程序。本次试验通过Altiumdesigner先设计电路,然后再画印刷电路板(PCB),并将所须要的电子元器件焊接到电路板上,最终再进行调试,直至将所须要的现象展示出来。关键词:单片机STC89C52LCDI2864液晶蜂鸣器Proteus软件KEIL编译软件一.任务解析单片机限制的数字钟的硬件结构与软件设计,给出了单片机C语言源程序。此数字钟是一个将“年”、“月”、“日”,“时”、“分”、“秒”显示于人的视觉器官的计时装置。显示器件选用液晶128640运用独立式按键识别过程,按“时”,“分”,“秒”数据送出显示处理方法。由STC89C51单片机设计的万年历具有以

3、下特点:(1)具有时、分、秒计数显示功能,以24小时循环。(2)液晶12864显示时、分、秒,和日期显示,日期可以显示2000年到2099年,同时还可以显示农历、温度。(3)可以在随意时刻校准时间、日期和星期。通过四个按键可以对时间、日期及星期进行调整,然而要进入调整状态时必需先按设置按键,再进入调整状态,通过按键可以调到标准的时刻。(4)电源指示灯亮灭可以推断电路是否通电,同时还可以通过LCDI2864是否正常显示来推断单片机STC89C51是否正常工作。(5)通过加上两节蓄电池(L5V)给DS1302供电,使得单片机系统能够记住时间,即在断电的状况下,DS1302也能正常运行将时间记住。因

4、此下次上电是不须要再对时间进行调整。(6)可以通过滑动变阻器R14来调整LCD12864的亮度。二.方案论证STC89C52单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O接口电路等一台计算机所须要的基本功能部件。具体的单片机原理在此不再赘述。现仅具体介绍液晶12864的工作原理。带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示辨别率为128x64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块敏捷的接口方式和简洁、便利的操作指令,可

5、构成全中文人机交互图形界面。可以显示8x4行16x16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。在日常生活中,我们对液晶显示器并不生疏。液晶显示模块已作为许多电子产品的通过器件,如在计算器、万用表、电子表及许多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。在单片机的人机沟通界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简洁,在前面章节已经介绍过,在此不作

6、介绍,本章重点介绍字符型液晶显示器的应用。在单片机系统中应用晶液显示器作为输出器件有以下几个优点:(1)显示质量高由于液晶显示器每一个点在收到信号后就始终保持那种色调和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样须要不断刷新新亮点。因此,液晶显示器画质高且不会闪耀。(2)数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简洁牢靠,操作更加便利。(3)体积小、重量轻液晶显示器通过显示屏上的电极限制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。(4)功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。图1、L

7、CDI2864实物1.CDI2864的基本特性:(I)低电源电压(VDD:+3.0-+5.5V)(2)显示辨别率:128x64点(3)内置汉字字库,供应8192个16x16点阵汉字(简繁体可选)(4)内置128个16x8点阵字符(5)2MHZ时钟频率(6)显示方式:STN半透、正显(7)驱动方式:132DTY,1/5BIAS(8)视角方向:6点(9)背光方式:侧部高亮白色LED,功耗仅为一般LED的1/51/10(10)通讯方式:串行、并口可选(11)内置DC-DC转换电路,无需外加负压(12)无需片选信号,简化软件设计(13)工作温度:0-+55,存储温度:-20C-+601.CDI2864

8、应用举例:(1)运用前的打算:先给模块加上工作电压,再依据下图的连接方法调整LCD的对比度,使其显示出黑色的底影。此过程亦可以初步检测LCD有无缺段现象。(2)字符显示:带中文字库的128X64-0402B每屏可显示4行8列共32个16X16点阵的汉字,每个显示RAM可显示1个中文字符或2个16X8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部供应128X2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。依据写入内容的不同,可分别在液晶屏上显示CGRoM(中文字库

9、)、HCGROM(ASCH码字库)及CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000-0006H(其代码分别是OOo0、0002OOO4、0006第3页,共38页共4个)显示自定义字型,02H7FH显示半宽ASCIl码字符,AlAoHF7FFH显示8192种GB2312中文字库字形。字符显示RAM在液晶模块中的地址80H9FHo字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示。80H81H82H83H84H85H86H87H90H91H92H93H94H95H96H97H88H89H8AH8BH8CH8DH8EH8FH98H99H9

10、AH9BH9CH9DH9EH9FH(3)图形显示先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)垂直地址范围C5.ACO水平地址范围AC3C0绘图RAM的地址计数器(AC)只会对水平地址(X轴)自动加一,当水平地址=OFH时会重新设为OOH但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行推断垂直地址是否需重新设定。(4)应用说明用带中文字库的128X64显示模块时应留意以下几点:欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。显示ASCIl字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次

11、显示地址,由模块自动对地址加I指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。当字符编码为2字节时,应先写入高位字节,再写入低位字节。模块在接收指令前,向处理器必需先确认模块内部处于非忙状态,即读取BF标记时BF需为“0”,方可接受新的指令。假如在送出一个指令前不检查BF标记,则在前一个指令和这个指令中间必需延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。“RE”为基本指令集与扩充指令集的选择限制位。当变更“RE”后,以后的指令集将维持在最终的状态,除非再次变更“RE”位,否则运用相同指令集时,无需每次均重设“RE”位。基

12、本操作时序表2.写操作时序3.时序参数图2、基本操作时序表时序参数符号极限值单位测试条件最小值典型值最大值EfS号周期tc400一一ns引脚EE脉冲宽度tPW150一一nsE上升沿/下降沿时间tR.tf一一25ns地址建立时间tSP130一一ns引脚E、RS、R/W地址保持时间tHO110一一ns数据建立时间(读操作)to一一100ns引脚DBoDB7数据保持时间(读操作)tHD220一一ns数据建立时间(写操作)tSP240一ns数据保持时间(写操作)tHO210-nsLCDI2864采纳标准的背光(20个管脚),各引脚接口说明如表编号符号引脚说明编号符号引脚说明1VSS电源地11DB4三态

13、数据线2VDD电源正极12DB5三态数据线3VO/NC对比度(亮度)调整13DB6三态数据线4RS数据/吩咐选择14DB7三态数据线5R/W读/写选择15PSB(H/L)并口/串口方式6E使能信号16NC空脚7DBO三态数据线17RST复位端8DBl三态数据线18VOUTLCD驱动电压输出端3DB2=态数据线19LEDA背光源正端(+5V)10DB3日态数据线20LEDK背光源负端表1引脚接口说明表第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VO/NC为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,运用时可以通过一个IoK的电位器调

14、整对比度。第4脚:RS为寄存器选择,高电平常选择数据寄存器、低电平常选择指令寄存器。第5脚:R/W为读写信号线,高电平常进行读操作,低电平常进行写操作。当RS和R/W共同为低电平常可以写入指令或者显示地址,当RS为低电平R/W为高电平常可以读忙信号,当RS为高电平R/W为低电平常可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平常,液晶模块执行吩咐。第714脚:D0D7为8位三态数据线。第15脚:PSB(HL)H:8位或4位并口方式,L:串口方式,如在实际应用中仅运用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。第16脚:NC为空脚第17脚:RS

15、T为复位端第18脚:VOUT为LCD驱动电压输出端第19脚:背光源正极。第20脚:背光源负极。如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接其中另外一个重要部件是DS1302,DS1302是DALLAS公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31字节静态RAM通过简洁的串行接口与单片机进行通信实时时钟/日历电路供应秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM指示确定采纳24或12小时格式DS1302与单片机之间能简洁地采纳同步串行的方式进行通信仅需用到三个口线1RES复位2I/O数据线3SCLK串行时钟时钟/RAM的读/写数据以一个字

16、节或多达31个字节的字符组方式通信DS1302工作时功耗很低保持数据和时钟信息时功率小于ImW,后备电源是3V的纽扣电池,可以在主电源断开后维持时钟运作。管脚描述XI,X232.768KHZ晶振管脚GND地RST复位脚I/O数据输入/输出引脚SCLK串行时钟Vccl,Vcc2电源供电管脚管脚配置8-PIN DIP (300 MIL)8 7 6 5 一12 3 4 2X1X21NDvCC1 SCLK I/O RSTDS1302S8-PINSOIC(2MILDS1302Z8-PINSOIC(150MlL图3、DS1302时钟芯片依据设计设想,当液晶显示整点时间,将发出蜂鸣声音,所以电路设计上还增加

17、了蜂鸣器。利用单片机实现开关信号,并运用三极管放大来实现蜂鸣器的驱动,其蜂鸣驱动原理通过延时或者定时器来实现不同频率音调的发声。电路图如下:图3、蜂鸣器驱动电路试验原理图:仿真图:口匕0 03: + zxaa %z blK Q图4、基于STC89C52单片机设计的万年历电路图实际在Altiumdesigner软件中设计的电路图:图5、利用AItiUmdesigner设计的万年历仿真电路图本次试验最终确定的电路图就是这个电路图。严谨团结、创新I设省I O I调大ISHiiH:匾曰;啊金=aoooooooeooQooooQBjieczC6 (Sw)湖北师范学院物理与电子科学学院IOO4班BUZZE

18、RD09OOOQOOOOCOOQOOOOOPl 2864-CC2OeDo 。Ul YlSDOOQOOO O40O O OOO oo|?9 Hlg- .IM1 I X严谨、。求实、,团结、创新2013年6月10日 O图6、利用AItiUmdesigner设计的万年历印刷电路板上面第一个印刷电路板是我第一次画的,由于起先我对画PCB考虑的不全面,导致所画的PCB很大,后来经过压缩就画成了下面的这个印刷电路板。试验材料选取状况:本次试验材料主要在电子俱乐部购得,其中液晶12864由网购所得。另附材料清单。三.试验步骤1、由于在上电子系统课程设计之前,我们学习了AItiUmdesigner电路制版这门

19、课程,并且在这门课程结束之前我们还画了一个89C51单片机系统的印刷电路板,所以在这个基础之上,我确定做一个万年历,用12864来显示。2、在以前画的89C51单片机的电路原理图中,如下图所示:潜需用杵淄褶L pUUULLIm吃眨三竺:,:吃 I -lSEffHKBEBEBEffleo THH+HH Ir-LL/p二-Y-X二r-yr r二 W 一甘 i7J-lf图7、89C51单片机原理图经过反复考虑,我保留了单片机系统、USB电源接口电路、红外遥控模块、DS1302模块、蜂鸣器驱动电路模块、LCDI2864模块、温度计(18B20)电路模块、单片机的外扩(Pl双排排针)、一个复位电路模块以

20、及四个按键模块。3、在万年历原理图确定好了以后,起先绘制原理图,原理图绘制好了以后进行编译,编译无误后,就进行PCB的设计。4、在PCB环境先设置规则,再进行布局,最终进行布线。5、设计完PCB以后,便发到厂家去打样。6、大约过了一个星期之后,我从电子俱乐部买来电子元器件,于是我起先焊板子,我先焊接电源接口电路,然后再通电视察电源接口是否是好的。在确定电源接口是好的状况下再接着接着焊接其他的元器件。7、板子焊接好了以后,我起先调试实物,直到所须要的现象调试出来。四.结果分析图8、我已经把我自己画的印刷电路板焊接好了图9、刚起先调试出来的现象图10、调试到标准状态下的万年历图11、老师已阅历收过

21、我制作的实物五.阅历总结在这次试验过程中,我始终以一种肃穆谨慎的看法仔细对待,不过我在设计电路到绘制电路图再到设计PCB的过程中我也遇到了不少问题,但我每次遇到问题我都自己独立地解决问题,有时是通过看书解决的,有时则是通过百度或谷歌搜寻相关资料而使得问题迎刃而解,有时则是通过QQ与他人沟通从而获得解决问题的方法。在画好了PCB之后,接下来就是焊接了,我先是焊接了USB电源接口电路,然后接上电源,视察电源接口能否正常供电。接着再焊接电路的其他部分。当全部的元器件都焊接好了以后,我先是下载了一个小程序试试看整个实物能否正常工作,然后我再把自己所写的万年历程序下载进去,经过几次调试之后,我发觉128

22、64液晶可以正常工作,能够正常显示时间、日期、农历、星期以及温度。于是,我有通过按键对时间进行校准,以使时间校准到精确的时间状态上来。但是,每次断电之后,时间都会重新回到原来初始设定的时间,不能回到原来标准的状态。于是我又在原来的基础之上加了一个由蓄电池供电的电源装置,目的是为了给DS1302时钟芯片供电,使得时钟芯片记住时间,即使在断电的状况下也能正常运行。在全部的工作都完成了之后,我把实物交给老师检查了,并获得通过。在这个过程当中,我与同学黄仲文始终在进行调试,有时我还向他请教了一些问题。这让我明白在一个向别人学习很是重要,正如我在印刷电路板上所写“严谨、求实、团结、创新”,我信任我以后也

23、必需以它来作为我的座右铭,是我恒久记住作为一名工程师应当具备的素养与实力!在这次的电子系统课程设计的过程当中,我感受颇多,作为一个从事于电子行业的技术人员来说,我们应当必需具备分析问题与解决问题的实力,当给定一个任务之后,我们应当对其进行仔细分析,之后运用自己所学学问进行设计,必要时还要进行仿真。作为个从事于电子行业的技术人员来说,从分析问题,到设计电路,再到调试到所须要的技术指标是一个必须要经验的过程,同时作为一位高校生,也必须要具备肯定的思维实力、分析与解决问题的实力!附录:附录一:电子元器件清单元件名称个数元件名称个数89C51单片机1个LCD128641个USB接口1个12MHz晶振1

24、个按键1个22pF瓷片电容2个单刀双掷开关1个DS1302时钟芯片1个电源指示灯1个104瓷片电容3个双排排针1个25V220uF电容1个三端稳压集成电路78051个25VIOuF电容1个1N4007二极管1个1N4148二极管2个18B20温度计1个4.7K。排阻1个S8550三极管1个Jl电源接口1个排座1个10色环电阻1个IKQ色环电阻1个4.7K。色环电阻2个2.2KQ色环电阻1个5K。色环电阻1个32KHz晶振1个单片机基座1个DS1302基座1个红外遥控1个蜂鸣器1个数据线1条5kQ色环电阻1个IKQ变位器1个附录二:基于STC89C52单片机设计的万年历的程序#include#i

25、nclude#defineLCD.DataPO/LCD并口选择#defineucharunsignedcharunsignedcharsec,min,hour,day,month,year,cen,week,next,aa,bb,cc,dd,mm,tempo,LunarMonth,LunarDay,LunarYear;显示和处理的变量inttemp;温度值uchartt=l;bitc_moon;bitcenbit=l;bitw;/LCD端口设定sbitLCD.RS=P26;sbitLCD.RW=P25;sbitLCD-E=P27;sbitPSB=P32;/DS1302端口设定sbitDSI30

26、2-CLK=P36;sbitDS1302JO=P17;sbitDS1302_RST=P3A5;/DS18B20端口设定sbitDS18B20=P37;蜂鸣器端口设定sbitSpeak=P15;SbitSeIKey=P2八0;按键功能:设置SbiISUreKey=P23;按键功能:确认sbitPIUSKey=P2八1;按键功能:力口sbiReduceKey=P22;按键功能:减/sbitSd=Pl1;/sbitsda=P10;voidDisplayShengXiao(Void);voidHolidays(void);定义延时变量,多任务循环uchar(0=0;uchartl=0;uchart2=

27、0;uchart3=0;uchar(4=0;uchar(5=0;/初始化定时器0,实现时间分片多任务循环voidinitTimer(void)(TMOD=Oxl;TH0=0xb8;TL0=0x63;voidtimerO(void)interrupt1using1(TH0=0xf8;TLO=Oxff;多任务延时限制t2-;t3-;t4-;t5-;voiddelay(unsignedinta)/延时IMS/次(unsignedchari;while(-a)(for(i=0;i125;i+);)/延时一个机器周期voiddelayb(unsignedintcount)(while(counl-);/

28、18B20初始化unsignedcharDS18B20Init()(unsignedcharx;DS18B20=l;delayb;DSI8B20=0;delayb(80);DSI8B20=l;delayb;x=DS18B2O;delayb(20);returnx;)/温度读取函数unsignedcharTempRead(Void)(unsignedchari,dat;DSI8B2O=1;delayb(1);for(i=0;il;DSI8B20=l;if(DS18B20)dat=dat0x80;delayb;)returndat;)/温度传感器写一字节voidTempWriteByte(unsi

29、gnedchardat)(unsignedinti;DSI8B20=l;delayb(2);for(i=0;i8;i+)DSI8B20=0;DS18B20=datl;delayb;)/获得温度值intGetTempO(floattt;unsignedchara,b;DSI8B20Init();TempWriteByte(Oxcc);TempWrileByte(0x44);delayb(100);DS18B20Init();TempWriteByte(Oxcc);TempWrileByte(Oxbe);delayb(200);a=TempRead();b=TempRead();temp=b;le

30、m0;i-)DS1302JO=temp&0x01;DS1302_CLK=0;DS1302_CLK=l;temp=1;)DS1302-IO=0;)/DS1302写数据voidWriteDs1302(unsignedcharaddress,unsignedchardat)(DS1302_RST=0;DS1302.CLK=0;DS1302.RST=l;delay(l);Wri(eDs1302Byle(address);WriteDs1302Byte(dat);DS1302.RST=0;)/Ds1302读一字节数据unsignedcharread_byte()(unsignedchari;DS1302

31、JO=I;for(i=8;i0;i-)(if(DS1302JO)tempO=tempOOx8O;DS13O2_CLK=1;DS1302_CLK=0;temp=temp1;)DS1302JO=O;returntempo;)/DS1302读地址数据unsignedcharReadDs1302(unsignedcharaddress)unsignedchartemp;DS1302_RST=0;DS1302_CLK=0;DS1302_RST=l;WriteDsI302Byte(address);temp=read_byte();DS1302_RST=0;DS1302_CLK=l;returntemp;

32、)/DS1302初始化voidInitDS1302()(/unsignedcharSecond=ReadDs1302(0x80);/if(Second&0x80)(WriteDs1302(0x8e,0x00);WriteDsl302(0x8c,0xl0);写入年份10年WriteDs1302(0x8a,0x06);写入星期6WriteDs1302(0x88,0x11);定入月分11月WriteDs1302(0x86,0x6);写入日期6日WriteDs1302(0x84,0x17);写入小时17点WriteDs1302(0x82,0x43);WriieDs1302(0x80,0x30);写入秒

33、30秒WriteDs1302(0xc0,aa);写入初始化寄存器数据/delay(5);WriteDs1302(0x8e,0x80);WriteCommandLCD(OxO1);限制吩咐,WP为1,禁止写操WriteCommandLCD(OxOb);作WriteCommandLCD(OxOC);)LCD清屏/LCD写数据voidLCDClear(Void)voidWriteDataLCD(unsignedchardat)(WriteCommandLCD(OxO1);LCD.RS=1;WriteCommandLCD(0x34);LCD_RW=0;WriteCommandLCD(OxSO);LCD

34、_E=0;)delay;/LCD送字符LCD_Data=dat;voidLCDSendWord(unsignedchar*p)delay;(LCD_E=1;while(*pO)delay(5);(LCD_E=0;WrileDataLCD(*p);delay(5);P+;)/LCD写指令)voidWriteCommandLCD(unsignedcharLCD送数据,指令udat)voidLCDTestWord(biti,unsignedchar(word)LCD_RS=0;(LCD_RW=0;if(i=0)LCD_E=0;(delay;WriteCommandLCD(Word);LCD_Data

35、=udal;)delay(2);elseLCD_E=1;(delay;WrileDataLCD(Word);LCD_E=0;)delay(5);)显示年份/LCD初始化voidDisplayYear(Void)voidLCDInit(Void)(year=ReadDs1302(0x8d);WriteCommandLCD(OxSO);LCDleslWord(0,0x81);LCDTestWord(1XyearZl6)+0x30);1.CDTestWord(l,year%16+0x30);1.CDTeslWord(0,0x82);1.CDSendWOrd(“年”);DisplayShengXiao

36、O;)显示月份voidDisplayMonth(Void)(month=ReadDs1302(0x89);1.CDTeslWord(0,0x83);if(month16!=0)(1.CDTestWord(l,(monlh/16)+0x30);)else(1.CDTstWord(1,0x20);)1.CDTeslWordd,month%16+0x30);1.CDleslWord(0,0x84);1.CDSendWord(月);DisplayShengXiaoO;)/显示星期voidDisplayWeek(Void)(Week=ReadDs1302(0x8b);1.CDleslWord(0,0x9

37、0);1.CDSendWord(“星期);LCDrRSlWOrd(0,0x92);/LCDleslWord(1,week+0x30);if(week=7)LCDSendWordC日);if(week=6)LCDSendWord(,);)if(week=5)LCDSendWordC三);)if(week=4)LCDSendWordCHn);)if(week=3)LCDSendWordC三);if(week=2)LCDSendWordC1t);)if(week=1)LCDSendWord(-h);)显示日期voidDisplayDay(Void)(day=ReadDs1302(0x87);1.CD

38、rRSlWord(0,0x85);if(day16!=0)LCDTestWord(1,(day/16)+0x30);)else(LCDTestWord(1,0x20);)1.CDTestWord(l,day%16+0x30);1.CDleslWord(0,0x86);1.CDSendWordCH);DisplayShengXiaoO;)显示小时voidDisplayHour(Void)(Hour=ReadDs1302(0x85);1.CDleslWord(0,0x88);1.CDlestWordd,(hour/16)+0x30);1.CDlestWordC1,hour%16+0x30);)显示

39、分钟voidDisplayMin(Void)(min=ReadDs1302(0x83);1.CDleslWord(0,0x89);/LCDleslWord(l,0x3a);1.CDSendWordO1.CDlestWord(l,(minl6)+0x30);1.CDleslWord(l,min%16+0x30);1.CDSendWord(“分”);)/显示秒voidDisplaySec(Void)unsignedchari=0;unsignedinta=O,b=O,c=O;Sec=ReadDs1302(0x81);1.CDTeStWOrd(0,0x8c);1.CDTestWord(1,(secl

40、6)+0x30);1.CDTeslWordd,sec%16+0x30);)/显示温度voidDisplayTemp(Void)(unsignedinti;unsignedchara,b,c;WriieCommandLCD(OxSc);1.CDTeslWord(0,0x8d);1.CDSendWordC);i=GelTemp();a=i100;1.CDTeslWord(1,a+0x30);b=i%10010;1.CDTstWord(I,b+0x30);1.CDTestWord(1,0x2e);c=i-a*100-b*10;1.CDlslWord(1,c+0x30);LCDSendWordCC);

41、)codeunsignedcharDayCodel91=(0x00,Ox1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3);codeunsignedintDayCode231=(0xlll,0xl30,0x14e);计算公历日离当年元旦的天数,为了削减运算,用了两个表DayCodel91,DayCode23假如公历月在九月或前,天数会少于Oxff,用表DayCOdel9,在九月后,天数大于OXff,用表DayCode231如输入公历日为8月10日,则公历日离元旦天数为DayCodel8-1+10-1,如输入公历日为11月10日,则公历日离元旦天数为DayeOde2ll

42、-10+10-1/*读取数据表中农历月的大月或小月,假如该月为大返回1,为小返回0*/bitGetMoonDay(unsignedchar1.unarMonth,unsignedintTableAddr)(unsignedchartemp;switch(LunarMonth)/LunarMonth指向农历月份(caseI:temp=YearCodeTableAddrlfc0x08;/1月,对应年份表里第一字节的BIT3位,假如是1,则月大,假如是0,则月小if(Iemp=O)return(O);为0,月小elsereturn(I);为1,月大)case 2: temp=YearCodeTableAddrlfc0x04;/2月,对应年份表里第一字节的BIT2位,假如是1,则月大,假如是0,则月小if(Iemp=O)return(O);为0,月小elsereturn(I);为1,月大)case 3: temp=YearCodeTableAddr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号