基于LED数码管制作的电子钟C语言设计_第1页
基于LED数码管制作的电子钟C语言设计_第2页
基于LED数码管制作的电子钟C语言设计_第3页
基于LED数码管制作的电子钟C语言设计_第4页
基于LED数码管制作的电子钟C语言设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、led 数 码 管 显 示 数 字 钟 设 计 报 告 作者:王海燕 指导老师:王全洲 报告日期:2011.2.12 目目 录录 1.1. 引言引言.1 1 1.1. 编写目的: .1 1.2. 背景 .1 1.3. 定义 .2 1.4. 参考资料 .4 2.2. 总体设计总体设计.4 4 2.1. 开发与运行环境 .4 2.2. 硬件功能描述 .4 2.3. 硬件结构 .5 3.3. 硬件模块设计硬件模块设计.9 9 3.1. 描述 .9 3.2. 功能 .12 4.4. 嵌入式软件设计嵌入式软件设计.1313 4.1. 流程逻辑 .14 4.2. 程序代码 .17 5.5. 经验总结经验总

2、结.2929 6.6. 附录附录.3434 1 1. 引言引言 1.1 编写目的编写目的 (1)巩固和提高学过的基础理论和专业知识; (2)提高运用所学专业知识进行独立思考和综合分析、解决实际问 题的能力; (3)培养掌握正确的思维方法和利用软件和硬件解决实际问题的基 本技能; (4)增强对实际电路的认识,掌握分析处理方法,进行调试、设计 等基本技能的训练,使之具有一定程度的实际工作能力。 (5)通过设计数字电子钟,了解电子钟的工作原理和内部构造。 (6)学会系统(模块)的测试方法,并根据完整的测试数据对系统 (模块)的性能指标做出分析和评价; 1.2 背景背景 20 世纪末,电子技术获得了飞

3、速的发展,在其推动下,现代 电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的 发展和社会信息化程度的提高。目前,单片机正朝着高性能和多品 种方向发展,发展趋势将进一步向着 cmos 化、低功耗、小体积、大 容量、高性能、低价格和外围电路内装化等几个方面发展。单片机 应用的重要意义在于,它从根本上改变了传统的控制系统设计思想 和设计方法。从前必须由模拟电路或数字电路实现的大部分功能, 现在已能用单片机通过软件方法来实现了。 2 单片机模块中最常见的是数字钟,数字钟是一种用数字电路 技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准 确性和直观性,且无机械装置,具有更更长的使用寿

4、命,因此得到 了广泛的使用。 因此,本设计报告在 keil vision2 环境下调试与编写程序,在 利用 proteus 软件进行仿真 ,最终设计出 pcb,制作出 led 数码管 显示的数字钟。 产 品 名 称:led 数码管显示数字钟 任务提出者: 王全洲 设 计 者:王海燕 产品运行环境:keil uvision2、proteus、实物 1.3 定义定义 (1)单片机:单片机微型计算机简称单片机,特别适用于控制领 域,故又称为微控制器。通常,单片机由单块集成电路芯片构成, 内部包含有计算机的基本功能部件:中央处理器、存储器和 i/o 接 口电路等。因此,单片机只需要和适当的软件及外部设

5、备相结合, 便可成为一个单片机控制系统。 (2)stc89c52 单片机:本设计中采用型号为 stc89c52 的单片 机,stc89c52 是一个低功耗高性能单片机,40 个引脚,32 个外部 双向输入/输出(i/o)端口,同时内含 6 个中断源,3 个 16 位可编 程定时计数器,2 个全双工串行通信口,片内含 8kb 的可反复擦写的 flash 只读程序存储器(rom)和 256b 的随机存取数据存储器 3 (ram) ,器件采用 atmel 公司的高密度、非易失性存储技术生产, 兼容标准 mcs-52 指令系统,片内置通用 8 位中央处理器和 flash 存 储单元。 (3)中断:就是

6、当 cpu 正在执行程序 a 时,发生了另一个急需 处理的事件 b,这时 cpu 暂停当前执行的程序 a,立即转去执行处理 事件 b 的程序,处理完事件 b 后,再返回到程序 a 继续执行,这个 过程被叫做中断。 (4)数码管:分段式显示器(led 数码管)由 7 条线段围成 8 字 型,每一段包含一个发光二极管。外加正向电压时二极管导通,发 出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字 形或符号。led 数码管有共阳、共阴之分。 (5)keil uvision2 :是众多单片机应用开发软件中优秀的软件 之一,它支持众多不同公司的mcs51 架构的芯片,它集编辑,编译, 仿真等于

7、一体,同时还支持,plm,汇编和c 语言的程序设计,它的 界面和常用的微软vc+的界面相似,界面友好,易学易用,在调试 程序,软件仿真方面也有很强大的功能。 (6)proteus:proteus 软件是 labcenter electronics 公司的 一款电路设计与仿真软件,它包括 isis、ares 等软件模块,ares 模块主要用来完成 pcb 的设计,而 isis 模块用来完成电路原理图的 布图与仿真。proteus 的软件仿真基于 vsm 技术,它与其他软件最 大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如 mcs-51 系列、pic 系列等等,以及单片机外围电路,比如

8、键盘、 4 led、lcd 等等。通过 proteus 软件的使用我们能够轻易地获得一个 功能齐全、实用方便的单片机实验室。 1.3 参考资料参考资料 (1)51 单片机 c 语言教程 郭天祥编著 电子工业出版社出版 (2)单片机原理与应用及 c51 程序设计 谢维成、杨加国编著 清 华大学出版社出版 (3)单片机原理及技术接口技术 北京航空航天大学出版社 北 京航空航天大学出版社出版 (4) 网络资料 2. 总体设计总体设计 2.1 开发与运行环境开发与运行环境 本设计以 c 语言为开发语言,在 keil uvision2 软件平台上进 行 c 程序的编辑,连接和调试,最终与 proteus

9、 仿真软件相结合, 进行相关的电路仿真及修改,最后利用 protel dxp 软件进行产品的 pcb 绘制和设计,最终完成电路的焊接和调试,制作出成品。 2.2 硬件功能描述硬件功能描述 此数字钟可实现基本的走时和显示时间时、分、秒;时间的调 整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下: 5 (1)实现基本的走时和显示时间的时、分、秒,上电自动显示 初始时间 12-00-00,且控制闹钟状态的的蓝色 led 灯为亮的状态。 (2)当第一次按下第一个弹性按键时进入时间的调节状态,此 时实现对显示时间的小时调节,按下第二个按键时实现小时的加一 调节,按下第三个按键时实现小时的减一调节。

10、(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状 态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实 现分钟的减一调节。 (4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态, 按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实 现闹钟小时的减一调节。 (5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态, 按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实 现闹钟分钟的减一调节。 (6)当第五次按下第一个弹性按键时返回正常的显示时间走时状 态。 (7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时 蓝色 led 灯为灭,及定时时间到蜂鸣器并不响,

11、若再次同时按下第 二和第三个弹性按键,则开启闹钟,且此时蓝色 led 灯为亮,定时 时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键 即可关闭闹铃。闹铃状态默认为开启。 6 2.3 硬件结构硬件结构 本数字钟显示时间需 8 位,格式为 12- 00 00,因此需采用 8 个 数码管,若采用单独数码管连线时比较麻烦,而市场上无 8 位一体 的数码管,故本数字钟采用 4 位一体的共阴极数码管,其引脚图如 下: 若使 8 个数码管正常显示时间,必须采用数码管的动态扫描方式, 即每一时刻只有一个数码管点亮,采用软件延时和人眼的视觉停留 效果,使人眼看到的数码管是同时点亮的。因此需要用 8 个

12、端口控 制数码管的段选,即决定数码管显示什么字符,8 个端口控制数码 管的位选,即决定该时刻让哪个数码管点亮。考虑到数码管采用动 态扫描方式,即循环扫描数码管的 8 位,并将显示字符送入段选段, 为了节省单片机的输入/输出端口和易于程序的编写,采取直接用 p0 口控制数码管的 8 个段选位,其中数码管的小数点控制位 dp 不用可 直接悬空,为了增加其驱动能力使数码管显示更亮,在此加入 74ls573,有锁存数据和增加驱动的作用。利用 p2.0 p2.2 口接一个 74ls138 的 3 8 译码器控制数码管的位选端。 7 74ls138 为 3 线8 线译码器,共有 54/74s138 和 5

13、4/7 4ls138 两种线路结构型式 ,其工作原理如下: 当一个选通端( e1)为高电平,另两个选通端( e2)和/(e3) )为低电平时,可将地址端( a、b、c)的二进制编码在一个对 应的输出端以低电平译出。 利用 e1、e2 和 e3 可级联扩展成 2 4 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。 若将选通端中的一个作为数据输入端时, 74ls138 还可作数据分 配器。 74hc573具有数据锁存和数据缓冲的功能,做数据锁存时,当输 入的数据消失时,在芯片的输出端,数据仍然保持; 做数据缓冲时,可 8 加强驱动能力。同样,74ls244/74ls245/74ls37

14、3/74ls573都具备数 据缓冲的能力。 四位一体的数码管的引脚图如上所述,将 2 个四位一体的数 码管的 a 到 g 的引脚依次相连接,既可作为 8 位数码管的段选端, 将 bit1 到 bit4 的引脚依次相连接,即可作为 8 位数码管的位选端。 数码管的段选端控制如上图所示,分别将 2 个 4 位一体的数码 9 管 a 到 g 引脚相连,构成其段选端,用单片机的 p0.0p0.6 经 74hc573 后控制其段选端,使之显示相应的字符。 数码管的位选段控制如上图所示,用单片机的 p2.0p2.2 经 74ls138 的 38 译码器后控制该时刻数码管的哪一位选中,因为 74ls138

15、选中时输出为低电平,故数码管采用共阴级的数码管,方 便控制和编程。 如上图所示,按键采取独立按键控制方式,用单片机的 p3.1p3.3 控制 3 个弹性按键,用以显示时间和闹钟的控制。 3. 硬件模块描述硬件模块描述 3.1 描述描述 (1)数码管显示部分 10 数码管显示部分的电路如图所示,单片机的 p0 口控制 8 数码 管的段选端,决定显示的字符,p0 口经过 74hc573 锁存器后输出数 据控制数码管的段选端,74hc573 在这里起到锁存数据和增加驱动 能力,是数码管亮度增加的作用,此外,单片机 p0 口做输入/输出 端口使用时必须加上拉电阻,一般为 1k 电阻。单片机的 p2.0

16、p2.2 经 74ls138 的 38 译码器后将译出的数据送入数码管的位选端,控 制该时刻数码管的哪一位选中,因为 74ls138 译出为低电平,故数 码管采用共阴级的数码管,方便控制和编程。当然,位选端也可以 直接由单片机的 p2 口控制数码管的 8 位,但因为数码管显示采用动 态扫描方式,数码管循环轮流点亮,采用每个端口控制编写程序比 较繁琐,而且浪费端口,故采用 38 译码器输出。 (2)按键扫描控制部分 11 此部分为按键扫描控制部分 ,用来控制时间的调整、闹钟 的设定及闹钟的开启和关闭,因所用的按键较少,故采用独立按键 控制方式,且所用按键均为弹性小按键,即按下时为低电平接通, 松

17、手时即弹起变为高电平,为了节省输入/输出端口和方便编程,每 个按键根据其按的次数有不同的作用。 (3)闹钟部分 此部分为闹铃部分,当定时时间到,蜂鸣器发出滴滴的声响, 可通过按键关闭或开启,若无手动操作,则响够 1 分中后自动关闭。 (4)闹钟状态指示部分 闹钟指示部分由一只共阳的蓝色 led 充当,若闹钟在开启状 12 态,则 led 为亮的状态,若闹钟在关闭状态,led 为灭的状态,默 认为闹钟开启状态。 总体电路图设计如下 3.1 功能功能 单片机上电,启动开关后,电源指示灯(红色 led)亮,显 示初始时间 12-00-00,且控制闹钟状态的的蓝色 led 灯为亮的状态。 此时可对显示

18、时间进行调整和进行闹钟的设定。具体做法如下: 当第一次按下第一个弹性按键时进入时间的调节状态,此时实 现对显示时间的小时调节,按下第二个按键时实现小时的加一调节, 按下第三个按键时实现小时的减一调节。 当第二次按下第一个弹性按键时进入显示时间的分钟调节状态, 按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分 钟的减一调节。 当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按 13 下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现 闹钟小时的减一调节。 当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按 下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现 闹钟

19、分钟的减一调节。 当第五次按下第一个弹性按键时返回正常的显示时间走时状态。 当定时时间到,蜂鸣器将发出滴滴的闹铃声,此时,若同时按 下第二和第三个弹性按键,关闭闹钟,闹钟指示灯(蓝色 led)灭, 若不手动关闭,则在声音响够 1 分钟后自动关闭,闹铃不影响正常 走时,也可在刚开始就对闹钟的状态进行设置,若刚开始将闹钟关 闭,则定时时间到蜂鸣器也不响,闹钟默认为开启状态。 4. 嵌入式软件设计嵌入式软件设计 4.1 流程逻辑流程逻辑 主程序流程图 主程序流程图如下图所示,在主程序中设置定时器定时器 0 和 1 工作在方式一,开始循环扫描个按键的状态,检测到该按键按 下,则执行相应的程序,其中按键

20、一的按下还有标志位,每次按下 标志位都加一,根据标志位的不同可控制是时间的时、分调整,还 是闹钟的时、分调整,按键二控制加一调节,按键三控制减一调节, 14 同时按下按键二、三控制闹钟的状态。 n y n y n y y n 第三个按键是否按下 开 始 设置定时器初值,开启定时器 循环扫描检测按键状态 第一个按键是否按下 标志位加一,进入调整状态 第二个按键是否按下 小时/分钟加一调整 小时/分钟减一调整 第二、三个键是否同时按 下 控制闹钟的开/关 15 时间显示流程图 时间显示流程图如下图所示,定义 8 个缓冲区,循环扫描 数码管的位选状态,将时、分、秒的十位和各位计算显示,其中定 时器一

21、用来数码管的动态扫描。 时十位计算显示 结束 开始 秒个位计算显示 秒十位计算显示 分个位计算显示 分十位计算显示 时个位计算显示 16 定时器 0 中断流程图 定时器 0 中断流程图如下图所示,定时器 0 中断时先检 测 1 秒是否到,1 秒如果到,秒单元就加 1;如果没到,就检测 1 分 钟是否到,1 分钟如果到,分单元就加 1;如果没到,就检测 1 小时 是否到,1 小时如果到,时单元就加 1,如果没到,就显示时间。 y n 24 小时到? 分单元清零,时单元加 1 n n n y y 时单元清零 时间显示 中断返回 开始 一秒时间到? 60 秒时间到? 60 分钟到? 秒单元加 1 秒

22、单元清零,分单元加 1 y 17 4.2 程序代码程序代码 (1)初始化及定义部分程序如下 #include sbit key1=p32; sbit key2=p33; sbit key3=p34; sbit speak=p23; sbit led=p12; code unsigned char tab=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; unsigned char strtab8; unsigned char minute=00,hour=12,second; unsigned char minute1=0

23、0,hour1=00; second1; unsigned char flag=0; unsigned char num; unsigned int count; unsigned int flag1=0; 此部分程序定义单片机 p3.2 口为 key1,p3.3 口为 key1,p3.4 口为 key1,分别接三个弹性小按键,用于按键扫描, p2.3 口为 speak,接蜂鸣器,用于闹铃,p1.2 口为 led,接蓝色 led,用于指示闹钟的开/关状态,tab数组中放有 09 共阴极数码 管显示代码,定义 8 个缓冲区,用于数码管的动态扫描,初始化显 示时间为 12-00-00,定义标志位

24、flag,用于标识按键一第几次按下, 定义标志位 flag1,用于标示闹钟的状态。定义变量 num 和 count,用于加一和计数。 18 (2)延时子函数 void delay(unsigned int cnt) while(-cnt); 实现延时 cnt ns 的功能。 (3)正常时间显示子程序 void play(void) strtab0=tabhour/10; strtab1=tabhour%10; strtab2=0 x40; strtab3=tabminute/10; strtab4=tabminute%10; strtab5=0 x40; strtab6=tabsecond/1

25、0; strtab7=tabsecond%10; 用于显示正常的走时,显示格式为 12-00-00,取小时的十 位放在第一个数码管缓冲区,取小时的个位放在第二个数码管缓冲 区, 第三个数码管缓冲区放入字符“”,取分钟的十位放在第四个数 码管缓冲区,取分钟的个位放在第五个数码管缓冲区,第六个数码 管缓冲区放入字符“”,取秒的十位放在第七个数码管缓冲区, 取秒的个位放在第八个数码管缓冲区。 19 (4)闹钟时间显示 void nplay(void) strtab0=tabhour1/10; strtab1=tabhour1%10; strtab2=0 x40; strtab3=tabminute1

26、/10; strtab4=tabminute1%10; strtab5=0 x40; strtab6=tab0/10; strtab7=tab0%10; 原理与正常走时显示相同,只是函数名不同。 (5)主程序 main() tmod =0 x01;/定时器 0 用于计时 th0=0 x3c; tl0=0 xb0; et0=1; tr0=1; tmod =0 x10; /定时器 1 用于动态扫描 th1=0 xf8; tl1=0 xf0; et1=1; tr1=1; ea =1; play(); while(1)/主循环 20 if(!key1) /按键 1 去抖以及动作 delay(10000

27、); 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(); 21 if(flag=2) if(!key2) /按键去抖以及动作 delay(10000); if(!key2) minute+;if(minute=60)minute=0;/分加 1 play(); if(!key

28、3) /按键去抖以及动作 delay(10000); if(!key3) minute-;if(minute=0)minute=59; /分减 1 play(); if(flag=3) /闹钟对时 if(!key2) delay(10000); if(!key2) 22 hour1+;if(hour1=24)hour1=0; /闹钟时间 小时 加 1 nplay(); if(!key3) delay(10000); if(!key3) hour1-;if(hour1=0)hour1=23; /闹钟时间 小时 减 1 nplay(); if(flag=4) if(!key2) /按键去抖以及动作

29、 delay(10000); if(!key2) minute1+;if(minute1=60)minute1=0;/闹钟分加 1 nplay(); if(!key3) /按键去抖以及动作 delay(10000); 23 if(!key3) minute1-;if(minute1=0)minute1=59; /闹钟分减 1 nplay(); 此部分程序用来对定时器设置初值和按键扫描,定时器 0 和 1 都工作在方式 1,定时器 0 用于计时,计时时间为 50ms,定时器 1 用于数码管动态扫描,即使时间为 10ms,设置定时器初值和开启定 时器后,调用显示时间子程序进行显示,同时不断循环扫描

30、按键的 状态,其中,按键一每按下一次,标志位加一,第一次按下时,标 志位为一,标志进入显示时间小时的调节,此时若检测到按键 2 按 下,则进行加一调节,若检测到按键 3 按下,则进行减一调节,若 无则继续扫描,标志位为 2 时指示显示时间分钟的调节,标志位为 3 时指示闹钟小时的调节,标志位为 4 时指示闹钟分钟的调节。其 中,按键加入延时 10ms 的去抖动程序,当标志为为 5 时重新赋值标 志位为 0 。在进行显示时间和闹钟显示时调用相应的响应子程序。 (6)闹钟控制子程序 void nz() if(minute=minute1 else speak=1; if(!key2 if(flag

31、1=1) led=0; else led=1; if(flag1=2) flag1=0; if(flag=5) flag=0; 此本分程序为闹钟控制子程序,当正常走时的分和闹钟的分、 正常走时的时和闹钟的时相等且闹钟标志位为 0 时,蜂鸣器发出滴 滴的响声,否则蜂鸣器不发声。此外还加了闹钟状态标志位 flag1,初值为 0,标志着闹钟开启。当按键 2 和 3 同时按下时,标 志位加一,且 led 给低电平,即 led 灭,标志着闹钟关闭,否则 led 亮。当 flag1 为 2 时,重新赋值为 0. (7)定时中断 1 子程序 void time1_isr(void) interrupt 3

32、/定时器 1 用来动态扫描 ,l,l 25 th1=0 xf8;/重入初值 tl1=0 xf0; switch (num) case 0:p2=0;p0=strtabnum;break; /分别调用缓冲区的值进行扫描 case 1:p2=1;p0=strtabnum;break; case 2:p2=2;p0=strtabnum;break; case 3:p2=3;p0=strtabnum;break; case 4:p2=4;p0=strtabnum;break; case 5:p2=5;p0=strtabnum;break; case 6:p2=6;p0=strtabnum;break;

33、 case 7:p2=7;p0=strtabnum;break; default:break; nz(); num+; /扫描 8 次,使用 8 个数码管 if(num=8) num=0; 此部分为定时器 1 动态扫描数码管子程序,定时器 1 重新赋初 值,定时时间 10ms,利用 case 语句进行循环动态扫描,给数码管 相应的位送入相应的段码,完成数码管的动态扫描显示,且在定时 器 1 中调用闹钟子程序,不断检测闹钟时间是否到。 (8)定时中断 0 子程序 void tim(void) interrupt 1 /using 1 th0=0 x3c; tl0=0 xb0; count+; 2

34、6 switch (count) case 0: case 20: if(flag=1 | flag=2 | flag=0) /隔一定时间调用显示处 理 play(); break; case 40: if(flag=3 | flag=4) nplay(); break; case 60: case 80: default:break; if (count=159) count=0; second+;/秒加 1 if(second=60) second=0; minute+; /分加 1 if(minute=60) minute=0; hour+; /时加 1 if(hour=24) hour

35、=0; 此部分程序为定时器 0 中断子程序,对定时器重新赋初值,完成 50ms 的计时,当秒加到 60 时,秒清零分加一,当分加到 60 时,分 清零小时加一,当小时加到 24 时,小时清零,依次循环。 27 proteus 仿真结果如下 此图为在 proteus 软件下仿真的数字钟正常走时下的画面。 实物设计如下 28 此图为 pcb 绘制刻板后完成的实物图 绘制的电路 pcb 图如下 此图为在 protel dxp 软件下绘制的电路 pcb 图 pcb 印制电路图如下 29 此图为刻出的 pcb 印制板电路实物图 5.经验总结经验总结 led 数码管显示的数字钟是单片机中的经典系统模块,可

36、以 说掌握了其基本原理就基本掌握了单片机的知识。自己也从这次 的制作中收获不少,从最初的程序代码编写,到仿真调试,到 pcb 的绘制,再到最终的元件焊接和实物调试,每一个环节都让 我有所收获。 先是程序代码的编写,刚开始时采用最基本的 p0 口控制段 选,p2 口控制位选,6 个独立按键分别控制秒、分、时的加一和 减一。编写程序时虽然简单易懂,但比较繁琐,且浪费的端口较 多,而且在后面加了闹钟的调节后,编写程序显得非常麻烦,故 30 又重新换了方案,位选端通过 74ls138 的 38 译码器控制,这 样在数码管动态扫描是方便编程,且节省了端口,按键控制部分 也改为 3 个独立按键,且引进了标

37、志位,用来标识时间时、分调 整和闹钟时、分调整,这样不仅节省了端口,而且方便编程。编 写程序时,刚开始想着不借助别人的思想,自己试着编,但发现 自己有很多知识和思想都很匮乏,遇到了好多问题,最终都无法 解决,后来在网上搜了很多别人的数字钟设计方案,发现用汇编 编程的设计远大于用 c 语言编程的,汇编语言主要优点是占用资 源少、程序执行效率高。但是不同的 cpu,其汇编语言可能有所 差异,所以不易移植。 c 语言是一种结构化的高级语言。其优点 是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是 占用资源较多,执行效率没有汇编高,就个人认为,刚开始学单 片机时对汇编有所了解有助于更好的了解单

38、片机的内部结构,学 习 c 语言时上手也比较快。通过对数字钟程序的编写,我对单片 机定时器的应用有了很好的掌握,对数字钟的设计流程和思想也 有了较好的认识。同时也让我认识到,不依靠别人的思想和已有 的知识去创造是不可能实现的,只有在有一定的知识基础,借鉴 别人的思想,再加入自己的思想去创新才是有效可行的。程序的 编写我是和 proteus 仿真相结合完成的,可根据仿真的结果修改 程序,proteus 仿真软件虽然很强大,但毕竟和实际调试还是有 一定的差距的,我在仿真时发现在按键防抖动这部分仿真软件处 理的不是很好,同样的程序,用软件延时 10ms 去抖动,在仿真 31 时,调整时间时点一次按键

39、,有时会增加或减少几个数,很不稳 定,而将程序下载到开发板上运行时,防抖动程序完全合适,按 一次按键只增加或减少一个数。而且在仿真时,不用加驱动电路, 不用考虑各部分驱动能力和一些保护电路,因此,仿真软件只能 用来检测程序是否合适,至于一些细节问题还要自己在实际中解 决。 程序编写合适后,就是 pcb 的绘制,在绘制 pcb 时我采用了 orcad 软件,但无论怎么布局,所用到的芯片 74ls138 和 74ls573 总是会有一个布不通,需要跑飞线,此外还有 3 根飞线, 听着别人布通了而且只有 1/2 根飞线,心里真的挺着急的。用 orcad 画 pcb 的另外几个人也没合适,本想着让他们

40、帮忙,但他 们自己的还没合适根本无暇顾及我,任庆的电路图中也采用了 74ls138 和 74ls573,他的情况和我一样,也是 2 个芯片中有一 个芯片布不通,第二天就要刻板子了,情急之下我将王鹏绘制的 pcb 刻了一块。后来任庆把之前的问题也解决了,他在绘制时直 接把 74ls73 和电路断开,在布不通的地方全部加了插槽,等图 刻出来后全部借上杜邦线就可以了。通过这件事,我认识到自己 在绘制 pcb 方面还有很多的缺陷,要在以后好好补一补这一块, 而且自己没有耐心,遇到困难认为解决不了就退缩了,其实只要 肯动脑,总会想出解决办法的。因为是我们第一次刻板子,大家 也没什么经验,基本都是用自动布

41、线,在布线时只想着将全部的 线全部布通,尽量不要有飞线,对于以后的焊接问题基本没有考 32 虑,因此有的同学出现了焊孔间距不合适,焊盘太小,铜线太细 及铜线比较密集,四周没有留下空余的地方等问题,给后面的焊 接元件和调试带来了不便。由于 pcb 不是自己亲自绘制的,我也 只是在焊接元件和调试时才发现了问题,首先是焊接时焊盘很小, 一定要有很高的焊接技术,且一定要细心,否则一不留神就会与 地相连,而且焊完一个要及时检查,否则最后全部焊完后很难检 查出问题。自己刚拿到板子准备焊元件时,心里挺紧张的,对自 己的焊接技术很没信心,而越怕出错就越会出错,平均焊 6 了引 脚就会焊坏一个引脚,只能用吸锡枪

42、吸了重焊,后来放松了心态, 焊起来才比较得心应手,其实有时候心态决定成败,遇到事情不 要先被自己打到了,无论多大的困难以一颗平常心对待就好了。 在焊接时,为了用刀片刮掉残留在引脚的一点点焊锡,不下心刮 断了一根铜线,不过后来又用焊锡点好了。在之前的焊接中,我 一直不喜欢用尖头烙铁,觉得尖头烙铁不好焊接,所以一直采用 扁头的烙铁,但这次的焊盘都非常的小,用扁头烙铁很容易焊坏, 不得不采用尖头烙铁。因此,我认识到有些东西不是你不喜欢就 可以永远排斥它的,不要由着自己的性子轻易地排斥什么,任何 东西都有它的使用价值。有些事情也不是你不喜欢就可以按你喜 欢的方式发展的,也不会因为你不喜欢就永远不会发生

43、,当我们 无法改变环境时我们只能改变自己。 元件焊接完成,焊接好飞线后,检查完电路没有问题,但是 上电后发现数码管根本不亮,测量加到单片机上的电压为 4.3 伏, 33 这说明单片机上是加上电压,单片机是工作的。于是便用万用表 检查了数码管的好坏,数码管是可以点亮,元件是没有问题的。 但是数码管却没加上电压,便猜想是驱动芯片的问题。因为在买 元件时想增大其驱动能力,故将原图中 18 引脚的 74ls573 换成 了 20 引脚的单片机专用驱动芯片 uln2003,绘制 pcb 时也用的是 uln2003 芯片。我便将仿真电路中的 74ls573 换成了 una2003, 发现数码管确实不显示,

44、而且输入 uln2003 的电平并未输出,由 此可见 uln2003 也没有正常工作。在网上查资料时才发现 uln2003 正常工作电压为 12v,而单片机正常工作电压为 5v,故 驱动芯片并未工作。因为 uln2003 和 74ls573 的引脚数目和功能 并不相同,硬件和软件都无法更改,只能将 uln2003 芯片不接, 而直接用导线短接,相当于 p0 口直接接到数码管的段选端,这 样虽然数码管的亮度不是很好,但能正常工作了。但数码管显示 的时间并不正常,为秒的个位、符号“-” 、小时的个位、分的个 位、分的十位、秒的十位、符号“-” 、小时的十位。再确认线未 连接错误后,仔细查看了原理图

45、,才发现在网上找的四位一体的 数码管引脚图有误,致使数码管的位选段接线错误,因此,只能 在程序上改正。只需将数码管的位选顺序改变即可。因此,将程 序中的正常走时和闹钟程序改为如下即可: 原程序: strtab0=tabhour1/10; strtab1=tabhour1%10; strtab2=0 x40; strtab3=tabminute1/10; 34 strtab4=tabminute1%10; strtab5=0 x40; strtab6=tabsecond/10; strtab7=tabsecond%10; 修改后的程序: strtab7=tabhour/10; strtab5=t

46、abhour%10; strtab1=0 x40; strtab4=tabminute/10; strtab3=tabminute%10; strtab6=0 x40; strtab2=tabsecond/10; strtab0=tabsecond%10; 修改后则运行正常。后来又添加了闹钟的关闭和其状态标志, 因此在原有的pcb板子上又打了2个钻孔,用刀片刻了焊盘,从单片 机的p1.2口接上蓝色的led,加上程序后便可完成。刚开始时,以为 pcb刻出来硬件电路就算是定下来,无法修改了,压根没想到用刀片 刻焊盘,在别人指点下在恍然大悟。任何东西都不是一成不变的, 关键是要动脑去改造它。最后数字

47、钟终于正常工作了,在此次制作 中,自己真的收获很大,但同时也看清了自己的不足,pcb方面的欠 缺及自己缺乏创新的勇气,遇到困难便失去了信心,而不是开动自 己的大脑去寻找办法,以后一定要加以改正。 6.附录附录 用软件方法如何消除单片机的时间误差: 用单片机做的数字钟,由于软件和硬件的原因,总会出现走时 误差误差,电子钟的走时误差 s=s1-s2,s1 表示程序实际运行计算所 得的秒;s2 表示客观时间的标准秒。s0 时表示电子钟秒单元数值 35 刷新滞后,即走时误差为“慢”;反之,s0 表示秒单元数值的刷 新超前,即走时误差为“快”。 一个常规电子计时器的计时准确度,取决于晶振标称频率 (fs

48、)与实际频率(fo)的频率偏差和晶振频率的时漂、温漂等离 散参数。普通晶振的实际频率与标称频率有较大的偏差,可达万分 之五(万分之 5),折算到一天计时误差就是 43.2s。每天 10左 右,对应。因此电子计时器的误差主要取决于晶振实际频率与标称 频率的偏差。 本次设计的单片机电子钟系统中,其误差主要来源包括晶体频 率误差,定时器溢出误差,延迟误差。晶体频率产生震荡,容易产 生走时误差;定时器溢出的时间误差,本应这一秒溢出,但却在下 一秒溢出,造成走时误差;延迟时间过长或过短,都会造成与基准 时间产生偏差,造成走时误差。 减少走时误差的方法有如下几种: 1.硬件方法 对于纯硬件计时电路,因分频系数 n 固定不变,要提高计时准确 度只能调整 fo,使得已尽可能接近于 fs。常规减少计时误差的方法 是:微调元件 l、c、r 的参数,调节硬件频率,使得时钟源的频率 误差减小。但此方法操作复杂,没有一定的电子技术知识和专用仪 器很难校准,而且会降低晶振频率稳定度。 2 .纯软件方法 36 由微控制器控制的实时时钟,可以采用软件的方法消除晶振实 际频率与标称频率间误差引起的计时误差。 3.测量晶振实际长期振荡频率 以标称频率下的定时计数值 ns 作为实际计数值,在电台报时 时将时间设置正确,然后让它运行一段较长的时间,再与电台的报 时比较求出误差的秒数,即可算出实际频

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论