单片机数字电子钟.docx

上传人:b****2 文档编号:23038107 上传时间:2023-04-30 格式:DOCX 页数:19 大小:1.43MB
下载 相关 举报
单片机数字电子钟.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

单片机数字电子钟

 

1课程设计目的与要求

 

1.1设计目的

了解数字钟的原理,从而学会制作数字钟。

通过数字钟的制作进一步的了解在制作中用到的各种中小规模集成电路的作用及使用方法。

学习与掌握各种组合逻辑电路与时序电路的原理与使用方法。

学习并掌握单片机的使用和编程方法。

1.2设计要求

可调整时间的数字时钟。

只显示分、秒,采用动态显示模式。

通过按键可对时钟进行选位和加减的时间调整,调整时选中位进行闪烁。

可实现时间暂停和重新启动。

计时精确。

 

2硬件设计

 

2.1方案设计

数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。

标准的频率时间信号必须做到准确稳定,通常使用石英晶体振荡电路构成数字钟。

本次课程设计的内容是设计一个数字钟,由单片机通过编辑的程序控制电路,实现显示秒、分的一个电子时钟。

并且可以通过按键选择调整时钟时间,以及暂停的功能。

电路原理图如图1

 

 

图1原理图

2.2电路设计

本次设计中使用的主要元器件有AT89S52、三极管、数码管、晶体振荡器、按键、LED指示灯等。

本次数字钟电路用到的模块主要由电源电路、单片机控制电路、晶体振荡电路、显示电路等组成。

(1)电源电路采用外接5V直流电源驱动其运行。

电源电路才用一个开关来打开\关闭电源。

另外时用一个发光二极管来指示电源的通断。

(2)晶体振荡电路电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了震荡器的功能。

由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。

(3)单片机控制电路数字钟的核心原件为AT89S52,配合程序对整个电路进行控制。

P1口输出时钟显示的数字,P0口对数码管进行片选,P0口时用需接上拉电阻和三极管,P2口接受按键信号,通过中断来实现对数字钟的时间的调整。

复位按键可对单片机进行复位。

(4)显示电路由数码管、电阻和三极管组成。

(5)复位电路为手动复位,由一个开关,电解电容,电阻组成。

(6)下载口电路下载模块:

ISP下载功能,是通过单片机的SPI口实现的。

89S系列的单片机都带ISP下载功能

各种功能电路相互结合组成实现设计功能要求的数字钟电路,配合根据电路编写的程序以实现设计要求的全部功能。

2.3原理图及PCB图

使用protel绘制全部电路的原理图和PCB图,网络标号的使用可以让图看起来简洁清楚,方便绘图人的操作。

详图请见附录。

2.4制板

根据原理图在万用版上使用导线将各种器件连接成电路板。

2.5系统调试

使用万用表对制作好的电路板进行电气检查,确保没个引脚的连接都符合原理图的设计,没有出现虚焊、漏焊或者短路的情况。

通电状态下检查各器件的工作电压是否正常。

 

3软件设计

 

3.1流程图

通过单片机来实现数字钟的功能。

流程图2

图2数字钟总原理图

定时器中断时,先检测50ms脉冲是否计数20次,计数到20次,秒就加1;如果没计满60,就返回显示时间,如果秒计满60秒,就清零秒,给分加1;检测分钟,如果没计满60,继续计时,返回显示时间,如果满60,就清零分钟,给小时加1;检测小时,如果没计满24,就继续计时,返回显示时间,如果计满24,就清零,给秒加1,显示时间。

时+1=24?

3.2程序清单

根据原理图,写出相应的程序,程序清单详见附录A

 

4设计结果与调试

 

4.1软件调试

软件为老师所提供提供,其原理在上面以作说明。

软件部分是先参考书上的例子,然后自己根据硬件电路写程序,本次编程采用的是C语言。

刚刚开始,编写不会一次性通过,经过仔细分析修改最后编译成功。

4.2硬件调试

把程序烧入单片机,上电后,按下开始\停止按键,时钟便从000000开始每秒加1计时,再次按下开始\停止按键,时间暂停,进入调时状态。

按秒按键,秒个位闪烁并加1;按下调分按键,分个为闪烁并加1;按下调时按键,分个为闪烁并加1。

当再次按下开始\停止按键时,时钟又运行。

当按下复位键时,时间显示消失。

经以上调试所要求的功能均以实现。

4.3误差分析

在调试过程中,最初几次数码管显示有一定的问题,但最后发现是位控线和段控线的焊接存在问题。

在运行中存在一定的误差,误差产生有三种可能,首先是采用的计时方案是软件计时的,计时优势利用中断来实现。

而你开启定时器和开启LED灯顺序上是有先后的,这个过程需时间的,所以就产生了一定的误差,当然这个误差是避免不了的,其次还有硬件系统也有一定的影响。

第三,设计用到12MHz的晶振,计算是满20次为一秒钟,但实际会慢很多。

4.4教学建议

最开始学习单片机时,是对单片机不感兴趣的,上课也是一直只是抱着完成任务的心态,直到后来,上了第一次单片机实验课,王老师通过各种问题,让我们巩固上课所学知识,通过实际解决问题,才慢慢发现单片机是一门很有趣的课程,并且每当你解决一个问题时,你会充满成就感。

希望王老师再接再厉,对我们之后的学弟学妹,也以同样的心态对待。

相信,他们也会像我们一样,痛并快乐着!

 

结束语

 

这个学期即将结束,从刚开学,老师就说我们的课程设计从第一节课开始。

在这个学期里,我学到了很多,对单片机有了更深刻的认识,也对自己的不足有了清醒的认识。

虽然我在上课时,觉得理论很容易,但是当具体写程序时,发现还是有各种各样的问题出现。

开学时画PCB图,一点都不熟练,出了不少错误。

在焊接过程中,也出现了不少虚焊的情况。

通过这次的课程设计,使我注意到了以上几点,应在以后的学习中加以注意。

通过这次机会不但练习了编程,而且还对AT89S52单片机又加深了一些认识,练习了定时器,中断等。

课程设计很快就这样过去了。

我们每个人都学到了很多东西,同时也感觉到了自己的不足,它将对我们以后参加工作有很大的帮助,有利于我们以后走上工作岗位。

 

致谢

 

在整个课程射界的过程中,同学给予的帮助很重要,他们是我成功的关键,尤其在焊接时,一个人很容易疏忽大意,而我们一起时,轻松愉快也不容易出问题,再就是遇到困难时,首先自己会仔细考虑,实在想不出来,我们会在一起思考找问题,每次问题的解决都会充满成就感。

在设计过程中,老师给予了我们很多帮助,其实在每次单片机实验的时候,老师就是通过各种各样的问题,来让我们更加好的学习单片机。

没有单片机实验带给我们扎实的基础,这次课程设计也不会这么顺利,取得成功。

非常感谢老师的帮助!

 

参考文献

1、马忠梅,单片机的C语言Windows环境编程宝典[M],北京:

北京航空航填天大学出版社,2003.6;   

1,MaZhongmei,microcontrollerClanguageWindowsenvironmentprogrammingbook[M],Beijing:

BeijingUniversityofAeronauticsaviationdaysPress,2003.6;

2、李光飞,单片机C程序设计指导[M],北京:

北京航空航天大学出版社,2003.01;

2,LiGuangfei,microcontrollerCprogramdesigntheguidance[M],Beijing:

BeijingUniversityofAeronauticsandAstronauticsPress,2003.01;

3、李光飞,单片机课程设计实例指导[M],北京:

北京航空航天大学出版社,2004.9。

3,LiGuangfei,SCMcurriculumdesignexamplestoguide[M],Beijing:

BeijingUniversityofAeronauticsandAstronauticsPress,2004.9.

 

附录

 

附录A:

程序清单:

#include

#include/*共阳数码管字型码数组*/

/*0,1,2,3,4,5,6,7,8,9,p.,灭,-*/

charcodedis_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff,0xbf};

/*显示缓冲数组(存放显示信息的字型码的序号)*/

charfind_code[8];

chartime;

sbitp12=P1^2;

/********************************************************/

//函数名:

voidDelayX1ms(uintcount)

//功能:

延时时间为1ms

//调用函数:

//输入参数:

count,1ms计数

//输出参数:

//说明:

总共延时时间为1ms乘以count,crystal=12Mhz

/********************************************************/

#defineucharunsignedchar

#defineuintunsignedint

ucharsec=0,min=0,hour=0;

voidDelayX1ms(uintcount)

{

uintj;

while(count--!

=0)

{

for(j=0;j<80;j++);

}

}

/*显示函数*/

voiddisp()

{

chari,j=0xfe;

chark;

for(i=0;i<8;i++)

{

P2=j;

k=find_code[i];

P0=dis_code[k];

DelayX1ms

(1);

j=_crol_(j,1);

}

}

/************************************************************************

*函数原型:

keychuli();

*功能:

处理与键盘相连的P1口的内容,作为键值。

************************************************************************/

ucharkeychuli()

{

uchark;

k=P1;//P1口内容送K

k=~k;//取反

return(k);//返回键值

}

/************************************************************************

*函数原型:

key();

*功能:

键盘扫描函数,函数返回值即键值。

************************************************************************/

ucharkey()

{

ucharkeyzhi,keyzhii;//键盘按键键值临时存放

keyzhi=keychuli();//调P1口处理函数

if(keyzhi!

=0)//有键动作延时去抖动,否则函数返回

{

disp();

disp();

keyzhi=keychuli();//再次调P1口处理函数

if(keyzhi!

=0)//真正有键按下,取键值并暂存

{

keyzhii=keyzhi;

while(keyzhi!

=0)//判按键是否释放,没有释放延时去抖动等待释放

{

disp();

disp();

keyzhi=keychuli();

}

keyzhi=keyzhii;//按键释放后恢复按键键值

}

}

return(keyzhi);//返回按键键值

}

 

voidINTT0()interrupt1

{

staticucharclick=0;//定时器0定时中断次数

TH0=0x3c;TL0=0xb0;//设置初始值50ms为循环20次为1ms,12MHz

++click;

if(click>=20)//是否到1秒,到1秒,秒加1,否则函数返回

{

click=0;

if(++sec>=60)//加到60秒,秒清0

{

sec=0;

if(++min>=60)//分加1,是否到60分,否则函数返回

{

min=0;//加到60分,分清0

if(++hour>=24)//时加1,是否到24小时,否则函数返回

{

hour=0;//加到24小时,时清0

}

}

}

}

find_code[0]=sec%10;

find_code[1]=sec/10;

find_code[2]=12;

find_code[3]=min%10;

find_code[4]=min/10;

find_code[5]=12;

find_code[6]=hour%10;

find_code[7]=hour/10;//LED显示缓冲区时间值更新

}

voidmain()

{

while

(1)

{

find_code[0]=11;

find_code[1]=11;

find_code[2]=11;

find_code[3]=11;

find_code[4]=11;

find_code[5]=11;

find_code[6]=11;

find_code[7]=10;

disp();

switch(key())

{

case0x01:

TMOD=0x01;//定时器1,工作方式1

TH0=0x3c;

TL0=0xb0;//50ms中断一次

EA=1;

ET0=1;

TR0=1;

while

(1)

{

find_code[0]=0;

find_code[1]=0;

find_code[2]=12;

find_code[3]=0;

find_code[4]=0;

find_code[5]=12;

find_code[6]=0;

find_code[7]=0;

disp();

while

(1)

{mm:

disp();

if(key()==0x01)//进入调整状态

{while

(1)

{

TR0=0;

disp();

switch(key())

{

case0x01:

{TR0=1;gotomm;break;}//进入运行状态

case0x02:

//时调整

{hour++;

if(hour==24)

hour=0;

break;

}

case0x04:

//分调整

{min++;

if(min==60)

min=0;

break;

}

case0x08:

//秒调整

{sec++;

if(sec==60)

sec=0;

break;

}

default:

disp();break;

}

find_code[0]=sec%10;

find_code[1]=sec/10;

find_code[2]=12;

find_code[3]=min%10;

find_code[4]=min/10;

find_code[5]=12;

find_code[6]=hour%10;

find_code[7]=hour/10;

}

}

}

}

default:

disp();break;

}

}

}

 

附录B:

图B1电路原理图

附录C:

图C1布局图

图C2底层

图C3PCB顶层

图C4实物仿真图

 

附录D:

元器件清单:

名称

数量

参数

单片机

1个

AT89S52

共阳数码管

2个

共阳极4位1体

底座

3个

晶振

1个

12MHz

发光二极管

9个

单排插

1个

40PIN

蜂鸣器

1个

按键

9个

排阻

2个

10K

下载口座子

1个

10芯

6脚按键开关

1个

USB电源线加接口

1个

电阻

24个

470Ω

电阻

3个

1K

电阻

1个

200Ω

电解电容

1个

22μf

瓷片电容

2个

33pf

短路帽

3个

PCB板

1块

电源插座

1个

杜邦线

1个

铜柱(带螺母)

4个

三极管

9个

PNP9012

表D1

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

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

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

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