ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:769.78KB ,
资源ID:28511636      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28511636.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于C语言的Led 数码管显示数字钟.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于C语言的Led 数码管显示数字钟.docx

1、基于C语言的Led 数码管显示数字钟1.引言1.1编写目的(1)巩固和提高学过的基础理论和专业知识;(2)提高运用所学专业知识进行独立思考和综合分析、解决实际问题的能力;(3)培养掌握正确的思维方法和利用软件和硬件解决实际问题的基本技能;(4)增强对实际电路的认识,掌握分析处理方法,进行调试、设计等基本技能的训练,使之具有一定程度的实际工作能力。(5)通过设计数字电子钟,了解电子钟的工作原理和内部构造。(6)学会系统(模块)的测试方法,并根据完整的测试数据对系统(模块)的性能指标做出分析和评价;1.2背景20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有

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

3、在利用proteus软件进行仿真 ,最终设计出PCB,制作出led数码管显示的数字钟。产 品 名 称:led数码管显示数字钟任务提出者: 王全洲设 计 者:王海燕产品运行环境:Keil uVision2、proteus、实物1.3定义(1)单片机:单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。(2)STC89C52单片机:本设计中采用型号为STC89C52的单片机,STC89C52是一个低功耗高

4、性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含6个中断源,3个16位可编程定时计数器,2个全双工串行通信口,片内含8KB的可反复擦写的Flash只读程序存储器(ROM)和256B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-52指令系统,片内置通用8位中央处理器和Flash存储单元。(3)中断:就是当CPU正在执行程序A时,发生了另一个急需处理的事件B,这时CPU暂停当前执行的程序A,立即转去执行处理事件B的程序,处理完事件B后,再返回到程序A继续执行,这个过程被叫做中断。 (4)数码管:分段式显示器(LED数码

5、管)由7条线段围成8字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。LED数码管有共阳、共阴之分。(5)KEIL uVISION2 :是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C 语言的程序设计,它的界面和常用的微软VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。(6)Proteus:Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括IS

6、IS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。1.3参考资料(1)51单片机c语言教程 郭天祥编著 电子工业出版社出版(2)单片机原理与应用及c51程序设计 谢维成、杨加国编著 清华大学出版社出版(3)单片机原理及技术接口技术 北京航空航天大学出版社 北京

7、航空航天大学出版社出版(4) 网络资料2.总体设计2.1开发与运行环境 本设计以C语言为开发语言,在KEIL uVISION2软件平台上进行C程序的编辑,连接和调试,最终与proteus仿真软件相结合,进行相关的电路仿真及修改,最后利用protel dxp软件进行产品的PCB绘制和设计,最终完成电路的焊接和调试,制作出成品。2.2硬件功能描述 此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下:(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-00-00,且控制闹钟状态的的蓝色led灯为亮的状态。 (2)当第一次按下第

8、一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节。(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节。(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节。(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节。(6)当第五次按下第一个弹性按键时返回正常的显示时间走

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

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

11、74LS138 两种线路结构型式,其工作原理如下:当一个选通端(E1)为高电平,另两个选通端(E2)和/(E3))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。 利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。 若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。74HC573具有数据锁存和数据缓冲的功能,做数据锁存时,当输入的数据消失时,在芯片的输出端,数据仍然保持; 做数据缓冲时,可加强驱动能力。同样,74LS244/74LS245/74LS373/74LS573都具备数据缓冲的能力。 四

12、位一体的数码管的引脚图如上所述,将2个四位一体的数码管的A到G的引脚依次相连接,既可作为8位数码管的段选端,将BIT1到BIT4的引脚依次相连接,即可作为8位数码管的位选端。 数码管的段选端控制如上图所示,分别将2个4位一体的数码管A到G引脚相连,构成其段选端,用单片机的P0.0P0.6经74hc573后控制其段选端,使之显示相应的字符。 数码管的位选段控制如上图所示,用单片机的P2.0P2.2经74ls138的38译码器后控制该时刻数码管的哪一位选中,因为74ls138选中时输出为低电平,故数码管采用共阴级的数码管,方便控制和编程。 如上图所示,按键采取独立按键控制方式,用单片机的P3.1P

13、3.3控制3个弹性按键,用以显示时间和闹钟的控制。3.硬件模块描述3.1描述(1)数码管显示部分 数码管显示部分的电路如图所示,单片机的P0口控制8数码管的段选端,决定显示的字符,P0口经过74hc573锁存器后输出数据控制数码管的段选端,74hc573在这里起到锁存数据和增加驱动能力,是数码管亮度增加的作用,此外,单片机P0口做输入/输出端口使用时必须加上拉电阻,一般为1K电阻。单片机的P2.0P2.2经74ls138的38译码器后将译出的数据送入数码管的位选端,控制该时刻数码管的哪一位选中,因为74ls138译出为低电平,故数码管采用共阴级的数码管,方便控制和编程。当然,位选端也可以直接由

14、单片机的P2口控制数码管的8位,但因为数码管显示采用动态扫描方式,数码管循环轮流点亮,采用每个端口控制编写程序比较繁琐,而且浪费端口,故采用38译码器输出。(2)按键扫描控制部分 此部分为按键扫描控制部分 ,用来控制时间的调整、闹钟的设定及闹钟的开启和关闭,因所用的按键较少,故采用独立按键控制方式,且所用按键均为弹性小按键,即按下时为低电平接通,松手时即弹起变为高电平,为了节省输入/输出端口和方便编程,每个按键根据其按的次数有不同的作用。(3)闹钟部分 此部分为闹铃部分,当定时时间到,蜂鸣器发出滴滴的声响,可通过按键关闭或开启,若无手动操作,则响够1分中后自动关闭。(4)闹钟状态指示部分 闹钟

15、指示部分由一只共阳的蓝色led充当,若闹钟在开启状态,则led为亮的状态,若闹钟在关闭状态,led为灭的状态,默认为闹钟开启状态。 总体电路图设计如下3.1功能单片机上电,启动开关后,电源指示灯(红色led)亮,显示初始时间12-00-00,且控制闹钟状态的的蓝色led灯为亮的状态。此时可对显示时间进行调整和进行闹钟的设定。具体做法如下: 当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节。当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时

16、实现分钟的减一调节。当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节。当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节。当第五次按下第一个弹性按键时返回正常的显示时间走时状态。 当定时时间到,蜂鸣器将发出滴滴的闹铃声,此时,若同时按下第二和第三个弹性按键,关闭闹钟,闹钟指示灯(蓝色led)灭,若不手动关闭,则在声音响够1分钟后自动关闭,闹铃不影响正常走时,也可在刚开始就对闹钟的状态进行设置,若刚开始将闹钟关闭,则定时时间到蜂鸣器也不

17、响,闹钟默认为开启状态。 4.嵌入式软件设计4.1流程逻辑 主程序流程图 主程序流程图如下图所示,在主程序中设置定时器定时器0和1工作在方式一,开始循环扫描个按键的状态,检测到该按键按下,则执行相应的程序,其中按键一的按下还有标志位,每次按下标志位都加一,根据标志位的不同可控制是时间的时、分调整,还是闹钟的时、分调整,按键二控制加一调节,按键三控制减一调节,同时按下按键二、三控制闹钟的状态。 N Y N Y N Y Y N 时间显示流程图时间显示流程图如下图所示,定义8个缓冲区,循环扫描数码管的位选状态,将时、分、秒的十位和各位计算显示,其中定时器一用来数码管的动态扫描。 定时器0中断流程图

18、定时器0中断流程图如下图所示,定时器0中断时先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。 Y4.2程序代码(1)初始化及定义部分程序如下#include sbit KEY1=P32;sbit KEY2=P33;sbit KEY3=P34;sbit speak=P23;sbit led=P12;code unsigned char tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned ch

19、ar StrTab8;unsigned char minute=00,hour=12,second;unsigned char minute1=00,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数组中放有0

20、9共阴极数码管显示代码,定义8个缓冲区,用于数码管的动态扫描,初始化显示时间为12-00-00,定义标志位flag,用于标识按键一第几次按下,定义标志位flag1,用于标示闹钟的状态。定义变量num 和count,用于加一和计数。(2)延时子函数void delay(unsigned int cnt) while(-cnt); 实现延时cnt ns的功能。(3)正常时间显示子程序void play(void) StrTab0=tabhour/10; StrTab1=tabhour%10; StrTab2=0x40; StrTab3=tabminute/10; StrTab4=tabminute

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

22、=0x40; StrTab3=tabminute1/10; StrTab4=tabminute1%10; StrTab5=0x40; StrTab6=tab0/10; StrTab7=tab0%10; 原理与正常走时显示相同,只是函数名不同。(5)主程序main() TMOD =0x01;/定时器0 用于计时 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去抖以及动作 dela

23、y(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(!KE

24、Y3) /按键去抖以及动作 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)hour1=23; /闹钟时间 小时 减1 nplay(); if(flag=4) if(!KEY2) /按键去抖以及动作 dela

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

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

27、EY3) flag1+; if(flag1=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 /定时器1用

28、来动态扫描 ,l,l TH1=0xF8;/重入初值 TL1=0xf0; 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; case 7:P2=7;

29、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 1TH0=0x3c;TL0=0xb0;count+; 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; min

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

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