根据DS1302和51单片机的电子时钟设计Word文档格式.docx

上传人:b****5 文档编号:19601649 上传时间:2023-01-08 格式:DOCX 页数:28 大小:182.04KB
下载 相关 举报
根据DS1302和51单片机的电子时钟设计Word文档格式.docx_第1页
第1页 / 共28页
根据DS1302和51单片机的电子时钟设计Word文档格式.docx_第2页
第2页 / 共28页
根据DS1302和51单片机的电子时钟设计Word文档格式.docx_第3页
第3页 / 共28页
根据DS1302和51单片机的电子时钟设计Word文档格式.docx_第4页
第4页 / 共28页
根据DS1302和51单片机的电子时钟设计Word文档格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

根据DS1302和51单片机的电子时钟设计Word文档格式.docx

《根据DS1302和51单片机的电子时钟设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《根据DS1302和51单片机的电子时钟设计Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。

根据DS1302和51单片机的电子时钟设计Word文档格式.docx

P1口:

P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。

对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。

引脚口第二功能如下:

P1.0/T2(定时器/计数器T2的外部计数输入),时钟输出

P1.1/T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)

P1.5/MOSI(在系统编程用)

P1.6/MISO(在系统编程用)

P1.7/SCK(在系统编程用)

P2口:

P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。

对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。

在这种应用中,P2口使用很强的内部上拉发送1。

在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。

P3口:

P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。

对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。

P3口亦作为AT89C51特殊功能(第二功能)使用。

P3.0/RXD(串行输入口)

P3.1/TXD(串行输出口)

P3.2/INTO(外中断0)

P3.3/INT1(外中断1)

P3.4/TO(定时/计数器0)

P3.5/T1(定时/计数器1)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。

RST——复位输入。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。

ALE/PROG——当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。

一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。

要注意的是:

每当访问外部数据存储器时将跳过一个ALE脉冲。

如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。

该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。

此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。

PSEN——程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。

EA/VPP——外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。

需注意的是:

如果加密位LB1被编程,复位时内部会锁存EA端状态。

如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。

1.3时钟芯片DS1302简介

1.3.1主要功能

DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×

8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。

特性:

●实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数

●用于高速数据暂存的31×

8RAM

●2引脚的串行I/O

●2.5-5.5V满度工作范围

●用于时钟或RAM数据读写的单字节或

多字节数据传送

●双电源引脚

●可选慢速充电至VCC1

1.3.2内部结构及引脚功能

DS1302内部主要包括实时时钟(realtimeclock)、输入移位寄存器(inputshiftregisters)、31字节静态RAM、电源控制部分(powercontrol)、命令控制逻辑(commandandcontrollogic)、振荡器和分频器(oscillatoranddivider)等部分。

DS1302内部结构如图1-2所示。

图1-2DS1302内部结构

图1-3DS1302引脚排列

DS1302具有8脚DIP引脚排列如图1-3所示。

Vcc1:

后备电源,在主电源关闭的情况下,也能保持时钟的连续运行;

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

Vcc2:

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

X1、X2:

振荡源,外接32.768kHz晶振。

GND:

接地端

SCLK:

串行时钟输入端

I/O:

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

RST:

复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:

首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;

其次,RST提供终止单字节或多字节数据的传送手段。

1.3.3工作原理

DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。

数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址。

命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输入数据。

时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下最多可达8+248。

1.3.4控制字节及寄存器

DS1302的一次数据传送是从发送控制字节开始的。

控制字节的最高有效位(位7)必须是逻辑1,如果该位为0,则无法把数据写入到DS1302中;

位6表示要读写的数据类型,为0表示存取日历时钟数据,为1表示存取RAM数据;

位5至位1指示要操作单元的地址;

最低有效位(位0)表示命令类型,为0表示要进行写操作,为1表示要进行读操作。

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

其控制字节格式如图1-4所示。

图1-4控制字节格式

1.3.5时钟/日历存储区(时分秒)

1.3.6数据的传送

向DS1302写入数据时,数据在控制字节输入后的下一个SCLK周期的上升沿被写入,多余的SCLK将被忽略。

数据写入时从低位(位0)开始;

同样,从DS1302读取数据时,数据在紧跟控制字节后的下一个SCLK的下降沿读出,读出数据时也是从低位(0位)到高位(7位),只要RST保持高电平,额外的SCLK将导致数据字节的持续读出,这个特性用于实现该芯片的突发读模式。

对DS1302的每一次读写需16个时钟脉冲,前8个脉冲输入操作地址和读写命令,后8个脉冲写入或读出数据。

数据传送时序如图1-5。

图1-5数据读写时序图

第二章硬件设计

2.1系统结构及总流程图

图3-1系统总体结构

根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构:

时钟显示是一个循环过程,系统以单片机AT89S52为主控制器,不断读取实时时钟芯片DS1302提供的时间送LED显示,时间采用24小时模式;

当达到闹钟所设定时间时,控制蜂鸣器发声一分钟;

当需要调整时间或闹钟时,按下相应按键进入中断处理。

整个系统的电源可由电池提供或者用USB电源线由电脑提供。

系统总体结构如图3-1所示。

2.2系统硬件电路设计图

2.2.1整体电路设计

将DS1302时钟芯片与单片机的P1口连接构成系统的实时时钟电路的部分;

将键盘与单片机的P1.4-P1.7接口连接组成系统的按键电路,用来对显示器的控制;

LED的段选端与单片机的P0口连接构成系统的显示段选控制系统;

将位选与P2口连接使系统的位选较好。

2.2.2DS1302电路设计

DS1302部分电路设计图

将DS1302的X1、X2引脚分别与晶振相连,并通过两个分立电容相连然后接地;

将VCC1、VCC2相连然后接地,此部分构成了DS1302芯片的供电电路。

将DS1302的RST引脚接单片机P1.1引脚作为DS1302的复位引脚电路;

将DS1302的SLK引脚单片机的P1.2引脚相连组成DS1302的时钟端电路;

将DS1302的I/O引脚与单片机的P1.3相连构成DS1302的I/O端口的电路连接图。

2.2.3按键电路

按键部分电路设计图

将四个按键分别与单片机的P1.4-P.7相连组成系统的按键电路部分,P1.4用来接key1,此按键作为切换键,P1.5接口接key2,此键作为加,P1.6接口接key3,此键最为系统减位,

2.2.4显示电路

系统显示部分电路设计图

将LED数码显示管的段选端与单片机的P0口相连,由于数码管采用的是动态显示,所以通过对P0的8位二进制数据的不断改变使数码显示管不断的动态显示;

将LED的位选端与单片机的P2口连接使LED数码显示管不断的到位选信号在与数选信号不断的配合下显示数时间数据。

第三章、程序源代码

3.1程序流程图

图为系统软件系统流程图,通过不断的切换与循环实现系统循环计时

此图为按键扫描软件流程图,通过软件的不断扫描信号,确认按键的扫描情况。

3.1源程序

#include<

reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitbeep=P3^3;

sbitRST=P1^1;

sbitSCK=P1^2;

sbitSDA=P1^3;

sbitkey1=P1^4;

sbitkey2=P1^5;

sbitkey3=P1^6;

sbitkey4=P1^7;

uchari,j,mod,flag,flag1=1;

//ucharcodewrite_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};

//ucharcoderead_addr[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

//共阳数码管码表,表示0-9和-。

-表示时分秒的间隔.

ucharcodeLED[11]=

{

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,

};

uchardisbuf[8]=

0x62,0xa2,0xf7,0x7a,0x28,0xf7,0x7e,0x7e

//定义时间日期的结构类型

structtime

ucharsecond;

ucharminute;

ucharhour;

ucharweek;

ucharday;

ucharmonth;

ucharyear;

}

current_time;

#definectimecurrent_time//定义闹钟的时分秒变量

ucharasec,amin,ahour;

voiddelay(uintms)

uchari;

while(ms--)

for(i=135;

i>

0;

i--);

}//滴一声,用来按键伴音

voiddi()

for(i=0;

i<

40;

i++)

{

beep=0;

delay

(1);

beep=1;

}

//滴滴,连续响两下。

用来闹钟提醒。

voiddidi()

for(i=2;

i>

i--)

di();

delay(140);

}//DS1302的写驱动,传入参数为一个地址和数据

voidwrite(ucharaddr,uchardat)

RST=0;

SCK=0;

RST=1;

8;

SDA=(bit)(addr&

0x01);

addr>

>

=1;

SCK=1;

SDA=(bit)(dat&

0x01);

dat>

=1;

//DS1302的读驱动,传入参数为一个地址,返回参数为读到的数据

ucharread(ucharaddr)

uchari,dat;

SDA=(bit)(addr&

addr>

SCK=0;

dat>

if(SDA)

dat|=0x80;

SCK=1;

RST=0;

dat=(dat/16*10)+(dat&

0x0f);

returndat;

//读取DS1302的时间和日期

voidread_time()

ctime.second=read(0x81);

ctime.minute=read(0x83);

ctime.hour=read(0x85);

ctime.day=read(0x87);

ctime.month=read(0x89);

ctime.week=read(0x8b);

ctime.year=read(0x8d);

//设定时间和日期

voidset_time()

if(!

flag)

write(0x8e,0x00);

write(0x80,((ctime.second/10)<

<

4|(ctime.second%10)));

write(0x82,((ctime.minute/10)<

4|(ctime.minute%10)));

write(0x84,((ctime.hour/10)<

4|(ctime.hour%10)));

write(0x8e,0x80);

else

write(0x86,((ctime.day/10)<

4|(ctime.day%10)));

write(0x88,((ctime.month/10)<

4|(ctime.month%10)));

write(0x8a,((ctime.week/10)<

4|(ctime.week%10)));

write(0x8c,((ctime.year/10)<

4|(ctime.year%10)));

flag1=1;

//刷新显示缓冲区

voidrefbuf()

switch(flag)

case1:

disbuf[0]=LED[ctime.day%10];

disbuf[1]=LED[ctime.day/10];

disbuf[2]=0xbf;

disbuf[3]=LED[ctime.month%10];

disbuf[4]=LED[ctime.month/10];

disbuf[5]=0xbf;

disbuf[6]=LED[ctime.year%10];

disbuf[7]=LED[ctime.year/10];

break;

case2:

disbuf[0]=0xbf;

disbuf[1]=0xbf;

disbuf[3]=0xbf;

disbuf[4]=LED[ctime.week];

disbuf[6]=0xbf;

disbuf[7]=0xbf;

case3:

disbuf[0]=LED[asec%10];

disbuf[1]=LED[asec/10];

disbuf[3]=LED[amin%10];

disbuf[4]=LED[amin/10];

disbuf[6]=LED[ahour%10];

disbuf[7]=LED[ahour/10];

default:

disbuf[0]=LED[ctime.second%10];

disbuf[1]=LED[ctime.second/10];

disbuf[3]=LED[ctime.minute%10];

disbuf[4]=LED[ctime.minute/10];

disbuf[6]=LED[ctime.hour%10];

disbuf[7]=LED[ctime.hour/10];

//键盘扫描

voidkeyscan()

if(key1==0)

delay(5);

while(!

key1);

//key1用来调节时间和日期、闹钟

mod++;

//mod标示调节时间的时候对应的闪烁位,mod=1秒位或天或闹钟的秒,mod=2是分位,mod=3是小时位

//退出调节功能,返回正常显示

if(mod==4)

set_time();

mod=0;

}//调节加1,因为涉及到时分秒,年月日周和闹钟的调节,所以写的比较复杂,应该有更精简的代码。

if(key2==0)

key2);

switch(mod)

ctime.second++;

if(ctime.second==60)

ctime.second=0;

ctime.minute++;

if(ctime.minute==60)

ctime.minute=0;

ctime.hour++;

if(ctime.hour==24)

ctime.hour=0;

}//flag=0时默认调节时

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

当前位置:首页 > 医药卫生 > 基础医学

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

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