数码管万年历实习报告_第1页
数码管万年历实习报告_第2页
数码管万年历实习报告_第3页
数码管万年历实习报告_第4页
数码管万年历实习报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

河南机电高等专科学校

综合实训报告

系部:_________________

专业:_________________

班级:_________________

学生姓名:_________________

学号:_________________

2013年6月28日

实训任务书

1.时间:2013年6月15日〜2013年6月28日

2.实训单位:河南机电高等专科学校

3.实训目的:深入学习电子产品设计制作的全过程

4.实训任务:

①加深学习电路图绘制软件的相关常识及其特点;

②以51单片机为核心设计出一个LED万年历;

③万年历具有年份、月、日、时、分、秒、周、温度、整点报时等功能;

④自己独立完成设计电路图,生成PCB,转印、腐蚀电路板,焊接等硬件制作

工作;

⑤会使用keil软件编写程序,并完成烧写过程;

⑥学会调试程序,敢于发现问题,解决问题;

⑦参考相关的的书籍、资料,认真完成实训报告。

综合实训报告

前言:

万年历是我们经常见到和使用的计时工具,使用方便,功能多。但自己做一

个让人满意的万年历,就不一定有那么轻而易举了,本次实训的任务就是自己亲

手做一个万年历。利用本学期学过的单片机知识,设计出具有显示年、月、日、

时、分、秒、周、温度功能,同时有整点报时的功能的万年历。

一、实训器件

1.温度传感器DS18B20

采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一

条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低

硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高、测量范

围广等优点。因此,本设计DS18B20温度传感器作为温度采集模块。

2.时钟芯片DS1302

采用DS1302时钟芯片实现时钟,它可以对年、月、日、周、时、分、秒进

行计时,具有闰年补偿功能,工作电压为2.5V〜5.5V。采用三线接口与CPU进

行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31X8的用于临时性存放数据的RAM寄存器。具有主电源/后

背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点

是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并旦可以关闭

充电功能。采用普通32.768kHz晶振。因此,本设计中采用DS1302提供时钟。

3.74LS154

74LS154为4线―16线译码器,其主要电特性的典型值如下:

tpd

PD

ABCD->outputGl、G2->output

23ns19ns170mW

当选通端(Gl、G2)均为低电平时,可将地址端(ABCD)的二进制编码在一

个对应的输出端,以低电平译出。若将G1和G2中的一个作为数据输入端,由

ABCD对输出寻址,54/74154还可作4线一16线数据分配器。

引出端符号:A、B、C、D译码地址输入端(低电平有效)

Gl、G2选通端(低电平有效)

0-15输出端(低电平有效)

可用此种芯片作为数码管的选址芯片。

4.74HC573

74HC573是八进制3态非反转透明锁存器,是高性能硅门CMOS器件。当锁

存使能端为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当

锁存使能变低时,符合建立时间和保持时间的数据会被锁存。输出能直接接到

CMOS,NMOS和TTL接口上操作电压范围:2.0V~6.0VX低输入电流:1.OuA。

本实训采用此芯片作为数码管的驱动芯片。

5.数码管

本实训使用共阴极数码管作为显示器件,采用LED数码管动态扫描,LED数

码管价格适中,对于显示数字也最合适。

综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用

AT89s51作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;

74LS154作为选址芯片;74HC573作为数码管的驱动芯片;共阴极数码管显示数

字;S8550驱动扬声器。

二、实训原理

为了使万年历在包装美化时简单化及布线的方便,我将万年历分为两部分,

一部分是主体部分含有年份、月、日、时、分、秒,另一部分是小模块包含周、

温度。

电路图如下:

主电路图:

5&85&S&S

扫o2S3S8B8I

HWADO

PALIPftl/ADl

FAL2Pft2/AD2

PftS(AD3

Pa-VAEM

PftVAD5

M&AD6

Pa7/AD7

H

WTPPlJOT?

酬PL1H2EX

LBffiDGP12ECI

PI3CEXO

P1.4flCEX)

*0PI夕CEX2

LI/TxDPIOTX3

□aonPI.7OX4

ivroP2.(yA8

bnP2I/.A9

LMffiP22/AI0

17/EDP2.3/AI1

P14/AI2

P2.5/AI3

P1^AI4

5SP2.7/AI5

FRCHRP

O32768Hz_%>RSIVCC2

XI

X2VO

L

GND

GND

____________________cXIV”_______

nsimi

主电路PCB:

周,温度电路图:周,温度PCB:

AA

BBW14

CCW15

DDW16

EE

FF

GG

DPDP

A

B

C

D

E

F

G

DP

三、程序编写

使用Keil软件编写程序。程序包括主函数、时间显示函数、温度显示函数、

时间调整函数、DS18B20模块、DS1302模块和周计算函数等。

程序的编写使我熟练的掌握了Keil软件的应用。具体程序见附录。

四、程序的烧写与调试

程序烧写需要用专用的烧写软件将Keil软件声生成的.hex文件写进单片机

里。经过多次的程序的改写与调试,最终制作出比较满意的成品。

五、成品展不:

心得体会:

经过此次实训我学到了很多,刚开始以为做万年历很难,着手开始做这个

产品没有一点头绪,经过上网查资料,产生了最初的制作框架,然后就开始找

芯片,查芯片资料•,设计电路图,又请同学帮忙指点,修改原理图。接着买元

器件,做封装,生成PCB,制作电路板,焊接元器件,最后完成了整个硬件部

分的制作。完成了硬件制作后,我又编了测试软件测试硬件是否有问题,发现

数码管不亮,经过问题排查及资料查询,发现单片机P0口缺少了上拉电阻,接

上后,解决了问题。

编程也是比较困难的,由于掌握的知识不够多,借鉴了别人的程序,并加

入自己的想法,经过调试,程序编写成功。最终完成了产品的制作。

在实习的过程中我得到了别人的帮助,同时也主动帮助别人,得到了很多

经验,为以后学习提供了方便。实习就是学习的过程,本次实习是最成功的一

次,也是学到最多的一次。

参考文献:

《单片机C51程序设计教程与实验》北京航空航天大学出版社

《单片机原理及应用(C51澹)》清华大学出版社

《数字电子技术》黄河水利出版社

《ProtelDXP2004电路设计与仿真教程》北京航空航天大学出版社

附录:

程序

万年历.C

#include<reg5l.h>

#include<intrins.h>

#defineucharunsignedchar

#defineuintunsignedint

ucharcodedigit[]={Ox3f,0x06,0x5b,0x4f,0x66,Ox6d,0x7d,0x07,0x7f,0x6f,0x39,0x00};

ucharmode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;

ucharcount=0;

sbitSET=P3A4;

sbitADD=P3A5;〃增力口

sbitRED二P3八6;〃减小

sbitCANL=P3A7;

sbitle=P2A6;

sbitoe=P2A7;

sbiten=PlA4;

sbitbeep=P2A4;

ucharGetWeekFromDay(ucharyears,ucharmonths,uchardays);

voidWriteSet1302(ucharcmd,uchardate);

ucharReadSet1302(ucharcmd);

voidReadyreadDS18B20(void);

ucharReadDS18B20(void);

voidIntDS1302(void);

voiddelaylms(uintx)

(

uchari,j;

for(i=x;i>0;i—)

for(j=124;j>0;j-);

)

voiddelaynus(ucharn)〃延时若干微秒

(

while(n-);

)

voiddisplay_Year(year)//显示年

(

uchari,j;

i=year/10;

j=year%10;

P0=digit[2];

Pl=8;

delaylms(2);

PO=digit[O];

Pl=9;

delaylms(2);

PO=digit[iJ;

Pl=10;

delaylms(2);

PO=digit[j];

Pl=ll;

delaylms(l);

)

voiddisplay_Month(month)〃显示月

(

ucharij;

i=month/10;

j=month%10;

PO=digit[i];

Pl=6;

delay1ms⑵;

PO=digit[j];

Pl=7;

delaylms(l);

)

voiddisplay_Day(day)〃显示日

(

uchari,j;

i=day/10;

j=day%10;

PO=digit|i];

Pl=4;

delayIms(2);

PO=digit|j];

Pl=5;

delaylms(l);

)

voiddisplay_Hour(hour)〃显示时

(

uchari,j;

i=hour/10;

j=hour%10;

PO=digit[i];

Pl=2;

delay1ms⑵;

P0=digit[j]+n*0x80;

Pl=3;

delaylms(l);

voiddisplay_Minute(minute)〃显示分

{

ucharij;

i=minute/10;

j=minute%10;

PO=digit[i];

Pl=0;

delayIms(2);

PO=digit[j];

Pl=l;

delaylms(l);

)

voiddisplay_Week(void)〃显示周

{

WEEK=GetWeekFromDay(years,months,days);

Pl=12;

switch(WEEK)

(

casel:PO=digit[l];

delaylms(2);

break;

case2:P0=digit[2];

delaylms(2);

break;

case3:PO=digit[3];

delaylms(2);

break;

case4:P0=digit[4];

delaylms(2);

break;

case5:PO=digit[5J;

delaylms(2);

break;

case6:P0=digit[6];

delaylms(2);

break;

case7:P0=digit[8];

delaylms(2);

break;

)

)

voiddisplay_Time(void)〃显示实时时间

ucharvalue;

value=ReadSetl302(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=ReadSetl302(0x87);

days=(((value&0x70)»4)*10+(value&0x0f));

display_Day(days);

value=ReadSetl302(0x89);

months=(((value&0x70)»4)*10+(value&0x0f));

display_Month(months);

value=ReadSetl302(0x8D);

years=(((value&0xf0)»4)*10+(value&0x0f));

display_Year(years);

display_Week();

/*****************时间调整部分*********************/

voidhourset(void)〃调时

uchartimevalue,hour;

delay1ms(500);〃防止多次触发

WriteSetl302(0x8e,0x00);〃将写保护去掉,确保能正常将调整后的数值写入DS1302

timevalue=ReadSetl302(0x85);〃读取此时的数值

hour=(((timevalue&0x70)»4)*10+(timevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

hour++;

delaylms(100);

whi!e(ADD==0);

)

)

if(RED==0)

delaylms(20);

if(RED==0)

hour-;

delaylms(100);

if(hour==0)hour=23;

while(RED==0);

)

)

if(hour>=24)hour=0;

timevalue=(((hour)/10)«4l(hour%10));

WriteSet1302(0x84,timevalue);

delay1ms⑵;

display_Hour(hour);

delaylms(10);

if(CANL==0)

(

mode=0;

break;

)

if(SET==O)break;

)

WriteSet1302(0x8e,0x80);

)

voidminuteset(void)〃调分

(

uchartimevalue,minute;

delaylms(500);

WriteSet1302(0x8e,0x00);

timevalue=ReadSet1302(0x83);

minute=(((timevalue&0x70)»4):ic10+(timevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

minute++;

if(minute>=60)timevalue=0;

while(ADD==0);

)

)

if(RED==0)

(

delaylms(10);

if(RED==0)

minute—;

if(minute=O)minute=59;

delaylms(300);

while(RED==O);

)

}

if(minute>=60)minute=O;

timevalue=((minute/10)«4l(minute%10));

WriteSet1302(0x82,timevalue);

delay1ms⑵;

display_Minute(minute);

delaylms(10);

if(CANL==0)

(

mode=0;

break;

)

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

voidyearset(void)〃调年

(

uchardatevalue,year;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x8d);

year=(((datevalue&0x70)»4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

{

delaylms(20);

if(ADD==0)

(

year++;

while(ADD==0);

)

)

if(RED==0)

delaylms(20);

if(RED==O)

year—;

delaylms(lOO);

whi!e(RED==0);

)

)

datevalue=((year/l0)«4l(year%10));

WriteSet1302(0x8c,datevalue);

delay!ms(5);

display_Year(year);

delaylms(5);

if(CANL==O)

(

mode=0;

break;

)

if(SET==O)break;

)

WriteSet1302(0x8e,0x80);

)

voidmonthset(void)〃调月

(

uchardatevalue,month;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x89);

month=(((datevalue&0x70)»4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(20);

if(ADD==0)

(

month++;

if(month>12)month=l;

while(ADD==0);

)

)

if(RED==0)

(

delaylms(20);

if(RED==0)

month—;

delayIms(100);

if(month==0)month=12;

while(RED==0);

)

}

datevalue=((month/10)«4l(month%10));

WriteSet1302(0x88,datevalue);

delaylms(5);

display_Month(month);

delaylms(5);

if(CANL==0)

(

mode=0;

break;

)

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

)

voiddayset(void)〃调日

(

uchardatevalue,day;

delaylms(500);

WriteSet1302(0x8e,0x00);

datevalue=ReadSet1302(0x87);

day=(((datevalue&0x70)»4)*10+(datevalue&0x0f));

while(l)

(

if(ADD==0)

(

delaylms(10);

if(ADD==0)

(

day++;

if(day>31)day=l;

while(ADD==0);

)

)

if(RED==0)

delaylms(lO);

if(RED==O)

if(day==0)day=31;

day—;

delaylms(300);

while(RED==0);

datevalue=((day/l0)«4l(day%10));

WriteSet1302(0x86,datevalue);

delaylms(5);

display_Day(day);

delaylms(5);

if(CANL==0)

mode=0;

break;

if(SET==0)break;

)

WriteSet1302(0x8e,0x80);

)

voidTimeSet(void)〃时间调整函数

if(SET==0)

(

delaylms(20);

if(SET==0)

{while(!SET)

mode++;

delaylms(20);

switch(mode)

case1:{yearset();delay1ms(20);}break;

case2:{monthset();delay1ms(20);}break;

case3:{dayset();delay1ms(20);}break;

case4:{hourset();delaylms(20);}break;

case5:{minuteset();delay1ms(20);}break;

)

if(mode==5)mode=0;

ucharflag;

voidDisplay_Integer(unsignedcharx)

(

uchars,g;

s=x%100/10;

g=x%10;

PO=digit[s];

Pl=13;

delaylms(3);

P0=digit[g]+0x80;

Pl=14;

delaylms(3);

PO=digit[1O];

Pl=15;

delaylms(l);

voiddisplay_Temperature(void)

(

ReadyreadDS18B20();

TL=ReadDS18B20();

TH=ReadDS18B20();

if((TH&0XF8)!=0X00)

(

flag=l;

TL=~TL;

TH=~TH;

TL+=1;

if(TL>255)TH+=1;

TN=TH*16+TL/16;

)

TN=TH*i6+TL/16;

Display_Integer(TN);

)

/****************设置模块******************/

voidSet(void)

(

if(SET==0)

{

delaylms(5);

if(SET==0)

delaylms(50);

while(l)

TimeSet();

if(CANL==O)

break;

voidInitTimerO(void)

TMOD=0x01;

THO=0x3C;

TL0=0x0B0;

EA=1;

ET0=1;

TR0=1;

voidmain()

(

inti;

P0=0;

InitTimerO();

IntDS1302();〃初始化DS1302

delaylms(5);

le=l;

oe=0;

en=0;

delayIms(200);

beep=1;

while(l)

{

for(i=1000;i>0;i-)

Set();

display_Time();

Display_Integer(TN);

if(hours==7llhours==8llhours==9llhours==10llhours==llllhours==12

llhours==14llhours==15llhours==16llhours==17llhours==18llhours==19

llhours==20llhours==21llhours==22)

if(minutes==OxOO)

ucharvalue,w,k;

value=ReadSet1302(0x81);

seconds=(((value&0x70)»4):{:104-(value&0x0f));

if(seconds>0&&seconds<2)

(

for(k=5;k>=0;k—)

(

for(w=100;w>0;w—)

(

beep=0;

delaylms(3);

beep=l;

delaylms(3);

)

delaylms(1000);

)

}

elsebeep=l;

)

)

}

display_Temperature();

)

)

voidt0()interrupt1

(

THO=0x3C;

TLO=OxOBO;

count++;

if(count==10)

{n=0;

)

if(count==20)

{count=0;

n=l;

)

/*******DS]302模块*************/

sbitSCLK=P2A0;//DS1302时钟输入

sbitDATE=P2A1;//DS1302数据输入

sbitREST=P2A2;//DS1302复位端口

voidWrite1302(uchardate)//|nj1302写数据

uchari;

SCLK=O;

delaynus(2);

for(i=0;iv8;i++)

(

DATE=date&0x01;

SCLK=1;

delaynus(2);

SCLK=O;

delaynus(2);

date»=l;

)

)

voidWriteSet1302(ucharcmd,uchardate)〃根据相应的命令输入相应的数据

(

REST=0;

SCLK=0;

REST=1;

Write1302(cmd);

delaynus(5);

Write1302(date);

SCLK=1;

REST=0;

)

ucharRead1302(void)〃读取1302数据

(

uchari,date;

delaynus(2);

for(i=0;i<8;i++)

(

date»=l;

if(DATE==l)

datel=0x80;

SCLK=1;

delaynus(2);

SCLK=0;

delaynus(2);

)

returndate;

)

ucharReadSet1302(ucharcmd)〃根据命令读取1302相应的值

uchardate;

REST=O;

SCLK=O;

REST=1;

Write1302(cmd);

delaynus(2);

date=Read1302();

SCLK=1;

REST=0;

returndate;

)

voidIntDS1302(void)//DS1302初始化

(

ucharflag;

flag=ReadSetl302(0x81);

if(flag&0x80)〃判断时钟芯片是否关闭

(

WriteSet1302(0x8E,0x00);〃根据写状态寄存器命令字,写入不保护

指令

温馨提示

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

评论

0/150

提交评论