基于单片机的多功能万年历_第1页
基于单片机的多功能万年历_第2页
基于单片机的多功能万年历_第3页
基于单片机的多功能万年历_第4页
基于单片机的多功能万年历_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、专科毕业设计(论文)题目51单片机电子万年历论文51单片机电子万年历论文摘 要随着当今世界经济的快速发展和信息化时代的来临,各种各样的小型智能家电产品陆续出现在我们的生活当中。日历是人们不可或缺的日常用品。但一般日历都为纸制用品,使用不便,寿命不长。电子万年历采用智能电子控制和显示技术,改善了纸制日历的缺陷。本设计以STC89C52RC单片机为主控核心,以DS1302为时钟芯片,以LCD1602作为显示器,并加以DS18B20进行环境温度测量。该系统能够实现实时时钟显示、时间校准、闹钟设置、定时报警、环境温度测量与显示并能够掉电储存用户设置、掉电正常走时等功能。系统由单片机控制电路、时钟芯片电

2、路、LCD1602液晶显示电路、温度测量电路报警电路、键盘输入电路等组成。本文将从硬件与软件两个方面对本系统进行详细介绍。关键词:电子万年历;单片机;时钟芯片;液晶显示目录一、设计要求与方案论证 41.1 设计要求 41.2 系统基本方案选择 41.2.1单片机芯片的选择方案 41.2.2 显示模块选择方案41.2.3 时钟芯片的选择方案 41.2.4 温度传感器的选择方案5二.系统的硬件设计与实现52.1 电路设计框图 52.2 系统硬件概述 52.3 主要单元电路的设计 62.3.1单片机主控制模块的设计 62.3.2时钟电路模块的设计 62.3.3温度采集模块设计 72.3.4 电路原理

3、与说明 72.3.5显示模块的设计 82.3.7 报警模块的设计············································

4、3;·······9三、系统的软件设计 -9系统源代码一:设计要求与方案论证1.1设计要求:() 基本要求1 能显示阳历年、月、日、星期、小时、分、秒,能标明是否为闰年。2 显示模块采用LCD液晶显示,要求能够用按键调整时间。3 具有定时报警功能,能够进行整点和半点报时。( 2 ) 创新要求1 具有闹钟功能2 实现掉电储存,储存用户设置如闹钟设置与时间设置3 针对万年历,设计其他有实际意义的创新功能1.2 系统基本方案选择1.2.1单片机芯片的选择方案根据设计要求,本系统单片机芯片选择STC89C52RC,此芯片具有高速、低

5、功耗、超强抗干扰的性能,指令系统完全兼容传统的8051单片机,具有8KB用户程序储存空间flash rom,片上集成512字节RAM,并具有4KB EEPROM。片的Flash与EEPROM是分开独立的,利用ISP/IAP技术,可将部的Data Flash当做EEPROM,擦写次数在10万次以上。EEPROM可用于保存一些在应用过程中修改并且掉电不丢失的参数数据。由于本系统要实现用户设置的掉电存储,可利用此功能以减少外部电路。且STC89C52RC具有ISP/IAP功能,可以不用编程器实现在线编程。因此从经济和功能等方面综合考虑,选择STC89C52RC。1.2.2 显示模块选择方案本系统采用

6、LCD1602液晶模块作为显示器,1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。为了更直观地显示时间,温度等信息,综合经济因素,使用LCD1602作为显示器。1.2.3时钟芯片的选择方案和论证: 采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以与闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V5.5V围,2.

7、5V时耗电小于300nA.2.4温度传感器的选择方案与论证:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量围广等优点。1.3 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用STC89C52RC作为主控制系统; DS1302提供时钟;DS18B20数字式温度传感器;LCD1602作为显示器二:系统的硬件设计与实现STC89C52RC主控制模块2.1 电路设计框图键盘模块LCD模块温度采集模块DS1302时钟模块2.2 系统硬件概述本电路是由

8、STC89C52RC单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周日、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20构成;显示部份由LCD液晶模块构成2.3 主要单元电路的设计2.3.

9、1单片机主控制模块的设计STC89C52RC单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。STC单片机如图-1所示:(1) 电源引脚电源引脚主要负责单片机的供电,有两根引脚。Ø VCC(pin40):电源端。正常工作电压为+5.0VØ GND(pin20):接地端(2) 外接晶振或外部振荡器引脚主要负责为单片机运行提供时钟振荡器,主要有两根引脚。Ø XTAL1(Pin19):时钟XTAL1脚,片振荡电路的输入端。Ø XTAL2

10、(Pin18):时钟XTAL2脚,片振荡电路的输出端STC89C52RC的时钟振荡器有两种工作方式。一种是片时钟振荡方式,在18与19脚之间外接石英晶体(033Hz)和振荡电容(1030pF)。另外一种是外部时钟方式,将XTAL2悬空,外部信号从XATL1输入。本系统采用前一种方案。(3) 输入输出(I/O)端口引脚Ø P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时

11、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口输出

12、地址的高八位。在给出地址“1”时,它利用部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 Ø P3口:P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的容读入到部总线,经过某种运算或变换后再写回到端口锁存器。只有读端口时才真正地

13、把外部的数据读入到部总线。输入缓冲器CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作。这是由硬件自动完成的,不需要我们操心,1然后再实行读引脚操作,否则就可能读入出错,如果不对端口置1,端口锁存器原来的状态有可能为0Q端为0Q为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低使得外加的1信号读入后不一定是1。若先执行置1操作,则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口。STC90C516RD+的P0/P1/P2/P

14、3口作为输入时都是准双向口。(4) 复位引脚Ø RST(Pin9):单片机部CPU的复位信号输入端。在单片机的振荡器启动后,该引脚置两个机器周期以上高电平,便可以实现复位。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和电容的一端,在片它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻与开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 如图-2所示图-2主控制系统2.3.2时钟电路模块的设计DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RA

15、M的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+

16、0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置

17、为高电平。I/O为串行数据输入输出端(双向)。SCLK为时钟输入端。图示为DS1302与单片机的连接电路:2.3.3温度采集模块设计如图所示:DS18B20各引脚功能如下:Ø GND(Pin1):接地引脚;Ø DQ(Pin2):数据的输入输出端Ø VCC(Pin3)外部供电电源引脚采用数字式温度传感器DS18B20,它是数字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用P3.6与DS18B20的I/O口连接加一个上拉电阻,VCC接电源,GND接地。 图-3 DS18B20温度采集2.3.4 电路原理与说明1.时钟芯片D

18、S1302的说明(1) 时钟芯片DS1302的工作原理: DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。图5为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为DS1302的日历、时间寄存器容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器

19、停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节DS1302的控制字如表-1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出 RAM RD 1 A4 A3 A2 A1 A0 / CK /WR表-1 DS1302的

20、控制字格式(3) 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。如下图-4所示 图-4 DS1302读/写时序图(4) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器与其控制字见表-2。 表-2 DS1302的日历、时间寄存器 此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器与与RAM相关的寄存器等。时

21、钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 2. 温度传感器DS18B20的说明(1)2.3.5显示模块的设计显示模块采用LCD1602,其电路图如下:引脚说明:l Pin1:电源引脚l Pin2:接地引脚l Pin3:LCD驱动电压输入,采用10K可调电位器与地相连l Pin4:RS=1,表示P

22、in7-Pin14为显示数据;RS=0,表示Pin7-Pin14为指令l Pin5:RW=1,数据被读到Pin7-Pin14;RW=0,数据被写到Pin7-Pin14l Pin6:使能信号l Pin7-Pin14:数据线l Pin15:背光正极l Pin16:背光负极控制时序表RSRWEPin7-Pin14功能001输入写指令代码01下降沿输出读BF和AC值101输入写显示数据11下降沿输出读显示数据2.3.6报警模块的设计报警模块电路原理图如下:由于本系统只需发出简单的声音,因此采用了有源蜂鸣器,以减少程序的复杂程度,其中蜂鸣器通过单片机引脚P1.0进行控制。三:系统的软件设计程序包含时间读

23、取模块、温度读取模块、时间和温度显示模块,时间调节模块,闹钟设置模块与掉电存储模块。下面是本套系统的全部程序:#include<reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int #define RdCommand 0x01 /定义ISP的操作命令#define PrgCommand 0x02#define EraseCommand 0x03#define WaitTime 0x01 /定义CPU的等待时间#define row_1 0x80 /第一行的初始位置

24、#define row_2 0x80+0x40 /第二行初始位置sfr ISP_DATA=0xe2;/寄存器申明sfr ISP_ADDRH=0xe3;sfr ISP_ADDRL=0xe4;sfr ISP_CMD=0xe5;sfr ISP_TRIG=0xe6;sfr ISP_CONTR=0xe7;sbit bell=P10;sbit RS=P05;sbit RW=P06;sbit E=P07;sbit SCLK=P02; sbit IO=P01; sbit RST=P00; sbit ACC0=ACC0;sbit ACC7=ACC7;sbit Tkey=P30;sbit Ckey=P33;sbi

25、t Akey=P31;sbit keyup=P35;sbit keydown=P34;sbit secled=P12;sbit setled=P13;sbit DQ=P36;uchar a,miao,shi,fen,ri,yue;uchar nian,week,flag,temp,Tkeyn,Akeyn,stopwn;uchar hyear;char ala="Alarm"char atime="It's time!" uchar al;uint ahour,aminute,asecond;uchar time;uchar code digit1

26、0="0123456789" /定义字符数组显示数字uchar code Str="Temperature is:" /说明显示的是温度uchar code Error="Error!Check!" /说明没有检测到DS18B20uchar code Cent="Cent" /温度单位int bdata TEMP1;int bdata TEMP2;void baoshi();void alarm();void ISP_IAP_enable(void) /* = 打开 ISP,IAP 功能 = */EA = 0; /

27、* 关中断 */ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000*/ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时*/ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1*/void ISP_IAP_disable(void) /* = 关闭 ISP,IAP 功能 = */ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ISP_TRIG = 0x00;EA = 1; /* 开中断 */void ISPgoon(void) /* = 公

28、用的触发代码 = */ISP_IAP_enable(); /* 打开 ISP,IAP 功能*/ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1*/ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2*/ _nop_();unsigned char EEP_read(unsigned int byte_addr) /* = 字节读 = */ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值*/ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);I

29、SP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令*/ISPgoon(); /* 触发执行*/ISP_IAP_disable(); /* 关闭ISP,IAP功能*/return (ISP_DATA); /* 返回读到的数据*/void SectorErase(unsigned int sector_addr) /* = 扇区擦除 = */unsigned int iSectorAddr;iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址

30、*/ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);ISP_ADDRL = 0x00;ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */ISP_CMD = ISP_CMD|EraseCommand; /* 擦除命令3 */ ISPgoon(); /* 触发执行*/ISP_IAP_disable(); /* 关闭ISP,IAP功能*/void EEP_write(unsigned int byte_addr, unsigned char original_data)/* = 字节写 = */ ISP_ADDR

31、H = (unsigned char)(byte_addr >> 8); /* 取地址 */ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);ISP_CMD = ISP_CMD & 0xf8; /* 清低3位*/ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ISP_DATA = original_data; /* 写入数据准备*/ISPgoon(); /* 触发执行 */ISP_IAP_disable();/* 关闭IAP功能*/void bitchange(int bitm)int

32、 i;TEMP1=bitm;TEMP2=TEMP1&0X01;for(i=0;i<7;i+)TEMP1=TEMP1>>1;TEMP2=TEMP2<<1;TEMP2=TEMP2|TEMP1&0X01;P2=TEMP2;void delay(uint xms)/延时函数uint x,y;for(x=xms;x>0;x-)for(y=110;y>0;y-);/*液晶写入*/void Lcdcom(uchar )/液晶写入指令函数RS=0;/置为写入命令bitchange();/送入数据delay(1);E=1;/拉高使能端delay(1);E

33、=0;/完成高脉冲void Lcddat(uchar dat)RS=1;/置为写入数据bitchange(dat);/送入数据delay(1);E=1;delay(1);E=0;void write_hyear()uchar gw,sw;sw=hyear/10;gw=hyear%10;Lcdcom(row_1+2);Lcddat(0x30+sw);Lcddat(0x30+gw); /*over*/*ds1302*/void write_byte(uchar dat)ACC=dat;RST=1;for(a=8;a>0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>

34、>1;uchar read_byte()RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;return (ACC);void write_1302(uchar add,uchar dat)RST=0;SCLK=0;RST=1;write_byte(add);write_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)uchar t;RST=0;SCLK=0;RST=1;write_byte(add);t=read_byte();SCLK=1;RST=0;retur

35、n(t);uchar BCD_Decimal(uchar bcd)uchar Decimal;Decimal=bcd>>4;return(Decimal=Decimal*10+(bcd&=0x0F);void ds1302_init()RST=0;SCLK=0;write_1302(0x80,miao);/允许写 删去|0x00void write_sfm(uchar add,uchar dat)/写时分秒uchar gw,sw;gw=dat%10;sw=dat/10;Lcdcom(row_2+add);Lcddat(0x30+sw);Lcddat(0x30+gw);bao

36、shi();alarm();void write_nyr(uchar add,uchar dat) /写年月日uchar gw,sw,year;year=hyear*100+nian;gw=dat%10;sw=dat/10;if(year%400=0)|(year%400!=0)&(year%4=0)Lcdcom(row_2+0);Lcddat('Y');else Lcdcom(row_2+0);Lcddat('N');Lcdcom(row_1+add);Lcddat(0x30+sw);Lcddat(0x30+gw);void write_week(uc

37、har week) /写星期函数Lcdcom(row_1+0x0d);switch(week)case 1:Lcddat('M');Lcddat('O');Lcddat('N');break;case 2:Lcddat('T');Lcddat('U');Lcddat('E');break;case 3:Lcddat('W');Lcddat('E');Lcddat('D');break;case 4:Lcddat('T');Lcddat(

38、'H');Lcddat('U');break;case 5:Lcddat('F');Lcddat('R');Lcddat('I');break;case 6:Lcddat('S');Lcddat('A');Lcddat('T');break;case 7:Lcddat('S');Lcddat('U');Lcddat('N');break;void lcd_init() /液晶初始化函数 RW=0;Lcdcom(0x38)

39、; /设置液晶工作模式Lcdcom(0x0c); /开显示不显示光标Lcdcom(0x06); /整屏不移动,指针加一Lcdcom(0x01);Lcdcom(row_1+2); /字符写入的位置hyear=EEP_read(0x2000);Lcddat(0x30+hyear/10);Lcddat(0x30+hyear%10);Lcdcom(row_1+4); /字符写入的位置nian=EEP_read(0x2200);Lcddat(0x30+nian/10);Lcddat(0x30+nian%10);Lcdcom(row_1+6);Lcddat('-');Lcdcom(row_

40、1+9);Lcddat('-');Lcdcom(row_2+6);Lcddat(':');Lcdcom(row_2+9);Lcddat(':');void lcdtemp_init() delay(15); /延时15ms,首次写指令时应给LCD一段较长的反应时间 Lcdcom(0x38); /显示模式设置:16×2显示,5×7点阵,8位数据接口delay(5); /延时5ms,给硬件一点反应时间 Lcdcom(0x38);delay(5); /延时5ms,给硬件一点反应时间Lcdcom(0x38); /连续三次,确保初始化成

41、功delay(5); /延时5ms,给硬件一点反应时间Lcdcom(0x0c); /显示模式设置:显示开,无光标,光标不闪烁delay(5); /延时5ms,给硬件一点反应时间Lcdcom(0x06); /显示模式设置:光标右移,字符不移delay(5); /延时5ms,给硬件一点反应时间Lcdcom(0x01); /清屏幕指令,将以前的显示容清除delay(5); /延时5ms,给硬件一点反应时间 void lcdala(uint addr, uint dat)uint gw,sw;gw=dat%10;sw=dat/10;Lcdcom(row_2+addr);Lcddat(0x30+sw);

42、Lcddat(0x30+gw);void Akeyscan()if(Akey=0) delay(3);if(Akey=0)setled=0;secled=1;while(Akey=0);Akeyn+;if(Akeyn=5)Akeyn=1;switch(Akeyn)case 1: TR0=0;Lcdcom(0x01);Lcdcom(row_1);for(al=0;al<5;al+)Lcddat(alaal);ahour=EEP_read(0x2400);aminute=EEP_read(0x2600);asecond=EEP_read(0x2800); Lcdcom(row_2+4);Lc

43、ddat(0x30+ahour/10);Lcddat(0x30+ahour%10);Lcddat(':');Lcddat(0x30+aminute/10);Lcddat(0x30+aminute%10);Lcddat(':');Lcddat(0x30+asecond/10);Lcddat(0x30+asecond%10);Lcdcom(row_2+5);Lcdcom(0x0f); /设置光标为闪烁break;case 2: Lcdcom(row_2+8);break;case 3: Lcdcom(row_2+0x0b);break;case 4: Lcdcom(

44、0x0c); /设置光标不闪烁lcd_init();setled=1;secled=0;TR0=1;break;if(Akeyn!=0)if(keyup=0)delay(5);if(keyup=0)while(keyup=0);switch(Akeyn)case 1:ahour+;if(ahour=24)ahour=0;SectorErase(0x2400);EEP_write(0x2400,ahour);lcdala(4,ahour);Lcdcom(row_2+0x05);break;case 2: aminute+;if(aminute=60)aminute=0;SectorErase(0

45、x2600);EEP_write(0x2600,aminute);lcdala(7,aminute);Lcdcom(row_2+0x08);break;case 3: asecond+;if(asecond=60)asecond=0;SectorErase(0x2800);EEP_write(0x2800,asecond);lcdala(10,asecond);Lcdcom(row_2+0x0b);break;if(keydown=0)delay(5);if(keydown=0)while(keydown=0);switch(Akeyn)case 1: ahour-;if(ahour=-1)a

46、hour=23;SectorErase(0x2400);EEP_write(0x2400,ahour);lcdala(4,ahour);Lcdcom(row_2+0x05);break;case 2: aminute-;if(aminute=-1)aminute=59;SectorErase(0x2600);EEP_write(0x2600,aminute);lcdala(7,aminute);Lcdcom(row_2+0x08);break;case 3:asecond-;if(asecond=-1)asecond=59; SectorErase(0x2800);EEP_write(0x28

47、00,asecond);lcdala(10,asecond);Lcdcom(row_2+0x0b);break; void Tkeyscan()if(Tkey=0) /key1为功能键delay(8);if(Tkey=0)setled=0;secled=1;while(Tkey=0);Tkeyn+;if(Tkeyn=10)Tkeyn=1;switch(Tkeyn)case 1: TR0=0; /关闭定时器Lcdcom(row_1+0x05); /写入光标位置Lcdcom(0x0f); /设置光标为闪烁Lcdcom(row_1+0x03); /hyearbreak;case 2:Lcdcom(row_1+0x05); /yearbreak;case 3: Lcdcom(row_1+0x08); /monthbreak;case 4: Lcdcom(row_1+0x0b); /daybreak;case 5: Lcdcom(row_1+0x0f); /weekbreak;case 6: Lcdcom(row_2+5); /hourbreak;case 7: Lcdcom(row_2+8); /minutebreak;case 8: Lcdcom(row_2+11);temp=(miao)/10*16+(miao)%10;write_1302(0x8e,0x00);wr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论