ds1302时钟数码管显示时分秒Word文档格式.docx
- 文档编号:19399281
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:15
- 大小:361.83KB
ds1302时钟数码管显示时分秒Word文档格式.docx
《ds1302时钟数码管显示时分秒Word文档格式.docx》由会员分享,可在线阅读,更多相关《ds1302时钟数码管显示时分秒Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
分:
秒)电路;
2.选用八位LED数码显示,实时显示时、分、秒,采用按键式实现时钟对表和快慢调整;
3.硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。
设计的单元电路必须有工作原理,器件的作用,分析和计算过程;
4.软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单;
5.原理图设计部分,根据所确定的设计电路,利用Protel工具软件绘制电路原理图、PCB板图、提供元器件清单。
2方案论证
实现数字电子钟的设计有以下两种基本方案,现就两种基本方案的优劣进行具体论证,从而说明选择方案二的理由。
方案一:
直接用单片机的内部定时器来实现时间。
该方案以MCS-51单片机为主控芯片,以MCS-51的内部定时器产生的1s中断作为时钟的驱动,然后再通过8个74LS245缓冲器驱动8个独立的数码管来组成数字钟电路。
该电路由于数码管和缓冲器的数目较多,所以在连线方面比较复杂,而且用到的分压电阻也比较多。
但是此方案最大的缺点在于单片机89C51产生的1s中断存在误差,如果工作时间长的话,数字时钟显示的时间将会出现严重的偏差,不够精确。
方案二:
使用串行接口时钟芯片DS1302设计时钟电路。
该设计方案以MCS-51单片机为主控芯片,以串行时钟芯片DS1302为核心计时芯片,然后再通过一个74LS245缓冲器驱动两组数码管组(每个数码管组由四个数码管连在一起组成)组成数字时钟电路。
更重要的是,DS1302时钟芯片的加入大大提高了数字钟时间的准确性,而且该电路在断电后不丢失时间和数据信息时也使得该方案的研究与提升更具有开发的意义。
3系统硬件设计
3.1系统总原理图
图1数字钟总原理图
3.2元件清单
元件序号
型号或主要参数
数量
封装
R1
100Ω
1
AXIAL0.3
U1
AT89C51
DIP40
R2
1kΩ
U2
74S15
DIP14
RP1
1KΩ
SIP9
U4
DS1302
DIP8
C1
22pF
3
RAD2.54
U3
74LS245
DIP20
C4
104uF
Y1
CRYSTAL
STAL3
DS
SM41C564
2
数码管*4
Y2
STAL2
K
按键
4
按键4.5*6.5
3.3PCB板图
图2总电路PCD板图
3.4Proteus仿真图
图3proteus仿真图
3.5分电路图及原理说明
本次设计的硬件电路由主控部分(单片机MCS-51)、计时部分(实时时钟芯片DS1302)、显示部分(数码管)、调时部分(按键)4个部分组成。
各部分之间相互协作,构成一个统一的有机整体,实现数字时钟的计时功能。
现就各部分的硬件电路设计作出如下论述:
3.5.1主控部分(单片机MCS-51)
MCS-51单片机作为主控芯片,控制整个电路的运行。
其外围电路主要有两部分:
复位电路和晶体振荡器。
复位电路的功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤消复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
该设计采用含有二极管的复位电路,复位电路可以有效的解决电源毛刺和电源缓慢下降(电池电压不足)等引起的问题,在电源电压瞬间下降时可以使电容迅速放电,一定宽度的电源毛刺也可令系统可靠复位。
晶体振荡电路:
MCS-51单片机中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别为该反向放大器的输入端和输出端。
这个反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。
对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性。
如果使用石英晶体,电容应该使用30pF
10pF。
电路图如下:
图4主控部分电路图
3.5.2计时部分(实时时钟芯片DS1302)
时钟芯片DS1302与外围电路的连接:
与MCS-51单片机的接口是由3条线来完成的,MCS-51单片机的P1.0与时钟芯片的数据传输端I/O相连,P1.1用来作为DS1302输入时钟SCLK控制端,P1.2控制DS1302的复位输入端RST。
DS1302的X1和X2管脚外接标DS1302的复位引脚通过把
输入驱动置高电平来启动所有的数据传送。
输入有两种功能:
首先,
接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,
提供了终止单字节或多字节数据的传送手段。
当
为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中置
为低电平,则会终止此次数据传送,并且I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,
必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
图5计时部分电路图
3.5.3显示部分(共阳极数码管)
八段数码显示管有两种,一种是共阳数码管,其内部是由八个阳极相连接的发光二极管组成;
另一种是共阴数码管,其内部是由八个阴极相连接的发光二极管组成。
二者原理不同但功能相同。
本设计的时间显示选用6个共阴八段数码管LED,其外形和内部结构如图10所示:
图6八段共阴数码管LED
3.5.4调时部分(按键)
按键电路有K1,K2,K3三个按键和一个74S15组成,只有其中任意一个按键按下,电路都会通过74S15向单片机INT0引脚发送一次中断请求信号。
按键K1用来调整小时,按键K2用来调整分钟,按键K3用来结束调时,数字开始继续走表。
图7按键电路
4系统软件设计
4.1程序流程图
否
是
图8主程序流程图
图9写DS1302流程图图10读DS1302流程图
4.2源程序
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitsda=P1^1;
//ds1302的数据线
sbitclk=P1^0;
//ds1302的时钟线
sbitrst=P1^2;
//ds1302的复位线
sbitk1=P1^5;
//调时
sbitk2=P1^6;
//调分
sbitk3=P1^7;
//开始走秒
ucharcodeduan_code[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管段码表
uchardisplay_code[]={
0x00,0x00,0xbf,0x00,0x00,0xbf,0x00,0x00};
//显示格式,中间两个横杠
ucharbit_code[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//数码管位选
ucharcurrent_time[7];
//所读取的日期和时间
charadjust_flag=0;
//调节标志
voiddelayms(uintx)//延时函数ms级
{
uchari;
while(x--)for(i=0;
i++;
i<
120);
}
voidwrite_byte(ucharx)//写一个字节函数
for(i=0;
8;
i++)
{
sda=x&
1;
clk=1;
clk=0;
x>
>
=1;
}
ucharread_byte(void)//读一个字节函数
uchari,b,t;
b>
t=sda;
b|=t<
<
7;
returnb/16*10+b%16;
ucharread_data(ucharaddr)//读取数据函数
uchardat;
rst=0;
rst=1;
write_byte(addr);
dat=read_byte();
returndat;
voidwrite_data(ucharaddr,uchardat)//写入控制字和输入函数
write_byte(dat);
voidset_1302()//设置ds1302函数
write_data(0x8e,0x00);
//关闭写保护。
write_data(0x82,(current_time[1]/10<
4)|(current_time[1]%10));
//初始化分
write_data(0x84,(current_time[2]/10<
4)|(current_time[2]%10));
//初始化时
write_data(0x8e,0x80);
//打开写保护。
voidgettime()//单片机从ds1302读取的时间数据
current_time[0]=read_data(0x81);
current_time[1]=read_data(0x83);
current_time[2]=read_data(0x85);
voidint0()interrupt0//中断函数
if(k1==0)//小时调整
adjust_flag=1;
//正在调整
current_time[2]=(current_time[2]+1)%24;
else
if(k2==0)//分钟调整
current_time[1]=(current_time[1]+1)%60;
if(k3==0)//确定
set_1302();
//将调整后的时间写入ds1302
adjust_flag=0;
//结束调整,时间继续正常显示
voidmain()//主函数
IE=0X81;
//开总中断,同时开外部定时器0中断
while
(1)
if(adjust_flag==0)
gettime();
//扫描按键,当按键没有被按下时,单片机从ds1302读取时间数据
display_code[0]=duan_code[current_time[2]/10];
//小时为的十位
display_code[1]=duan_code[current_time[2]%10];
//小时位的个位
display_code[3]=duan_code[current_time[1]/10];
//分钟位的十位
display_code[4]=duan_code[current_time[1]%10];
//分钟为的个位
display_code[6]=duan_code[current_time[0]/10];
//秒位的十位
display_code[7]=duan_code[current_time[0]%10];
//秒位的个位
i++)//对数码管进行动态扫描
P2=bit_code[i];
P0=display_code[i];
delayms(5);
5心得体会
通过本次设计,使我们对单片机的了解有了更加深一步,我发现只有动手做才会孰能技巧,还有对材料的整理和理解。
这次设计运用到的知识很多方面,尤其是单片机,像AT89C51,引脚多,硬件内部线路接通,所以用起来很方便,还有ds1302芯片与单片机之间的连接,以及如入使用ds1302芯片。
当然也要对这些元器件作相应调查。
主要就是电路原理图,还有对引脚的作用熟悉。
对于软件方面则是灵活运用单片机有关的程序语言,还有很多扩展功能,由于知识匮乏,但是理论知识还是比较详细的。
我们最大的成功之处是在这整个过程,动脑寻求解决一个一个问题的办法,对程序是不断思索,务必写出很简单的程序来,使得电子时钟能做成功!
6参考文献
《单片机原理及其接口技术》(第二版)清华大学出版社
《新概念51单片机C语言教程》电子工业出版社
《单片机C语言程序设计实训100例》电子工业出版社
7结束语
本设计利用单片机AT89C51控制串行实时时钟芯片DS1302构成数字时钟电路,
实现计时功能。
该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片DS1302带有后备电池,具备对后背电源进行涓细电流充电的能力,保证电路断电后仍保存时间和数据信息,这些优点解决了目前常用实时时钟占用单片机资源多以及计时不可靠等缺点。
该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的精确性和可靠性有较高要求的场合,提供较好的实时时钟。
但是,由于DS1302易受环境影响,会使该电路出现时钟精度不高、时钟混乱等问题,还有继续研究和改进。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds1302 时钟 数码管 显示 时分