电子设计大赛作品51单片机的实时时钟制作.docx

上传人:b****5 文档编号:4169548 上传时间:2022-11-28 格式:DOCX 页数:21 大小:22.51KB
下载 相关 举报
电子设计大赛作品51单片机的实时时钟制作.docx_第1页
第1页 / 共21页
电子设计大赛作品51单片机的实时时钟制作.docx_第2页
第2页 / 共21页
电子设计大赛作品51单片机的实时时钟制作.docx_第3页
第3页 / 共21页
电子设计大赛作品51单片机的实时时钟制作.docx_第4页
第4页 / 共21页
电子设计大赛作品51单片机的实时时钟制作.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

电子设计大赛作品51单片机的实时时钟制作.docx

《电子设计大赛作品51单片机的实时时钟制作.docx》由会员分享,可在线阅读,更多相关《电子设计大赛作品51单片机的实时时钟制作.docx(21页珍藏版)》请在冰豆网上搜索。

电子设计大赛作品51单片机的实时时钟制作.docx

电子设计大赛作品51单片机的实时时钟制作

河北大学工商学院

 

电子设计竞赛报告

!

题目:

使用DS12C887时钟芯片设计

I

装高精度时钟

学部信息科学与工程学部

专业电气一类

学号2009480102

姓名田海茂

2011年3月12日

1摘要3

2系统组成与功能说明3

三硬件电路设计与分析2

四程序流程说明3

附录1

摘要

本系统利用单片机(STC89C52和DS12C887时钟芯片实现对时间的控制。

在1602液晶

上显示年,月,日,星期,时,分,秒,并且按秒实时更新显示;具有闹铃报警功能;具有更改功能,能任意更改时间;利用DS12C887自身掉电可继续走时的特性,实现断电时间

不停,再次上电时时间仍准确显示在液晶上的功能。

以上各种功能依据一定的联系,

组成一个比较完整的系统。

一系统组成与功能说明

系统可划分为几个功能模块,如图1所示。

STC89C52

通过STC89C52单片机按键的扫描函数实现对更改时间功能的控制。

在外部断电情况下

DS12C887仍能继续走时,再次上电时将准确时间传给单片机,从而实现时间不停的功能,

当闹钟时间到时,DS12C887发出中断申请,单片机控制液晶停止走时,通过蜂鸣器发出闹铃声,并且按键与蜂鸣器相连,按下按键的同时蜂鸣器会发出响声。

采用个性化的液晶显示,当开始供电时以屏幕的平移为起始,时间信息从右往左平移至中央。

硬件电路设计与分析

硬件电路原理图如下所示

最小系统图

77

窃口|||]—

Pi:

AIXT'a

PtI

W1K-1

Bfe~i

斫潭:

rl■

PE3

ACE]PC5

Pl*PESfLMK:

.

Qtf>

JlE^PC5

Pl出、AM^

収阳

PI详E

AC~>C-

jjshSl

起2;^r

WK*;(JbJ:

L

(Atmi

CjLM|P23

屮亦*

U\77

bHAL】阖軾:

H?

T

lAiiTL?

vw

Sill

〜盯一

匹”笆_閃痂7

ALEFSW

?

SEC

45

T

1

sic

ni

 

1602液晶与单片机连接图

LCD1LMD16L.

fi?

hUn3lI

XTM1

1

PC!

XT

PQJ^AOJ

W卫2t

PH

urr

FO.&Afr'g

FDJfA&7

眩皿鶴

FZ-1/AB

PZZfAffi

RSJfAH

P2WAH

EA

F2jSAf3

□如专

F2.7/A1®

Plf]

PjD'H.XB

;ri.i

fj-icna

P1Z

ipaa'iirm

fij

乃aim

PP1.t

P15

ragri

pis

pz^viBi.

jFU

PZJ.TfN0

U1

□5

>*T®tSi

■a

p药

P22.

DS12C887与单片机连接图

FIU

?

i)oy

PH

?

3t-

PH

P

Pl3

FD1-

PM

P(M-

Pl*

POS-

P't

PM-

Fl?

FOT-

mt

咖・

LKTO

¥2i-

T】F""

709031胃;;

H/w

賂卜

l丄

PH

12

Y2?

fttsrr

UD

r>

T1D

PSEli

22

)9

4

AH:

■h:

~r

ne_

MC

1;r

13s

nUJ

ADJ

tr]x

NCiflQ

TJ"

1!

AU®

ADJ

構os.

T3T

CTORC

2L,pis.

DS12C3&7

14

 

⑴以STC89C52为核心制作出单片机最小系统。

⑵1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,符合本作品需要。

⑶DS12C887具有闹铃以及外部掉电自身继续走时功能,为理想的时钟芯片。

⑷选择蜂鸣器,通过用三极管对其放大,实现所想要的功能。

⑸选择RS232,使得计算机的9.6V的电压能够与该系统5V得以匹配,与此同时也实现了我们直接用电脑直接对其系统直接拷贝程序。

三程序流程说明

初始化

按键检查

从DS12C887读取数据

液晶显示数据

图主程序流程图

附件1

#include

#defineucharunsignedchar#defineuintunsignedintsbitrs=P3八5;

sbitIcden=P3A4;

sbits仁P3A6;〃功能键

sbits2=P3A1;//增大键

sbits3=P3A2;//减小键

sbitbeep二P2A3;〃蜂鸣器

sbitdscs=P1A4;

sbitdsas=P1A5;

sbitdsrw=P1A6;

sbitdsds=P1A7;

sbitdsirq二卩3八3;

ucharcount,s1num,flag;

bitflag1;

charmiao,shi,fen,nian,yue,ri,week;

液晶固定显示

ucharcodetable[]="20--”;〃

ucharcodetable1[]=":

:

";

ucharcodetable2[]="Helloeveryone!

";

ucharcodetable3[]="Nicetomeetyou!

";voidwrite_ds(uchar,uchar);

voidset_alarm(uchar,uchar,uchar);ucharread_ds(uchar);voidset_time();

ucharamiao,ashi,afen;

voiddelay(uintz)//延时函数

{

uintx,y;

for(x二z;x>0;x--)

for(y=110;y>0;y--);

}

voiddi()//按键时蜂鸣器发音

{

beep=0;

delay(IOO);

beep=1;

}

voiddidi()//闹钟时蜂鸣器发音

{

beep=0;

delay(50);

beep=1;

delay(IOO);

beep=0;

delay(50);

beep=1;

voidwrite_com(ucharcom)//写液晶命令函数

{

rs=0;

leden=0;

P0=com;

delay(5);

Icden=1;

delay(5);

Icden=0;

}

voidwrite_date(uchardate)//写液晶具体数据函数

{

rs=1;

Icden=0;

PO二date;

delay(5);

Icden=1;

delay(5);

lcden=0;

{

ucharnum;

EA=1;〃打开总中断

EX1=1;〃开外部中断1

IT1=1;〃设置负跳变沿触发方式

lcden=0;

week=1;

//set_time();〃给DS12C887设置时间函数

set_alarm(2,2,10);〃设置闹铃函数

write_ds(0x0B,0x26);〃设置DS12C88724小时模式write_com(0x38);//1602液晶初始化

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

for(num=0;num<16;num++)〃写入液晶平移内容

{

write_date(table2[num]);

delay(5);

write_com(0x80+0x40);

for(num=0;num<16;num++)

{

write_date(table3[num]);

delay(5);

}

write_com(0x80+0x10);〃写入液晶固定内容

for(num=0;num<16;num++)

{

write_date(table[num]);

delay(5);

}

write_com(0x80+0x50);

for(num=0;num<16;num++)

{

write_date(table1[num]);

delay(5);

}

}

voidwrite_sfm(ucharadd,uchardate)//在液晶上写入时分秒

{

ucharshi,ge;

shi二date/10;

ge=date%10;

write_com(0x80+0x50+add);

write_date(0x30+shi);

write_date(0x30+ge);

在液晶上写入年月日

}

voidwrite_sfm1(ucharadd,uchardate)//

{

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x10+add);

write_date(0x30+shi);

write_date(0x30+ge);

}

voidwrite_week(ucharwe)//星期函数

{

write_com(0x80+0x10+13);

switch(we)

case1:

write_date('M');delay(5);

write_date('0');delay(5);write_date('N');

break;

case2:

write_date('T');delay(5);write_date('U');delay(5);write_date('E');

break;

case3:

write_date('W');delay(5);write_date('E');delay(5);write_date('D');

break;

case4:

write_date('T');delay(5);write_date('H');delay(5);write_date('U');

break;

case5:

write_date('F');delay(5);

write_date('R');delay(5);

write_date(T);

break;

case6:

write_date('S');delay(5);

write_date('A');delay(5);

write_date(T);

break;

case7:

write_date('S');delay(5);

write_date('U');delay(5);

write_date('N');

break;

}

}

voidkeyscan()

{

if(flag仁=1)//闹铃响

{

if(s2==0)

delay(5);

if(s2==0)

中断闹铃

中断闹铃

{while(!

s2);

di();

flag仁0;//

}

}

if(s3==0)

{

delay(5);

if(s3==0)

{

while(!

s3);

di();

flag仁0;//

}

}

}

if(s1==0)

delay(5);

if(s仁=0)

{slnum++;flag=1;flag1=0;while(!

s1);

di();

if(s1num==1)

{

write_com(0x80+0x50+10);

write_com(0x0f);〃光标停止位置不断闪烁

if(s1num==2)

{

write_com(0x80+0x50+7);

}

if(s1num==3)

{

write_com(0x80+0x10+13);

}

if(s1num==5)

{

write_com(0x80+0x10+10);

}

if(s1num==6)

{

write_com(0x80+0x10+7);

}

if(s1num==7)

{

write_com(0x80+0x10+4);

}

if(s1num==8)

{

s1num=0;

write_com(OxOc);〃光标停止闪烁

write_ds(2,fen);

write_ds(4,shi);write_ds(6,week);write_ds(7,ri);write_ds(8,yue);write_ds(9,nian);flag=O;

}

}

}

if(s1num!

=O)

{

if(s2==0)

{

delay

(1);

if(s2==0)

{

while(!

s2);

di();

miao++;

if(miao==60)

miao=0;

write_sfm(10,miao);〃将变化后的时间写入液晶

write_com(0x80+0x50+10);

}

if(s1num==2)

{

fen++;

if(fen==60)

fen=0;

write_sfm(7,fen);

write_com(0x80+0x50+7);

}

if(s1num==3)

{

shi++;

if(shi==24)

shi=0;

write_com(0x80+0x50+4);

}

{

week++;

if(week==8)

week=1;

write_week(week);

write_com(0x80+0x10+13);

}

if(s1num==5)

{

ri++;

if(ri==32)

ri=1;

write_sfm1(10,ri);

write_com(0x80+0x10+10);

}

if(s1num==6)

yue++;

yue=1;

write_sfm1(7,yue);

write_com(0x80+0x10+7);

}

if(s1num==7)

{

nian++;

if(nian==100)

nian=0;

write_sfm1(4,nian);

write_com(0x80+0x10+4);

}

}

}

if(s3==0)

{

delay

(1);

if(s3==0)

di();

if(s1num==1)

miao--;

if(miao==-1)

miao=59;

write_sfm(10,miao);write_com(0x80+0x50+10);

}

if(s1num==2)

{

fen--;

if(fen二=-1)

fen二59;

write_sfm(7,fen);

write_com(0x80+0x50+7);

}

if(s1num==3)

{

shi--;

if(shi==-1)

shi=23;

write_com(0x80+0x50+4);

}

if(s1num==4)

{

week--;

if(week==O)

week=7;

write_week(week);

write_com(0x80+0x10+13);

}

if(s1num==5)

{

ri--;

if(ri==0)

ri=31;

write_sfm1(10,ri);write_com(0x80+0x10+10);

}

if(s1num==6)

yue--;

yue=12;

write_sfm1(7,yue);

write_com(0x80+0x10+7);

}

if(s1num==7)

{

nian--;

if(nian二=-1)

yue=99;

write_sfm1(4,nian);write_com(0x80+0x10+4);

}

}

}

}

}

写入程序函数

voidwrite_ds(ucharadd,uchardate)//DS12C887{

dscs=0;

dsas=1;

dsds=1;

dsrw=1;

P0二add;

dsas=O;

dsrw=0;

PO二date;

dsrw=1;

dsas=1;

dscs=1;

从DS12C88冲读取数据

}

ucharread_ds(ucharadd)//

{

uchards_date;

dsas=1;

dsds=1;

dsrw=1;

dscs=O;

PO=add;

dsas=O;

dsds=O;

PO=Oxff;

ds_date=PO;

dsds=1;

dsas=1;

dscs=1;

returnds_date;

}

voidset_time()〃设置时间

{

write_ds(4,1);

write_ds(2,2);

write_ds(6,3);

write_ds(7,4);

write_ds(8,5);

write_ds(9,6);

设置闹铃

}

voidset_alarm(ucharashi,ucharafen,ucharamiao)//

{

write_ds(1,amiao);

write_ds(3,afen);

write_ds(5,ashi);

voidmain()

{

ucharnum,bo=0;

init();delay(4000);

for(num=0;num<16;num++)

{

{

平移函数

write_com(0x18);//1602

delay(600);

}

keyscan();〃按键检测

if(flag1==1)

didi();

if(flag==0)

miao=read_ds(0);//平移时从时钟芯片中读取时间

fen二read_ds

(2);

shi二read_ds(4);

week二read_ds(6);

ri=read_ds(7);

yue=read_ds(8);

nian二read_ds(9);

write_sfm(10,miao);〃平移时将读取的时间写到液晶

write_sfm(7,fen);

write_sfm(4,shi);

write_week(week);

write_sfm1(10,ri);

write_sfm1(7,yue);

write_sfm1(4,nian);

}

}

while

(1)

{

keyscan();

if(flag1==1)

didi();

读取数据

写入数据

if(flag==O)

{

miao二read_ds(O);〃fen二read_ds

(2);shi=read_ds(4);

week二read_ds(6);ri=read_ds(7);

yue=read_ds(8);nian二read_ds(9);

write_sfm(10,miao);〃write_sfm(7,fen);write_sfm(4,shi);write_week(week);write_sfm1(10,ri);

write_sfm1(7,yue);write_sfm1(4,nian);

}

}

voidexter()interrupt2{ucharc;

flag仁1;c=read_ds(0x0c);

}

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

当前位置:首页 > 小学教育 > 数学

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

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