电子时钟设计方案及程序文档格式.docx

上传人:b****3 文档编号:17581359 上传时间:2022-12-07 格式:DOCX 页数:17 大小:140.70KB
下载 相关 举报
电子时钟设计方案及程序文档格式.docx_第1页
第1页 / 共17页
电子时钟设计方案及程序文档格式.docx_第2页
第2页 / 共17页
电子时钟设计方案及程序文档格式.docx_第3页
第3页 / 共17页
电子时钟设计方案及程序文档格式.docx_第4页
第4页 / 共17页
电子时钟设计方案及程序文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

电子时钟设计方案及程序文档格式.docx

《电子时钟设计方案及程序文档格式.docx》由会员分享,可在线阅读,更多相关《电子时钟设计方案及程序文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

电子时钟设计方案及程序文档格式.docx

3、液晶部分

图4-3

液晶1、2端口分别是工作电源的负、正极,15、16是液晶背光灯电源正负极,R4起限流作用,避免电流过大烧坏背光灯。

第3端口还可接一电位器,调节液晶显示对比度。

无标号的8个端口是数据端,通过一上拉电阻接到单片机的

P0口。

三.系统的软件设计(如必要,含有流程图)

1、程序流程图

流程图中的X表示液晶中秒、分、时、星期、年、月、日中的任一个。

图5-1主程序流程图图5-2扫描键盘的子程序流程

四.系统测试及结果

测试结果总的来说很满意,比预计的还要好。

但由于中断函数中代码较长,故存在一定程度的误差,用秒表测试大约为每5分钟慢了一秒,这个问题是用单片机定时器来数时所无法解决的,中断函数必定会较长,处理这一函数会花费一定的时间这就无法做到让时钟走得很精确。

解决方法是用一时钟芯片来实现,由于时钟芯片不好买又比较贵(新的20几块一片),暂时就不考虑了,有机会再尝试。

1.源程序

//主函数放在最后面

#include<

reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitrs=P2^4;

//定义液晶数据命令选择端

sbitlcden=P2^5;

//液晶使能端

sbits1=P2^0;

//按键1

sbits2=P2^1;

//按键2

sbits3=P2^2;

//按键3

ucharcount,s1num;

charshi,fen,miao;

//时、分、秒

charyear,month,day,week;

//年月日星期

voiddelay(uintx)//延时子程序

{

uintj,k;

for(j=x;

j>

0;

j--)

for(k=110;

k>

k--);

}

//----液晶写命令功能---

voidwrite_com(ucharcom)

rs=0;

lcden=0;

P0=com;

delay(5);

lcden=1;

//---液晶写数据功能-----

voidwrite_date(uchardate)

rs=1;

P0=date;

//----------写入时、分、秒--------?

voidwrite_sfm(ucharadd,uchardate)

ucharshi,ge;

shi=date/10;

ge=date%10;

write_com(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

//--------写入年、月、日-----------

voidwrite_nyr(ucharadd,uchardate)

write_com(0x80+add);

//--------------写入星期X---------------

voidwrite_week(ucharwe)

write_com(0x80+12);

switch(we)

{

case1:

write_date('

M'

);

delay(5);

write_date('

O'

N'

break;

case2:

T'

U'

E'

case3:

W'

D'

case4:

H'

case5:

F'

R'

I'

case6:

S'

A'

case7:

}

//-----实现初始化功能-------

voidinit()

shi=1;

fen=1;

miao=1;

day=1;

month=1;

year=1;

week=1;

count=0;

s1num=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80+1);

2'

write_com(0x80+2);

0'

write_com(0x80+5);

-'

write_com(0x80+8);

write_nyr(9,day);

write_nyr(6,month);

write_nyr(3,year);

write_week(week);

write_com(0x80+0x40+6);

:

'

write_com(0x80+0x40+9);

write_sfm(10,miao);

write_sfm(7,fen);

write_sfm(4,shi);

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

//--------------键盘扫描功能----------------

voidkeyscan()

if(s1==0)//键盘1是否被按下

delay(5);

//如果检测到键盘被按下,延时约

if(s1==0)//5毫秒看是否为键下,这样可越过按

{//键盘时的抖动时间,防止误判

s1num++;

while(!

s1);

if(s1num==1)

{

TR0=0;

write_com(0x80+0x40+10);

write_com(0x0f);

}

if(s1num==2)

write_com(0x80+0x40+7);

if(s1num==3)

write_com(0x80+0x40+4);

if(s1num==4)

{

write_com(0x80+12);

if(s1num==5)

write_com(0x80+9);

if(s1num==6)

write_com(0x80+6);

if(s1num==7)

write_com(0x80+3);

if(s1num==8)

s1num=0;

write_com(0x0c);

TR0=1;

}

if(s1num!

=0)//键盘2是否被按下

if(s2==0)

{

delay(5);

if(s2==0)

while(!

s2);

if(s1num==1)

{

miao++;

if(miao==60)

miao=0;

write_sfm(10,miao);

write_com(0x80+0x40+10);

}

if(s1num==2)

fen++;

if(fen==60)

fen=0;

write_sfm(7,fen);

write_com(0x80+0x40+7);

if(s1num==3)

shi++;

if(shi==24)

shi=0;

write_sfm(4,shi);

write_com(0x80+0x40+4);

if(s1num==4)

week++;

if(week==8)

week=1;

write_week(week);

write_com(0x80+12);

if(s1num==5)

day++;

if(day==32)

day=1;

write_nyr(9,day);

write_com(0x80+9);

if(s1num==6)

month++;

if(month==13)

month=1;

write_nyr(6,month);

write_com(0x80+6);

if(s1num==7)

year++;

if(year==100)

year=0;

write_nyr(3,year);

write_com(0x80+3);

}

if(s3==0)//键盘3是否被按下

if(s3==0)

s3);

miao--;

if(miao==-1)

miao=59;

fen--;

if(fen==-1)

fen=59;

shi--;

if(shi==-1)

shi=23;

week--;

if(week==0)

week=7;

day--;

if(day==0)

day=31;

month--;

if(month==0)

month=12;

year--;

if(year==-1)

year=99;

//-----------主函数-----------------

voidmain()

init();

//初始化子函数

while

(1)

keyscan();

//-------中断服务子程序-------------

voidtimer0()interrupt1

count++;

if(count==20)

count=0;

miao++;

if(miao==60)

miao=0;

fen++;

if(fen==60)

fen=0;

shi++;

if(shi==24)

week=1;

{

day=1;

month++;

if(month==13)

{

month=1;

year++;

if(year==100)

{

year=0;

}

write_nyr(3,year);

}

write_nyr(6,month);

}

write_sfm(4,shi);

write_sfm(7,fen);

write_sfm(10,miao);

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

当前位置:首页 > 初中教育 > 语文

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

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