设计基于单片机的课程设计数字电子钟.docx

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

设计基于单片机的课程设计数字电子钟.docx

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

设计基于单片机的课程设计数字电子钟.docx

设计基于单片机的课程设计数字电子钟

【关键字】设计

单片机技术课程设计说明书

数字电子钟

系、部:

电气与信息工程学院

学生姓名:

胡龙海

指导教师:

凌云职称讲师

专业:

自动化

班级:

自本1002班

完成时间:

摘要

电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz晶振与单片机AT89S52相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键S1、S2、和S3键,进行相应的操作就可实现功能选择,一个加一个减。

具有时间显示、整点报时、校正等功能。

走时准确、示直观运行稳定等优点。

具有极高的推广应用价值。

关键词电子钟;AT89S52;硬件设计;软件设计

ABSTRACT

Clockiswidelyusedinlife,andasimpledigitalclockismorewelcomedbypeople.Sotodesignasimpledigitalelectronicclockisnecessary.ThesystemuseasinglechipAT89S52ofATMEL’sasitscoretocontrolThecrystaloscillatorclock,usingofE-12MHZisconnectedwiththemicrocontrollerAT89S52,throughthesoftwareprogrammingmethodtoachievea24-hourcycle,andeight7-segmentLEDdigitaltube(twofourinonedigitaltube)displayshours,minutesandsecondsrequirements,andinthetimecourseofatimingfunction,whenthetimearrivedaheadofscheduledtimetobuzzagoodtimekeeping.TheclockhasfourbuttonsS1,S2,S3andS4key,andmaketheappropriateactioncanbeachievedwhentheschool,timing,reset.Withatimedisplay,alarmclocksettings,timerfunction,correctiveaction.Accuratetraveltime,displayandintuitive,precision,stability,andsoon.Withahighapplicationvalue.

KeywordsElectronicclock;;AT89S52;HardwareDesign;SoftwareDesign

1设计课题任务、功能要求说明及方案介绍……………………………………1

1.1设计课题任务………………………………………………………………1

1.2功能要求说明………………………………………………………………1

1.3设计总体方案介绍及原理说明……………………………………………1

2设计课题硬件系统的设计………………………………………………………2

2.1设计课题硬件系统各模块功能简要介绍…………………………………2

2.2设计课题电路原理图、PCB图、元器件布局图等……………………3

2.3设计课题元器件清单………………………………………………………4

3设计课题软件系统的设计………………………………………………………5

3.1设计课题使用单片机资源的情况…………………………………………5

3.2设计课题软件系统各模块功能简要介绍…………………………………5

3.3设计课题软件系统程序流程框图…………………………………………5

3.4设计课题软件系统程序清单………………………………………………8

4设计结论、仿真结果、误差分析、教学建议…………………………………18

4.1设计课题的设计结论及使用说明…………………………………………18

4.2设计课题的仿真结果………………………………………………………18

4.3设计课题的误差分析………………………………………………………19

4.4设计体会……………………………………………………………………19

4.5教学建议……………………………………………………………………19

参考文献……………………………………………………………………………20

致谢……………………………………………………………………………21

附录……………………………………………………………………………22

1设计课题任务、功能要求说明及方案介绍

1.1设计课题任务

设计一个具有特定功能的电子钟。

具有时间显示、报时等功能。

并有时间设定,时间调整功能。

1.2功能要求说明

设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“P.”,加入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,加入时钟运行状态;再次按电子钟启动/调整键,则电子钟加入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次加入时钟运行状态。

1.3设计课题总体方案介绍及工作原理说明

本电子钟主要由单片机、4*1独立键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1.1所示:

图1.1总体设计方案图

本电子钟的所有的软件、参数均存放在AT89S52的FlashROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

2设计课题硬件系统的设计

2.1设计课题硬件系统各模块功能简要介绍

本设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块。

(1)单片机最小系统模块:

包括低功耗、高性能CMOS8位微控制器AT89S52;复位电路;晶振电路。

本本模块AT89S52系统控制核心,单片机系统复位由复位电路完成,单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端位位引脚XTAL2。

通过这两个引脚在芯片外并接石英晶体振荡器和两只电容。

这样就构成一个稳定的自激振荡器。

(2)输入模块:

本模块共用到了5个按键,1个电源开关,一个复位键,单片机运行期间,利用按键完成复位操作。

3个按键独立式键盘,S1键控制电子钟的启动\调整状态,S2键为加1键,S3键为减1键。

且S1、S2、S3任一键都独自连一个I/O(P1.0、P1.1、P1.2)口线,说明它们可以独立实现相应的电子钟功能。

(3)输出模块:

本次设计显示为8位,采用两个四位一体数码管(共阳极)作为显示窗口,既可以节约成本又能简化电路。

数码管用8个PNP三极管驱动。

(4)电源模块:

现在市面上销售的编程器有很多都是由PC机的USB口直接供电为了降低本设计的成本及节省设计时间,没有另外设计编程器,而直接购买了市场上的USB供电及下载器。

2.2设计课题电路原理图、PCB图、元器件布局图

图2.1电路原理图

图2.2PCB图

图2.3proteus仿真图

2.3设计课题元器件清单

设计课题元器件清单如表2.1所示。

表2.1设计所用元器件清单

名称

数量

参数

电阻

3个

1KΩ

数码管

2个

4位一体

电阻

1个

200Ω

下载口

1个

普通插座

1个

40PIN

电阻

16个

470Ω

按键

4个

三极管

9个

PNP

USB供电线

1根

晶振

1个

12MHz

电容

2个

30pF

极性电容

1个

22μF

芯片

1块

AT89S52

发光二极管

1个

六角开关

1个

3设计课题软件系统的设计

3.1设计课题使用单片机资源的情况

设计课题使用单片机资源的情况如下:

P0口输出数码管段选信号,P3口输出数码管位选信号;晶振12MHz;调整选择键SET_KEY:

P1.0;通过选择键选择调整位,选中位闪烁;增加键ADD_KEY:

P1.1;按一次使选中位加1;减少键DEC_KEY:

P1.2;按一次使选中位减1;P2.1为蜂鸣器发声报时;50H-5FH;16个寄存器单元作为显示单元;

50H用于控制秒基准时钟源的产生;51H清零秒寄存器;

52H清零分寄存器;53H清零时寄存器;

5FH用于秒个位;5EH用于秒十位;

5DH用于分个位;5CH用于分十位;

5BH用于时个位;5AH用于时十位;

54H用于控制调时闪烁;堆栈栈底:

70H。

3.2设计课题软件系统个模块功能简要介绍

本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。

主程序:

主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。

中断服务程序:

主要是用于电子钟的准确运行、数据输入过程中的闪烁。

键盘输入程序模块:

主要是用于确定按键并得到特定的键码值。

数码管及其驱动模块:

主要是用于驱动数码管及利用数码管显示时间。

延时模块:

程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。

3.3设计课题软件系统程序流程框图

系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程

序转变成十六进制程序语言,接着使用Proteous进行仿真,读出显示数据。

主程序流程框图如3.1所示;加1子程序如3.2所示;

中断服务程序程序如3.3所示;

键盘扫描子程序框图如3.4所示;

显示子程序框图如3.5所示;

图3.1主程序流程框图图3.2加1子程序流程框图

图3.3中断子程序

图3.4键盘扫描子程序图3.5显示子程序

3.4设计课题软件系统程序清单

;-----------------------------------------------------------------------

;本电子钟实现24小时制,8位数码管显示时分秒,可整点报时

;显示格式:

00-00-00(设置小时十位为0时,不显示)

;通过3只按键来调整时间

;调整选择键SET_KEY:

P1.0;通过选择键选择调整位,选中位闪烁

;增加键ADD_KEY:

P1.1;按一次使选中位加1

;减少键DEC_KEY:

P1.2;按一次使选中位减1

;如果长按ADD_KEY或DEC_KEY,可进行调时、调分快进快减,并停止闪烁

;如果选中位是秒,则按增加键或减少键可实现,但无调时快进和快减功能

;P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz

;P3.1为蜂鸣器发声报时

;编程人:

胡龙海编写日期:

2012年7月12日修改日期(最终):

2010年12月12日

;-----------------------------------------------------------------------

;-----------

;程序入口

;-----------

/*数字电子钟-查询方式

要求:

<一>.显示系统提示符“P.”

<二>.定义3个功能键:

分别为电子钟启动键/停止键/功能选择键;加1键;减1键;并且有相应指示灯指示

<三>.在系统提示符状态下,只有按启动键/停止键才能开启电子钟,电子钟进入运行状态;再次按下启动键/停止键,电子钟进入调整状态,选择功能键,选择好想要的时或分或秒,此时,加1键,减1键才可以工作。

调整结束后,按下启动键/停止键,电子钟由调整状态返回运行状态,紧跟着以调整以后的时间运行。

作者:

胡龙海

时间:

2012年8月5日

电路描述:

crystal=12MhzP2口位控口,P0口段控口P1口为按键控制位P3口为指示灯控制口*/

#include

#include

#defineucharunsignedchar

#defineintsignedint

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

/*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};

/*共阳数码管位控码数组(从右往左点亮,反向驱动)*/

charcodeweikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

charfind_code[8];

sbitS2=P1^1;//启动键/停止键/功能键(第一次按下-启动;第二次按下-暂停,第三次按下-功能选择)

sbitS3=P1^2;//加1键

sbitS4=P1^3;//减1键

sbitP3_7=P3^7;//启动键/停止键指示灯

sbitP3_1=P3^1;//秒指示灯

sbitP3_2=P3^2;//分指示灯

sbitP3_3=P3^3;//时指示灯

intsecond=0;

intminite=0;

inthour=0;

uchartime=0;

uchartimes=0;

uchart,flag1,flag2,flag3;

intH;

voidxianshishuzu();/*缓冲数组函数*/

voiddisp();/*显示函数*/

ucharkeychuli();/*P1口处理函数*/

ucharkey();/*键扫描函数*/

voiddelay0_5s();/*0.5秒延时函数*/

voiddelay1s();/*1秒延时函数*/

/*1ms延时函数*/

voidDelayX1ms(intcount)

{

intj;

while(count--!

=0)

{

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

}

}

/*显示函数*/

voiddisp()

{

chari;

chark;

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

{

P2=weikong_code[i];

k=find_code[i];

P0=dis_code[k];

DelayX1ms

(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);//返回按键键值

}

/*缓冲数组函数*/

voidxianshishuzu()

{

find_code[1]=second/10;//时-分-秒显示数组初始化

find_code[0]=second%10;

find_code[2]=12;

find_code[4]=minite/10;

find_code[3]=minite%10;

find_code[5]=12;

find_code[7]=hour/10;

find_code[6]=hour%10;

disp();

}

/*0.5s延时函数,查询方式*/

voiddelay0_5s()

{

EA=1;

ET1=0;

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

TR1=1;

do

{

TH1=0x3c;

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

do{disp();}

while(TF1==0);

times++;

TF1=0;

}

while(times!

=5);

TR1=0;

times=0;

}

/*1s延时函数*/

voiddelay1s()

{

TMOD=0X01;

EA=1;

ET0=1;

TH0=(65536-50000)/256;//10ms送计数初值

TL0=(65536-50000)%256;

TR0=1;

do{disp();H=key();}while(H!

=1);//有条件转移

}

voidtime_()interrupt1//中断程序

{

time++;

TH0=(65536-50000)/256;//10ms重新送初值

TL0=(65536-50000)%256;

if(time==20)//时-分-秒-计时函数

{

second++;

time=0;

if(second==60)//秒值等于60,秒清零,分加1

{

second=0;

minite++;

if(minite==60)//分值等于60,分清零,时加1

{

minite=0;

hour++;

if(hour==24)//时值等于24,时清零,返回,全部归零

{

hour=0;

}

}

}

}

xianshishuzu();

}

voidmain()

{

while

(1)

{

find_code[0]=10;/*相当于初始化*/

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]=11;

disp();//初始化显示“P.”

H=key();

if(H==1)//S2键按下,进入case1,进入延时函数,开始自动计时并显示

{

while

(1)

{

P3_7=0;//启动键/停止键/功能键指示灯亮

P3_1=0;//时-指示灯亮

P3_2=0;//分-指示灯亮

P3_3=0;//秒-指示灯亮

switch(H)

{

case0:

disp();H=key();//暂停显示

break;

case1:

xianshishuzu();

t++;

H=key();

if(t==5){t=1;}

switch(t)

{

case1:

delay1s();H=key();TR0=0;P3_7=1;delay0_5s();//自动显示时间-时-分-秒

break;

case2:

flag1=1;flag2=0;flag3=0;//秒加1调整条件

P3_1=1;delay0_5s();//秒指示灯闪烁

break;

case3:

flag2=1;flag1=0;flag3=0;//分加1调整条件

P3_2=1;delay0_5s();//分指示灯闪烁

break;

case4:

flag3=1;flag1=0;flag2=0;//时加1调整条件

P3_3=1;delay0_5s();//时指示灯闪烁

break;

}

break;

case2:

if(flag1)//按键加1函数

{

P3_1=1;

second++;//秒自加1

find_code[1]=second/10;

find_code[0]=second%10;

delay0_5s();

if(second==60)//秒值等于60,清零

{second=0;}

}

if(flag2)

{

P3_2=1;

minite++;//分自加1

find_code[4]=minite/10;

find_code[3]=minite%10;

delay0_5s();

if(minite==60)//分值等于60,清零

{minite=0;}

}

if(flag3)

{

P3_3=1;

hour++;//时自加1

find_code[7]=hour/10;

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

当前位置:首页 > 外语学习 > 法语学习

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

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