基于单片机的电子时钟设计

更新时间:2024-04-25 21:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

武汉软件工程职业学院毕业设计

bu

武汉软件工程职业学院

2006级毕业论文

课题名称 基于单片机的电子时钟设计 学生姓名 班 级 指导老师

完成时间: 2008 年10月 23日

光电子与通信工程系

武汉软件工程职业学院毕业设计

基于单片机的电子时钟设计

摘要

本文介绍了一款基于AT89S51单片机控制的电子钟的设计,通过多功能数字钟带的设计思路,详细叙述了系统硬件、软件的具体实现过程。论文重点阐述了数字钟硬件中MCU模块、时钟模块、显示模块和相关控制模块等的模块化设计与制作;软件同样采用模块化的设计,包括中断模块、时间调整模块设计,并采用简单流通性强的C语言编写实现。本设计实现了时间的修改功能和年、月、日和星期的显示功能。

关键词:

AT89S51 单片机 数字钟

武汉软件工程职业学院毕业设计

Abstract

This paper introduced the design of digital clock based on SCM of AT89S51, the specific process of how the system hardware and software achieved were detailed description through the design of multifunction digital clock. The modular design and production, which consisted of MCU module,clock module and the associated control module, were mainly recounted;As well as hardware designing,software design use the same method, consists suspension module, time adjust module, and that use the C language to achieve because of its simple and strong negotiability. In this design the functions of time clock run and change, functions of the year, month, day and week display have been achieved. And by comparing the actual clock.

Key words :

AT89S51 Microcontroller Digital Clock

武汉软件工程职业学院毕业设计

目 录

前 言..............................................................3

第一章 系统实现功能、设计方案论证及芯片介绍......4

第一节 系统要求实现功能.........................................4 第二节 设计方案论证..............................................4 第三节 芯片介绍..................................................6

1、DS1302芯片介绍.........................................6

第二章 电路硬件设计及分析..................................................10

第一节 时钟电路.........................................10 第二节 复位电路................................................11 第三节 DS1302

时钟电路..........................................11

第四节 键盘电路.......................................12 第五节. 显示电路...............................................13 第六节 按键提示电路................................................14

第三章 软件设计..........................................................................15

第一节 主函数流程图............................................15 第二节 键盘电路流程图.....................................16 第三节 定时器

T0中断服务程序流程图..........................................17

第四章 结束语..............................................................................18

第一节 带时钟显示的温度计Proteus仿真效果 图…....................................................................................................................18

武汉软件工程职业学院毕业设计

第二节 所用到的相关元器件图示....................................................19

附录 主程序清单...............................................20

参考文献 ........................................................32

致 谢 ...........................................................33

武汉软件工程职业学院毕业设计

前 言

单片微型计算机是随着超大规模集成电路技术的发展而诞生的,由于它具有体积小、功能强、性价比高等特点,所以广泛应用于电子仪表、家用电器、节能装置、军事装置、机器人、工业控制等诸多领域,使产品小型化、智能化,既提高了产品的功能和质量,又降低了成本,简化了设计。本文主要介绍由单片机控制的电子钟的设计。

武汉软件工程职业学院毕业设计

第一章 系统实现功能、设计方案论证及芯片介绍

第一节 系统要求实现功能

(1) 万年历

(2) 三键调时(设置键,上调键,下调键)

(3) 按键蜂鸣器提示(调试时蜂鸣器BUZZER系统自动设置为“本元件进行仿真”)

第二节 设计方案论证

方案一 用主芯片为AT89C51的单片机控制实现,为了满足单片机系统的

实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,按键蜂鸣器提示,时间使用LCD1602显示。方案2系统结构框图如图1-2所示。

LCD1602显示按键AT89C51单片机图1-2 方案2系统结构框图 时钟芯片DS1302

温度传感器方案二 用主芯片为AT89C51的单片机控制实现,为了满足单片机系统

信号调理电路AD转换电路的实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,按键有蜂鸣器提示,显示时间使用LCD1602显示。方案3系统结构框图如图1-3所示。

武汉软件工程职业学院毕业设计

LCD1602显示DS18B20AT89C51单片机时钟芯片DS1302按键 图1-3 方案3系统结构框图

方案选择 方案一直接使用单片机内集成的定时器,产生定时节拍,编制

软件计数器,进行节拍技术,理论上讲,不但能够完成秒表设计,还能够实现分钟、刻钟、小时的实时计时功能,在此基础上,如果加上足够精确的误差时间补偿处理,甚至可以实现日、星期、月、年等日历功能。但使用片内定时器有以下几个问题: 1、时间补偿

片内定时器采用中断方式提供计时节拍,中断的实质是随机程序切换,那么,中断响应时间是不可精确预测的。这样,必然会导致计时节拍的时间误差,在计时时间较短的情况下,比如1~99s计时,可以采用一些软件措施进行误差补偿,但当系统所需要的计时时间较长时,比如进行年、月、日的日历计时,定时中断误差扥积累就会很大,无法满足时间精度的要求。因此,在需要日历、时钟的场合,片内定时器的作用有限。片内定时器只适合于单片机短时间计时的要求。

2、时钟维持

使用片内定时器进行计时的时候,单片机始终要处于工作状态。才能维持计时时间,一旦停机或进入待机状态,开机后,计时时间就需要重新设定。在单片机系统中,有时,需要维持一个时钟,对控制工作进行时间标定。不管单片机系统开机、关机还是待机,系统时钟要始终维持。

武汉软件工程职业学院毕业设计

为了满足单片机系统的实时钟需求,最可靠的方法是采用实时钟芯片DS1302。这个设计采用的是方案三。

第三节 芯片介绍

一、DS1302芯片介绍

DS1302是DALLAS公司推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。时钟/RAM的读/写数据以一字节或多达31字节的字符组方式通信。DS1302工作时功耗很低,保持数据和时钟信息时,功耗小于1mW。

1、DS1302的内部结构

DS1302的外部引脚功能说明如图1-6所示。

X1,X2 GND

RST I/O SCLK VCC1

DS1302封装图

32.768kHz晶振引脚 地 复位

数据输入/输出 串行时钟 电池引脚 主电源引脚

VCC2

图1-6 DS1302的外部引脚功能说明图

DS1302的内部结构如图1-7所示,主要组成部分为:移位寄存器、控制逻辑、振荡器、实时时钟以及RAM。虽然数据分成两种,但是对单片机的程序而言,其实是一样的,就是对特定的地址进行读写操作。

武汉软件工程职业学院毕业设计

图1-7 DS1302的内部结构图

DS1302含充电电路,可以对作为后备电源的可充电电池充电,并可选择充电使能和串入的二极管数目,以调节电池充电电压。不过对我们目前而言,最需要熟悉的是和时钟相关部分的功能,对于其它参数请参阅数据手册。

2、DS1302的工作原理

DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。

3、DS1302的寄存器和控制命令

对DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。日历、时间寄存器及控制字如表1-2所示。

表1-2 日历、时钟寄存器与控制字对照表

寄存器名称 秒寄存器

7

1 1 6 RAM/CK 0 5 A4 0 4 A3 0 3 A2 0 2 A1 0 1 0 A0 RD/W 0

武汉软件工程职业学院毕业设计

分寄存器 小时寄存器 日寄存器 月寄存器 星期寄存器 年寄存器

写保护寄存器 慢充电寄存器 时钟突发寄存器 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1

最后一位RD/W为“0”时表示进行写操作,为“1”时表示读操作。 DS1302内部寄存器列表如表1-3所示。

表1-3 DS14302内部主要寄存器分布表

寄存器名称 秒寄存器 分寄存器 小时寄存器 日期寄存器 月份寄存器 周寄存器 年份寄存器

命令字 取值范围 各位内容 写 读 7 6 5 4 3 2 1 0 80H 81H 00-59 CH 10SEC SEC 82H 83H 00-59 0 10MIN MIN 84H 85H 01-12或00-23 12/24 0 A HR HR 86H 87H 01-28,29,30,31 0 0 10DATE DATE 88H 89H 01-12 0 0 0 10M MONTH 8AH 8BH 01-07 0 0 0 0 0 DAY 8CH 8DH 00-99 10YEAR YEAR

DS1302内部的RAM分为两类,一类是单个RAM单元,共31个,每个单元为一个8位的字节,其命令控制字为COH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

我们现在已经知道了控制寄存器和RAM的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表1所示,最高位BIT7固定为1,BIT6决定操作是针对RAM还是时钟寄存器,接着的5个BIT是RAM或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。

物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。其中RST从低电平变成高电平启动一次数据传输过程,SCLK是时钟线,I/O是数据线。具体的读写时序如图1-8,但是请注意,无论是哪种同步通讯类型的串行接

武汉软件工程职业学院毕业设计

口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。

图1-8 DS1302的命令字结构

图1-9调试过程中DS1302电路图

武汉软件工程职业学院毕业设计

第二章 电路硬件设计及分析

第一节 时钟电路

系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。51单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为30pF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。时钟电路如图2-1所示。

图2-1 时钟电路图

武汉软件工程职业学院毕业设计

第二节 复位电路

复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通常采用上电自动复位和按键手动复位两种方式,此电路系统采用的是按键手动复位电路,高电平时复位,如图所示。当时钟频率选用12MHz时,C取22μF,R约为1K。复位电路如图2-2所示

图2-2 复位电路图

第三节 DS1302时钟电路

DS1302内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式。DS1302与单片机之间能简单地采用同步串行的方式进行通信,仅需三根I/O线:复位(RST)、I/O数据线、串行时钟(SCLK)。

武汉软件工程职业学院毕业设计

图2-3 DS1302时钟电路图

第四节 键盘电路

键盘接口是单片机应用系统中最常用的接口之一,键盘的类型很多,常用的有独立式键盘和矩阵式键盘,因为本设计需要的键盘比较少,所以采用独立式键盘。 在键盘的应用中,需要解决键盘消抖的问题,一般使用的是软件消抖的方法。键盘的电路图如图2-5所示。

武汉软件工程职业学院毕业设计

图2-5 键盘电路图

第五节 显示电路

显示器是单片机常用的功能单元之一,显示器的主要功能是为单片机系统使用者提供必要的单片机工作信息,或者提供工作状态的提示信息,显示器的工作是由单片机通过显示接口驱动的。本设计采用的是LCD1602显示电路图如图2-6所示。

图2-6 LCD1602显示电路图

武汉软件工程职业学院毕业设计

第六节 按键提示电路

本设计具有按键蜂鸣器响的功能,使得按键可靠工作。按键提示电路如图2-7

所示。

图2-7 按键提示电路如图

武汉软件工程职业学院毕业设计

第三章 软件设计

第一节 主函数流程图

主函数流程图如图3-1所示。

图3-1 主函数流程图

武汉软件工程职业学院毕业设计

第二节 按键程序流程图

按键程序流程图如图3-3所示。

开始键盘扫描蜂鸣器响加健功能健减健相应的按键操作结束 图3-3 按键程序流程图

武汉软件工程职业学院毕业设计

第三节 定时器T0中断服务程序流程图

定时器T0中断服务程序流程图如图3-4所示。

图3-4 定时器T0中断服务程序流程图

武汉软件工程职业学院毕业设计

第四章 结束语

第一节 带时钟显示的温度计Proteus仿真效果图

图4-1时钟显示的温度计Proteus仿真效果图

武汉软件工程职业学院毕业设计

第二节 所用到的相关元器件图示

图4-2所用到的相关元器件图示

武汉软件工程职业学院毕业设计

附录主程序清单

#include

#include\ #define uint unsigned int #define uchar unsigned char

uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)

#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

sbit rs=P2^0; sbit en=P2^2;

sbit rw=P2^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了 sbit led=P2^6; //LCD背光开关 sbit IO=P1^1; sbit SCLK=P1^0; sbit RST=P1^2; sbit ACC0=ACC^0; sbit ACC7=ACC^7;

sbit key1=P1^5; //设置键 sbit key2=P1^6; //加键 sbit key3=P1^7; //减键

sbit buzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响 uchar code tab1[]={\ - - \年显示的固定字符 uchar code tab2[]={\ : : \时间显示的固定字符 void delay(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); }

write_1602com(uchar com)//****液晶写入指令函数**** { rs=0;//数据/指令选择置为指令 rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); en=0;//en由高变低,产生下降沿,液晶执行命令

武汉软件工程职业学院毕业设计

}

write_1602dat(uchar dat)//***液晶写入数据函数**** { rs=1;//数据/指令选择置为数据 rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); en=1; //en置高电平,为制造下降沿做准备 delay(1); en=0; //en由高变低,产生下降沿,液晶执行命令 }

lcd_init()//***液晶初始化函数**** { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分 //delay(3); } write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号 //delay(3); } }

void write_byte(uchar dat)//写一个字节 { ACC=dat; RST=1; for(a=8;a>0;a--) { IO=ACC0; SCLK=0; SCLK=1; ACC=ACC>>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)//向1302芯片写函数,指定写入地址,数据 {

RST=0; SCLK=0; RST=1; write_byte(add); write_byte(dat); SCLK=1; RST=0; }

uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址 { uchar temp; RST=0; SCLK=0; RST=1; write_byte(add); temp=read_byte(); SCLK=1; RST=0; return(temp); }

uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制 {

uchar Decimal; Decimal=bcd>>4;

return(Decimal=Decimal*10+(bcd&=0x0F)); }

void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4) {

武汉软件工程职业学院毕业设计

RST=0; SCLK=0;

write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x8e,0x80); //打开写保护 }

void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数 { uchar gw,sw; gw=dat;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(er+add);//er是头文件规定的值0x80+0x40 write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }

void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数 { uchar gw,sw; gw=dat;//取得个位数字 sw=dat/10;//取得十位数字 write_1602com(yh+add);//设定显示位置为第一个位置+add write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码 write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码 }

void write_week(uchar week)//写星期函数 { write_1602com(yh+0x0c);//星期字符的显示位置 switch(week) { case 1:write_1602dat('M');//星期数为1时,显示 write_1602dat('O'); write_1602dat('N'); break; case 2:write_1602dat('T');//星期数据为2时显示 write_1602dat('U'); write_1602dat('E'); break;

武汉软件工程职业学院毕业设计

case 3:write_1602dat('W');//星期数据为3时显示 write_1602dat('E'); write_1602dat('D'); break; case 4:write_1602dat('T');//星期数据为4是显示 write_1602dat('H'); write_1602dat('U'); break; case 5:write_1602dat('F');//星期数据为5时显示 write_1602dat('R'); write_1602dat('I'); break; case 6:write_1602dat('S');//星期数据为6时显示 write_1602dat('T'); write_1602dat('A'); break; case 7:write_1602dat('S');//星期数据为7时显示 write_1602dat('U'); write_1602dat('N'); break; } }

//****************键盘扫描有关函数********************** void keyscan() { if(key1==0)//---------------key1为功能键(设置键)-------------------- { delay(9);//延时,用于消抖动 if(key1==0)//延时后再次确认按键按下 {

buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key1); key1n++; if(key1n==9) key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环 switch(key1n) { case 1: TR0=0;//关闭定时器 //TR1=0; write_1602com(er+0x09);//设置按键按动一次,秒位置显

武汉软件工程职业学院毕业设计

示光标 write_1602com(0x0f);//设置光标为闪烁 temp=(miao)/10*16+(miao);//秒数据写入DS1302 write_1302(0x8e,0x00); write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case 2: write_1602com(er+6);//按2次fen位置显示光标 //write_1602com(0x0f); break; case 3: write_1602com(er+3);//按动3次,shi //write_1602com(0x0f); break; case 4: write_1602com(yh+0x0e);//按动4次,week //write_1602com(0x0f); break; case 5: write_1602com(yh+0x0a);//按动5次,ri //write_1602com(0x0f); break; case 6: write_1602com(yh+0x07);//按动6次,yue //write_1602com(0x0f); break; case 7: write_1602com(yh+0x04);//按动7次,nian //write_1602com(0x0f); break; case 8: write_1602com(0x0c);//按动到第8次,设置光标不闪烁 TR0=1;//打开定时器 temp=(miao)/10*16+(miao); write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao数据写入DS1302 write_1302(0x8e,0x80); break; } } } if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零) { if(key2==0) //上调键 { delay(10); if(key2==0) {

武汉软件工程职业学院毕业设计

buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key2); switch(key1n) { case 1:miao++;//设置键按动1次,调秒 if(miao==60) miao=0;//秒超过59,再加1,就归零 write_sfm(0x08,miao);//令LCD在正确位置显示\加\设定好的秒数 temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x80,temp);

//向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护 write_1602com(er+0x09);

//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回 //write_1602com(0x0b); break; case 2:fen++; if(fen==60) fen=0; write_sfm(0x05,fen);//令LCD在正确位置显示\加\设定好的分数据 temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);

//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);

//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case 3:shi++; if(shi==24) shi=0; write_sfm(2,shi);//令LCD在正确的位置显示\加\设定好的小时数据 temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);

武汉软件工程职业学院毕业设计

//DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);

//设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 4:week++; if(week==8) week=1;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容

temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);

//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 5:ri++; if(ri==32) ri=1; write_nyr(9,ri);//令LCD在正确的位置显示\加\设定好的日期数据 temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);

//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 6:yue++; if(yue==13) yue=1; write_nyr(6,yue);//令LCD在正确的位置显示\加\设定好的月份数据 temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);

//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护

武汉软件工程职业学院毕业设计

write_1602com(yh+7);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian++; if(nian==100) nian=0; write_nyr(3,nian);//令LCD在正确的位置显示\加\设定好的年份数据

temp=(nian)/10*16+(nian);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);

//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; } } } if(key3==0) { delay(10);//调延时,消抖动 if(key3==0) {

buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key3); switch(key1n) { case 1:miao--; if(miao==-1) miao=59;//秒数据减到-1时自动变成59 write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数

temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护 write_1302(0x80,temp);

//向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护 write_1602com(er+0x09);

//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置

武汉软件工程职业学院毕业设计

//write_1602com(0x0b); break; case 2:fen--; if(fen==-1) fen=59; write_sfm(5,fen); temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x82,temp);

//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+6);

//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置 break; case 3:shi--; if(shi==-1) shi=23; write_sfm(2,shi); temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x84,temp);

//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(er+3);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 4:week--; if(week==0) week=7; write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容 temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8a,temp);

//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+0x0e);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 5:ri--;

武汉软件工程职业学院毕业设计

if(ri==0) ri=31; write_nyr(9,ri); temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x86,temp);

//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+10);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 6:yue--; if(yue==0) yue=12; write_nyr(6,yue); temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x88,temp);

//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+7);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian--; if(nian==-1) nian=99; write_nyr(3,nian); temp=(nian)/10*16+(nian); //十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护 write_1302(0x8c,temp);

//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护 write_1602com(yh+4);

//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; } } } } }

void init() //定时器、计数器设置函数

武汉软件工程职业学院毕业设计

{ TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0 TL0=0; //定时器T0的低四位=0 EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断 TR0=1; //开启中断,启动定时器 }

void main() { lcd_init(); //调用液晶屏初始化子函数 ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 led=0; //打开LCD的背光电源 buzzer=0;//蜂鸣器长响一次 delay(80); buzzer=1; while(1) //无限循环下面的语句: {

keyscan(); //调用键盘扫描子函数 } }

void timer0() interrupt 1 //取得并显示日历和时间 {

miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); //显示温度、秒、时、分数据:

write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数) write_sfm(5,fen);//分,从第二行第5个字符后开始显示 write_sfm(2,shi);//小时,从第二行第2个字符后开始显示 //显示日、月、年数据: write_nyr(9,ri);//日期,从第二行第9个字符后开始显示 write_nyr(6,yue);//月份,从第二行第6个字符后开始显示 write_nyr(3,nian);//年,从第二行第3个字符后开始显示

武汉软件工程职业学院毕业设计

write_week(week);}

参考文献

[1] 单片机实验与实践教程(一)[M],万光毅. 严义.,北京航空航天大学出版社; [2] 单片机实验与实践教程(二)[M],夏继强. 沈德金,北京航空航天大学出版社; [3] 单片机基础(修订本)[M],李广弟. 朱月秀. 王秀山,北京航空航天大学出版社; [4] 单片机高级语言C51应用程序设计[M],徐爱钧. 彭秀华.,2000年版;

[5] MCS-51单片机原理及其接口技术[M],马家辰. ,哈尔滨工业大学出版社,1997年版;

[6] 单片机应用开发技术—基于PROTEUS仿真和C语言编程[M],张奇. ,中国电力出版

社,2009年版;

[7] 51系列单片机应用软件编程技术[M],李强. ,北京航空航天大学出版社,2009年版。 [8] 51单片机应用基础,胡进德. 丁如春. 熊辉.,湖北科学技术出版社

武汉软件工程职业学院毕业设计

致 谢

在本次论文设计过程中,祝勋老师对该论文从选题,构思到最后定稿的各个环节给予细心指引与教导,使我得以最终完成毕业论文设计。在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。这三年中还得到众多老师的关心支持和帮助。在此,谨向老师们致以衷心的感谢和崇高的敬意!

最后,我要向百忙之中抽时间对本文进行审阅,评议和参与本人论文答辩的各位老师表示感谢。

武汉软件工程职业学院毕业设计

致 谢

在本次论文设计过程中,祝勋老师对该论文从选题,构思到最后定稿的各个环节给予细心指引与教导,使我得以最终完成毕业论文设计。在学习中,老师严谨的治学态度、丰富渊博的知识、敏锐的学术思维、精益求精的工作态度以及侮人不倦的师者风范是我终生学习的楷模,老师们的高深精湛的造诣与严谨求实的治学精神,将永远激励着我。这三年中还得到众多老师的关心支持和帮助。在此,谨向老师们致以衷心的感谢和崇高的敬意!

最后,我要向百忙之中抽时间对本文进行审阅,评议和参与本人论文答辩的各位老师表示感谢。

本文来源:https://www.bwwdw.com/article/nm6p.html

Top