单片机电子钟程序设计.docx

上传人:b****7 文档编号:10910424 上传时间:2023-02-23 格式:DOCX 页数:19 大小:169.46KB
下载 相关 举报
单片机电子钟程序设计.docx_第1页
第1页 / 共19页
单片机电子钟程序设计.docx_第2页
第2页 / 共19页
单片机电子钟程序设计.docx_第3页
第3页 / 共19页
单片机电子钟程序设计.docx_第4页
第4页 / 共19页
单片机电子钟程序设计.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机电子钟程序设计.docx

《单片机电子钟程序设计.docx》由会员分享,可在线阅读,更多相关《单片机电子钟程序设计.docx(19页珍藏版)》请在冰豆网上搜索。

单片机电子钟程序设计.docx

单片机电子钟程序设计

目录

一、引言3

1.1课题的背景及目的3

1.2课题的内容要求及研究方法3

二、课题设计4

1、基本原理4

2、原理框图4

3、硬件电路原理图5

3.1AT89C52单片机5

3.2液晶显示器LCD5

3.3键盘控制模块6

3.4直流稳压电源部分6

4.软件设计6

4.1流程图6

4.2代码附录7

5.调试过程10

5.1硬件调试11

5.2软件调试数据与数据分析12

三、总结个人心得体会13

一、引言

1.1课题的背景及目的

随着计算机科学与技术的飞速发展,计算机的应用已经渗透到国民经济与人们生活的各个角落,正在日益改变着传统的人类工作方式和生活方式,而单片机技术又作为计算机技术中的一个独立分支,有着性价比高,集成度高,体积小,可靠性高,控制功能强大,低功耗,低电压,便于生产,便于携带等特点,所以得到越来越广泛的应用,特别是在工业控制和仪表仪器智能化中起极其重要的作用.本文利用单片机强大的控制功能和内部定时器重要部件,设计了一款自行对时间进行调整以及把时、分、秒用LCD显示的电子钟。

电子钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。

因此,我们此次设计与制做数字钟就是为了了解数字钟的原理,从而学会制作数字钟.而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及实用方法.且由于数字钟包括组合逻辑电路和时叙电路.通过它可以进一步学习与掌握各种组合逻辑电路与时序电路的原理与使用方法

1.2课题的内容要求及研究方法

①时间以24小时为一个周期;

②显示时、分、秒;

③具有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;

本文先按照设计的一般步骤,先选定用单片机实现的方案,了解设计要求,再分别从硬件系统设计和软件系统设计两个宏观方面着手.然后大量阅读相关资料,硬件方面,熟练单片机工作基本原理,查出相关元器件的参数,八个八段数码管,继电器等性能.然后画出系统框图和单元电路原理图,再对系统工作原理按照单元电路作简单的说明。

软件方面,熟悉编程语言,查找相关子程序.熟悉使用KeiluVision2开发软件及STC-ISP下载软件.把原器件按电路原理图安装.最后再对硬件和软件系统进行调试和仿真。

课题的内容是要求设计一款电子钟,而且要求计时准确,显示直观,清晰,时能够精确到秒。

最后设计出来的产品,要求电路简洁,稳定性好。

 

二、课题设计

1、基本原理

本设计基于单片机技术原理,以单片机芯片AT89C52作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个多功能数字时钟系统。

单片机扩展的LCD显示器用来显示秒、分、时计数单元中的值。

整个设计包括两大部分:

硬件部分和软件部分,以单片机为核心,配以一定的外围电路和软件。

硬件是整个系统的基础,软件部分则要合理、充分地支持和使用系统的硬件,从而完成系统所要完成的任务。

该时钟系统主要由时钟模块、液晶显示模块、键盘控制模块以及信号提示模块组成。

能够准确显示时间(显示格式为时时:

分分:

秒秒,24小时制),可随时进行时间调整。

设计以硬件软件化为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。

单片机在这种情况下诞生了基于单片机电子时钟。

2、原理框图

 

3、硬件电路原理图

硬件模块功能介绍

3.1AT89C52单片机

AT89C52提供以下标准功能:

8k字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路[2]。

同时,AT89C52可降至0HZ的静态逻辑操作,并支持两种软件可选的节电工作模式。

空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。

掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。

3.2液晶显示器LCD

液晶显示器简称是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。

其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用系统中有着日益广泛的应用。

1602芯片:

主要用于显示时间和定时时间。

1602芯片由点阵字符液晶显示器件和专用的行、列驱动器、控制及必要的链接件、结构件组装而成,可以显示数字和西文字符,但不能显示图形,已经可以满足本次设计的需要。

1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。

3.3键盘控制模块

按键中有一个复位键及定时键、调时键加一键和减一键,一个按键接在复位电路上,另外四个按键接在P0——P4口,低电平表示有按钮按下;按钮没有接防抖电路,需要设计软件防抖。

1、定时。

按下定时键后可以开始定时,过程如下:

定时---〉小时加/减---〉按定时---分钟加/减---按定时。

2、调时。

按下调时键后可以调时,过程如下:

调时---年加/减---调时--月加/减---调时---日加/减---调时---时加/减---调时---分加/减---调时---秒加/减---调时。

3.4直流稳压电源部分

直流稳压电源是给电子设备提供稳定直流电压的电子电路。

这次电路需要的是+5V直流电源。

4.软件设计

4.1流程图

4.3代码附录

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineBUSY0x80//lcd忙检测标志

#defineDATAPORTP0//定义P0口为LCD通讯端口

sbitlight=P1^3;

sbitLCM_RS=P2^6;//数据/命令

sbitLCM_RW=P3^6;//读/写选择

sbitLCM_EN=P2^5;

sbitADJ_key=P3^2;

sbitINC_key=P3^3;

sbitDEC_key=P3^5;

ucharsecond;//定义并初始化时钟变量

ucharminite;

ucharhour;

ucharmstcnt=0;

uchart,set=0;

ucharcodestr0[]={"WenXianLiangXuJ"};

ucharcodestr1[]={"TIME:

:

:

"};

voiddelay_LCM(uint);//LCD延时子程序

voidinitLCM(void);//LCD初始化子程序

voidlcd_wait(void);//LCD检测忙子程序

voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数

voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数

voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数

voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数

voidinit_timer0(void);//定时器初始化

voiddisplayfun1(void);

voiddisplayfun2(void);

voiddisplayfun3(void);

voidkeyscan(void);//键盘扫描子程序

voidset_adj(void);

voidinc_key(void);

voiddec_key(void);

/*********延时K*1ms,12.000mhz**********/

voiddelay_LCM(uintk)

{uinti,j;

for(i=0;i

{for(j=0;j<60;j++){;}}

}

/**********写指令到LCM子函数************/

voidWriteCommandLCM(ucharWCLCM,ucharBusyC)

{if(BusyC)lcd_wait();

DATAPORT=WCLCM;

LCM_RS=0;//选中指令寄存器

LCM_RW=0;//写模式

LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}

/**********写数据到LCM子函数************/

voidWriteDataLCM(ucharWDLCM)

{lcd_wait();//检测忙信号

DATAPORT=WDLCM;

LCM_RS=1;//选中数据寄存器

LCM_RW=0;//写模式

LCM_EN=1;_nop_();_nop_();_nop_();LCM_EN=0;}

/***********lcm内部等待函数*************/

voidlcd_wait(void)

{DATAPORT=0xff;LCM_EN=1;LCM_RS=0;LCM_RW=1;_nop_();

while(DATAPORT&BUSY)

{LCM_EN=0;_nop_();_nop_();LCM_EN=1;_nop_();_nop_();}

LCM_EN=0;}

/**********LCM初始化子函数***********/

voidinitLCM()

{DATAPORT=0;delay_LCM(15);WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号

delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,1);//8bit数据传送,2行显示,5*7字型,检测忙信号

WriteCommandLCM(0x08,1);//关闭显示,检测忙信号

WriteCommandLCM(0x01,1);//清屏,检测忙信号

WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号

WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号

}

/****************显示指定坐标的一个字符子函数*************/

voidDisplayOneChar(ucharX,ucharY,ucharDData)

{Y&=1;X&=15;if(Y)X|=0x40;//若y为1(显示第二行),地址码+0X40

X|=0x80;//指令码为地址码+0X80

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

/***********显示指定坐标的一串字符子函数***********/

voidDisplayListChar(ucharX,ucharY,ucharcode*DData)

{ucharListLength=0;

Y&=0x01;

X&=0x0f;

while(X<16)

{DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;X++;

}}

/***************液晶显示子函数1正常显示*****************/

voiddisplayfun1(void)

{

WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(7,1,hour/10+0x30);//液晶上显示小时

DisplayOneChar(8,1,hour%10+0x30);

DisplayOneChar(10,1,minite/10+0x30);//液晶上显示分

DisplayOneChar(11,1,minite%10+0x30);

DisplayOneChar(13,1,second/10+0x30);//液晶上显示秒

DisplayOneChar(14,1,second%10+0x30);

}

/************液晶显示子函数2***************/

voiddisplayfun3(void)

{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(7,1,hour/10+0x30);

DisplayOneChar(8,1,hour%10+0x30);

DisplayOneChar(13,1,second/10+0x30);

DisplayOneChar(14,1,second%10+0x30);

WriteCommandLCM(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号

DisplayOneChar(10,1,minite/10+0x30);

DisplayOneChar(11,1,minite%10+0x30);

}

/**************液晶显示子函数3*****************/

voiddisplayfun2(void)

{WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示,不闪烁,检测忙信号

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(10,1,minite/10+0x30);

DisplayOneChar(11,1,minite%10+0x30);

DisplayOneChar(13,1,second/10+0x30);

DisplayOneChar(14,1,second%10+0x30);

WriteCommandLCM(0x0f,1);//显示屏打开,光标显示,闪烁,检测忙信号

DisplayOneChar(7,1,hour/10+0x30);

DisplayOneChar(8,1,hour%10+0x30);

}

/**************键盘扫描子函数******************/

voidkeyscan(void)

{if(ADJ_key==0)

{delay_LCM(5);if(ADJ_key==0)

{while(!

ADJ_key);set_adj();

}

}

if(INC_key==0)

{delay_LCM(5);

if(INC_key==0)

{while(!

INC_key);inc_key();}

}

if(DEC_key==0)

{delay_LCM(5);

if(DEC_key==0)

{while(!

DEC_key);dec_key();}

}

}

/**************设定工作模式子函数****************/

voidset_adj(void)

{delay_LCM(100);set++;

if(set>2)set=0;

}

/****************按键加法子函数******************/

voidinc_key(void)

{delay_LCM(150);

if(set==1)

{hour++;

if(hour>=23)hour=23;

}

else

if(set==2)

{minite++;if(minite>=59)minite=59;}

else

displayfun1();

}

/****************按键减法子函数*****************/

voiddec_key(void)

{

delay_LCM(150);

if(set==1)

{hour--;if(hour<=0)hour=0;}

else

if(set==2)

{minite--;if(minite<=0)minite=0;}

else

displayfun1();

}

/***************定时器t0初始化*******************/

voidinit_timer0(void)

{TMOD=0x01;//time0为定时器,方式1

TH0=0x3c;//预置计数初值

TL0=0xb0;EA=1;ET0=1;TR0=1;

}

/***********定时器t0中断子函数**************/

voidtimer0(void)interrupt1using0//定时器0方式1,50ms中断一次

{

TH0=0x3c;TL0=0xb0;mstcnt++;

if(mstcnt>=20)

{second++;mstcnt=0;}

if(second>=60)

{minite++;second=0;}

if(minite>=60)

{

hour++;minite=0;light=0;delay_LCM(200);light=1;

}

if(hour>=24)

{hour=0;}

keyscan();//按键扫描

}

/***********themainfuntion*************/

voidmain(void)

{

P1=0xff;//初始化p1口,全设为1

delay_LCM(500);//延时500ms启动

initLCM();//LCD初始化

init_timer0();//时钟定时器0初始化

DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

while

(1)

{keyscan();//按键扫描

switch(set)//LCD根据工作模式显示

{

case0:

displayfun1();delay_LCM(1000);//正常工作显示

break;

case1:

displayfun2();delay_LCM(1000);//调整分显示

break;

case2:

displayfun3();delay_LCM(1000);//调整时显示

break;

default:

break;

}

}

}

5.调试过程

调试的主要过程包括硬件调试和软件调试,其中软件调试,也即程序编译与仿真过程处于本次设计调试过程的核心环节。

由于本设计已经制作出液晶显示电子钟,所以硬件调试也很重要。

两种调试过程并非孤立或者分开的,而是紧密相关。

在此我们用到的开发工具是仿真器。

5.1硬件调试

完成仿真器软件仿真后,就要连接上硬件也即液晶显示电子钟成品板进行硬件调试。

将仿真器通过串行电缆连接计算机上,将仿真头接到仿真器,检查接线是否有误,确信没有接错后,接上电源,打开仿真器的电源开关。

再进行仿真器和通信设置。

仿真器和仿真头设置正确,并且硬件连接没有错误,出现“硬件仿真”的对话框,并显示仿真器、仿真头的型号及仿真器的序列号。

表明仿真器初始化正确。

硬件调试很重要也很麻烦,由于本次设计硬件非PCB制板,而是手工焊板,焊点质量、布线是否合理等对系统的影响比较大,这无疑增加硬件调试的难度。

由于此前没有很多的练习,本次设计我所制作的液晶显示电子钟在质量工艺上很难达到满意程度,不过在调试中还算稳定,基本功能都能较稳定地实现。

5.2软件调试

系统仿真分析电路原理图在ISIS里设计完成,并将系统软件编译成.Hex文件,再进行电子时钟的系统虚拟仿真。

(1)在ISIS的原理图中,右键单击AT89C51将其选中,然后单击左键打开AT89C51的EditComponent对话框,如下图所示。

图EditComponent对话框

(2)选择相应的.Hex文件,再在ProteusISIS编辑窗口的File菜单中选择SaveDesign选项,保存设计,生成.DSN文件。

5.3测试数据与数据分析

在ProteusISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如下图所示。

实现功能的具体方法:

当进入调整功能时,按第一个键K1进行减运算,按第二个键K2进行加运算。

按下第三个键K3,实现日期\时间调整及\定时功能,等数字闪烁后,按一二键进行加减,从而可以进行具体日期时间调整。

按下第四个键K4,可以进行时间\日期切换,将显示时间或日期,采用24小时制。

时间显示格式为:

时-分-秒;日期显示格式为:

日-月-年。

具有显示时间和日期的功能。

图Proteus系统仿真结果

三、总结:

个人心得体会

通过这次对电子钟的设计与制作,让我了解了什么是嵌入式系统开发,虽然这次的实习做的电子钟比其他同学做的较简单,但是也给将来进入嵌入式系统开发有了一个起点的基础。

在这次实习的过程,刚开始的时候,真的有点不知所措,因为刚刚学习完单片机,以及微机原理课程,接着就立即开始了这个实习了。

幸好有三个星期的时间来准备。

画电路原理图,一开始就觉得有点烦,因为那个软件有很多基本操作都不知道,做起来非常的费时又费力,幸好一个组里可以有两个成员,我的组员就是我的得力助手了,我解决不了的问题,他就去跑腿求问其他同学或者老师,反正有了解决办法就一起动手解决。

这个电子钟的软件程序都是使用C语言编写的,毕竟使用汇编对于我们来说难度都是比较大啊。

这次嵌入式电子钟课程设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。

它不仅加深了我对单片机技术课程的理解,还让我感受到了电子钟设计的乐趣。

在这次设计中,虽然我比较怕麻烦,但是还是跟组员一起坚持到底,反复设计、绘图与修改,就是希望能把这次课程设计做好。

因此对我来说,这次课程设计是非常有意义的。

参考文献:

<<80C51单片机原理与应用技术>>吴炳胜编著

<<微型计算机原

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

当前位置:首页 > 解决方案 > 营销活动策划

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

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