课程设计DS1302数码管显示数字钟的设计1文档格式.docx
- 文档编号:18108325
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:26
- 大小:356.44KB
课程设计DS1302数码管显示数字钟的设计1文档格式.docx
《课程设计DS1302数码管显示数字钟的设计1文档格式.docx》由会员分享,可在线阅读,更多相关《课程设计DS1302数码管显示数字钟的设计1文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
2.单元模块设计…………………………………………………………….….…...2
2.1硬件总电路设计………………………………………………………...….…2
2.2显示模块电路设计……………………………………………………....…….2
2.3按键调时电路设计…………………………………………………………….3
2.4时钟芯片通信电路……………………………………………………....……3
3.软件模块设计...............................................................................................4
3.1主程序设计……………………………………………………………….……….4
3.2时钟芯片…………………………………………………………..………………5
3.2.1DS1302内部结构……………………………………………………………5
3.2.2DS1302的读时序……………………………………………………………6
3.2.3DS1302的写时序……………………………………………………………6
3.3键盘调时………………………………………………………………..…………7
4.设计总结……………………………………………………………………………8
5.参考文献……………………………………………………………………………8
6.附录……………………………………………………………………………………9
前言
数字钟是采用数字电路实现对时、分、秒及数字显示的计时装置,广泛用于个人家庭、车站、办公室等公共场所,成为人们日常生活中的必需品。
钟表的数字化给人们生产生活带来了极大的方便,而且大大的扩展了钟表原先的报时功能。
如定时报警器、按时自动打铃、时间程序自动控制、自动开关路灯、定时电气的自动启用等。
所有这些都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有现实意义。
钟表的数字化大力推动了计时的精确性和可靠性。
在单片机工程的装置中,实时时钟必不可少。
目前常用的实时时钟,很多采用单片机中断服务实现。
这种方式一方面需要采用计数器,占用硬件资源,另一方面需要设置中断、查询,浪费单片机资源。
虽然能满足对实时时钟的要求,但是占用地址、数据总线多,给其他设计带来不便。
本次设计选择串行时钟芯片DS1302与单片机同步通信构成数字时钟电路。
三线接口能为单片机节省大量资源。
DS1302的后备电源以及对后备电源进行涓流充电的能力保证电路断电后仍能保存时间和数据信息。
这些优点解决了目前常用的实时时钟无法解决的问题。
1.总体设计方案
1.1.1基本功能介绍
第一点:
电子时钟用8位数码管显示。
第二点:
时间显示格式为XX-XX-XX,分别为时、分、秒。
1.1.2扩展功能介绍
设计的电子时钟可以通过安检切换现实日历,其格式为XX-XX-XX,分别为年、月、日。
设计的电子时钟可以进行时间的校准功能。
1.2总体设计方案
1.2.1计时方案
利用STC89C52单片机内部定时/计数器和时钟芯片DS1302进行终端定时,配合软件延时实现时、分、秒的计时。
方案节省硬件成本,并且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼和提高,对单片机指令系统能有更升入的了解。
1.2.2按键方案
STC89C52外接8个LED数码管显示,外接4个按键构成按键控制部分。
图1设计方案图
1.2.3显示方案
八段数码管显示有两种,一种是共阳数码管,其内部是八个阳极相连接的发光二极管组成;
另一种是共阴极数码管,其内部是八个阴极连接的发光二级管组成。
二者原理不同但功能相同。
本设计选用8个共阳八段数码管LED。
2.单元模块设计
2.1硬件总电路设计
图2硬件电路图
2.2显示模块电路设计
设计主要使用数码管功能实现,显示部分硬件用8只数码管为显示管。
这些数码管的阳极相连接在一起,所以称为共阳极数码管。
通过在8只数码管的阳极加+5V电压或0V电压数码管形成不同的数字。
数码管部分如图所示。
动态显示:
数码管动态显示接口是单片机应用中最广泛的一种显示方式。
动态是将所有数码管的8个显示笔画a,b,c,d,e,f,g,dp的同名端连接在一起,另外为每个数码管的公共级COM增加位选通控制电路。
位选通由各自独立的I/O线控制,当单片机输出字型码时,所有数码管都接收到相同的字型码,当选择哪个数码管显示字形时,就取决于单片机对选通COM端电路的控制。
所以我们只要将需要显示的数码管的选通控制打开,该为显示字形。
没有选通的数码管不会亮。
通过分时控制各个数码管的COM端,就使个个数码管轮流受控显示,这就是动态驱动。
图3显示电路图
2.3按键调时电路
图4键盘电路图
2.4时钟芯片通信电路
时钟芯片DS1302与单片机STC89C52的借口是由三条线来完成的,单片机STC89C52的P2.3与时钟芯片的数据传输端相连,P1.7用作DS1302的输入时钟SCLK控制线。
P1.3控制DS1302的复位控制端。
DS1302接标准32.768KHZ石英晶振。
DS1302与单片机的接口电路如图。
图5时钟芯片电路图
3.软件模块设计
3.1主程序设计
图6主程序设计图
3.2时钟芯片
图7时钟芯片流程图
3.2.1DS1302内部结构:
图8DS1302内部构造图
3.2.2DS1302的读时序:
图9读时序图
3.2.3DS1302的写时序:
图10写时序图
3.3键盘调时
图11键盘调时流程图
4.设计总结
在这学期的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在实验课上,我们学会了很多学习的方法。
而这是日后最实用的,受益匪浅。
要面对社会的挑战,只有不断的学习、实践。
在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢×
,×
×
老师,他们一丝不苟的作风一直是我工作、学习中的榜样;
老师循循善诱的教导和不拘一格的思路给予我无尽的启迪。
同时,对给过我帮助的所有同学和各位指导老师表示忠心的感谢!
5.参考文献
[1]楼然苗,李光飞.51系列单片机设计实例[M].北京:
北京航空航天大学出版社,2003.88-100
[2]李群芳,黄建.单片机微型计算机与接口技术[M].北京:
电子工业出版社,2001.70-82
[3]李朝青.单片机原理接口技术(第三版)[M].北京:
北京航空航天大学出版社,2005,1-320
[4]赵嘉蔚.单片机原理与接口技术[M].北京:
清华大学出版社,2010.2-26
[5]赵小安.MCS-51单片机原理及应用[M].天津:
天津大学出版社,2001.3-35
[6]欧伟明,周春临,翟遂春.电子信息系统设计[M].西安:
西安电子科技大学出版,2005,54
附录:
程序代码
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitK1=P3^0;
//定义K1键
sbitK2=P3^1;
//定义K2键
sbitK3=P3^2;
//定义K3键
sbitK4=P3^3;
//定义K4键
sbitP2_5=P2^5;
sbitP2_6=P2^6;
sbitP2_7=P2^7;
sbitRST=P1^7;
sbitIO=P2^3;
sbitSCLK=P1^3;
bitK1_FLAG=0;
//定义按键标志位,当按下K1键时,该位置1,K1键未按下时,该位为0
bitflag;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchardisp_buf[8];
//定义显示缓冲区
uchartime_buf[7];
//DS1302时间缓冲区,存放秒、分、时、日、月、星期、年
uchartime_hour[10];
uchartime_min[10];
uchartemp[2];
//用来存放设置时的小时、分钟的中间值
uchart0;
//定时器标志变量
/***********************函数声明********************************/
voiddula(void);
//段选
voidwela(void);
//位选
voidON_Buzzer(void);
//打开蜂鸣器
voidOFF_Buzzer(void);
//关闭蜂鸣器
voidON_Relay(void);
//打开继电器
voidOFF_Relay(void);
//关闭继电器
voidDelay(uchari);
//延时
voidWrite_byte(ucharinbyte);
//写一个字节
ucharRead_byte(void);
//读一个字节
voidWrite_ds1302(ucharaddress,ucharindata);
//向DS1302写入地址和数据
ucharRead_ds1302(ucharaddr);
//根据给定的地址读数据
voidinit_ds1302(void);
//DS1302初始化
voidinit_timer0(void);
//定时器初始化
voidKey_Process(void);
//按键检测并作出响应
voidKey_Clock(void);
//按键设置闹钟时间
voidget_time(void);
//获取时间(进制转换)
voidTime_Display(void);
//时间显示
voidDate_Display(void);
//日历显示
/***************************主函数************************************/
voidmain()
{
uinti=0;
//设置闹钟数
uintj;
P0=0;
P2=0;
init_ds1302();
init_timer0();
while
(1)
{
get_time();
//读取当前时间
if(K1==0)//若K1键按下
{
Delay(5);
//延时10ms去抖
if(K1==0)
{
while(!
K1);
//等待K1键释放
K1_FLAG=1;
//K1键标志位置1,以便进行时钟调整
}
}
if(K1_FLAG==1)
Key_Process();
//若K1_FLAG为1,则进行走时调整
Time_Display();
if(K4==0)
if(K4==0)
while(!
K4);
Key_Clock();
time_hour[i]=temp[0];
time_min[i]=temp[1];
i++;
if(K4==0)
{
Delay(5);
if(K4==0)
{
Write_ds1302(0x80,0x00);
//调整完毕后,启动时钟运行
Write_ds1302(0x8e,0x80);
//写保护控制字,禁止写
}
}
for(j=0;
j<
=i;
j++)
if((time_hour[j]==time_buf[2])&
&
(time_min[j]==time_buf[1]))
flag=1;
TR0=1;
t0=0;
ON_Relay();
ON_Buzzer();
}
}
if(flag==1)
OFF_Relay();
OFF_Buzzer();
TR0=0;
flag=0;
}
}
/*******************************延时程序*****************************/
voidDelay(uchari)
ucharj;
for(;
i>
0;
i--)
for(j=110;
j>
j--);
/***********************数码管**********************************/
voiddula(void)//段选
P2_5=1;
P2_6=1;
P2_7=1;
/*---------------------------------------------------------------------------*/
voidwela(void)//位选
P2_5=0;
/**************************蜂鸣器*******************************/
voidON_Buzzer(void)//打开蜂鸣器
P2_6=0;
P0=0x40;
P2_7=0;
voidOFF_Buzzer(void)//关闭蜂鸣器
P0=0;
/****************************继电器*********************************/
voidON_Relay(void)//继电器打开
P0=0x10;
voidOFF_Relay(void)//继电器关闭
/******************初始化DS1302函数***************************/
voidinit_ds1302(void)
RST=0;
SCLK=0;
Write_ds1302(0x80,0x00);
//写秒寄存器
Write_ds1302(0x90,0xab);
//写充电器
Write_ds1302(0x8e,0x80);
//写保护控制字,禁止写
/******************定时器初始化***********************************/
voidinit_timer0(void)
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
ET0=1;
EA=1;
TR0=0;
/****************************写一个字节******************************/
voidWrite_byte(ucharinbyte)
uchari;
for(i=0;
i<
8;
i++)
SCLK=0;
//写时低电平改变数据
if(inbyte&
0x01)
IO=1;
else
{
IO=0;
}
SCLK=1;
//高电平把数据写入DS1302
_nop_();
inbyte=inbyte>
>
1;
/*********************读一个字节*********************************/
ucharRead_byte(void)
uchari,temp=0;
IO=1;
7;
if(IO==1)
temp=temp|0x80;
temp=temp&
0x7f;
//产生下跳沿
temp=temp>
return(temp);
/**********************向DS1302写入数据************************/
voidWrite_ds1302(ucharaddress,ucharindata)
RST=1;
Write_byte(address);
//写入地址
Write_byte(indata);
//写入数据
/**********************从DS1302读取数据*****************************/
ucharRead_ds1302(ucharaddr)
ucharbackdata;
Write_byte(addr);
//先写地址
backdata=Read_byte();
//然后读数据
return(backdata);
/************************按键扫描及操作******************************/
voidKey_Process(void)//通过按键调整时间
ucharmin16,hour16;
//定义16进制的分钟和小时变量
Write_ds1302(0x8e,0x00);
//DS1302写保护控制字,允许写
Write_ds1302(0x80,0x80);
//时钟停止运行
if(K2==0)//K2键用来对小时进行加1调整
//延时去抖
if(K2==0)
while(!
K2);
//等待K2键释放
time_buf[2]++;
//小时加1
if(time_buf[2]==24)
{
time_buf[2]=0;
//当变成24时初始化为0
hour16=time_buf[2]/10*16+ti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 DS1302 数码管 显示 数字 设计