《电子万年历设计论文.doc》由会员分享,可在线阅读,更多相关《电子万年历设计论文.doc(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、桂林航天工业高等专科学校毕业设计(论文)第1章 引 言随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。而电子万年历作为电子类小设计不仅是市场上的宠儿,也是单片机实验中一个很常用的题目。因为它有很好的开放性和可发挥性,因此对设计者的要求也比较高,不仅考察了对单片机的掌握能力,更加强调了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要
2、出色。数字显示的日历钟已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用。集温度、时间、日历、星期于一体,采用液晶显示,设计电路更加简单直观,省去了用数码管显示的电路复杂性。通过按键可以调整更改时间和日历,并且还可以设置闹钟,这样就组成了一个多功能的万年历。32第2章 方案论证2.1 方案设计与论证2.1.1 控制部分的方案选择用可编程逻辑器件设计,使用FPGA构造数字电子系统,设计者可以不用考虑芯片内部的具体结构,也不用顾虑与外部的电路连接。设计者只需依据电路所要完成的具体逻辑功能,然后设法用软件描述出来即可。至于数据在芯片内部的处理过程,设计者不用考虑,但设计者可
3、以通过仿真软件观察和验证数据的处理结果。这种设计方法,极大地降低了设计难度,提高了工作效率,但设计成本较高。用单片机来作为主控制部分,实现时间、温度同步显示的万年历,为了使用的方便性,还可以通过设置按键来更改时间和闹钟。这正是利用了51单片机的多管脚功能性,4个8位并行I/O口,定时计数端口,中断端口,这使得操作起来更加方便,通过软件可以随时的调整和更改,使得更加精确。通过认真的分析与讨论,最终决定采用单片机来作为主控制部分,这样制作也方便,价格也相对较低。2.1.2 显示部分的方案选择可以通过数码管来显示时钟的日历、时间、温度,使用数码管的优点是直观清楚,适合用在光线较暗的地方,但是数码管的
4、功耗大,显示单一,并且在电路制作上布线复杂,难度较高。显示电路还可以采用液晶1602来实现。液晶显示器具有微功耗、体积小、显示内容丰富、超薄轻巧等诸多优点,在本题的制作中,用液晶来实现数字信息的显示是比较合适的一种选择。2.2 系统整体方案的设计与论证通过初步的选择,我们最终决定采用单片机AT89C52作为时钟的主控制部分,LCD1602作为显示部分,时钟信号采用芯片DS1302,DS18b20温度传感器用作温度采集,通过设置4个按键来实现时间的调整,闹钟的开关。这五个主要部分基本上就实现了集日历、时间、星期、温度、闹钟于一体的多功能万年历。精确度高,显示直观,轻巧的优越性具有很高的使用价值。
5、第3章 硬件电路设计3.1 系统硬件设计框图此系统的硬件部分主要由主控制器单片机,显示电路,时钟电路,温感电路构成。系统电路框图如图3-1所示。时钟电路DS1302温感器DS18B20AT89C52单片机液晶显示闹钟按键控制图 3-13.2 主控电路时钟主控电路由单片机AT89C52芯片控制,8位P0口作为数据的输出通道,外接时钟电路,复位电路,蜂鸣器,温度传感器。P3.4管脚接收时钟芯片DS1302发出的时钟信号,P3.3管脚与时钟芯片的数据传输口相连,收发读写信号,P3.2管脚用来驱动蜂鸣器,P2.4-P2.7管脚分别接按键,用来调整修改时间。P1.4管脚与温度传感器DS18B20相连,接
6、收温感信号。3.3 AT89C52主要性能介绍AT89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使AT89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89C52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,
7、全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要
8、外部上拉电阻。P1口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口接收低8位地址字节。P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此
9、时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部
10、拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89C52特殊功能(第二功能)使用,如图3-2所示。在flash编程和校验时,P3口也接收一些控制信号。图 3-23.4 DS1302芯片的介绍DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3
11、SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。DS1302 是由DS1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1 为可编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域下面将主要的性能指标作一综合:1. 实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力2. 318位暂存数据存储RAM3. 串行I/O 口方式使得管脚数量最少4. 宽范围工作电压2.0-5.5V5. 工作电流2.0V 时
12、,小于300nA6. 读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送7. 8脚DIP 封装或可选的8 脚SOIC 封装(根据表面装配)8. 简单3 线接口9. 与TTL 兼容Vcc=5V10.可选工业级温度范围-40 +853.4.1 管脚说明管脚描述: 管脚配置: 图 3-3 图 3-43.4.2 DS1302时钟信号设置模式如图3-5所示图 3-53.5 LCD1602液晶介绍模块组件内部主要由LCD显示屏、控制器、列驱动器和偏压产生电路构成。LCD显示屏为行和列交叉形成的点阵,以58点阵的字符结构模式和设置的显示字符数目,选择适宜的行数,分单屏、双屏或者多屏显示规定的字符
13、。对于双屏或者多屏显示结构的LCD,每一显示屏结构部分,均由各自独立的使能信号E控制。列驱动器与控制器配套使用,它接收来自控制器的振荡、帧同步输出、串行输出的数据和移位及锁存脉冲,产生列交流扫描驱动信号。控制器接受来自MPU的指令和数据,控制着整个模块的工作,由CGROM、CGRAM、DDRAM等字符存储域、以及与MPU和列驱动器的I/O接口、指令寄存和译码机构、地址计数器等部分组成。在控制器的控制下,模块通过数据总线DB0DB7和E、R/W、RS三个输入控制端与MPU接口。这三根控制线按照规定的时序相互协调作用,使控制器通过数据总线DB接收MPU发送来的指令和数据,从CGROM中找到欲显示字
14、符的字符码,送入DDRAM,在LCD显示屏上与DDRAM存储单元对应的规定位置显示出该字符。控制器还可以根据MPU的指令,实现字符的显示、闪烁和移位等显示效果。3.5.1端口的定义:管脚号符号功能1Vss电源地(GND)2Vdd电源电压(+5V)3V0LCD驱动电压(可调)4RS寄存器选择输入端,输入MPU选择模块内部寄存器类型信号;RS=0,当MPU进行写模块操作,指向指令寄存器;当MPU进行读模块操作,指向地址计数器;RS=1,无论MPU读操作还是写操作,均指向数据寄存器5R/W读写控制输入端,输入MPU选择读/写模块操作信号;R/W=0 读操作;R/W=1 写操作6E使能信号输入端,输入
15、MPU读/写模块操作使能信号;读操作时,高电平有效;写操作时,下降沿有效7DB数据输入/输出口,MPU与模块之间的数据传送通道8DB数据输入/输出口,MPU与模块之间的数据传送通道9DB数据输入/输出口,MPU与模块之间的数据传送通道10DB数据输入/输出口,MPU与模块之间的数据传送通道11DB数据输入/输出口,MPU与模块之间的数据传送通道12DB数据输入/输出口,MPU与模块之间的数据传送通道13DB数据输入/输出口,MPU与模块之间的数据传送通道14DB数据输入/输出口,MPU与模块之间的数据传送通道15A背光的正端+5V16K背光的负端0V3.5.2 操作时序图写操作时序如图3-6图
16、3-6读操作时序如图3-7图 3-73.5.3 指令说明一般情况下,内部RAM的数据传送的功能使用最为频繁,因此,RAM中的地址指针所具备的自动加一或减一功能,在一定程度上减轻了MPU编程负担。此外,由于数据移位指令与写显示数据可同时进行,这样用户就以最少系统开发时间,达到最高的编程效率。这里值得一提的是,在每次访问模块之前,MPU应首先检测忙标志BF,确认BF=0后,访问过程才能进行。 Clear display 清显示指令码:Return home 归位指令码:Entry mode set 设置输入模式指令码:I/D=1,完成一个字符码传送后,AC自动加1;I/D=0, 完成一个字符码传送
17、后,AC自动减1;S=1,将全部显示向右(I/D=0)或者向左(I/D=1)移位;S=0, 显示不发生移位;Display on/off control 显示开/关控制指令码:D:显示开/关控制标志:D=1,开显示;D=0,关显示;C:光标显示控制标志:C=1,光标显示;C=0,光标不显示;B:闪烁显示控制标志:B=1,光标所指位置上,交替显示全黑点阵和显示字符,产生闪烁效果。Cursor or display shift 光标或显示移位指令码:光标或显示移位指令可使光标或显示在没有读写显示数据的情况下,向左或向右移动;运用此指令可以实现显示的查找或替换;在双行显示方式下,第一行和第二行会同时
18、移位;当移位越过第一行第四十位时,光标从第一行跳到第二行,但显示数据只在本行内水平移位,第二行的显示决不会移进第一行;倘若仅执行移位操作,地址计数器AC的内容不会发生改变。S/CR/L说明0 0光标向左移动,AC自动减一01光标向右移动,AC自动加一10光标和显示一起向左移动11光标和显示一起向右移动第4章 系统程序的设计多功能万年历系统的软件设计主要由主程序、温度子程序、时钟程序、定时中断子程序及液晶显示子程序组成。由于C语言编写的程序逻辑性强,也方便移植。而汇编虽然效率高,但相对比较繁琐,特别是遇到综合性强的逻辑运算时,执行起来比较困难。下面主要对时钟程序和闹钟子程序加以详细介绍。4.1
19、高准确度时钟程序算法电子计时器通常以石英晶振为时钟源。时钟源的频率通常为几十khz乃至几十mhz,而所用时钟的最小计单位一般在0.01s1s。高频的时钟源脉冲通过分频器后产生基本定时脉冲。电子计时器的计时部分就是对基本定时脉冲进行累加,产生秒、分、时等时间信息乃至日、月、年等日期信息。而常常一个电子时钟会出现走时误差,一个常规电子计时器的计时准确度,取决于晶振标称频率(fs)与实际频率(fo)的频率偏差和晶振频率的时漂、温漂等离散参数。普通晶振的实际频率与标称频率有较大的偏差,可达万分之五,折算到一天计时误差就是43.2s。而减少计时误差的最好方法就是用软件控制,我们本实验中用到的AT89C5
20、2的晶振频率是12MHZ,实际长期平均振荡频率fo=12.0006mhz,量化精度取1字节,取tns=10ms,则分频系数为: n0=fo/(12tns)=12.0006/(1210 610 -2)=10000.5 令n=int(n0)=10000 ni为第i决定时值,可能是10000或10001,这取决于nti的进位;nti为第i次尾数暂存值。每次定时中断服务程序均执行上式,取得第i次定时计数值,然后实时时钟增加10ms,完成时钟功能。这样进行软件计时校正后,每10天的计时误差1s。所以这种基于软件提高时钟准确度的算法,具有极高的实用价值。4.2 定时闹钟程序时钟的闹钟主要是通过外部设置的按
21、键来定时,当时钟的时间与设置的时间相同时,将会触发中断源,进入闹钟子程序,这时蜂鸣器将会被接通,发出声音。当中断时间达到规定的时间后,闹钟程序讲会自动退出,蜂鸣器停止响。闹钟工作的程序框图如图3-8所示 设置闹钟时间是否到时?蜂鸣器响闹时过否?NNYYY图 3-8第5章 调试与结果分析经过理论分析和仿真调试后,最后按照硬件电路制作出了成品多功能电子万年历,现在进入了最后的调试阶段。开始为整个系统接上电源后,液晶显示器不亮,通过调节与液晶显示器电源端相连的电位器,显示屏点亮了。5.1 调试我们发现虽然显示屏亮了,但是时钟不走,复位也不起作用,4个时间设置按键也没有反应,通过认真的分析后,软件应该
22、是没有问题的,因为在仿真的时候是能正常工作的,这只可能是在硬件上出现了问题,通过检查电路的焊接,连线都没有错误的情况下,最后确定应该是某个模块没有正常工作,通过查资料,发现时钟芯片DS1302的数据端口和时钟信号端口要接上拉电阻,这样才能正常的工作,通过调试,最后时钟开始走起来,达到了预期的效果。5.2 结果分析 时钟虽然是正常的走了,整个系统也运行顺畅,但是时钟精度不够高。5.2.1 误差分析一个常规的电子时钟走时不准的原因主要是时钟标称频率与实际频率有误差,这样导致时钟计数不准确,另外是环境的温度影响,也会导致走时有误差,因为每个元器件都有一个正常工作温度范围,但超出这个范围后,就会使元件
23、不能正常工作,这样也就导致了整个系统的误差产生。第6章 总结多功能万年历是能同时显示日历、星期、时间、温度的电子时钟。这次的毕业设计从选题上也花了很多时间,板也做了一块又一块,在做的过程中还是出现了很多常见的错误,比如在画原理图的时候,连线连错,网络标号不对应,电源和地接反,这些都是很小的错误,但是小错误也能成大错,导致最后做出来的板不能实现预期的功能。另外就是对一些芯片的运用不熟悉,导致显示乱码也是很正常的,比如时钟芯片DS1302的数据端口和信号端口必须接上拉电阻后再接电源端,否则芯片不能正常工作,软件无法正常运行,整个系统也将瘫痪无法正常显示。还有液晶显示器的电源端也要接个电位器,一是方
24、便调节明暗度,二是防止电流过大,烧坏显示屏,这些都是很基本的知识,但必须要熟记和掌握,以致才能运用的更加熟练。另外对于这次的毕业设计,感觉自己的能力又得到了一定的提高,特别是对设计的整体流程有了更清晰的认识,包括选题、设计,制版,调试、写报告。但是还有很多要弥补的地方,比如写软件程序,对于一个学单片机的人来说,不仅要懂硬件,更要懂软件,只有都懂了,才能设计出更好的电路,要学好这些,只有不断的去尝试,尝试中不断的发现错误,不断的改正错误,只有这样能力才能得到一步步的提高。参考文献1 陈权昌.李兴富单片机原理及应用华南理工大学出版社,2007年8月2 陈正振.电子电路设计与制作 广西交通职业技术学
25、院信息工程系 2007年3 求是科技.8051系列单片机C程序设计.北京:人民邮电出版社,2006年4 谭浩强.C程序设计.北京:清华大学出版社,1991年附录附录一 电路原理图附录二 电路PCB图附录三 元件清单元件类型个数电阻1K3排阻10K1晶振12M1晶振32.768K1电解电容22u1瓷片电容22p4单片机AT89C521温感器DS18B201三极管NPN1时钟芯片DS13021电位器10K1蜂鸣器1附录四 源程序#include#include#define uchar unsigned char #define uint unsigned int#define TIME (0X1
26、0000-50000)#define FLAG 0XEF/闹钟标志sbit rst=P35;sbit clk=P34;sbit dat=P33;sbit rs=P15;sbit rw=P16;sbit e=P17;sbit DQ=P14; /温度输入口sbit P3_2=P32;sbit ACC_7=ACC7;uchar i=20,j,time116;/全局变量及常量定义uchar alarm2,time215,time3;uchar code Day=31,28,31,30,31,30,31,31,30,31,30,31;/12个月的最大日期(非闰年)/音律表uint code table1
27、=64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217;/发声部分的延时时间uchar code table2=0x82,1,0x81,0xf4,0xd4,0xb4,0xa4,0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0;/LCD自建字uchar code tab=0x18,0x1b,5,4,4,5,3,0,0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,/年0x0f,0x09,0x0f,0x09,0x
28、0f,0x09,0x11,0x00,/月0x0f,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00;/日 /*温度小数部分用查表法*/Uchar code ditab16=0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;/闹钟中用的全局变量uchar th1,tl1;uchar temp_data2=0x00,0x00; / 读出温度暂放bit flag;/18b20存在标志位/*11微秒延时函数*/delay(uint t)for(;t0;t-);/*18B20
29、复位函数*/ow_reset(void)uchar i;DQ=1;_nop_();_nop_();DQ=0; /delay(50); / 550usDQ=1; / delay(6); / 66usfor(i=0;i0; i-) /DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDQ=val&0x01; /最低位移出delay(6); /66usval=val/2; /右移一位DQ=1;delay(1); /*18B20读1个字节函数*/从总线上读取一个字节uchar read_byte(void)uc
30、har i;uchar value=0;for (i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ=0; /_nop_();_nop_();_nop_();_nop_(); /4usDQ=1;_nop_();_nop_();_nop_();_nop_(); /4us if(DQ)value|=0x80;delay(6); /66usDQ=1;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位if(!flag)/判断ds1820是否存在?若ds18b20不存在则返回return;/write_byte(0xC
31、C); / Skip ROM/write_byte(0x44); / 发转换命令/delay(70);write_byte(0xCC); /发Skip ROM命令write_byte(0xBE); /发读命令temp_data0=read_byte(); /温度低8位temp_data1=read_byte(); /温度高8位ow_reset();write_byte(0xCC); / Skip ROMwrite_byte(0x44); / 发转换命令/*温度数据处理函数*/work_temp()uchar n=0,m; if(temp_data1127)/负温度求补码temp_data1=(
32、256-temp_data1);temp_data0=(256-temp_data0);n=1;time213=ditabtemp_data0&0x0f+0;time212=.;m=(temp_data0&0xf0)4)|(temp_data1&0x0f)4);/if(n)m-=16;time29=m/100+0;time211=m%100;time210=time211/10+0;time211=time211%10+0;if(time29=0)/最高位为0时都不显示time29=0x20;if(n)/负温度时最高位显示-time29=-;if(time210=0)if(n)time210=
33、-;time29=0x20;elsetime210=0x20;if(time211=0&time213=0)time211=time212=0x20;delay1ms(uchar time)/延时1msuchar i,j;for(i=0;itime;i+)for(j=0;j250;j+);/LCD驱动部分enable()rs=0;rw=0;e=0;delay1ms(3);e=1;write2(uchar i)P0=i;rs=1;rw=0;e=0;delay1ms(2);e=1;write1(uchar data *address,m)uchar i,j;for(i=0;im;i+,addres
34、s+)j=*address;write2(j);/LCD显示lcdshow()P0=0XC;/显示器开、光标关enable();P0=0x80;/写入显示起始地址enable();write1(time1,16);P0=0xc1;/写入显示起始地址enable();write1(time2,15);/自建字zijianzi()uchar i;P0=0x40;enable();for(i=0;i32;i+)write2(tabi);delay1ms(2);/DS1302读写子程序write(uchar address)uchar i;clk=0;_nop_();rst=1;_nop_();for
35、(i=0;i=1;clk=0;uchar read()uchar i,j=0;for(i=0;i=1;_nop_();clk=0;_nop_();if(dat)j|=0x80;_nop_();clk=1;return(j);/部分显示数据初始化timestart()time11=time113=time28=time29=time210=0x20,time214=0;time16=1,time19=2,time112=3,time12=2,time13=0;time114=W,time22=time25=:;write(0xc1);alarm0=read();rst=0;write(0xc3)
36、;alarm1=read();rst=0;write(0xc5);time10=read();rst=0;/读取时间readtime()uchar i,m,n;write(0x8d);/读取年份m=read();rst=0;time14=m/16+0x30;time15=m%16+0x30;write(0x8b);/读取星期m=read();rst=0;time115=m+0x30;for(i=7,n=0x89;i11;i+=3,n-=2)/读取月份和日期write(n);m=read();rst=0;time1i=m/16+0x30;time1i+1=m%16+0x30;for(m=0,i=
37、0,n=0x85;i7;i+=3,n-=2,m+)/读取时,分,秒write(n);timem=read();rst=0;time2i=timem/16+0x30;time2i+1=timem%16+0x30;time0() interrupt 1 using 1i-;if(i=0)if(j!=0)j-; i=20;TH0=TIME/256,TL0=TIME%256;/闹钟部分intime1() interrupt 3TH1=th1,TL1=tl1;P3_2=!P3_2;showalarm()uchar i,j,a,b,n;ET1=1;for(j=0;j=4; if(a=0)TR1=0;goto D1;a=(-a)1)/2;TH1=th1=table1a/256,TL1=tl1=table1a%256;TR1=1;D1:dob-;for(n=0;n2)i+;j=(time110&0xf)*10+(time111&0xf);i+=j;i%=7;if(i=0)i=7;return(i);/设置时间settime()uchar i=0x85,year,month,day,n;
限制150内