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