首页 3基于单片机AT89S52的万年历设计

3基于单片机AT89S52的万年历设计

举报
开通vip

3基于单片机AT89S52的万年历设计第1章​ 时钟电路硬件介绍 第一节 AT89S52单片机 单片机是微型计算机的一个重要分枝,单片机是把中央处理器、随机存储器、只读存储器、定时器/计数器、并行接口、串行接口、A/D转换器等主要计算机部件,集中在一块集成电路芯片上。虽然只是一个芯片,但只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。从功能上它就相当于一台完整的微机。随着科学技术的迅猛发展,单片机集成度高、体积小、运算速度快、功耗低、运行可靠、价格低廉等诸多优点,越来越显现出来。目前可以说单片机已经渗透到我们的生活的各个领域,在工业方面...

3基于单片机AT89S52的万年历设计
第1章​ 时钟电路硬件介绍 第一节 AT89S52单片机 单片机是微型计算机的一个重要分枝,单片机是把中央处理器、随机存储器、只读存储器、定时器/计数器、并行接口、串行接口、A/D转换器等主要计算机部件,集中在一块集成电路芯片上。虽然只是一个芯片,但只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。从功能上它就相当于一台完整的微机。随着科学技术的迅猛发展,单片机集成度高、体积小、运算速度快、功耗低、运行可靠、价格低廉等诸多优点,越来越显现出来。目前可以说单片机已经渗透到我们的生活的各个领域,在工业方面:像过程控制、数据采集,机电一体化、智能化仪器仪表,特别在军事武器控制方面尤为突出。在日常生活方面,我们使用彩电、洗衣机、电冰箱,录放机、VCD、照相机、手机、高级定时闹钟以及公共汽车上的报站器等等可以说举不胜举。 单片机经过几代的发展,目前正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角多功能化,以及低电压低功耗。 一 AT89S52单片机的功能特性描述 AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦始于常规编程器。在S单芯片上,拥有灵巧的的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 。 AT89S52具有以下 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,两个数据指针。三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持两种软件可选择节电模式。空闲模式下。CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作、掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。图1.1.1所示为AT89S52单片机。 图1.1.2 AT89S52单片机 二 AT89S52单片机引脚图及其功能 AT89S52单片机引脚图如图1.1.2所示: 图1.1.1 AT89S52引脚图 VCC : 电源 GND: 接地 P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时, P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。 在 flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。 P1 口:P1 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p1 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL) 。 此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX) ,具体如表1.1.1所示。 在flash编程和校验时,P1口接收低8位地址字节。 引脚号 第二功能 P1.0 T2(定时器/计数器T2的外部计数输入) ,时钟输出 P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制) P1.5 MOSI(在系统编程用) P1.6 MISO(在系统编程用) P1.7 SCK(在系统编程用) 表1.1.1 P2 口:P2 口是一个具有内部上拉电阻的 8 位双向 I/O 口,P2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL) 。在访问外部程序存储器或用16位地址读取外部数据存储器 (例如执行MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送 1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。 P3 口:P3 口是一个具有内部上拉电阻的 8 位双向 I/O 口,p2 输出缓冲器能驱动 4 个TTL 逻辑电平。对 P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL) 。P3口亦作为AT89S52特殊功能(第二功能)使用,如表1.1.2所示。 在flash编程和校验时,P3口也接收一些控制信号。 引脚号 第二功能 P3.0 RXD(串行输入) P3.1 TXD(串行输出) P3.2 INT0(外部中断 0)​​ P3.3 INT0(外部中断 0) P3.4 T0(定时器0外部输入) P3.5 T1(定时器1外部输入) P3.6 WR(外部数据存储器写选通) P3.7 RD(外部数据存储器写选通) 表1.1.2 RST: 复位输入。晶振工作时,RST脚持续2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。 ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低 8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。 在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。 PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。 当 AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。 EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程序存储器读取指令,EA必须接GND。 为了执行内部程序指令,EA应该接VCC。 在flash编程期间,EA也接收12伏VPP电压。 XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 第二节 DS1302时钟芯片介绍 现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本次使用的实时时钟电路DS1302是DALLAS公司的一种高性能、低功耗、带RAM的实时时钟电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。如图1.2.1所示为DS1302实物图。 图1.2.1 DS1302 一 DS1302引脚功能及结构 图1.2.1 DS1302引脚图 图1.2.1示出DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向)。SCLK始终是输入端。 第三节 LCD1602液晶屏简介 采用LCD液晶显示,具有超精致影像画质、十足平面显示、节省空间、节省能源等优点,但按控制方式不同,LCD可分为被动矩阵式LCD及主动矩阵式LCD两种。可根据不同需要采用不同的方式。 被动矩阵式LCD:被动矩阵式LCD在亮度及可视角方面受到较大的限制,反应速度也较慢。由于画面质量方面的问题,使得这种显示设备不利于发展为桌面型显示器,但成本低廉。 主动矩阵式LCD:目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD(Thin Film Transistor-LCD,薄膜晶体管LCD)。TFT液晶显示器是在画面中的每个像素内建晶体管,可使亮度更明亮、色彩更丰富及更宽广的可视面积。与CRT显示器相比,LCD显示器的平面显示技术体现为较少的零件、占据较少的桌面及耗电量较小,但CRT技术较为稳定成熟。本次 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 采用主动矩阵式LCD。 一 LCD1602实物图 LCD1602实物图如图1.3.1所示: 图1.3.1 LCD1602实物图 二 LCD1602引脚图 LCD1602引脚图如图1.3.2所示: 三 LCD1602引脚说明 表1.3.1所示为LCD1602引脚功能: 编号 符号 引脚说明 编号 符号 引脚说明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选择 12 D5 数据 5 R/W 读/写选择 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 表1.3.1 引脚功能表 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第2章​ 时钟硬件电路设计 第1节​ 硬件电路的总体框图设计 本次设计采用以AT89S52为核心的单片机最小系统,显示模块采用LCD液晶屏动态扫描显示。设计框图如图2.1.1所示: 图2.1.1 时钟硬件框架图 基本原理:本次设计的时钟电路使用电源模块由变压器和二极管整流电路构成,通电后输出5V直流电压分别给DS1302时钟芯片、AT89S52单片机和LCD1602供电。AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作。有四个接口,分别为P0口接上拉电阻之后与LCD1602显示屏连接;P1口接DS1302时钟电路;P3口接按键电路。 时钟电路以DS1302为核心,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。显示部份由LCD液晶显示屏显示,当AT89S52单片机接收到DS1302发来的信号后,通过相应的显示子程序变换成LCD液晶屏所需要的电信号,这样就可以把时间显示出来。图2.1.2为时钟电路图。 图2.1.2 时钟电路图 第2节​ AT89S52单片机主控模块 AT89S52是一个8位单片机,片内ROM全部采用FLASH ROM技术,晶振时钟为12MHz。AT89S52是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。第31引脚需要接高电位使单片机选用内部程序存储器。AT89S52具有在线编程可擦除技术,当对电路进行调试时,由于程序错误或对程序新增功能需要烧入程序时,不需要对芯片多次插拔,所以不会对芯片造成损坏。 单片机的最小系统如图2.2.1所示, 第9引脚为复位引脚,外接300Ω电阻,10uF电容及开关后构成手动上电复位电路,每按一次时钟回复初始状态。18引脚XTAL1外接12MHZ的晶振和22PF微调电容C5的一端,在片内它是振荡器倒相放大器的输入,19引脚XTAL2外接12MHZ晶振另一端和22PF微调电容C6的一端,在片内它是振荡器倒相放大器的输出。C5、C6的另一端接地,18引脚、19引脚的外接电路为时钟电路。第20引脚为接地端GND,通常在VCC和GND引脚之间接0.1μF高频滤波电容。 第40脚为电源端VCC,接+5V电源。 图2.2.1 AT89S52主控模块电路图 第3节​ 电源供电电路 现在生活用电都是220V的交流电,而本次设计中使用的芯片的驱动电压全都是5V直流电压,为了使本次设计的产品方便实用,所以设计了一个220V交流电转换成5V直流电电源。 电路设计原理图如下图2.3.1所示: 图2.3.1 AC 220V/DC 5V框图 基本原理:220V市电经220V/9V变压器变压后得到9V交流电压,经过二极管桥式整流电路整流后,输出波动很大的直流电压,因此要进行滤波和稳压设计,在整流桥后接一只滤波电容C1,滤波稳压之后输入到7805稳压电路中,直流电压经过LM7805的稳压和C3的滤波便在稳压电源的输出端产生了精度高、稳定度好的5V直流输出电压。电路图如图2.3.2所示: 图2.3.2 AC 220V/ DC 9V电路图 第4节​ DS1302时钟电路 如图2.4.1所示为DS1302时钟电路图, DS1302与CPU的连接需要三条线,即SCLK(7)、I/O(6)、RST(5),分别于单片机的P1.5(6)P1.6(7)P1.7(8)相连。 图2.4.1 时钟芯片电路 DS1302工作原理:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲。如表3.4.1所示,DS1302的控制字的位7必须置1,若为0则不能对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写,CK=0,位1至位5指向操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。 1 RAM A4 A3 A2 A1 A0 RD CK WR 7 6 5 4 3 2 1 0 表2.4.1 DS1302的控制字节 第5节​ LCD1602液晶显示电路 单片机AT89S52的P2口分别接LCD控制屏幕的显示。而P0口用来显示信息的输入,液晶显示框图图见图2.5.1。 图2.5.1 液晶显示方框图 由于LCD的电流参数较小,为了防止因电流过大而被烧坏,能够帮助内存起到稳压作用,让内存工作更稳定,因此必须加入限流电阻。限流电阻有两种实现方式: 1.直接用单个电阻限流 直接用单个电阻进行限流,散热快,但是既占空间又接线麻烦。 2. 用排阻进行限流 用多个电阻排列而成的排阻能减少占用的空间,易于连线。 综上所述,本次设计采用10KΩ排阻为上拉电阻。液晶显示电路图如图3.5.2所示: 图3.5.2 LCD1602液晶显示电路 第六节 按键模块设计 由于本次设计的是电子时钟需要实现年、月、日、时、分、秒、星期多种功能的显示,并要能够对日期时间进行调节,因此,在设计过程中按键的设计就显得尤为重要。 在设计过程中共采用了4个按键K1、K2、K3、K4,其功能依次是:光标键(每按一次光标移动一位);加一键(每按一次,光标对应的数字加一);减一键(每按一次,光标对应的数字减一);确定键(按下此键之后,光标停止闪动,保存当前数字并开始计时)。在设计时,我在每个按键后加一个发光二极管,每按一次按键,二极管闪烁一次,这样使操作更加直观。按键电路与AT89S52单片机的P3口连接,具体电路如图2.6.1所示。 图2.6.1 按键电路 第3章​ 时钟电路软件设计 第一节 程序总体流程图 在编程上,首先进行初始化,定义程序的入口地址以及中断的入口地址,在主程序的开始定义一组固定单元用来存储计数的年、月、日、星期、时、分、秒、的存储单元。调用闰年判断程序后,进入主程序中循环。在主程序中,对不同的按键进行扫描,实现时间调整功能。时钟计时利用定时器T0中断子程序实现,时间调整闪烁程序由定时器T1的中断服务子程序实现。考虑到实用性,在该电子钟的时间调整时采用了闪烁。在自动开、关屏设置子程序中,另外开辟内存单元用来存放开、关屏设置时间,而在另外的子程序中不断比较当前时间是否和设置时间相等并设置标志位,然后程序中检测标志位,从而实现开、关屏操作。系统总体流程图见图3.1.1。 N Y Y N 图3.1.1 程序流程图 第二节 时钟中断服务子程序设计 首先设定定时器T0的初值,T0的最大定时不足1s,为便于计算,取定时50ms。这样每50ms中断1次,中断20次为1s。50ms的定时初值的计算如下:0.05/(1/12*10^6/12))=C350H ,补码为3CB0H。启动定时器后,运行中断服务程序。在中断服务程序中,由秒信号来计数,当达到60后向“分”进位;分计数,当达到60后向“时”进位;时计数,当达到24后向“日”进位;日计数,日超出当月上限后进位到“月”;月计数,当月计数到达12后向“年”进位……,在日计数程序中,日每增加一天,都对星期进行调整,具体为:若上一天不是星期日,则直接在星期上加一,若上一天是星期日,则当前星期变为星期一。 第3节​ 时间调整子程序设计 在主程序中通过按键进入时间调整界面,可实现年、月、日、星期及时间的调整。每次调整时,调用闪烁程序,使相应的位闪烁,再通过按键进行加减调整。闪烁程序也采用定时器T1中断实现,每次计时50ms,中断6次也就是0.3秒过后,闪烁标志位取反,显示熄灭。 第四节 显示子程序流程图 要使液晶屏可以正确的显示时间日期,就要对从DS1302时钟模块得到的数据进行转换,使之符合LCD1602正常工作所需要的电平。具体程序流程图如图3.4.1所示。 附录一 系统原理图 附录二 部分原程序 一 系统主程序 #include #include //#include "LCD1602.h" //#include "DS1302.h" #define uint unsigned int #define uchar unsigned char sbit DS1302_CLK = P1^7; //实时时钟时钟线引脚 sbit DS1302_IO = P1^6; //实时时钟数据线引脚 sbit DS1302_RST = P1^5; //实时时钟复位线引脚 sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数 sbit Set = P3^0; //模式切换键 sbit Up = P3^1; //加法按钮 sbit Down = P3^2; //减法按钮 sbit out = P3^3; //立刻跳出调整模式按钮 char done,count,temp,flag,up_flag,down_flag; uchar TempBuffer[5],week_value[2]; void show_time(); //液晶显示程序 sbit LcdRs = P2^5; sbit LcdRw = P2^6; sbit LcdEn = P2^7; sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口 unsigned char LCD_Wait(void) {LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_(); LcdEn=0;return DBPort; } #define LCD_COMMAND 0 // Command #define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏 #define LCD_HOMING 0x02 // 光标返回原点 void LCD_Write(bit style, unsigned char input) {LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input; _nop_();//注意顺序 LcdEn=1; _nop_();//注意顺序 LcdEn=0; _nop_();LCD_Wait(); } #define LCD_SHOW 0x04 //显示开 #define LCD_HIDE 0x00 //显示关 #define LCD_CURSOR 0x02 //显示光标 #define LCD_NO_CURSOR 0x00 //无光标 #define LCD_FLASH 0x01 //光标闪动 #define LCD_NO_FLASH 0x00 //光标不闪动 void LCD_SetDisplay(unsigned char DisplayMode) {LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode) {LCD_Write(LCD_COMMAND, 0x04|InputMode);} //初始化LCD void LCD_Initial() {LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动} void GotoXY(unsigned char x, unsigned char y) {if(y==0)LCD_Write(LCD_COMMAND,0x80|x); if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));} //将字符输出到液晶显示 void Print(unsigned char *str) {while(*str!='\0') {LCD_Write(LCD_DATA,*str);str++;}} 二 DS1302时钟程序 DS1302时钟部分子程序 typedef struct __SYSTEMTIME__ { unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[11]; unsigned char TimeString[9]; }SYSTEMTIME; //定义的时间类型 SYSTEMTIME CurrentTime; #define AM(X) X #define PM(X) (X+12) // 转成24小时制 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A #define DS1302_DAY 0x86 #define DS1302_MONTH 0x88 #define DS1302_YEAR 0x8C void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 ) { unsigned char i;ACC = d; for(i=8; i>0; i--) {DS1302_IO = ACC0; DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; / ACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; } return(ACC); } void Write1302(unsigned char ucAddr, unsigned char ucData) //ucAddr: DS1302地址, ucData: 要写的数据 { DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; } unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据 { unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);} 时钟芯片初始化程序 void Initial_DS1302(void) { unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判断时钟芯片是否关闭 {Write1302(0x8e,0x00); //写入允许 Write1302(0x8c,0x07); //以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55 Write1302(0x88,0x07);Write1302(0x86,0x25); Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59); Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}} void Delay1ms(unsigned int count) {unsigned int i,j;for(i=0;i0;delay--){for(i=0;i<62;i++) //1ms延时. {;}}} void outkey() //跳出调整模式,返回默认显示 { uchar Second;if(out==0) { mdelay(8); count=0; hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0; Second=Read1302(DS1302_SECOND); Write1302(0x8e,0x00); //写入允许 Write1302(0x80,Second&0x7f); Write1302(0x8E,0x80); //禁止写入 done=0; while(out==0); }} 三 显示程序 void show_time() //液晶显示程序 { DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据 TimeToStr(&CurrentTime); //时间数据转换液晶字符 DateToStr(&CurrentTime); //日期数据转换液晶字符 GotoXY(0,1); Print(CurrentTime.TimeString); //显示时间 GotoXY(0,0); Print(CurrentTime.DateString); //显示日期 GotoXY(15,0); Print(week_value); //显示星期 GotoXY(11,0); Print("Week"); //在液晶上显示 字母 week Delay1ms(400); //扫描延时} main() { flag=1; //时钟停止标志 LCD_Initial(); //液晶初始化 Initial_DS1302(); //时钟芯片初始化 up_flag=0; down_flag=0; done=0; //进入默认液晶显示 while(1) { while(done==1) keydone(); //进入调整模式 while(done==0) { show_time(); //液晶显示数据 flag=0; Setkey(); //扫描各功能键 } } }
本文档为【3基于单片机AT89S52的万年历设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_262913
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:29
分类:工学
上传时间:2011-06-17
浏览量:37