DS1302定时闹钟课程设计.docx

上传人:b****6 文档编号:6557575 上传时间:2023-01-07 格式:DOCX 页数:25 大小:78.21KB
下载 相关 举报
DS1302定时闹钟课程设计.docx_第1页
第1页 / 共25页
DS1302定时闹钟课程设计.docx_第2页
第2页 / 共25页
DS1302定时闹钟课程设计.docx_第3页
第3页 / 共25页
DS1302定时闹钟课程设计.docx_第4页
第4页 / 共25页
DS1302定时闹钟课程设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

DS1302定时闹钟课程设计.docx

《DS1302定时闹钟课程设计.docx》由会员分享,可在线阅读,更多相关《DS1302定时闹钟课程设计.docx(25页珍藏版)》请在冰豆网上搜索。

DS1302定时闹钟课程设计.docx

DS1302定时闹钟课程设计

 

课程设计报告

 

课程设计名称:

单片机课程设计

课程设计题目:

DS1302实时时钟(3)

 

专业班级:

*****

姓名:

*****

学号:

*********

实验室号:

信息楼205/220

实验组号:

实验时间:

(11.7.4-11.7.15)

批阅时间:

指导教师:

成绩:

1.题目名称

DS1302实时时钟(3)

 

2.课设目的

1.掌握KEILuV下汇编语言的调试方法

2.练习利用单片机小系统板编程实现一些简单功能的方法。

 

3.课设内容

1.掌握KEILuV下汇编语言的调试方法

2.编写软件(或借鉴网络共享的汇编语言程序)

实现功能:

由键盘切换显示年,月,日,时,分,秒

由键盘设置年,月,日,时,分,秒

3.由键盘设置定时时间,当时钟的时间和定时时间相同时,

蜂鸣器响5声,数码管闪烁3次

 

4.课设方案

1、DS1302的结构及工作原理

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

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

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

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

1.1引脚功能及结构

  图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始终是输入端。

1.2DS1302的控制字节

  DS1302的控制字如图2所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

1.3数据输入输出(I/O)

  在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

1.4DS1302的寄存器

  DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

  

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:

一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

 

2、程序设计流程图

 

 

no

 

yes

 

3、m2t1原理图板号NO.19

 

DS1302接线图

5.课设总结

1、程序清单及注释

主函数

/***********************************************************************************

程序功能:

实现DS1302功能并具有整点报时,闹钟功能。

CPU:

STC12C5608AD

晶振:

22.1184MHz

调用文件:

主函数

时间:

2011年7月10日20:

13:

41

************************************************************************************/

#include

#include

#include"delay.h"

#include"DS1302.h"

#include"CH451.h"

#defineucharunsignedchar

#defineuintunsignedint

voidmain()

{

initCH451();

iniDS1302();

//initimer0();

while

(1)

{

mode();

Timer_approach();

Time_adjustment();

}

}

子程序1

/*********************************************************************************

程序功能:

数码管显示和键盘扫描的程序

CPU:

STC12C5608AD

晶振:

22.1184MHz

调用文件:

delay.h

函数接口:

voidinitCH451(void)//初始化CH451

voidCH451_wr(uintadd,uchardat)//写到数码管add位dat数据

voidP_Key(void)//检测键盘按键

ucharIf_Key_Press(void)//检测后是否已经按下

ucharWhich_Key_Press(void)//检测后按了那个键

uintaddress(ucharAD)//将地址翻译机器码

ucharTrans_Num(uchard8)//将显示位翻译机器码

Author:

时间:

2011年7月11日11:

41:

************************************************************************************/

#include

#include

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitCLK=P3^4;

sbitDIN=P3^3;

sbitLOAD=P2^3;

sbitDOUT=P2^2;

ucharcodesmg[]={0xBE,0x24,0xEA,0xE6,0x74,0xD6,0xDE,0xA4,0xFE,0xF4,0xFC,0x5E,0x9A,0x6E,0xDA,0xD8,0x01};

uintcodeaddr[]={0x0A00,0x0900,0x0B00,0x0800,0x0C00,0x0D00,0x0E00,0x0F00};

ucharWKP=0,kp=0;

voidclock(void)

{

delay();

CLK=0;

delay();

CLK=1;

delay();

}

voidsetCH451(uintCTRL)

{

uchari;

for(i=0;i<12;i++)

{

DIN=CTRL&0x01;

clock();//判断最低位

CTRL>>=1;//右移之后再判断

}

DIN=1;

LOAD=0;

delay();

LOAD=1;

}

voidinitCH451(void)

{

uintini=0x0201,sys=0x0403,CTRL=0x0500;//ini芯片内部复位;sys初始化系统参数;

uintss=0x0628;

DIN=0;//0x580数码管显示BCD,010110000000B数码管BCD显示代码

delay();

DIN=1;

delay();//初始化,令DIN先置低再置高。

setCH451(ini);

setCH451(sys);

setCH451(CTRL);

setCH451(ss);

}

voidCH451_wr(uintadd,uchardat)

{

uchari;

add+=dat;

for(i=0;i<12;i++)

{

DIN=add&0x01;

clock();

DIN=1;

add>>=1;

}

LOAD=0;

delay();

LOAD=1;

}

voidP_Key(void)

{

unsignedchari;

unsignedcharcommand;//定义命令字,和数据存储器

command=0x07;//输入读451命令字

LOAD=0;

for(i=0;i<4;i++){

DIN=command&1;//送入最低位

CLK=0;

command>>=1;//往右移一位

CLK=1;//产生时钟上升沿锁通知CH451输入位数据

}

LOAD=1;//产生加载上升沿通知CH451处理命令数据

kp=0;//清除keycode

for(i=0;i<7;i++)

{

kp<<=1;//数据移入keycode,高位在前,低位在后

kp|=DOUT;//从高到低读入451的数据

CLK=0;//产生时钟下升沿通知CH451输出下一位

CLK=1;

}

WKP=kp&0x40;

WKP>>=6;

kp&=0xBF;

}

ucharIf_Key_Press(void)

{

returnWKP;

}

ucharWhich_Key_Press(void)

{

returnkp;

}

uintaddress(ucharAD)

{

uintret;

ret=addr[AD];

returnret;

}

ucharTrans_Num(uchard8)

{

ucharret;

ret=smg[d8];

returnret;

}

voidclrD(void)//清屏

{

uchari;

for(i=0;i<8;i++)

CH451_wr(addr[i],0x00);

}

 

子程序2:

C51COMPILERV9.00DELAY07/12/201111:

15:

03PAGE1

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

//函数作用:

延时函数//

//晶振:

22.1184MHz//

//接口程序:

voidDelay_Ms(unsignedintT)//毫秒延时程序//

//voiddelayu(unsignedintT)

//作者:

pandawbp//

//时间:

2011年7月4日13:

53:

45//

/////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include

voidDelay_Ms(unsignedintT)//毫秒延时程序

{//仿真300-1s

unsignedinti;

while(T--)

{

for(i=0;i<566;i++);//STC12C5201为566

}

}//1-9.775us5-40.1us10-78us100-750us

voiddelayu(unsignedintT)

{

unsignedchari;

while(T--)

{

for(i=6;i>0;i--);//STC12C5201为6

}

}

voiddelay(void)//延时两个机器周期

{

_nop_();

_nop_();

}

子程序3:

C51COMPILERV9.00DS1302

/***************************************************************************

程序功能:

DS1302实时时钟以及、、按键调节时钟

CPU:

STC12C5608AD

晶振:

22.1184MHz

调用文件:

delay.h

函数接口:

修改内容:

TH0set//按键扫描时间定时器0工作方式1

时间:

2011年7月11日11:

41:

03

*****************************************************************************/

#include

#include

#include"CH451.h"

#include"delay.h"

#defineucharunsignedchar

#defineuintunsignedint

#defineTH0set0x00//按键扫描时间定时器0工作方式1

sbitBUZZ=P2^6;

sbitSCLK=P2^1;

sbitIO=P2^0;

sbitCE=P1^7;

ucharsj[3],flag=1;//sj[]为时间sj[2]是小时==timer[0]

uchartimer[2];//闹钟缓冲区

ucharModeNow;//现行模式(0为时钟模式,1为闹钟调节模式,2为年月日模式)

voidinitimer0(void)//初始化定时器1(按键使用)

{

EA=1;

ET0=1;

TH0=TH0set;

TL0=0x00;

TMOD=0x11;

TR0=1;

}

voidDS1302_wr(ucharaddress,uchardat)

{

uchari;

CE=0;

SCLK=0;

CE=1;

for(i=0;i<8;i++)

{

SCLK=0;

IO=address&0x01;

SCLK=1;

address>>=1;

}

for(i=0;i<8;i++)

{

SCLK=0;

IO=dat&0x01;

delay();

SCLK=1;

delay();

dat>>=1;

}

CE=0;

}

ucharDS1302_re(ucharaddress)

{

uchari,value;

CE=0;

SCLK=0;

CE=1;

for(i=0;i<8;i++)

{

SCLK=0;

IO=(bit)(address&0x01);

address>>=1;

SCLK=1;

}

for(i=0;i<8;i++)

{

if(IO)value|=0x80;

SCLK=1;

value>>=1;

SCLK=0;

}

CE=0;

returnvalue;

}

voidiniDS1302(void)

{

DS1302_wr(0x8E,0x00);

//DS1302_wr(0x80,0x00);

//DS1302_wr(0x82,0x00);

//DS1302_wr(0x84,0x00);

}

ucharread1302(void)//返回一个整点数或0

{

sj[0]=DS1302_re(0x81);

Delay_Ms(10);

CH451_wr(address(0),Trans_Num(sj[0]%16));

CH451_wr(address

(1),Trans_Num(sj[0]/16));

sj[1]=DS1302_re(0x83);

Delay_Ms(10);

CH451_wr(address(3),Trans_Num(sj[1]%16));

CH451_wr(address(4),Trans_Num(sj[1]/16));

sj[2]=DS1302_re(0x85);

Delay_Ms(10);

CH451_wr(address(6),Trans_Num(sj[2]%16));

CH451_wr(address(7),Trans_Num(sj[2]/16));

CH451_wr(address

(2),0x42);

CH451_wr(address(5),0x42);

if(sj[0]==0&&sj[1]==0)

{

returnsj[2];

}

elsereturn0;

}

ucharexchange216(ucharn)

{

uchari,j;

i=n/16;

j=n%16;

n=i*10+j;

returnn;

}

ucharexchange210(ucharn)

{

uchari,j;

i=n/10;

j=n%10;

n=i*16+j;

returnn;

}

voidTimer_display(void)

{

clrD();

setCH451(0x0600);

CH451_wr(address(6),Trans_Num(timer[0]/10));

CH451_wr(address(5),Trans_Num(timer[0]%10));

CH451_wr(address(3),Trans_Num(timer[1]/10));

CH451_wr(address

(2),Trans_Num(timer[1]%10));

CH451_wr(address(4),0x40);

}

voidTimer_hour(void)//闹钟小时设定

{

if(ModeNow==1)timer[0]++;

if(timer[0]==24)timer[0]=0;

Timer_display();

Delay_Ms(60);

if(flag)

{

Delay_Ms(250);

flag=0;

}

ModeNow=1;

}

voidTimer_min(void)//闹钟分钟设定

{

if(ModeNow==1)timer[1]++;

if(timer[1]==60)timer[1]=0;

Timer_display();

Delay_Ms(60);

if(flag)

{

Delay_Ms(250);

flag=0;

}

ModeNow=1;

}

voiddate(void)

{

sj[0]=DS1302_re(0x87);

Delay_Ms(10);

CH451_wr(address(0),Trans_Num(sj[0]%16));

CH451_wr(address

(1),Trans_Num(sj[0]/16));

sj[1]=DS1302_re(0x89);

Delay_Ms(10);

CH451_wr(address(3),Trans_Num(sj[1]%16));

CH451_wr(address(4),Trans_Num(sj[1]/16));

sj[2]=DS1302_re(0x8d);

Delay_Ms(10);

CH451_wr(address(6),Trans_Num(sj[2]%16));

CH451_wr(address(7),Trans_Num(sj[2]/16));

CH451_wr(address

(2),0x40);

CH451_wr(address(5),0x40);

}

voidSwitchTime(ucharposi,ucharcom,charbac)

{

sj[posi]=exchange216(sj[posi]);

if(sj[posi]==bac)sj[posi]=0;

elsesj[posi]++;

sj[posi]=exchange210(sj[posi]);

DS1302_wr(com,sj[posi]);

if(ModeNow==0)

{

read1302();

}

elseif(ModeNow==2)

{

date();

}

Delay_Ms(60);

if(flag)

{

Delay_Ms(250);

flag=0;

}

}

voidTime_adjustment(void)

{

P_Key();

if(If_Key_Press())

{

switch(Wh

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

当前位置:首页 > 幼儿教育

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

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