单片机课程设计(论文)单片机万历(含仿真).doc
单片机 课程设计(论文)仿真联系,153893706题 目单片机万年历 专 业 班 级2009通信01 学 号0904140124 姓 名指 导 教 师学 院 名 称电气信息学院 2012年 6 月 8 日 附件1:中文摘要式样摘 要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒;本设计采用的是AT89C51单片机,该单片机是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。该万年历系统利用C语言开发,并在软硬件设计中分别使用了Protel 99se 、keilC51开发平台。关键词:AT89C51单片机 ;万年历;C语言附件2:摘要和关键词写法摘要摘要包括中文摘要与外文摘要。摘要是对课程设计内容不加注释和评论的简短陈述,要求扼要说明研究工作的目的、主要材料和方法、研究结果、结论、科学意义或应用价值等,是一篇具有独立性和完整性的短文。摘要中不宜使用公式、图表以及非公知公用的符号和术语,不标注引用文献编号。中文摘要350字左右,特殊情况字数可以略多;外文摘要应与中文摘要内容一致。中、外文摘要与关键词分别单独成页置于目录前,编排上中文在前,外文在后。关键词关键词是为了文献标引工作从论文中选取出来用以表示全文主题内容信息款目的单词或术语。应采用能覆盖论文主要内容的通用词条(参照相应的专业术语标准),一般列38个,按词条的外延层次从大到小排列,应在摘要中出现。附件3:英文摘要式样AbstractSingle-chip microcontroller, application-oriented object design, highlighting the control function of the chip. Microcontroller connected to the oscillator, reset circuit and the corresponding interface circuit, after loading software can constitute a single-chip applications. Embed it into all kinds of applications, on a wide range of products, equipment, intelligent core. This design is the application of a powerful single chip control functions made of electronic calendar, the electronic calendar includes three major functions: real-time display year, month, day, minutes, seconds; used in this design is AT89C51 microcontroller, the microcontroller is a with 4K bytes of FLASH memory low voltage, high performance CMOS 8-bit microprocessor the microcontroller AT89C many embedded control system provides a high flexibility and low cost solution. The calendar system using C language, and were used in the hardware and software design of Protel 99se, keilC51 development platformKeywords: AT89C51SCM;Calender;C language 目 录 摘要 (II) Abstract (IV)1 绪论1.1选题背景与意义 (6)2 正文2.1 单片机的定义和特点 (7) 2.1.1 单片机的定义2.1.2 单片机的特点2.2 单片机的应用与发展趋势 (7)2.3 单片机芯片的选择 (8)2.4 显示模块选择 (8)2.5实时环境温度采集模块 (8)2.6 元器件的选择 (9)3 硬件设计 3.1 主要的单元电路模块 (10)3.1.1 AT89C51单片机的简介 (10)3.1.2 数码管简介 (12)3.1.3 温度传感器DS18B20 (13)3.1.4 排阻respack-8 (16)3.1.5 按键系统 (16)3.1.6系统硬件PROTEUS仿真原理图 (17)4 软件设计 4.1.1程序流程图 (18) 4.1.2程序的设计 (19)5 心得与体会 (24)参考文献 答辩记录 1 绪论液晶显示的万年历已经越来越流行,特别适合在家庭居室、办公室、大厅、会议室、车站和 广场等地方使用,它具有显示清晰直观、走时准确、可以进行夜视等功能,并且还可以扩 展出其它多种功能。1.1选题背景与意义2万年历是我国古代传说中最古老的一部太阳历。为纪念历法编撰者万年的功绩,便将 这部历法命名为“万年历” 。而现在所使用的万年历,实际上就是记录一定时间范围内(比 如 100 年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用,与原始历 法并无直接联系。随着新技术的不断开发与应用,近年来单片机发展十分迅速,一个以微 机应用为主的新技术革命浪潮正在蓬勃兴起。单片机具有集成度高,通用性好,功能强, 特别是体积小,重量轻,耗能低,可靠性高,抗干扰能力强和使用方便等独特优点,在数 字、智能化方面有广泛的用途。单片机的应用已经渗透到工业控制、家用电器、通信设备、 信息处理、尖端武器等各个领域。而随着单片机的发展,人类用于计时的工具也在不断发 展更新,单片机技术使得万年历有了新的发展方向。目前世界上单片机年产量已达十多亿 片,通常是当年微处理器产量的 4-5 倍以上。用最少的芯片就能实现最强大的功能,这是 将来电子产品的主流方向,它将无可置疑地一步步取代其它同类产品,其数量之大和应用 面之广,是其它任何类型的计算机所无法比拟的。本设计的主要内容:1、了解单片机技术的发展现状,熟悉万年历各模的工作原理;2、选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;3、熟悉单片机使用方法和 C 语言的编程规则,编写出相应模块的应用程序。2 正文2.1 单片机的定义和特点 2.1.1 单片机的定义单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O接口和中断系统、定时器、计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。 2.1.2 单片机的特点单片机在控制领域中,具有种类多,型号全,集成度高,通用性好,功能强,性价比高,特别是体积小,重量轻,耗能低,成本相对较低,抗干扰能力强等优点。最重要的是可以采用C语言开发环境,具有友好的人机互交环境。2.2 单片机的应用及发展趋势一、更生活化 目前,随着我国国民经济的发展和人民物质文化生活水平的不断提高,人们在忙于工作之余,人们对生活的质量要求越来越高。 举例:豆浆机是一种新型的家用饮料机,以黄豆为原料,直接加工成熟的热豆浆。豆浆机由粉碎黄豆的搅拌机、 豆浆加热器和控制电路三大部分组成。用单片机研制的全自动豆浆机的控制电路,只要按下启动按键,豆浆机就开始工作。整个过程由单片机全自动控制,用起来更加地方便、更加的安全。 二、低碳化 2010 世博会已逐渐离我们远去,但是上海世博会的理念一直与我们紧密相连。 1、低功耗 CMOS 化, CMOS 电路的特点是低功耗、 高密度、低速度、低价格。CMOS 虽然功耗较低,但由于其物理特征决定其工作速度不够高,而 CHMOS 则具备了高速和低功耗的特点, 这些特征, 更适合于在要求低功耗象电池供电的应用场合。 所以我相信这种工艺将是今后一段时期单片机发展的主要途径。2、低噪声与高可靠性 为提高单片机的抗电磁干扰能力,使产品能适应恶劣的工作环境,满足电磁兼容性方面更高标准的要求,各单片厂家在单片机内部电路中都采用了新的技术措施。 三、 高性能化 主要是指进一步改进 CPU 的性能, 加快指令运算的速度和提高系统控制的可靠性。由于这类单片机有极高的指令速度,就可以用软件模拟其 I/O 功能,由此引入了虚拟外设的新概念。随着半导体集成工艺的不断发展,单片机的集成度将更高、体积将更小、功能将更强。2.3 单片机芯片的选择方案一:采用 AT89C51 芯片作为硬件核心,内部具有 4KB ROM 存储空间,能于3V 的超低压工作,而且与 MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备 ISP在线编程技术,所以在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧 入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二: 采用 STC89C52 芯片,STC89C52 是一种低功耗、高性能的 8 位 CMOS 微控制器,具有 8K 的可编程 Flash 存储器。同样具有 AT89C51 的功能,且具有在线编程可擦除技术, 当对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,因此选择采用 STC89C52 作为主控制系统核心。 2.4 显示模块选择方案一: 采用 LED 数码管动态扫描,LED 数码管价格适中,对于显示数字合适,采用动态扫描法与单片机连接时,虽然占用的单片机口线少,但连线还需要花费一点时间,所以也不用此种作为显示。 方案二: 采用点阵屏显示,点阵屏是由八行八列的发光二极管组成,对于显示文字比较适合, 若采用显示数字显得太浪费,且价格也相对较高,所以在此也不用此种作为显示。 方案三: 采用 LCD1602 液晶显示屏,该液晶显示屏的显示功能强大,内置 192 种字符,可显示 大量符号、数字,清晰可见,而且功率消耗小寿命长抗干扰能力强。所以在此设计中采用 LCD1602 液晶显示屏。2.5实时环境温度采集模块方案一:热敏电阻是开发早、种类多、发展较成熟的敏感元器件热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化通过一定的电路可以将周围环境的温度变化转化成电压的变化,通过AD转化器件将信号传输给单片机进行分析,从而测出当前环境温度,但误差大,不稳定,对环境要求较高。方案二:DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高 ,在使用中不需要任何外围元件,支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。因此非常适合本系统使用。综上比较上述两种方案,宜采用方案(2)构成本设计的实时温度采集模块。最终方案:本设计采用AT89C51 芯片作为硬件核心,采用 LED 数码管动态扫描,采用DS18B20温度传感器2.6 元器件的选择用单片机自制电路图,一般会用到以下元器件: 电阻:常用的有100R,220R,1K,2.2K,5,1K,10K,47K和100K。一般选1/16W或1/8W就足够了。通常都是用来限流、分压、上拉等。 电容:常用的电容一般有电解电容、瓷片电容等。其中电解电容常用的有1u、10u、100u、470u等,具有容量大、有极性等特点,基本都用于电源滤波、退耦等。瓷片电容常用的有22p、27p和30p几种,具有小型、高耐压和频率特性好等特点,基本都用于晶振电路做负载电容,为CPU提供工作时钟。 二极管:单片机开发常用的二极管主要有以下几种。1N4148,这大概是单片机和数字电路里最常用的型号了,通常用于单向信号隔离(如键盘/显示电路)或信号钳位(常见于脉冲收发电路和整形电路)。1N4001/4007/5401等,用于电源整流,把变压器的交流信号变成脉动直流。根据电压和电流不同而选择不同的型号。稳压二极管,常用于AD转换电路的参考电压源,也常用于对单片机电源进行稳压。高频检波二极管,常用的有2AP9,一般用于无线收发电路中。变容二极管,通常用于调频无线发射或电调谐接收。 还有发光二极管,常用的有各种可见光发光管、双色发光管等。还有红外发光管(用于红外遥控)和红外接收管,还有可以用来感受可见光的光敏二极管(通常用于光控,比如防盗、自动灯等)。3 硬件的设计3.1 主要的单元电路模块3.1.1 :AT89C51单片机的简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。1主要特性: ·与MCS-51 兼容 ·4K字节可编程闪烁存储器 寿命:1000写/擦循环数据保留时间:10年·全静态工作:0Hz-24Hz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源 ·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路 2管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚 备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。3振荡器特性: XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。4芯片擦除: 整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。 3.1.2 数码管简介7SEG-MPX2-CC 两个共阴二极管显示器7SEG-MPX4-CC 四个共阴二极管显示器 1234 是阴公共端 1数码管的分类数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。 2数码管的驱动方式 数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×840根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。 3数码管参数 8字高度:8字上沿与下沿的距离。比外型高度小。通常用英寸来表示。范围一般为0.25-20英寸。 长*宽*高:长数码管正放时,水平方向的长度;宽数码管正放时,垂直方向上的长度;高数码管的厚度。 时钟点:四位数码管中,第二位8与第三位8字中间的二个点。一般用于显示时钟中的秒。3.1.3 温度传感器DS18B201 DS18B20温度传感器的优点:一、采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。二、测量温度范围宽,测量精度高。DS18B20的测量范围为-55-125,在-10-85范围内,精度为±0.5。三、在使用中不需要任何外围元件。四、持多点组网功能。多个DS18B20可以并联在唯一的单线上,实现多点测温。五、供电方式灵活。DS18B20可以通过内部寄生电路从数据线上获取电源,因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更简单,可靠性更高。六、测量参数可配置。DS18B20的测量分辨率可通过程序设定为9-12位。七、负压特性。电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。八、掉电保护功能。DS18B20内部含有EEPROM,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。2DS18B20内部结构:DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警除法器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看做是DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20管脚排列:GND为电源地,DQ为数字信号输入/输出端,VDD为外接供电电源输入端。DS18B20寄生电源工作方式(电源从IO口上获得注意:当温度高于100时,不能使用寄生电源,因为此时器件中较大的漏电流会使总线不能可靠检测高低电平,从而导致数据传输误码率的增大。DS18B20外接电源工作方式3.1.4 排阻respack-8一般是接在51单片机的P0口,因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。排阻就是好多电阻连载一起,他们有一个公共端 1端为公共端接VCC或地,看你是上拉还是下拉呢,其他接你要操作的端口3.1.5 按键系统3.1.6系统硬件PROTEUS仿真原理图 4 软件的设计4.1.1系统的总流程图 主流程图计算阳历程序4.1.2程序的设计#include <stdio.h>code unsigned char WeekTab = /闰年月星期表 (3 << 5) + 31,/1月 (6 << 5) + 29,/2月 (0 << 5) + 31,/3月 (3 << 5) + 30,/4月 (5 << 5) + 31,/5月 (1 << 5) + 30,/6月 (3 << 5) + 31,/7月 (6 << 5) + 31,/8月 (1 << 5) + 30,/9月 (4 << 5) + 31,/10月 (0 << 5) + 30,/11月 (2 << 5) + 31 /12月;/*- 2000年2099年星期算法-*/unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d)unsigned char week, day; day = WeekTabm - 1;/月表 week = day >> 5;/月星期数 day &= 0x1f;/月天数 if (m < 3) && (y & 0x03)/平年 if (m = 2) day-;/平年月天数 week+;/平年月表+1 y = y + (y >> 2);/年+年/4 week = (week + y + d + 2) % 7;/(星期=年+年/4+月表+2日)%7 return (week << 5) | day;/返回星期和月天数/*- 0000年9999年星期算法-*/unsigned char WeekDay(unsigned char c, unsigned char y, unsigned char m,unsigned char d)unsigned char week, day; c &= 0x03;/百年%4 c = c | (c << 2);/百年%4*5 day = WeekTabm - 1;/月表 week = day >> 5;/月星期数 day &= 0x1f;/月天数 if (m < 3) && !(c = 0) | (y & (y & 0x03) = 0)/平年 if (m = 2) day-;/平年月天数 week+;/平年月表+1 y = y + (y >> 2);/年+年/4 week = (week + c + y + d + 2) % 7;/(星期=百年%4*5+年+年/4+月表+日+2)%7 return (week << 5) | day;/返回星期和月天数unsigned char BcdToBin(unsigned char val) val = (val >> 4) * 10 + (val & 0x0f);/将BCD码转换为10进制数 return val;/返回10进制数void main(void)unsigned char c, y, m, d;unsigned char cx, yx, mx, dx; unsigned char WDay, Week, Day;/*- 0001年1月1日 星期天-*/ c = 0x00; y = 0x01; m = 0x01; d = 0x01; cx = BcdToBin(c);/百年 yx = BcdToBin(y);/年 mx = BcdToBin(m);/月 dx = BcdToBin(d);/日 WDay = WeekDay(cx, yx, mx, dx);/取星期和月天数 Week = WDay >> 5;/得到星期 Day = WDay & 0x1f;/得到最大月天数/*- 1918年1月21日 星期一-*/ c = 0x19; y = 0x18; m = 0x01; d = 0x21; cx = BcdToBin(c);/百年 yx = BcdToBin(y);/年 mx = BcdToBin(m);/月 dx = BcdToBin(d);/日 WDay = WeekDay(cx, yx, mx, dx);/取星期和月天数 Week = WDay >> 5;/得到星期 Day = WDay & 0x1f;/得到最大月天数/*- 9999年12月31日 星期天-*/ c = 0x00; y = 0x01; m = 0x01; d = 0x01; cx = BcdToBin(c);/百年 yx = BcdToBin(y);/年 mx = BcdToBin(m);/月 dx = BcdToBin(d);/日 WDay = WeekDay(cx, yx, mx, dx);/取星期和月天数 Week = WDay >> 5;/得到星期 Day = WDay & 0x1f;/得到最大月天数/*- 2004年6月18日 星期五-