DS1302定时闹钟课程设计.docx
- 文档编号:9895647
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:25
- 大小:78.17KB
DS1302定时闹钟课程设计.docx
《DS1302定时闹钟课程设计.docx》由会员分享,可在线阅读,更多相关《DS1302定时闹钟课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 定时 闹钟 课程设计