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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

基于单片机的数字时钟设计实训报告.docx

1、基于单片机的数字时钟设计实训报告摘 要近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善本次做的数字钟是以单片机(AT89C51)为核心,结合相关的元器件(3个2位共阳数码管,一个发光二极管和一个蜂鸣器)和应用程序(proteus软件和KEIL编译软件),构成相应的应用系

2、统。关键词: 单片机 AT89C51 共阳数码管 发光二极管 蜂鸣器 proteus软件 KEIL编译软件 1.课题设计目的 42. AT89C51的单片机简介 42.1 LED显示电路 72.2键盘控制电路 73.课程设计报告内容 83.1.方案设计要求 83.2系统设计流程图 83.3绘制数字时钟电路Protues仿真原理图 93.4运行程序 104.总结 105.数字时钟源程序 10-19数字时钟设计1. 课题设计目的数字电子钟具有走时准确,一钟多用等特点,在生活中已经得到广泛的应用本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89C51芯片和3个两位一体

3、的共阳极的数码管为核心,辅以必要的电路,构成了一个单片机数字时钟。2. AT89C51的单片机简介(一)AT89C51的介绍AT89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多种功能的I/O接口电路等一台计算机所需要的基本功能部件,AT89C51单片机内包含下列几个部件:(1) 一个8位CPU;(2)一个片内振荡器及时钟电路;(3)4K字节ROM程序存储器;(4)128字节RAM数据存储器;(5)两个16位定时器/计数器;(6)可寻址64K外部数据存储器和64K外部程序存储器空间的控制电路;(7)32条可编程的I/O线(四个8位并行I/O端口);(8)一个可编程全

4、双工串行口;(9)具有五个中断源、两个优先级嵌套中断结构。(二) AT89C51单片机的部分管脚说明:AT89C51单片机采用40条引脚双列直插式器件,引脚除5V( 40脚)和电源地( 20脚)外,其功能分为时钟电路、控制信号、输入/输出三大部分,引脚图如下图: Vcc40 电源端;GND20 接地端。工作电压为5V 。 外接晶振引脚晶振连接的内部、外部方式图XTAL119 、XTAL218 :XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率

5、就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。复位RST9常用复位电路图在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。/EA=1 31脚当/EA=1时,访问内部程序存储器,当PC值超过内ROM范围时,自动转执行外部程序存储器的程序;当/EA=0时,只访问外部程序存储器。(三)另外介绍一下输入输出引脚(本系统只用到P0、P1、P2口):

6、(1) P0端口P0.0-P0.7 是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。作为输出口时能驱动8个TTL。对内部Flash程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。(2) P1端口P1.0P1.7是一个带有内部上拉电阻的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收低8位地址信息。(3) P2端口P2.0P2.7是一个带有内部上拉电阻

7、的8位双向I/0端口。输出时可驱动4个TTL。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。2.1 LED显示电路本课程设计用到共阳极数码管通过其引脚图,便可顺利完成其连接。2.3 键盘控制电路通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。按下S1键显示闹钟,松开后显示时间;按下S4键进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢

8、复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。当用手按下一个键时,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也会出现类似的情况,这就是抖动。抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。很容易想到,抖动问题不解决就会引起对闭合键的识别。用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,这之后,再读入键盘码。3.课程设计报告内容3.1.方案设计要求设计制作一个数字时钟,要求能实现基本走时,并以数字形式显示时、分、秒;采用24小时制;能实现校时、校分,定时

9、闹钟的功能,也可以添加其他功能.采用单片机最小系统实现功能。优点:电路简单,能通过程序进行随机调整并扩展功能,成本低,易于实现。缺点:走时有一定的误差。经过综合考虑成本问题以及电路实现问题,选择第三种方案实现设计要求。3.2系统设计流程图如下图所示3.3制数字时钟电路Protues仿真原理图通过S1、S2、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。按下S1键显示闹钟,松开后显示时间;按下S4键进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1

10、恢复正常显示。3.4运行程序 4.总结经过这次单片机课程设计实验,让我获得了很多知识,进一步加深了我对AT89C51单片机的掌握,另外也巩固了我的编程思想和焊接技术. 本次的课程设计,让我发现理论必须用于实践,否则只是一张白纸。此外只有理论水平提高了,才能更好的运用于实践。另外,本次课程设计也考验了我的认真的态度。只有做事拥有认真的态度与科学的方法,才能成功。5.1数字时钟源程序#include#define uchar unsigned charsbit dula=P26;sbit wela=P27;sbit beep=P23;unsigned char j,k,a1,a0,b1,b0,c1

11、,c0,s,f,m,key=10,temp,qq;uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei;unsigned int pp;unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delay(unsigned char i) for(j=i;j0;j-) for(k=125;k0;k-);void display(uchar shi2,uchar shi1,u

12、char fen2,uchar fen1,uchar miao2,uchar miao1) dula=0; P0=tableshi2; dula=1; dula=0; wela=0; P0=0xfe; wela=1; wela=0; delay(5); P0=tableshi1|0x80; dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(5); P0=tablefen2; dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(5); P0=tablefen1|0x80; dula=1; dula=0; P0=

13、0xf7; wela=1; wela=0; delay(5); P0=tablemiao2; dula=1; dula=0; P0=0xef; wela=1; wela=0; delay(5); P0=tablemiao1; dula=1; dula=0; P0=0xdf; wela=1; wela=0; delay(5);void keyscan0() P3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xbb: ok=0; break;

14、case 0x7b: ok=1; break; void keyscan() P3=0xfe; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0; wei+; break; case 0xde: key=1; wei+; break; case 0xbe: key=2; wei+; break; case 0x7e: key=3; wei+; break; while(temp!=0xf0) temp=P3; temp=temp&0xf

15、0; beep=0; beep=1; P3=0xfd; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4; wei+; break; case 0xdd: key=5; wei+; break; case 0xbd: key=6; wei+; break; case 0x7d: key=7; wei+; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; P

16、3=0xfb; temp=P3; temp=temp&0xf0; if(temp!=0xf0) delay(10); if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8; wei+; break; case 0xdb: key=9; wei+; break; while(temp!=0xf0) temp=P3; temp=temp&0xf0; beep=0; beep=1; void main() TMOD=0x01; TH0=(65536-46080)/256;/ 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000

17、微秒发起一次中断。 TL0=(65536-46080)%256;/46080的来历,为50000*11.0592/12 ET0=1; EA=1; while(1) keyscan0(); if(ok=1) TR0=1; wei=0; if(pp=20) pp=0; m+; if(m=60) m=0; f+; if(f=60) f=0; s+; if(s=24) /为24h一个循环,若要12h,只需在此改为12即可。 s=0; a0=s%10; a1=s/10; b0=f%10; b1=f/10; c0=m%10; c1=m/10; display(a1,a0,b1,b0,c1,c0); els

18、e TR0=0; keyscan(); if(key!=10) switch(wei) case 1: if(key3) /小时最高位为2 a1=key; else wei-; break; case 2: if(a1=1|a1=0) a0=key; else if(key5) a0=key; /当小时最高位为2时,低位最高为4 break; case 3: if(key7) /分钟最高位为6 b1=key; else wei-; break; case 4: b0=key; break; case 5: if(key7) /秒最高位为6 c1=key; else wei-; break; case 6: c0=key; break; key=10; m=c1*10+c0; f=b1*10+b0; s=a1*10+a0; display(a1,a0,b1,b0,c1,c0); void time0() interrupt 1 TH0=(65536-46080)/256; TL0=(65536-46080)%256; pp+;

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

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