电气本1301班黄青云数字电子钟 - 图文

更新时间:2023-12-21 09:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

数字电子钟

学 院: 电气与信息工程学院 学生姓名: 黄青云 指导教师: 王韧 职称/学位 教授

专 业: 电气工程及其自动化 班 级: 电气本1301班 学 号: 1330140119 完成时间: 2016年6月

湖南工学院《单片机技术》课程设计课题任务书

学院:电气与信息工程学院 专业:电气工程及其自动化 指导教师 课题名称 王韧 学生姓名 数字电子钟 黄青云 内容及任务 一、设计任务 设计一个具有特定功能的电子钟。 二、设计内容 1、电子钟的硬件系统 (1)、单片机最小系统模块 (2)、供电模块 (3)、显示模块 (4)、键盘模块 2、电子钟的软件系统 (1)、系统监控程序模块 (2)、显示程序模块 (3)、键盘程序模块 三、设计要求 该电子钟上电或按键复位后能自动显示系统提示符“P.”, 进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按电子钟启动/调整键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按启动/调整键再次进入时钟运行状态。 [1]李广弟.单片机基础[M].第3版.北京:北京航空航天大学出版社,2003.6. [2]李全利.单片机原理及应用(C51编程)[M].北京:高等教育出版社,2012.12. [3]马忠梅.单片机的C语言应用程序设计[M].第4版.北京:北京航空航天大学出版社,2003.6. [4]李光飞.单片机C程序设计指导[M].北京:北京航空航天大学出版社,2003.01. [5]李光飞.单片机课程设计实例指导[M].北京:北京航空航天大学出版社,2004.9. 主要参考资料 教研室 意见 教研室主任:(签字) 年 月 日

I

摘 要

电子钟在生活中应用非常广泛,无论在哪里,都离不开时间的控制,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要,一个好的电子时钟,被安置在各种器件上,本课题采用单片机技术设计电子钟。采用AT89S52单片机作为主控芯片,通过汇编软件实现以24小时为一个周期,LED数码管显示小时,分,秒,该电子钟设有三个有效按键,分别为S1,S2,S3键,进行相应的操作就可对电子钟实现启动,暂停,功能选择,调整的功能,具有很高的推广价值。

关键字:数字电子钟;AT89S52;LED数码管显示

II

目 录

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

1.1 设计课题任务 .............................................. 1 1.2 功能、性能要求说明 ......................................... 1 1.3 设计课题总体方案介绍及工作原理说明 ........................ 1 2 设计课题硬件系统的设计........................................... 2

2.1设计课题硬件系统各模块功能简要介绍........................... 2 2.2设计课题电路实物图,原理图................................... 3 2.3设计课题元器件清单........................................... 3 3 设计课题软件系统的设计........................................... 4

3.1设计课题使用单片机资源的情况................................. 4 3.2 设计课题软件系统各模块功能介绍 .............................. 4 3.3 设计课题软件系统程序流程框图 ................................ 4 3.4 设计课题软件程序清单 ........................................ 5 4 设计课题操作使用说明、测试说明、误差分析、设计结论、设计体会..... 6

4.1 设计课题的操作使用说明 ...................................... 6 4.2 设计课题的测试过程 .......................................... 6 4.3 设计课题的误差分析 .......................................... 7 4.4 设计课题的设计结论、设计体会 ............................... 7 结束语.............................................................. 8 参考文献............................................................ 9 致 谢............................................................. 10 附 录............................................................. 11

附录A 电源元器件清单.......................................... 11 附录B 电路实物图.............................................. 12 附录C 电路原理图.............................................. 12 附录D 电源原理图.............................................. 14 附录E 程序清单................................................ 15

III

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

1.1 设计课题任务

设计一个具有特定功能的电子钟。具有时间显示,时间设定,时间调整功

能。

1.2 功能、性能要求说明

设计一个具有特定功能的电子钟,当该电子钟连上电源后,能自动显示系统提示符“p”,进入时钟准备状态;第一次按下S1暂停/启动/功能选择键,则时钟将会从0时0分0秒开始计时。按第二次开始暂停功能,再按一下则进行功能选择功能,可以进行调整时,分,秒。按下第二个键S2和第三个键S2是对时间调整进行相应的加减,退出手动调节之后,计时系统在调整之后开始运行,当计数达到24小时后,计数器自动清0,重新进入计时状态。

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

设计方案(1)基于单片机并行口的设计在AT89S52的P0口和P2口上外接LED数码管显示器,P0口作LED数码管显示器的段控口,P2口作LED数码管显示器的位控口,P1口外接3个按键S1,S2,S3,本电子钟的所有的软件、参数均存放在AT89S52的内部ROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

1

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

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

AT89SC52介绍:AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。芯片引脚如图1所示:

图1 AT89S52引脚图

设计的硬件系统主要采用以下基本模块来实现,单片机最小系统模块,输入模块、输出模块、电源模块。单片机最小系统模块:包括低功耗、高性能CMOS8位微控制器AT89S52;复位电路;晶振电路。本模块AT89S52系统控制核心,单片机系统复位由复位电路完成,单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端位位引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容。这样就构成一个稳定的自激振荡器。

输入模块:模块共用到3个按键,1个复位键,单片机接通电源后,利用按键复位完成复位操作。S1键控制电子钟的启动\\调整状态,做正常走时状态时S2为电子钟增加整键,S3为电子钟减少整键。

2

输出模块:设计显示为8位字符,采用两个四位一体数码管(共阳极)作为显示窗口,既可以节约成本又能简化电路。数码管用8个PNP三极管驱动。

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

2.2设计课题电路实物图,原理图见附录B,附录C 2.3设计课题元器件清单

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

表1 元器件清单

元器件名称 规格 数目

AT89S52单片机 40P 1 AT89S52单片机芯片锁紧座 40P 1 四位一体共阳数码管 2 四位一体共阳数码管插座 40P 1 74HC573 20P 1 74HC573芯片插座 20P 1 晶振 12MHz 1 发光二极管 9 单排插针 40P 2 三极管 9012 1 蜂鸣器 1 小按键 10 下载口座子 1 六脚按键电源开关 1 USB电源线 1 USB电源线插座 1 电阻 200 1 电阻 470 1 电阻 1K8 4 电解电容 22μf 2 瓷片电容 33μf 2 排阻 10k 4 排阻 470 1 短路冒 4 杜邦线 8P 1 PCB板子 1 固定螺钉螺帽 3mm 4 USB下载线 1

3

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

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

按键分别连接P1.0-P1.3,当有键按下时P1.0-P1.3的某一位为低电平,反之,则为高电平;两个八位数码管位控线分别连接P2口的P2.0-P2.7,其段控线分别接至P0口的P0.0-P0.7。采用共阳数码管,当控制位为低电平时,LED相应段点亮。根据实际和需要,设计选用定时器0做时钟定时,按方式1工作,每隔50ms溢出中断一次,计满0次为止。P0.0---P0.7段控线,接LED的显示段。从位控线(LED7,LED6,LE5,LED4,LED3,LED2,LED1,LED0)。使用定时器/计数器0,定时功能,工作方式1,提供50毫秒的定时时间,以中断方式工作,计满20次即得到秒计时单位;应用了显示字符段选码表(共阳极代码首地址TAB)

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

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

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

键盘输入函数模块:主要是用于确定按键并得到特定的键码值。

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

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

系统软件采用C语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进函数语言。 主程序框图:

4

子程序框图:

3.4 设计课题软件程序清单见附录D

5

4 设计课题操作使用说明、测试说明、误差分析、设计结论、设计体会

4.1 设计课题的操作使用说明

设计为基于单片机的电子钟的设计。刚开始,很多地方理不清头绪,和无 从下手,但通过认真研究设计课题,找书上网查资料买元件,确定基本设计方案, 对所用芯片功能进行查找、调试,然后画电路图制PCB板、打孔、溶铜、焊接等, 真的经历了许多困难,却积累了很多宝贵的经验,设计用2个四位一体的共数 码管做为显示器,它显示时间值;设计中有三个按键,其中S1为启动/选择调整 位置,S2为加控制键S3为减控制键。

4.2 设计课题的测试过程

先用无需驱动软件对将所编程序导入进去,成功后会有如下图所示准备状态:

然后分别按照前面的步骤调整S1,S2,S3可调出如下图所示的现象:

6

4.3 设计课题的误差分析

电子钟在运行中存在一定的误差,误差产生有三种可能,首先是采用的计时方案是软件计时的,计时优势利用中断来实现。而当电子钟运行时间1秒时,又得去执行中断程序,这个过程是需要时间的,所以就产生了一定的误差,当然这个误差是避免不了的,其次还有硬件系统也有一定的影响。第三,设计用到12MHz的晶振,计算是满20次为一秒钟,但实际会慢很多。那应该怎样有效的减小误差呢?以下几点可供参考:(1)保证元器件的流畅性,即选择新的好的元器件。(2)适当减小中断时间。

4.4 设计课题的设计结论、设计体会

在课程设计中,课程设计是培训学生运用专业所学的理论知识和专业知识来分析以及解决实际问题的重要教学环节,是对三年所学知识的复习和巩固。同样,也促使了同学们的相互探讨,相互学习。因此,必须认真、谨慎、踏实、一步一步的完成设计。如果时间可以重来,可能会认真的去学习和研究,也可能会自己独立的完成一个项目,相信无论是谁看到自己做出的成果时心里一定会很兴奋。设计让我明白了一个很深刻的道理:团队精神固然很重要,担人往往还是要靠自己的努力,自己亲身去经历,这样自己的心里才会踏实,学到的东西才会更多。课程设计是一个重要的教学环节,通过课程设计使我们了解到一些实际与理论之间的差异。通过课程设计不仅可以巩固专业知识,为以后的工作打下了坚实的基础,而其还可以培养和熟练使用资料,运用工具书的能力。

7

结束语

首先,在老师的帮助下,发现还有好多的不足,在知识在生活中,都是需要努力才能办成一件事的,在单片机课设中,发现了在汇编语言以及其理解能力还很不好,这都是平时没有花心思去认真学的后果。在以后的学习以及生活中,要一步步积累知识,这样才能学到更多的知识和技能。

数字电子钟在生活中应用广泛,有些功能经过修改可以变成市面上各种不一样的计时装备,对应不同的功能价格也不同,应用AT89S52为核心芯片,通过不同的按键选择来设定时间。

8

参考文献

[1] 代启化.基于Proteus的电路设计与仿真[J].现代电子技术.2006,第19期. [2] 刘文秀.单片机应用系统仿真的研究[J].现代电子技术.2005, 286 期. [3] 曹巧媛.单片机原理及应用[M],北京:电子工业出版社,1997.7.

[4] 张洪润.兰清华,单片机应用技术教程[M],北京:清华大学出版社,1997.11. [5]李广第.单片机基础[M],北京航空航天大学出版社,2006.7.

9

致 谢

首先,通过这个课程设计,首先,我要感谢我的父母,当每每想到我的眼前有多么困难的事阻挡我的时候,我就想到他们在不同的地方鼓励我,虽然在远方,可是我不想让他们失望,不想让他们以为我会被这小小的困难所打败。其次,我要感谢老师多日来的教导,他们是辛勤的园丁,教会了我们知识,在学习中,他们就像我们的朋友,指出我们在学习上的错误及不足。然后就是我的同学们,谢谢他们在我困难的时候给我学习上的帮助。通过这次课设,我也知道了在学习上的事大部分的还是得靠自己。

10

附 录

附录A 电源元器件清单

名 称 型 号 个 数 变压器 15V×2 1 散热片 1 整流桥 2W10 1 六脚开关 1 电容 2200μF 1 电容 470μF 1 电容 103 2 电容 22μF 1 电容 33pF 2 芯片 7805 1 芯片 AT89S52 1 电阻 51Ω 3 电阻 300Ω 1 电阻 200Ω 1 电阻 1KΩ 2 电位器 50KΩ 1 下载口 1 晶振 12M 1 按键 9 液晶 12864 1 排阻 10KΩ 1 插针 若干

11

附录B 电路实物图

12

附录C 电路原理图

13

附录D 电源原理图

附录D 电源原理图

14

附录E 程序清单

/******************************************************************** 程 序 名:电子钟 编 写 者:黄青云 指导老师:王韧

时 间:2015.12.1

功 能:(1)显示系统提示符“P.”。(2)定义3个功能键:分别为电子钟启

动键/停止键/功能选择键;加一键;减一键。在系统提示符状态下只 有按启动键/停止键才能开启电子钟,电子钟进入运行状态;再次按 下启动键/停止键,电子钟进入调整状态,此时,功能选择键,加一键, 减一键才可以工作。调整结束后,按下启动键/停止键,电子钟由调状 态返回运行状态,紧跟着以调整以后的时间运行。

使用说明:将单片机的P2口用排线连于J31即73ls573位选(P20对I18),P0口连于J32即数码管段选(P00对O11)

*****************************************************************#include #include\#include\#include\

#define uchar unsigned char #define uint unsigned int

/******************* 定义缓冲数组 **********************/ uchar find_code[8];

char hour=0,min=0,sec=0;

uchar i,on,counter=0,counter1=0,tx=0;

/******************************************************************** 函数名: set_find

功能: 设置缓冲数组初始值 调用函数: 无

调用数组: find_code[] 输入参数: 无 输出参数: 无

说明: 依照程序定义的段选数组,按照须显示的段选数,相应的设置缓冲数组的初始值

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

void set_find() {

find_code[0]=sec; find_code[1]=sec/10; find_code[2]=12; find_code[3]=min;

15

find_code[4]=min/10; find_code[5]=12;

find_code[6]=hour; find_code[7]=hour/10; }

/****************************主函数 ************************/ void main() {

uchar m;

EA=1; ET0=1; TMOD=0x01;

PT0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%6; TR0=0; m=key();

while(m!=0x01) {

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; display(find_code); m=key(); } while(1) {

switch(m) {

case 0x00: m=key();

display(find_code);

break; case 0x01: counter++;

if(counter==1) {

counter1=0; TR0=1;

16

//第一次按键,正常运行

on=0;

display(find_code); if(counter==2)

if(counter==3)

if(counter==4) if(counter==5)

m=key(); break; }

//第二次按键,进入状态

{ TR0=0; on=1;

display(find_code); m=key(); break;

}

//第三次,加时 {

counter1++;

/*if(counter1==4) {

counter1=1; } */

display(find_code); m=key(); }

//第四次。加分

{ counter1++;

display(find_code); m=key(); }

//第五次加秒

{ counter=0; counter1++;

display(find_code);

m=key();

}

if(counter==0) {

set_find();

display(find_code); m=key();

17

break; case 0x02: if(on==1)

}

{ if(counter1==1) {

hour++; if(hour==24)

if(counter1==2) if(counter1==3) if(counter1==0)

{

hour=0;

}

set_find();

display(find_code); m=key();

}

{ min++;

if(min==60) {

min=0;

}

set_find();

display(find_code); m=key();

} { sec++;

if(sec==60) {

sec=0;

}

set_find();

display(find_code); m=key();

}

{ display(find_code); m=key(); }

18

else

} { m=key(); set_find();

display(find_code); break;

case 0x04: if(on==1)

if(counter1==2) if(counter1==3)

}

{

if(counter1==1) {

hour--; if(hour==-1) {

hour=23; }

set_find();

display(find_code); m=key(); }

{ min--; if(min==-1) {

min=59; }

set_find();

display(find_code); m=key(); } { sec--; if(sec==-1) {

sec=59; }

set_find();

display(find_code); m=key();

}

19

if(counter1==0) { display(find_code); m=key(); } } else {

m=key(); set_find();

display(find_code); }

break; default:

display(find_code); m=key();

break; } } }

/****************************中断函数************************/ void timer_0() interrupt 1 {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; i++;

if(i==20) {

sec++; i=0;

if(sec==60) {

min++; sec=0;

if(min==60) {

hour++; min=0; if(hour==24) {

20

hour=0; } } }

} set_find(); }

键扫程序

#include #include\#include\

#define uchar unsigned char #define uint unsigned int uchar find_code[];

/******************************************************** \函数名: keychuli()\\功能: 提取键值\\输出参数: k\

\说明: 提取键码\

********************************************************/ uchar keychuli()

{ uchar k;

k=P1; //\口内容送K\ k=~k; //\取反\

return(k); //\返回键值\}

/******************************************************** \函数名: key()\

\功能: 扫描是否有键按下\

\调用函数: keychuli(),void display(uchar *p) \\输出参数: keyzhi\

********************************************************/ uchar key()

{ uchar keyzhi,keyzhii; //\键盘按键键值临时存放\ keyzhi=keychuli(); //\调P1口处理函数\

if(keyzhi!=0) //\有键动作延时去抖动,否则函数返回\

{ display(find_code); display(find_code); keyzhi=keychuli(); //\再次调P1口处理函数\ if(keyzhi!=0) //\真正有键按下,取键值并暂存\ { keyzhii=keyzhi;

while(keyzhi!=0) //\判按键是否释放,没有释放延时

21

去抖动等待释放\

{ display(find_code); display(find_code); keyzhi=keychuli(); }

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

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

显示程序

#include #include\#include\

#define uchar unsigned char #define uint unsigned int /*共阳数码管字型码数组*/

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

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

/*共阳数码管位控码数组(从右往左点亮,反向驱动)*/ //uchar code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; /*共阳数码管位控码数组(HC573,正向驱动)*/

uchar weikong_code[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //送位码

/******************************************************** 函数:void display(uchar *p) 说明:显示函数

/********************************************************/ void display(uchar *p) {

uchar i;

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

P2=weikong_code[i]; P0=dis_code[*p]; p++;

delay(1); P0=0xff; } }

延时程序

22

#include #include\

#define uchar unsigned char #define uint unsigned int

/******************************************************** 函数名: void delay(uint x) 功能: 延时时间为1ms 调用函数:

输入参数:x,1ms计数 输出参数:

说明:总共延时时间为1ms乘以x,crystal=12Mhz

********************************************************/ void delay(uint x) {

uchar i; while(x--)

for(i=0;i<120;i++); }

23

本文来源:https://www.bwwdw.com/article/y8a5.html

Top