毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx

上传人:b****5 文档编号:19418717 上传时间:2023-01-06 格式:DOCX 页数:43 大小:1.14MB
下载 相关 举报
毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx_第1页
第1页 / 共43页
毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx_第2页
第2页 / 共43页
毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx_第3页
第3页 / 共43页
毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx_第4页
第4页 / 共43页
毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx

《毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx(43页珍藏版)》请在冰豆网上搜索。

毋岩毕业设计正文基于单片机设计的数字电子钟Word文档格式.docx

Vcc2在双电源系统中提供主电源,在这种运用方式中Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。

DS1302由Vcc1或Vcc2中较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

2.1.1.2.DS1302数据操作原理

DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输出。

无论是读周期还是写周期,开始8位指定40存器中哪个将被访问到。

在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的始终周期在读操作时输出数据,在写操作时写入数据。

时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字数。

如果在传送过程中置RST脚为低电平,则会中止本次数据传送,并且I/O引脚变为高阻态。

上电运行时,在Vcc≧2.5V之前,RST脚必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

DS1302的引脚及内部结构图如图2-1所示。

图2-1DS1302引脚图及内部结构

DS1302的引脚功能如表2-1所示。

表2-1DS1302引脚功能

引脚号

引脚名称

功能

1

Vcc2

主电源

2,3

X1,X2

震荡源,外接32.768kHz晶振

4

GND

地线

5

RST

复位/片选线

6

I/O

串行数据输入/输出端(双向)

7

SCLK

串行数据输入端

8

Vcc1

后备电源

DS1302的控制字如图2-2所示。

控制字节的最高有效位(位7)必须是逻辑1;

如果它为0。

则不能把数据写入到DS1302中。

位6如果为0则表示存取日历时钟数据;

为1表示存取RAM数据。

位5~1(A4~A0)指示操作单元的地址。

最低有效位(位0)如为0,表示要进行写操作;

为1表示进行读操作。

控制字节总是从最低位开始输入/输出。

图2-2DS1302的控制字

DS1302的读写时序如图4所示。

为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。

位6规定时钟或RAM,而位0规定读或写。

在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。

在多字节方式中,读或写从地址0的位0开始。

必须按数据传送的次序写最先的8个寄存器。

但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每一字都将传送至RAM。

图2-3DS1302数据读/写时序

DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。

其日历、时间寄存器及其控制字见表2-5,其中奇数为读操作,偶数为写操作。

表2-2内部寄存器地址和内容

寄存器名

命令字节

取值范围

寄存器内容

3

2

秒寄存器

80H

81H

00~59

CH

10s

SEC

分寄存器

82H

83H

10min

MIN

[小]时寄存器

84H

85H

00~23或01~12

12/24

10A/P

HR

日期寄存器

86H

87H

01~28,29,30,31

10DATE

DATE

月份寄存器

88H

89H

01~12

10M

MONTH

周寄存器

8AH

8BH

01~07

DAY

年寄存器

8CH

8DH

00~99

10YEAR

YEAR

时钟暂停:

秒寄存器的位7定义位时钟暂停位。

当它为1时,DS1302停止振荡,进入低功耗的备份方式。

通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。

当它为0时,时钟将开始启动。

AM-PM/12-24小时方式:

小时寄存器的位7定义为12或24小时方式选择位。

它为高电平时,选择12小时方式。

在此方式下,位5是AM/PM位,此位是高电平时表示PM,低电平表示AM。

在24小时方式下,位5为第二个10小时位(20~23h)。

DS1302的晶振选用32.768kHz,电容推荐值为6pF,因为振荡频率较低,也可以不接电容,对记时精度影响不大。

2.2.STC89C52单片机

2.2.1.STC89C52单片机概述

STC89C52系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成MAX810专用复位电路。

2.2.2.STC89C52单片机特点

工作电压:

5.5V-3.5V(5V单片机);

增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;

工作频率范围:

0~40MHz,相当于普通8051的0~80MHz;

用户应用程序空间4K//8K/16k/32K/64K字节;

片上集成1280字节RAM;

通用I/O口(32/36个),复位后为准双向口/弱上拉(普通8051传统I/O口);

ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器。

每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA;

可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;

有EEPROM功能;

看门狗;

内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);

时钟源:

外部高精度晶体/时钟,内部R/C振荡器;

用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟;

常温下内部R/C振荡器频率为:

5.0V单片机为:

11MHz~17MHz;

共4个16位定时器,两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器;

外部中断I/O口4路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,PowerDown模式可由外部中断唤醒;

通用全双工异步串行口(UART);

工作温度范围:

-40~+85℃(工业级)/0~75℃(商业级);

封装:

PDIP-40,PLCC-44。

2.2.3.STC89C52单片机管脚及封装

STC89C52单片机有多种封装形式,本设计中选用40DIP封装,其管脚定义如图2-4所示。

图2-4STC89C52管脚图

2.3.硬件电路设计

2.3.1.单片机电路

如图2-5所示,单片机采用STC89C52芯片,电路采用11.0592MHz外部无源晶体,振荡电容采用20pF。

复位电路采用10uF(C1)电容和10K(R2)组成的阻容复位电路。

图2-5单片机电路

单片机管脚连接标号中,P00—P07为液晶屏数据线,P25—P27为液晶屏控制线。

标号RXD和TXD是单片机的异步串行通信引脚,用于单片机程序的ISP下载。

2.3.2.DS1302时钟电路

DS1302时钟电路如图2-6所示,其中BT1是后备电池,以保证在主电源掉电时时钟依然运行。

Y2是时钟晶振,因为频率较低,故可以不加电容。

R10—R12为上拉电阻。

DS1302通过SCLK、I/O和RST管脚和单片机相连。

图2-6DS1302时钟电路

2.3.3.液晶屏显示电路

显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:

表2-3液晶屏技术指标

接口信号说明如表2-4所示。

表2-4液晶屏接口信号说明

与单片机接口电路如图2-7所示。

图2-7LCD与单片机接口电路

2.3.4.按键电路

U盘驱动芯片CH375不仅提供了与USB设备的硬件连接,还内置了文件系统底层程序,使得读、写U盘中的文件变得容易。

图中CH375使用12MHz外部晶体,振荡电容为20pF。

管脚连接标号D0—D7是与单片机并口进行数据传输的数据线,CH375INT为单片机提供中断信号,CH375CS、CH375A0、CH375WR和CH375RD是控制信号线。

CH375通过RU2和RU3两个电阻与U盘的UD+和UD-数据线连接,同时通过LU发光管输出U盘状态。

2.3.5.键盘驱动电路

键盘驱动电路如图2-8所示。

图2-8键盘驱动程序

电路使用与单片机管脚直接相连的按键实现键盘。

当按键按下时管脚为低电平,无按键时为高电平。

单片机采用查询方式获取按键信息。

2.3.6.闹铃电路

图2-9闹铃电路

闹铃电路由单片机管脚驱动蜂鸣器和报警灯实现,当闹铃时间到时,蜂鸣器鸣响,红灯报警。

2.3.7.电源电路

本设计采用USB接口供电,电源电压5V。

同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。

其电路原理如图2-10所示。

图2-10供电及程序下载电路

2.3.8.总电路图

经上所述,画出总电路图,图2-11

图2-11总电路图

3.软件设计

3.1.软件流程图

本设计软件流程如图3-1所示。

图3-1软件流程图

3.2.时间调整程序设计

调整时间用4个调整按纽,1个作为移位、控制用,另外2个作为加个减用,分别定义为时间设置按纽、加按纽、减按纽。

在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。

闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。

利用定时器记时,当到达50ms溢出时,就送给该位熄灭符,在下一次溢出时,再送正常显示的值,不断交替,直到调整该位结束。

此时送正常显示值给该位,再进入下一位调整闪烁程序。

3.3.主程序

下面介绍main.c主程序编写。

3.3.1.头文件和一些宏定义

#include<

reg52.h>

math.h>

#include"

1602.h"

DS1302.h"

#defineAMHOURADDR0xC0//存闹铃时的地址

#defineAMMINUTEADDR0xC2//存闹铃分的地址

#defineAMENADDR0xC4//存闹钟使能标志的地址

3.3.2.管脚、常量、变量定义

//定义管脚

sbitLed_Alarm=P2^1;

//报警灯

sbitBeep_Alarm=P2^0;

//蜂鸣器

sbitKey_TMSet=P3^2;

//时间设置

sbitKey_AMSet=P3^3;

//闹铃设置

sbitKey_Up=P3^4;

//上调

sbitKey_Down=P3^5;

//下调

sbitKey_AMEn=P3^6;

//闹铃开关

sbitKey_Review=P3^7;

//查看

 

//定义标识

volatilebitFlagKeyPress=0;

//有键按下标志

volatilebitFlagShow=0;

//显示标志

volatilebitFlagTMSet=0;

//时间设置状态标志

volatilebitFlagAMSet=0;

//闹铃设置状态标志

volatilebitFlagAMEn=0;

//闹铃使能标志,0为闹铃不使能,1为闹铃使能

volatilebitFlagAlarm=0;

//闹铃状态标志

//按键响应用变量

ucharkeyvalue,keyTMSet,keyAMSet,keyUp,keyDown,keySet,keyAMEn,keyReview;

//DS1302时钟用变量

SYSTEMTIMECurrentTime;

ucharyear,month,day,hour,minute,second;

ucharAMhour,AMminute,AMStart;

//报警及存储用变量

//char*pSave;

//字符串显示用变量

ucharstr1[6]="

000000"

;

ucharDate[9]="

00-00-00"

Time[9]="

00:

00"

ucharhide,SetNum;

uintCounter;

3.3.3.函数声明

//函数声明

voidint2str(intx,char*str);

voidDelay1ms(unsignedintcount);

voidData_Init();

voidTimer0_Init();

voidTimer0_ISR();

voidKeyProcess(uintnum);

3.3.4.各子程序

//整型转字符串的函数,转换范围0--65536

voidint2str(intx,char*str)

{

inti=1;

inttmp=10;

while(x/tmp!

=0)

{

i++;

tmp*=10;

}

tmp=x;

str[i]='

\0'

while(i>

1)

str[--i]='

0'

+(tmp%10);

tmp/=10;

str[0]=tmp+'

}

voidDelay1ms(unsignedintcount)

{

unsignedinti,j;

for(i=0;

i<

count;

i++)

for(j=0;

j<

120;

j++);

}

//数据初始化

voidData_Init()

Beep_Alarm=1;

Led_Alarm=1;

AMStart=0;

keyvalue=0;

keyTMSet=1;

keyAMSet=1;

keyUp=1;

keyDown=1;

keyAMEn=1;

keyReview=1;

hide=0;

Counter=0;

SetNum=0;

//定时器0初始化

voidTimer0_Init()

ET0=1;

//允许定时器0中断

TMOD=1;

//定时器工作方式选择

TL0=0x06;

TH0=0xf8;

//定时器赋予初值

TR0=1;

//启动定时器

//定时器0中断

voidTimer0_ISR(void)interrupt1using0

//每1秒钟刷新显示一次时间值

Counter++;

if(Counter>

=450)

{

FlagShow=1;

//设定闪烁标志

if(hide==1)hide=0;

elsehide=1;

}

voidKeyProcess(uintnum)

switch(num)

case1:

//TMSet键被按下。

SetNum=0-管设置;

1-年;

2-月;

3-日;

4-时;

5-分;

6-秒,按一下SetNum加1。

if(FlagAMSet==1)//从闹铃时间设置进入当前时间设置

{

FlagAMSet=0;

FlagTMSet=1;

SetNum=1;

}

elseif(FlagTMSet==0)//从正常状态进入当前时间设置

FlagTMSet=1;

else//已经在时间设置状态

SetNum++;

if(SetNum>

=7)//已经设定完毕,则存盘退出

SetNum=0;

FlagTMSet=0;

break;

case2:

//AMSet键被按下。

SetNum=0-关设置;

1-时;

2-分,按一下SetNum加1。

if(FlagTMSet==1)//从当前时间设置进入闹铃时间设置

FlagTMSet=0;

FlagAMSet=1;

//清屏

L1602_string(1,1,"

"

);

L1602_string(2,1,"

//读出当前闹铃时间并显示

int2str(AMhour,str1);

L1602_string(2,1,str1);

int2str(AMminute,str1);

L1602_string(2,4,str1);

elseif(FlagAMSet==0)//从正常状态进入闹铃时间设置

FlagAMSet=1;

else//已经在闹铃时间设置状态

=3)//已经设定完毕,则存盘退出并返回正常显示界面

//存入闹铃时间

Write1302(0x8e,0x00);

//写入允许

Write1302(AMHOURADDR,AMhour);

Delay1ms(500);

Write1302(AMMINUTEADDR,AMminute);

Write1302(0x8e,0x80);

//写入禁止

AMhour=Read1302(AMHOURADDR);

AMminute=Read1302(AMMINUTEADDR);

FlagAMSet=0;

case3:

//Up键被按下

if(FlagTMSet==1)//如果在当前时间设置状态

switch(SetNum)

{

case0:

case1:

//年

if(year<

99)year++;

Write1302(0x8e,0x00);

DS1302_SetTime(DS1302_YEAR,year);

Write1302(0x8e,0x80);

//禁止写入

break;

case2:

//月

if(month<

12)month++;

Write1302(0x8e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1