数字钟设计.docx
- 文档编号:5056822
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:173.39KB
数字钟设计.docx
《数字钟设计.docx》由会员分享,可在线阅读,更多相关《数字钟设计.docx(21页珍藏版)》请在冰豆网上搜索。
数字钟设计
电子钟项目
总体设计说明书
编制单位:
侏罗纪工作室
作者:
王鹏
版本:
V0.1
发布日期:
2011-1-23
审核人:
批准人:
修订历史记录
发布日期
版本
说明
作者
2011-1-23
V0.1
硬件总体设计说明书初稿
王鹏
2008-12-20
V0.2
按照文档格式要求修改格式
王鹏
2011-01-23
V0.2
按照需求要求修改文档内容
王鹏
目录
1.引言1
1.1.编写目的:
1
1.2.背景1
1.3.定义2
1.4.参考资料2
2.总体设计3
2.1.开发与运行环境3
2.2.硬件功能描述3
2.3.硬件结构3
3.硬件模块设计4
3.1.描述4
3.2.功能6
4.嵌入式软件设计7
4.1.流程逻辑7
4.2.算法8
5.经验总结7
5.1.硬件7
5.2.软件8
6.附录7
1.引言
1.1.编写目的:
电子表在生活中的应用,可以说无处不在,在日常生活中我们无时不在使用电子表,给我们的生活和学习带来了说不尽的方便,使我们的生活更加有节奏和规律。
使用二十四时制。
并用实验室的PCB制作机器来完成电路板的绘制,尽量使PCB小,而且功能齐全,全面练习了我们的C语言工程应用经验和PCB板的制作过程和熟练程度。
在本次设计中需要下面的准备工作
• 复习本学期学过的单片机和上学期学过的C语言。
• 本实验没有用外接时钟源,所以在编写C语言时要尽可能的减小程序产生的误差。
• 列出电子秒表单元电路的测试表格。
• 列出调试电子表的步骤。
计数器是一个用以实现计数功能的时序部件,它不仅可用来计脉冲数,还常用作数字系统的定时,分频和执行数字运算以及其它特定的逻辑功能.计数器种类很多.按构成计数器中的各触发器是否使用一个时钟脉冲源来分,有同步计数器和异步计数器.根据计数制的不同,分为二进制计数器,十进制计数器和任意进制计数器.根据计数的增减趋势,又分为加法,减法和可逆计数器.还有可预置数和可编程序功能计数器等等.
译码器是一个多输入,多输出的组合逻辑电路.它的作用是把给定的代码进行"翻译",成相应的状态,使输出通道中相应的一路有信号输出.译码器在数字系统中有广泛的用途,不仅用于代码的转换,终端的数字显示,还用于数据分配,存贮器寻址和组合控制信号等.不同的功能可选用不同种类的译码器.译码器可分为通用译码器和显示译码器两大类.前者又分为变量译码器和代码变换译码器.
一个LED数码管可用来显示一位0~9十进制数和一个小数点.小型数码管(0.5寸和0.36寸)每段发光二极管的正向压降,随显示光(通常为红,绿,黄,橙色)的颜色不同略有差别,通常约为2~2.5V,每个发光二极管的点亮电流在5~10mA.LED数码管要显示BCD码所表示的十进制数字就需要有一个专门的译码器,该译码器不但要完成译码功能,还要有相当的驱动能力.
这些都是最简单的门电路,在设计和制作中可以准确的应用最简单的电路图做出来,相比较这些门电路功能简单搭建方便。
价格相对其他的集成芯片较便宜,整个制作完成价格不超过50元人民币。
而且易于制作和方便检查错误,精度较高。
1.2.背景
a、本次实验主要设计一个带有闹钟和定时功能的电子表。
b、本次实验是在大三第一学期学完单片机的基础上通过C语言使用51单片机来实现电子钟,在寒假期间用十天左右来完成制作,在实验室王老师的大力鼓励和支持下我们实验室大三十七个人一起共同努力每人完成一个,要求是现在单片机开发板上用C语言来实现功能,并自己绘制PCB板,由大四的师哥师姐们帮我们完成板子的刻制,并且自己焊元件,调试板子,来实现自己所要的功能。
项目任务提出者:
项目开发者:
王鹏
软件开发者:
王鹏
系统调试:
王鹏
项目用户:
单片机爱好者
系统运行环境:
HOT51单片机开发板、单片机仿真软件Wave6000、单片机最小系统电路板。
1.3.定义
1.3.1专门术语的定义
四位八段数码管:
就是四个单个数码管连在一起的二极管显示器,可以显示从0到9数字的显示。
晶振:
用来产生单片机工作所需的工作脉冲。
1.2.2外文首字母组词的原词组
PCB:
常称为印刷电路板是用来固定元件并可以导电的电路板。
:
在本文中代表89C51单片机的接口,即I/O口P1口。
1.4.参考资料
1、李朝青.单片机原理及接口技术(第三版)[M].北京:
北京航空航天大学出版社,2005.9
2、谭浩强.c语言程序设计(第二版).
3、HOT51增强版单片机开发板资料.
2.总体设计
2.1.开发与运行环境
2.1.1系统硬件运行环境
在常温下由电池供电,在基于89C51单片机的系统版上运行,最后在自制的PCB最小系统版上运行。
2.1.2系统软件运行环境
程序使用软件主要是keiluvision3中调试、编译、连接,然后由stc-isp软件下载到单片机中,在单片机开发板上运行。
软件运行环境为WindowsXP。
2.2.硬件功能描述
本系统硬件包括PCB集成电路板一个(芯片元件集成)、三个单稳态开关(用于数字钟对时),一个自锁开关(电源开关)、12MHz晶振一个,89C51单片机一个(程序执行)、蜂鸣器一个(闹钟报警)、电源接口一个(电路供电)、四位一体八段数码管两个(显示时间)、1K排阻一个、发光二极管一个(电源指示灯)、74HC38译码器芯片一个、若干导线。
2.3.硬件结构
硬件端口定义:
数码管片选接至单片机P0口,接至数码管引脚图如下:
7
5
6
8
4
3
2
1
从单片机的P0口分别接至数码管的段选口,共八个接口,从单片机的P2.1、P2.2、P2.3接位选驱动芯片74138,驱动芯片输出引脚接数管的位选端。
单稳态开关接口
单稳态开关接口为四个引脚,其引脚功能如下图所示:
在开关按下去时1和3接通,2和4接通,在程序里高电平为有效电平,所以在电路图中用1和3接口。
电源开关为单刀双置开关,当开关按下去时1和2接通,所以在电路图中所用1和2引脚。
电路中用到的唯一一个三极管是9012,是NPN的管子,所以其接法和PNP刚好相反,
E引脚接电源的正,c引脚接电源的地,此电路为闹钟部分驱动蜂鸣器,也可以换成9013或是PNP的管子,只要能提供比较大的电流就可以。
3.硬件模块设计
3.1.描述
3.1.189C51单片机
1、89C51RC:
此型号单片机是目前最流行的一款常用单片机,单片机是本系统的心脏,主要是用来执行二进制代码,实现所需功能的。
此单片机的主要参数如下:
ROM为64KB,
RAM为
3.1.2PCB板
1、PCB板概述:
标准的PCB板上头没有零件,常被称为“应刷电路板“。
板子本身的基板是由绝缘隔热、并不易弯曲的材质制作而成。
在表面可以看到细小线路是铜箔,,原本铜箔是覆盖在整个板子上的,而在制造过程中部分被蚀刻处理掉,留下来的部分就变成了网状的细小线路。
这些线路被称为导线或称布线,并用来提供PCB上零件的电路连接。
为了将零件固定在PCB板上,我们将原件的接脚直接焊在布线上,在最基本的PCB上,零件都集中在其中的一面。
这么一来我们就需要在板子上打洞,这样我们才能将引脚穿过板子到另一面,所以零件的焊接在另一面上的。
应为如此,PCB的正反面被称为零件面与焊接面。
如果PCB上头有些零件需要在制作完成后可以拿掉或装回去,那么零件安装时会用到底座。
由于底座是直接焊接在板子上的,零件可以任意的拆装。
PCB上绿色或是红的的是阻焊漆的颜色,这层是绝缘的防护层,可以保护铜线,也可以防止零件被焊接到不正确的地方。
在阻焊层上另外会应刷上一层网应刷面。
通常在这层上面会印刷上文字与符号,以标示出各零件在板子上的位置。
网丝应刷面也被称为图标面。
印刷电路板将零件与零件之间复杂的电路铜线经过细致整齐的规划后蚀刻在一块板子上,提供电子零件组件在安装与互联时的主要支撑体,是所有电子产品不可或缺的基础零件。
印刷电路板以不导电的材料所制成的平板,在此平板上通常都设计安装孔以安装元件。
组件的孔有助于让预先定义在板子上印制的金属路径以电子方式连接起来,将电子组件的接脚穿过PCB后,再以导电性的金属焊条粘附在PCB上而形成电路。
PCB可以分为单面板,双面板,多层板。
2、在本次实验中要求我们自己绘制PCB板,并且用实验室所提供的PCB刻板机刻制自己的板子,由于本次实验所用的电路简单,所以用单面板,PCB设计所用的软件为DXPPROTELL,因为没有用到高频电路,所以板子的绘制相对简单,但在绘制过程中出现了不少的问题,详细分析见后,绘制的PCB板如下图所示:
3.2.功能
本系统为二十四小时制带有闹钟功能的电子表,可以校对时间和闹钟,可以开启和关闭闹钟。
本系统共分为四部分,第一部分为显示区,第二部分为按键区,第三部分为闹钟功能区,第四部分为电源区。
显示区主要是数码管的显示,主要是用来显示结果,走时。
本部分还需要驱动芯片和数码管的动态扫描。
按键区有两部分,一是电源的开关按键,用来接通电源和断开电源。
二是电子表校时按键,共有三个按键,S1是功能选择,从电子钟的小时校对、分钟校对、闹钟的小时校对、分钟校对。
S2是加校对按键,在相应的功能选择下加。
S3是减校对按键,在相应的功能选择下减。
闹钟功能区是闹钟的功能电路,主要是在闹钟时间到时开始响闹钟。
电源区是电源接通显示,用一个发光二极管,当发光二极管亮表示电源接通,反之则表示电源未接通。
4.嵌入式软件设计
4.1.流程逻辑
程序用tab[]数组来定义共阴数码管的显示状态;
用定时器0来实现电子钟的走时;
用定时器1来实现数码管的动态扫描;
用外部键盘扫描来实现电子钟的校准,查询方式如下:
定义电子钟的初始值为23:
59:
00。
程序流程图如下:
查询方式流程图
本次试验,用到单片机外部中断,也就是按键,使用按键最主要的就是防抖动,防抖动的方法很多我使用的方法为延时,就是重新定义一个函数,功能是延时一定的时间,在按键程序中调用此函数。
voiddelay(unsignedintcnt)//延时函数
{
while(--cnt);
}
4.2.算法
定时器工作模式控制字TMOD
本次实验用到了单片机的所有的定时器中断,T0用来实现电子钟的计时,T1用来实现数码管的动态扫描。
当用计时器0时给TMOD赋值为0X01,用定时器1时给TMOD赋值为0X10,也可以一次性赋值为0X11。
定时器是一种中断响应的工作方式,所以在使用定时器时必须给定时器赋初值,当定时器达到初值时向CPU申请中断,来处理中断。
在电子钟计时要求是要很准确的,在定时器工作在方式一最大的计时为216,当使定时器定时为20mm时根据如下据算公式:
定时器的定时时间计算公式为t=(216–T0初值)×振荡周期×12
在用定时器0计时,系统晶振为12MHz,算出初值为3CB0H,也就是把定时器中断循环50次刚好是一秒。
同样用定时器1动态扫描数码管时根据公式2.063ms扫描一次,初值定义为F8F0H,再循环20次调用一次显示程序,这样就实现数码管动态扫描。
5.经验总结
本次实验主要是正对单片机的应用和在C语言的基础上设计完成,在制作和设计过程中遇到了很多问题,也暴露出了自己的很多不足。
本次实验主要一部分还是PCB板的制作,由于是初次制作PCB板,所以大四的师哥师姐门给了我们很多的帮助。
下面就针对每一部分出现的问题做进一步的探讨。
1、软件设计
软件部分在设计中用的是C语言,具体的思路和设计方法在前面已经提到,现在主要来说一下在设计过程中遇到的问题。
在软件设计过程中遇到的首要问题是数码管的动态扫描,因为我们用的数码管位选芯片是74HC138,此芯片四COMS芯片,信号比较稳定,属于高电平有点,我用51单片机的P2.0、P2.1、P2.2通过3-8译码器位选择数码管。
单片机用的是12MHz的晶振,在数码管扫描的时候频率大概是1/40的晶振频率,用单片机T1中断,但在起初设计时我把数码管的扫描程序加载数码管的段选程序中,结果出现了问题,数码管的扫描很不稳定,只有电子钟的秒不断地加,而电子钟的其他全都显示的是初始时间,不变。
在参考了单片机开发板的程序后发现要把数码管的扫描程序单独写成函数,然后调用函数,这要数码管的段选和位选分开,互不干扰。
结果问题消失,这就像王老师说的,在C程序中要尽可能的使程序模块化,这样在以后的修改和添加新的功能是就方便很多,也便于程序的优化。
在程序设计中遇到的最棘手的问题就是电子钟的时间误差,由于是用C语言编写,所以很难准确的算出每一个代码所执行的时间,所以要消除电子钟的误差,需要在硬件电路设计出来后通过更改软件了消除。
电子钟引起误差的因素很多,但有些是可以避免的,有些事无法消除的,所以我在设计过程中主要是通过软件来使电子钟走时准确。
在刚开的表误差是12个小时差2分钟,这对于我们日常所用的表来说误差太大。
设计要求是12个小时误差要控制在30秒之内,我起初使用改变计时中断循环次数来消除误差,但其精度远远不够,最后实验室所有队员共同商量,分析解决问题的方法,其方法见后面的附录部分。
2、硬件设计
(1)问题一
首先,我们本次实验是设计一个电子钟,主要涉及的是数码管的驱动和数码管的动态扫描,起初我们根据单片机开发板我们用的是74LS258,但是在设计过程中我们要求;绘制的PCB板要尽可能的小,所以我把数码管驱动芯片换成了2003,由于自己的粗心和设计缺乏经验,没有考虑到驱动芯片的工作电压,由于单片机用的是5V的电压,所以在电源供电使用电池,但2003芯片的工作电压时15V,所以在调试电路的时候数码管没有让任何显示,在经过查找资料,终于找出了问题的原因,由于制作的电路板已经成型,所以改变电路时很困难的,所以直接把2003芯片短路,数码管显示问题解决。
但是数码管由于没有驱动芯片,所以显示很暗,限于电路结构没法调整,只能修改至此。
如果需要彻底解决问题,就需要另找驱动芯片,然后重新封装,再制作一个符合要求的PCB,再次调试。
(2)问题二
在使用PROTEL软件制作PCB板的时候由于第一次画PCB,所以很多主意事项没有重视,以至于在后期使用实验室的PCB制作机器时线路走线很不科学,饶了很多弯路,在有些地方可以直线连接,但在自动布线时软件饶了很长的线路,自己也没有一根一根检查,所以浪费了电线,并且使电路工作稳定性不是很高。
在制作PCB时很多电子元件封装没有或是和实物对不上,所以要自己画封装,在制作封装时先使用游标卡尺测量实物的引脚间距,实物的边缘尺寸。
还有焊盘直径和过孔直径,线路的宽度。
由于实验室的PCB制作机器刻刀只有0.2mm,0.3mm,0.6mm,0.7mm,0.8mm,0.9mm,1.0mm,所以为了在刻线时刻刀走宽度的整数倍,所以在画PCB板时线路只能选择0.6mm~1.0mm,起初我认为0.6mm的线因该能够满足我电路的需要,忽视了在后期调试电路板时需要手工改变一些走线,以至于在后期调试电路板时很难再加一些线路。
对我后期完成实验出现了很多困难。
在电子钟调试好后八段数码管只没有用小数点,就在我调试程序准确性的时候王老师要求我们的电子表要对闹钟有控制即有闹钟开关功能和闹钟开关的标志,所以我想用一个数码管的小数点来显示闹钟的开启和关闭状态。
在PCB板上只能飞线。
用单片机的P0.7来接数码管的小数点,连接三根飞线。
在做完PCB后拿到板子才知道自己做的很多封装都和实际不相符合。
尤其是电路板的走线、焊盘大小、线宽度。
一般情况下导线的宽度是0.8mm,焊盘大小是1.4mm,过孔直径是0.8mm。
但在本次实验的时候由于缺乏经验,焊盘太小,导致在焊接元件的时候很困难,有些地方焊盘太小在电烙铁一接触焊盘就掉落。
在封装过孔直径的时候没有测量实际的引脚宽度,导致元件无法插上。
在走线的时候线宽度设置成0.6mm,在板子实际刻出来后导线太细,导致电阻太大,致使信号的稳定度太低或是电阻太大致使信号太弱。
6.附录
附录一用软件校正由中断冲突引起的延时误差
根据中断处理过程,和在中断嵌套的原则,具体思路是在按键的时候不影响电子钟的计时,应为电子钟计时是由定时器0的中断实现的,在默认状态下外部中断优先级比定时器优先级高,所以在软件中设置定时器优先级最高,这样在两个同时申请中断或在响应外部中断的时候定时器申请中断,马上响应定时器中断,这样电子钟走时就会更加准确。
中断处理流程图
由于电子钟的时间误差,消除误差有好几种方法,我采用控制中断优先级的方法来实现电子钟的走时准确。
在程序中我用计时中断来实现电子钟的位选扫描和电子钟的走时。
所以中断有个先后次序。
电子钟的按键也是由外部中断响应的,在设计软件时用定时器0的中断来计时,20mm然后循环50次达到一秒的计时时间。
但是外部中断0的优先级比定时器0的要高,也就是说当定时器0和外部中断同时向cpu申请中断时cpu会先响应外部中断,这样定时器0会等待cpu的中断响应,所以在软件设计中要使计时中断优先级最高,在两个同时申请中断时先响应定时器0的请求。
把定时器中断设置成高级中断,而把外部中断设置成低级中断,中断响应如下图所示,在两个同时申请中断时先响应定时中断,这样就不影响电子钟正常走时。
用软件实现中断优先级设置时使用中断有限设置位
中断优先级控制位
① PS——串行口中断优先级控制位。
② PT1——定时器/计数器T1中断优先级控制位。
③ PX1——外部中断1中断优先级控制位。
④ PT0——定时器/计数器T0中断优先级控制位。
⑤ PX0——外部中断0中断优先级控制位。
在软件中设计中断优先级时实际上就是给优先控制字负值,根据如上所述的控制字要实现所需功能,就给IP幅值0AH,即00001010B。
在实际应用中把IP=0AH写在主函数中,完成程序的误差更改。
把本修给的程序下载到芯片中后让电子钟走时12小时,在没修改以前的12小时误差1min26seco减少到12小时误差48seco,效果不是特别理想。
根据具体的电路和程序分析,总结原因主要如下:
1、电路的晶振不是特别准确,有系统误差。
2、在没有按键的情况下本次做的误差校准是不起作用的,没有从程序的根本上解决问题。
3、分析程序,发现在有中断的情况下每次执行的程序代码是不定的,也就是说程序的执行时间不确定,这也就导致走时不准确。
附录二系统源程序
#include
sbitKEY1=P3^2;
sbitKEY2=P3^3;
sbitKEY3=P3^4;
sbita=P2^3;
sbita1=P3^5;
sbita2=P3^6;
sbitb=P3^7;
sbitled=P1^1;
codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0-9
unsignedcharStrTab[8];//定义缓冲区
unsignedcharminute=59,hour=23,second;//时间定义并且初始化值
unsignedcharminute1=00,hour1=00;//second1;//闹钟定义并且初始化值
unsignedcharflag=0;
unsignedcharnum;
unsignedintcount;
unsignedinth1;
unsignedintflag1=0;
voiddelay(unsignedintcnt)//延时函数
{
while(--cnt);
}
voidplay(void)
{
StrTab[7]=tab[hour/10];//显示正常时间
StrTab[5]=tab[hour%10];
StrTab[1]=0x40;
StrTab[4]=tab[minute/10];
StrTab[3]=tab[minute%10];
StrTab[6]=h1;
StrTab[2]=tab[second/10];
StrTab[0]=tab[second%10];
}
voidnplay(void)
{
StrTab[7]=tab[hour1/10];//显示闹钟时间
StrTab[5]=tab[hour1%10];
StrTab[1]=0x40;
StrTab[4]=tab[minute1/10];
StrTab[3]=tab[minute1%10];
StrTab[6]=h1;
StrTab[2]=tab[0/10];
StrTab[0]=tab[0%10];
}
main()//主函数
{
TMOD=0x01;//定时器012Mcrystal用于计时
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
TMOD=0x10;//定时器1用于动态扫描
TH1=0xF8;
TL1=0xf0;
ET1=1;
TR1=1;
EA=1;
play();
while
(1)//主循环
{
if(!
KEY1)//按键1去抖以及动作
{
delay(10000);
if(!
KEY1)
{
flag++;
}
}
if(flag==1)
{
if(!
KEY2)
{
delay(10000);
if(!
KEY2)
{
hour++;if(hour==24)hour=0;//正常时间小时加1
play();
}
}
if(!
KEY3)
{
delay(10000);
if(!
KEY3)
{
hour--;if(hour==0)hour=23;//正常时间小时减1
play();
}
}
}
if(flag==2)
{
if(!
KEY2)//按键去抖以及动作
{
delay(10000);
if(!
KEY2)
{
minute++;if(minute==60)minute=0;//分加1
play();
}
}
if(!
KEY3)//按键去抖以及动作
{
delay(10000);
if(!
KEY3)
{
minute--;if(minute==0)minute=59;//分减1
play();
}
}
}
if(flag==3)//闹钟对时
{
if(!
KEY2)
{
delay(10000);
if(!
KEY2)
{
hour1++;if(hour1==24)hour1=0;//闹钟时间小时加1
nplay();
}
}
if(!
KEY3)
{
delay(10000);
if(!
KEY3)
{
hour1--;if(hour1==0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)