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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数码管万年历实习报告.docx

1、数码管万年历实习报告河南机电高等专科学校综合实训报告系 部: 专 业: 班 级: 学生姓名: 学 号: 2013年 6月 28日实训任务书1时间:2013年6月15日2013年6月28日2. 实训单位:河南机电高等专科学校3. 实训目的:深入学习电子产品设计制作的全过程4. 实训任务:加深学习电路图绘制软件的相关常识及其特点;以51单片机为核心设计出一个LED万年历;万年历具有年份、月、日、时、分、秒、周、温度、整点报时等功能;自己独立完成设计电路图,生成PCB,转印、腐蚀电路板,焊接等硬件制作工作;会使用keil软件编写程序,并完成烧写过程;学会调试程序,敢于发现问题,解决问题;参考相关的的

2、书籍、资料,认真完成实训报告。综合实训报告前言: 万年历是我们经常见到和使用的计时工具,使用方便,功能多。但自己做一个让人满意的万年历,就不一定有那么轻而易举了,本次实训的任务就是自己亲手做一个万年历。利用本学期学过的单片机知识,设计出具有显示年、月、日、时、分、秒、周、温度功能,同时有整点报时的功能的万年历。一、实训器件1.温度传感器DS18B20 采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。因此,本设计DS18

3、B20温度传感器作为温度采集模块。2.时钟芯片DS1302采用DS1302时钟芯片实现时钟,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个318的用于临时性存放数据的RAM寄存器。具有主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。因此,本设计中采用DS1302提供时钟。3.74LS15474LS1

4、54 为 4 线16 线译码器,其主要电特性的典型值如下:当选通端(G1、G2)均为低电平时,可将地址端(ABCD)的二进制编码在一个对应的输出端,以低电平译出。若将G1和G2中的一个作为数据输入端,由ABCD对输出寻址,54/74154 还可作4线16线数据分配器。引出端符号: A、B、C、D 译码地址输入端(低电平有效) G1、G2 选通端(低电平有效) 015 输出端(低电平有效)可用此种芯片作为数码管的选址芯片。4.74HC57374HC573是八进制3态非反转透明锁存器,是高性能硅门CMOS器件。 当锁存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低

5、时,符合建立时间和保持时间的数据会被锁存。输出能直接接到 CMOS,NMOS和 TTL接口上操作电压范围:2.0V6.0V低输入电流: 1.0uA 。本实训采用此芯片作为数码管的驱动芯片。5.数码管本实训使用共阴极数码管作为显示器件,采用 LED 数码管动态扫描,LED 数码管价格适中,对于显示数字也最合适。 综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用AT89S51作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;74LS154作为选址芯片;74HC573作为数码管的驱动芯片;共阴极数码管显示数字;S8550驱动扬声器。二、实训原理为了使万年历在包装美

6、化时简单化及布线的方便,我将万年历分为两部分,一部分是主体部分含有年份、月、日、时、分、秒,另一部分是小模块包含周、温度。电路图如下:主电路图:主电路PCB:周,温度电路图: 周,温度PCB:三、程序编写使用Keil软件编写程序。程序包括主函数、时间显示函数、温度显示函数、时间调整函数、DS18B20模块、DS1302模块和周计算函数等。程序的编写使我熟练的掌握了Keil软件的应用。具体程序见附录。四、程序的烧写与调试 程序烧写需要用专用的烧写软件将Keil软件声生成的.hex文件写进单片机里。经过多次的程序的改写与调试,最终制作出比较满意的成品。五、成品展示:心得体会:经过此次实训我学到了很

7、多,刚开始以为做万年历很难,着手开始做这个产品没有一点头绪,经过上网查资料,产生了最初的制作框架,然后就开始找芯片,查芯片资料,设计电路图,又请同学帮忙指点,修改原理图。接着买元器件,做封装,生成PCB,制作电路板,焊接元器件,最后完成了整个硬件部分的制作。完成了硬件制作后,我又编了测试软件测试硬件是否有问题,发现数码管不亮,经过问题排查及资料查询,发现单片机P0口缺少了上拉电阻,接上后,解决了问题。编程也是比较困难的,由于掌握的知识不够多,借鉴了别人的程序,并加入自己的想法,经过调试,程序编写成功。最终完成了产品的制作。在实习的过程中我得到了别人的帮助,同时也主动帮助别人,得到了很多经验,为

8、以后学习提供了方便。实习就是学习的过程,本次实习是最成功的一次,也是学到最多的一次。参考文献:单片机C51程序设计教程与实验 北京航空航天大学出版社单片机原理及应用(C51语言) 清华大学出版社数字电子技术 黄河水利出版社Protel DXP 2004电路设计与仿真教程 北京航空航天大学出版社附录:程序万年历.c#include#include#define uchar unsigned char#define uint unsigned intuchar code digit=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x39,0x0

9、0; uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n; uchar count=0; sbit SET=P34; sbit ADD=P35; /增加 sbit RED=P36; /减小 sbit CANL=P37;sbit le=P26;sbit oe=P27;sbit en=P14; sbit beep=P24; uchar GetWeekFromDay(uchar years,uchar months,uchar days); void WriteSet1302(uchar cmd,uchar date)

10、; uchar ReadSet1302(uchar cmd); void ReadyreadDS18B20(void); uchar ReadDS18B20(void); void IntDS1302(void); void delay1ms( uint x) uchar i,j; for(i=x;i0;i-) for(j=124;j0;j-);void delaynus(uchar n) /延时若干微秒 while(n-); void display_Year(year) /显示年 uchar i,j; i=year/10; j=year%10; P0=digit2; P1=8; delay

11、1ms(2); P0=digit0; P1=9; delay1ms(2); P0=digiti; P1=10; delay1ms(2); P0=digitj; P1=11; delay1ms(1);void display_Month(month) /显示月 uchar i,j; i=month/10; j=month%10; P0=digiti; P1=6; delay1ms(2); P0=digitj; P1=7; delay1ms(1);void display_Day(day) /显示日 uchar i,j; i=day/10; j=day%10; P0=digiti; P1=4; d

12、elay1ms(2); P0=digitj; P1=5; delay1ms(1);void display_Hour(hour) /显示时 uchar i,j; i=hour/10; j=hour%10; P0=digiti; P1=2; delay1ms(2); P0=digitj+n*0x80; P1=3; delay1ms(1);void display_Minute(minute) /显示分 uchar i,j; i=minute/10; j=minute%10; P0=digiti; P1=0; delay1ms(2); P0=digitj; P1=1; delay1ms(1); v

13、oid display_Week(void) /显示周 WEEK=GetWeekFromDay(years,months,days); P1=12; switch(WEEK) case 1:P0=digit1; delay1ms(2); break; case 2:P0=digit2 ; delay1ms(2); break; case 3:P0=digit3; delay1ms(2); break; case 4:P0=digit4; delay1ms(2); break; case 5:P0=digit5; delay1ms(2); break; case 6:P0=digit6; del

14、ay1ms(2); break; case 7:P0=digit8; delay1ms(2); break; void display_Time(void) /显示实时时间 uchar value; value=ReadSet1302(0x83); minutes=(value&0x70)4)*10+(value&0x0f); display_Minute(minutes); value=ReadSet1302(0x85); hours=(value&0x70)4)*10+(value&0x0f); display_Hour(hours); value=ReadSet1302(0x87); d

15、ays=(value&0x70)4)*10+(value&0x0f); display_Day(days); value=ReadSet1302(0x89); months=(value&0x70)4)*10+(value&0x0f); display_Month(months); value=ReadSet1302(0x8D); years=(value&0xf0)4)*10+(value&0x0f); display_Year(years); display_Week();/*时间调整部分*/ void hourset(void) /调时 uchar timevalue,hour; del

16、ay1ms(500); /防止多次触发 WriteSet1302(0x8e,0x00);/将写保护去掉,确保能正常将调整后的数值写入DS1302 timevalue=ReadSet1302(0x85); /读取此时的数值 hour=(timevalue&0x70)4)*10+(timevalue&0x0f); while(1) if(ADD=0) delay1ms(20); if(ADD=0) hour+; delay1ms(100); while(ADD=0); if(RED=0) delay1ms(20); if(RED=0) hour-; delay1ms(100); if(hour=0

17、) hour=23; while(RED=0); if(hour=24) hour=0; timevalue=(hour)/10)4)*10+(timevalue&0x0f); while(1) if(ADD=0) delay1ms(20); if(ADD=0) minute+; if(minute=60) timevalue=0; while(ADD=0); if(RED=0) delay1ms(10); if(RED=0) minute-; if(minute=0) minute=59; delay1ms(300); while(RED=0); if(minute=60) minute=0

18、; timevalue=(minute/10)4)*10+(datevalue&0x0f); while(1) if(ADD=0) delay1ms(20); if(ADD=0) year+; while(ADD=0); if(RED=0) delay1ms(20); if(RED=0) year-; delay1ms(100); while(RED=0); datevalue=(year/10)4)*10+(datevalue&0x0f); while(1) if(ADD=0) delay1ms(20); if(ADD=0) month+; if(month12) month=1; whil

19、e(ADD=0); if(RED=0) delay1ms(20); if(RED=0) month-; delay1ms(100); if(month=0) month=12; while(RED=0); datevalue=(month/10)4)*10+(datevalue&0x0f); while(1) if(ADD=0) delay1ms(10); if(ADD=0) day+; if(day31) day=1; while(ADD=0); if(RED=0) delay1ms(10); if(RED=0) if(day=0) day=31; day-; delay1ms(300); while(RED=0); datevalue=(day/10)255) TH+=1; TN=TH*16+TL/16; TN=TH*16+TL/16; Display_Integer(TN); /* 设置模块 */ void Set(void) if(SET=0) delay1ms(5); if(SET=0) delay1ms(50);

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

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