时钟计时器的设计单片机原理及应用课程设计 精品.docx

上传人:b****5 文档编号:6693999 上传时间:2023-01-09 格式:DOCX 页数:19 大小:188.68KB
下载 相关 举报
时钟计时器的设计单片机原理及应用课程设计 精品.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

时钟计时器的设计单片机原理及应用课程设计精品

湖南人文科技学院

课程设计报告

课程名称:

单片机原理及应用课程设计

 

设计题目:

时钟计时器的设计

系别:

通信与控制工程系

专业:

班级:

学生姓名:

学号:

起止日期:

2012年12月23日~2012年12月30日

指导教师:

教研室主任:

指导教师评语:

 

指导教师签名:

年月日

成绩评定

项目

权重

成绩

1、设计过程中出勤、学习态度等方面

0.2

2、课程设计质量与答辩

0.5

3、设计报告书写及图纸规范程度

0.3

总成绩

教研室审核意见:

 

教研室主任签字:

年月日

教学系审核意见:

 

主任签字:

年月日

摘要

时间计时器以单片机为核心,由计时器,综合控制器等组成。

系统采用模块化设计,主要分为计时显示模块和按键控制模块。

每个模块的程序结构简单,任务明确,易于编写、调试和修改。

编程后利用Keil软件来进行编译,在生成HEX文件装入芯片中。

本设计中系统硬件电路主要是由以下几个部分组成:

单片机AT89C52、振荡电路、显示电路和按键开关。

该系统具有60S内准确计时和及时清零的功能,基于单片机设计的时间计时器因为体积小,成本低廉等优点,被广泛用于我们的日常生活、工作当中。

关键词:

电子时钟、单片机、高精度

 

目录

设计要求2

1方案论证与对比2

1.1方案一2

1.2方案二2

1.3方案对比与选择3

2系统硬件设计4

2.1设计核心单元(AT89C52)4

2.2程序下载单元4

2.3数码管显示单元5

2.4复位单元6

4系统软件设计7

5系统调试8

6详细仪器清单9

7总结与致谢10

参考文献11

附录一:

时间计时器电路PCB原理图12

附录二:

USB下载模块电路PCB原理图13

附录三:

部分软件代码14

时间计时器的设计

设计要求

功能:

时钟计时器要求用单片机及6位LED数码显示时、分、秒,以24小时计时方式运行,能整点提醒(蜂鸣),使用按键开关可实现时、分调整,秒表/时钟功能转换,定时设定提醒的功能。

学习、了解单片机相关指令在各方面的应用,学习、了解单片机相关指令在各方面的应用,让我们学到更多关于单片机方面的知识。

学习更多关于单片机方面的知识。

1方案论证与对比

1.1方案一

采用专用集成时钟芯片DS1302实时时钟日历芯片完成时钟/日历的计时。

以AT89C52芯片作为核心。

这种实现的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易原理框图如图1所示:

图1方案一系统方框图

该方案因为采用时钟芯片DS1302来定时,导致生产成本偏高的缺点。

1.2方案二

电子时钟由AT89C52,八段数码管等构成,采用晶振电路作为驱动电路,由AT89C52内部定时器程序程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。

因为是改用AT89C52内部定时器定时,没有外加专用计时芯片,降低了生产成本,提高了推广的可能性。

而电路中五个控制键拥有多种不同的功能,模式按键,可以实现数码管显示不同信息的功能,达到日历和时间切换的目的;移位按键,达到在时间调节模式下,改变数码管被选中的位;加减按键,则可以通过按键实现分钟的累加,每按一次数码管被选中位显示值加减变化一次则可实现显示数值的调节。

电路图如图2所示。

图2方案二系统方框图

1.3方案对比与选择

以上二个方案一个方案时间准确性搞,程序简单。

但成本偏高。

而方案二直接使用核心芯片AT89C52的内部资源定时器来,不能保证长时间下的时间准确性。

但降低了成本。

我们进过讨论最终选择方案二。

选择低成本的,适用于短时间内的时间显示和时间定时。

 

2系统硬件设计

2.1程序下载单元

单片机普遍采用MAX232串口下载程序,这次我们采用另外一种下载方式,USB下载方式。

原理图如图4所示:

图4下载单元PL-2303原理图

2.2数码管显示单元

所谓数码管就是为数码管显示提供的各段状态组合,即字形代码。

八段数码管的段码为八位,用一个字节即可表示。

在段码字节中代码位与各段发光二极管的对应关系表1。

表1段码字节代码位与发光二极管的关系

段码

D7

D6

D5

D4

D3

D2

D1

D0

段名

dp

g

f

e

d

c

b

a

段码的值与数码管公共引脚的接法有关。

以八段数码管为例,显示十六进制的段码值如表2。

表2十六进制段码表

数字

共阳极段码

共阴极段码

数字

共阳极段码

共阴极段码

0

C0H

3FH

9

90H

6FH

1

F9H

06H

A

88H

77H

2

A4H

5BH

B

83H

7CH

3

B0H

4FH

C

C6H

39H

4

99H

66H

D

A1H

5EH

5

92H

6DH

E

86H

79H

6

82H

7DH

F

8EH

71H

7

F8H

07H

FFH

00H

8

80H

7FH

并排使用的多位数码管称为LED显示器。

LED显示器多采用动态显示方式,全部数码管共用一套段码驱动电路,各位数码管的同段引脚短接后接到相应段码的驱动线上。

显示时通过位控制信号采用扫描的方法逐位地循环点亮各位数码管。

动态显示虽然在任何时刻只有一位数码管被点亮,但是由于人眼具有的视觉残留效应,看起来与全部数码管持续点亮的效果完全一样。

由于单片机的驱动电流较小,无法正常驱动8位数码管,因此我们在单片机与数码管中间加上74LS573用于驱动数码管的正常显示。

电路如图5示:

图5数码管显示电路

2.4复位单元

当STC89C52单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。

如果RST持续为高电平,单片机就处于循环复位状态。

根据应用的要求,复位操作通常有两种基本形式:

上电复位和上电或开关复位。

上电复位要求接通电源后,自动实现复位操作。

上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。

上电后,由于电容的充电和反相门的作用,使RST持续一段时间的高电平。

当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。

电路如图6示:

图6复位单元电路

4系统软件设计

1.程序流程如图7所示:

我的程序中用了个定时器中断,还是用了独立键盘调时,蜂鸣器闹铃及提醒。

图7软件系统流程图

2.中断服务程序模块

我的程序中用了个定时器中断,所以有中断服务程序,是为了使秒自加而使用定时器中断,定时50MS循环20次到一秒以后,向CPU申请中断,使秒自加1。

图8中断服务程序流程图

3.加1子程序流程框图

加1子程序流程框图如图9所示:

图9加1子程序流程图

5系统调试

1.设计核心单元(AT89C52)

AT89C52单片机的40个引脚大致可分为4类:

电源、时钟、控制和I/O引脚。

⒈电源:

⑴VCC-芯片电源,接+5V;⑵VSS-接地端;

⒉时钟:

XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。

⒊控制线:

控制线共有4根,⑴ALE/PROG:

地址锁存允许/片内EPROM编程脉冲①ALE功能:

用来锁存P0口送出的低8位地址②PROG功能:

片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。

⑵PSEN:

外ROM读选通信号。

⑶RST/VPD:

复位/备用电源。

①RST(Reset)功能:

复位信号输入端。

②VPD功能:

在Vcc掉电情况下,接备用电源。

⑷EA/Vpp:

内外ROM选择/片内EPROM编程电源。

①EA功能:

内外ROM选择端。

②Vpp功能:

片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。

⒋I/O线80C51共有4个8位并行I/O端口:

P0、P1、P2、P3口,共32个引脚。

P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。

AT89C52封装如图3所示:

图3AT89C52

2.在PROTEUS中设计硬件

1、PROTEUS软件使用过程如下:

1)选择元器件

2)放置元器件

3)连线

4)添加程序

5)运行仿真

2、在WAVE中编写程序,编译、连接形成HEX文件。

3、在PROTEUS中把HEX文件加载到单片机芯片上。

即protues原理图中。

4、运行仿真看结果如图8所示:

图8protues仿真结果

6详细仪器清单

表格3仪器清单

仪器名称

数量

STC89C52

1

4位共阴数码管

2

蜂鸣器

1

贴片按键

5

圆排母

40P

74LS574

1

7总结与致谢

短暂几天的单片机课程设计结束了,从这次课程设计中学到了很多很多东西。

例如:

如何运用protelDXP2004制作双面板。

大型程序的编写等。

在这次课程设计中遇到很多困难,程序的编写无从下手,到最后还是借鉴别人的程序来完成的。

其次懂的了编写复杂程序该如何下手。

在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的。

课程设计结束了,但是从中学到的知识会让我受益终身,因为无论以后从不从事单片机工作,也许毕业设计会用到呢。

在此我特别感激谢老师和实验室的各位同学,没有你们的帮助,我们不会这么顺利完成本次设计。

参考文献

[1]候伯亨。

《VHDL硬件描述语言与数字逻辑电路设计》。

西安:

西安电子科技大学出版社,1999

[2]王天曦,李洪儒。

《电子技术工艺基础》编著。

北京:

清华大学出版社,2000

[3]李广弟,朱月秀,王秀山。

《单片机基础》。

北京:

北京航空航天大学出版社,2001

[4]赵曙光,郭万有,杨颂华。

《可编程逻辑器件,原理,开发与应用》。

西安:

西安电子科技大学,2000.8

[5]朱定华,戴汝平.单片微机原理与应用.(M)北京:

清华大学出版社,2003

附录一:

时间计时器电路PCB原理图

附录二:

USB下载模块电路PCB原理图

附录三:

部分软件代码

#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#defineuintunsignedint

#defineucharunsignedchar

voiddelay(unsignedint);//延时

voiddisplay(uchar);//显示

voidclock();//闹钟

voidTIAOSHI(void);//调时

voidbuzzer(ucharflag,ucharstyle,uchartimes);//蜂鸣器

voidInitTIMER0(void);//中断初始化

voidKeyScan(void);//按键扫描

voidKeySet(void);//按键控制

charSelect=1;

charRARLTIME1=0,RARLTIME2=0,RARLTIME3=0,RARLTIME4=0,RARLTIME5=0;

charstopmiao=0;

charnum2=0;

Charnum1=0;

Charflagzhuan=0;

bitALARMFLAG=0;

bitflag_1s=0;

sbitBEEP=P3^3;

sbitKEY1=P0^0;

sbitKEY2=P0^1;

sbitKEY3=P0^2;

sbitKEY4=P0^3;

unsignedcodeDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段码控制

unsignedcodedispbitw[8]={0x7F,0xbF,0xdF,0xef,0xf7,0xfb,0xfd,0xfe};//位选控制查表的方法控制

ucharLedOut[8],num=0,k=0,zz;

miao=50,fen=59,shi=23,day=29,month=2,week=1,year=2012,shi1,

fen1=1,miao1,DelayCNT,uKey1Counter=0,Stopwatch_Cnt=0;DelayCNT1=0;

//变量定义

voidmain(void)

{

InitTIMER0();//初始化定时器0

clock();

KeySet();

TIAOSHI();

buzzer((!

miao)&&(!

fen),0,1);//整点提醒

buzzer(ALARMFLAG,0,2);//闹钟

display(Select);}

/////////////数码显示

voiddisplay(ucharmode)

{

inti,n;

if(mode==5)//秒表

{LedOut[0]=0x72;//r

LedOut[1]=0x3e;//u

LedOut[2]=0x37|0x80;//n

LedOut[3]=Disp_Tab[Stopwatch_Cnt/600/10];

LedOut[4]=Disp_Tab[Stopwatch_Cnt/600%10];//分

LedOut[5]=Disp_Tab[Stopwatch_Cnt%600/100];

LedOut[6]=Disp_Tab[Stopwatch_Cnt%600%100/10]|0x80;//秒

LedOut[7]=Disp_Tab[Stopwatch_Cnt%10];

}

elseif(mode==4)//闹钟

{

LedOut[0]=0x37;//n

LedOut[1]=0x77;//a

LedOut[2]=0x3f|0x80;//o

LedOut[3]=Disp_Tab[shi1/10];

LedOut[4]=Disp_Tab[shi1%10];

LedOut[5]=Disp_Tab[10];

LedOut[6]=Disp_Tab[fen1/10];

LedOut[7]=Disp_Tab[fen1%10];

}

elseif(mode==3)//年

{LedOut[0]=0x6e;//y

LedOut[1]=0x79;//e

LedOut[2]=0x77;//a

LedOut[3]=0x72|0x80;//r

LedOut[4]=Disp_Tab[year/1000];

LedOut[5]=Disp_Tab[year%1000/100];

LedOut[6]=Disp_Tab[year%100/10];

LedOut[7]=Disp_Tab[year%10];

}

elseif(mode==2)//周月日

{

LedOut[0]=Disp_Tab[week/10];

LedOut[1]=Disp_Tab[week%10];

LedOut[2]=Disp_Tab[10];

LedOut[3]=Disp_Tab[month/10];

LedOut[4]=Disp_Tab[month%10];

LedOut[5]=Disp_Tab[10];

LedOut[6]=Disp_Tab[day/10];

LedOut[7]=Disp_Tab[day%10];

}

else

if(mode==1)//时分秒

{

LedOut[0]=Disp_Tab[shi/10];

LedOut[1]=Disp_Tab[shi%10];

LedOut[2]=Disp_Tab[10];

LedOut[3]=Disp_Tab[fen/10];

LedOut[4]=Disp_Tab[fen%10];

LedOut[5]=Disp_Tab[10];

LedOut[6]=Disp_Tab[miao/10];

LedOut[7]=Disp_Tab[miao%10];

}

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

{

switch(Select)

{case1:

switch(RARLTIME1)

{

case1:

n=6;break;

case2:

n=3;break;

case3:

n=0;break;

default:

break;

}

if(RARLTIME1!

=0)

if((n==i)||(n+1==i))

{if(flag_1s==1)P1=0x00;

elseP1=LedOut[i];

}

elseP1=LedOut[i];

if(RARLTIME1==0)P1=LedOut[i];break;

case2:

switch(RARLTIME2)

{

case1:

n=6;break;

case2:

n=3;break;

case3:

n=0;break;

default:

break;

}

if(RARLTIME2!

=0)

if((n==i)||(n+1==i))

{if(flag_1s==1)P1=0x00;

elseP1=LedOut[i];

}

elseP1=LedOut[i];

if(RARLTIME2==0)P1=LedOut[i];break;

case3:

if(RARLTIME3==1)

{n=6;}

if(RARLTIME3!

=0)

if((n==i)||(n+1==i))

{if(flag_1s==1)P1=0x00;

elseP1=LedOut[i];

}

elseP1=LedOut[i];

if(RARLTIME3==0)P1=LedOut[i];break;

case4:

if(RARLTIME4==1)

n=6;

if(RARLTIME4==2)

n=3;

if(RARLTIME4!

=0)

if((n==i)||(n+1==i))

{if(flag_1s==1)P1=0x00;

elseP1=LedOut[i];

}

elseP1=LedOut[i];

if(RARLTIME4==0)P1=LedOut[i];break;

case5:

P1=LedOut[i];break;

default:

break;

}

P2=dispbitw[i];

delay(110);

P2=0xff;

}

}

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

当前位置:首页 > 医药卫生 > 基础医学

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

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