河南科技学院毕业设计报告.docx

上传人:b****7 文档编号:23596535 上传时间:2023-05-18 格式:DOCX 页数:64 大小:193.75KB
下载 相关 举报
河南科技学院毕业设计报告.docx_第1页
第1页 / 共64页
河南科技学院毕业设计报告.docx_第2页
第2页 / 共64页
河南科技学院毕业设计报告.docx_第3页
第3页 / 共64页
河南科技学院毕业设计报告.docx_第4页
第4页 / 共64页
河南科技学院毕业设计报告.docx_第5页
第5页 / 共64页
点击查看更多>>
下载资源
资源描述

河南科技学院毕业设计报告.docx

《河南科技学院毕业设计报告.docx》由会员分享,可在线阅读,更多相关《河南科技学院毕业设计报告.docx(64页珍藏版)》请在冰豆网上搜索。

河南科技学院毕业设计报告.docx

河南科技学院毕业设计报告

河 南 科 技 学 院

2011届专科毕业设计报告

 

基于单片机的数字万年历

 

学生姓名:

冯建勇徐世伟

所在学院:

高等职业技术学院

所学专业:

应用电子技术

导师姓名:

杨枫

完成时间:

2011-5-30

 

一、设计目的

《单片机原理及应用》是一门技术性、应用性很强的学科,实践教学是它的一个极为重要的环节。

不论是硬件扩展、接口应用还是编程方法、程序调试,都离不开实验教学。

如果不在切实认真地抓好学生的实践技能的锻炼上下功夫,单凭课堂理论课学习,势必出现理论与实践脱节,学习与应用脱节的局面。

任随书本上把单片机技术介绍得多么重要、多么实用、多么好用,同学们仍然会感到那只是空中楼阁,离自己十分遥远,或者会因此而对它失去兴趣,或者会感到它高深莫测无从下手,这些情况都会令课堂教学的效果大打折扣。

本次仿真设计的目的就是让同学们在理论学习的基础上,通过完成一个涉及STC单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用,使学生不但能够将课堂上学到的理论知识与实际应用结合起来,而且能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立进行某些单片机应用系统的开发设计工作打下一定的基础。

二、设计任务

叙述系统应该完成的功能,

系统功能包括以下几点:

(1)24小时计时功能

用6位LED显示器显示时、分、秒。

(2)时间调整功能

用功能移位键、功能加键和功能减键实现时间的调整

(3)闹铃功能

用定闹键配合功能移位键、功能加键和功能减键三个按键设定闹铃,并用蜂鸣器实现响铃功能。

(4)环境温度采集与显示功能

选用温度传感器DS18B20采集环境温度,并用2位LED显示器显示环境温度。

在这里我们只考虑采集室内温度,即零度以上的温度。

三、硬件设计

本次设计的万年历系统以单片机为主控芯片,通过读写日历时钟芯片和温度芯片来实时的改变当前时间和温度,并通过LED显示实时数据,同时辅助以键盘来调节显示时间和定时时间,并带有蜂鸣器,当定时时间到时闹钟即打开。

硬件的结构和可靠性直接影响着整个系统的可靠性,所以合理的安排电路能提高电子产品的性能,但任何电子产品都必须有一个可靠的电源为其提供能量才能工作,本设计先介绍电源部分,再介绍功能电路。

3.1主电路设计

主电路的功能是完成年、月、日、星期、时、分、秒之间的转换,对温度传感器进行控制并读取温度转换后的值,再送往LED显示,并且接受键盘操作,对日期和时间进行校正,同时还要判断定时时间是否到,定时到时闹铃打开。

主电路原理图如图所示,显示部分用P0口做为输出数据接到LED数码管a到h,并接8个上拉电阻做为各段的驱动。

用P3口的低3位接译码器的A0,A1,A2端,用P3.3,P3.4,P3.5分别接译码器的使能端,通过控制P3口来控制LED的动态扫描。

单片机的18和19引脚接12MHZ的晶振,并接两个22PF的电容同时接地,单片机复位端接一极性电容并连接到电源处,在极性电容的负极接一10K的电阻,并连接至地做为放电用。

本设计用到四个独立式键盘分别接到P1口的低4位,用P1口的P1.4,P1.5,P1.6接日历时钟的使能端和时钟端及数据输入输出口,并在日历时钟上接一32.768KHZ的晶振,并接两个22PF的电容终端和地相连,用P1.7接温度芯片的DQ引脚,作为温度数据或命令的读写,用单片机的P3.7接扬声器,作为发音电路,各芯片的电源部分分别接到有开关式电源产生的+5V电源上,芯片的接地端都接在公共地上,在这里接电源部分就不再一一详述,读者注意一下就行了。

设计采用动态显示,轮流扫描各个LED使之显示相应的数型码,当扫描频率大于人眼所能识别的频率时就看不到闪烁现象。

动态显示的亮度不如静态显示,但静态显示占用的I/O口资源较多,往往用移位寄存器74LS164等来扩充其I/O口不足的情况,当显示位数较多时,这样势必增加硬件开销,增大成本,不利于开阔市场。

本设计的突出之处在于硬件电路简单,大大减少了硬件开销,这样又势必增加了软件开发的难度,但降低了成本有利于市场的开阔。

3.2主控制器和外围器件

主控芯片由单片机完成。

目前市场上的单片机种类很多,如Intel公司生产的80C51系列,ATMEL公司生产的AT89系列,Microchip公司生产的PIC系列,ADI公司生产的高性能ADuC84X系列单片机和ATMEL公司的高性能ATmegaXXX系列单片机等等。

本设计所要求的功能有限用一般的单片机即可完成任务,其中ATMEL公司生产的AT89系列单片机最为流行,它具有FlashROM,擦写方便,且价格便宜。

因此选用AT89S52为主控芯片。

外围器件其中温度传感器采用美国达拉斯(DALLAS)生产的可编程的DS18B20温度传感器。

它直接输出数字量的温度值,精度高,测温分辨率可达0.0625℃。

一线制总线,接口方便,体积小等诸多优点。

时钟芯片选用DS1302,DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。

显示部分采用共阴极数码管LED显示,具有显示亮度高,功耗小的优点,配合译码器74HC138完成动态显示功能。

3.3.1STC12C5616AD单片机

STC12C5616AD系列主要性能:

●高速:

1个时钟/机器周期,飞思卡尔芯片解密,增强型8051内核,速度比普通8051快8~12倍●宽电压:

5.5~3.3V,2.2~3.6V(STC12LE5A60S2系列)●增加第二复位功能脚(高可靠复位,可调整复位门槛电压,频率<12MHz时,无需此功能)●增加外部掉电检测电路,可在掉电时,及时将数据保存进EEPROM,正常工作时无需操作EEP●低功耗设计:

空闲模式,(可由任意一个中断唤醒)●低功耗设计:

掉电模式(可由外部中断唤醒),可支持下降沿/上升沿和远程唤醒●工作频率:

0~35MHz,相当于普通8051:

0~420MHz●时钟:

外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置●8/16/20/32/40/48/52/56/60/62K字节片内Flash程序存储器,擦写次数10万次以上●1280字节片内RAM数据存储器●芯片内EEPROM功能,擦写次数10万次以上●ISP/IAP,在系统可编程/在应用可编程,无需编程器/仿真器●8通道,10位高速ADC,速度可达25万次/秒,2路PWM还可当2路D/A使用●2通道捕获/比较单元(PWM/PCA/CCP),---也可用来再实现2个定时器或2个外部中断(支持上升沿/下降沿中断)●4个16位定时器,兼容普通8051的定时器T0/T1,2路PCA实现2个定时器●可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟●硬件看门狗(WDT)●高速SPI串行通信端口●全双工异步串行口(UART),兼容普通8051的串口●先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令●通用I/O口(36/40/44个),复位后为:

准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:

准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA,但整个芯片最大不得超过100mA

3.3.2温度芯片DS18B20

DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。

因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。

 

图3-2DS1302封装

 DS18B20的引脚功能描述

序号

名称

引脚功能描述

1

GND

接地

2

DQ

数据输入/输出引脚。

漏极开路。

当被用着在寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。

当工作于寄生电源时,此引脚必须接地。

 

表3-1DS18B20的引脚功能

3.3.3 DS18B20ROM操作指令

一旦总线主机检测到从器件的存在,它便可以发出器件ROM操作命令之一。

所有ROM操作命令均为8位长。

读ROM[33h]:

此命令允许总线主机读DS18B20的8位产品系列编码,唯一的48信序列号,以及8位的CRC。

此命令只能在总线上仅有一个DS18B20的情况下使用。

符合ROM[55h]:

此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。

只有与64位ROM序列严格相符的DS18B20才能对后继的存储器操作命令作出响应。

跳过ROM[CCh]:

在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而直接进行存储器操作以节省时间。

搜索ROM[F0h]:

当系统开始工作时,总线主机可能不知道单总线上的器件个数或不知道其64位ROM编码。

搜索ROM命令允许总线控制器用排除法识别总线上的所有从器件的64位编码。

警告搜索[ECh]:

此命令的流程与搜索ROM命令相同。

但是仅在最近一次温度测量出现警告的情况下,DS18B20才对此命令作出响应。

3.3.4DS18B20RAM操作指令

写暂存存储器[4Eh]:

这个命令向DS18B20的暂存器TH和TL中写入数据。

可以在任何时刻发出复信命令来中止写入。

读暂存存储器[BEh]:

这个命令读取暂相隔器的内容。

读取将从第1个字节开始,一直进行下去,直到第9(CRC)字节读完。

如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。

复制暂存存储器[48h]:

这个命令把暂存器的内容拷贝到DS18B20的E2ROM存储器里,即把温度报警触发字节存入非易失性存储器里。

温度变换[44h]:

这条命令启动一次温度转换而无需其它数据。

温度转换命令被执行,而后DS18B20保持等待状态。

如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又忙于做温度转换的话,DS18B20将在总线上输出0,若温度转换完成,则输出1。

如果使用寄生电顺势,总线控制器必须在发出这条命令后立即启动强上拉,并保持500ms以上时间。

读忙[B8h]:

在这条命令发出之后发出读数据隙,器件会输出温度转换忙的标识:

0为忙,1为准备就绪。

读电源[B4h]:

若把这条命令发给DS18B20后,发出读时间隙,器件会返回它的电源模式:

0为寄生电源,1为外部电源。

3.3.5DS18B20的数据处理

DS18B20的高速暂存存储器由9个字节组成,其分配如图2-2所示。

当温度转换命令发布后,经转换所得的温度值以2字节补码形式存放在高速暂存存储器的第1、2个字节里。

单片机可通过单总线接口读到该数据,读取时低位在前,高位在后。

3.3.6日历时钟芯片DS1302

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

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

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

    DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。

DS1302由Vcc1或Vcc2两者中的较大者供电。

X1和X2是振荡源,外接32.768kHz晶振。

RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:

首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电时,在Vcc≥2.5V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向),后面有详细说明。

SCLK始终是输入端。

 

图3-3DS1302引脚图

DS1302 的控制字如图所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

1

RAM

A4

A3

A2

A1

A0

RAM

CK

CK

表3-2DS1302控制字

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

 

    DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见下表。

寄存器

命令码

数据范围

寄存器中各位的内容

名称

地址

7

6

5

4

3

2

1

0

00H

80H

81H

00~59

CH

秒数据

01H

82H

83H

00~59

0

分数据

02H

84H

85H

01~12

或00~23

12/

24

0

10/

AP

时数据

03H

86H

87H

01~28,29

30,31

0

0

日数据

04H

88H

89H

01~12

0

0

0

月数据

星期

05H

9AH

8BH

01~07

0

0

0

0

0

星期数据

06H

8CH

8DH

00~99

年数据

多字节读写

BEH

BFH

表3-3日历时间寄存器

3.3.7数码管LED

LED显示器由若干个发光二极管组成,当发光二极管导通时,相应的一个笔画或一个点就发光。

控制相应的管导通,就能显示出对应字符。

各段LED显示器需要由驱动电路驱动。

在七段LED显示器中,通常将各段发光二极管的阴极或阳极连在一起作为公共端。

将各段发光二极管连在一起的叫共阳极显示器,用低电平驱动;将阴极连在一起的叫共阴极显示器,用高电平驱动。

静态显示就是每一个显示器各笔画段都要独占具有一个锁存功能的输出口线,CPU把要显示的字形代码送到输出口上,就可以使显示器上显示所需的数字或符号,此后,即使CPU不在去访问它,因为各笔画段借口具有锁存功能,显示的内容也不会消失。

动态显示是指显示器显示某一字符时,相应段的发光二极管恒定地导通或截止。

静态显示有并行输出和串行输出两种方式。

在本系统中数码管使用共阴极接法而且是用动态显示。

3.3.8译码器74HC138

74HC138译码器是通过3条线来达到控制8条线的状态,就是通过3条控制线A0、A1、A2不同的高低电平组合来控制Y0~Y7的输出状态,其中4和5为使能地端,与8引脚共同接地,当接高电平时Y0到Y7输出高电平。

6号脚为使能端,为高电平时有效。

74HC138封装如图2-5。

当需要级联时只需要改变使能端信号引脚即可,连接方法简单。

图3-474HC138封装图

 

 

四、软件仿真

软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。

因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。

4.1程序框图

 

4.2源程序代码

#include

#include

unsignedcharcodedisplaywelcome[]={"WelcomeToMyLcdTimer"};//欢迎界面

unsignedcharcodedisplaywish[]={"HappyEveryDay^_^"};//欢迎界面

unsignedcharcodeovertemperature[]={"OVERTEMPERATURE!

"};

unsignedcharcodedigit[]={"0123456789"};//数字代码

unsignedcharmode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours,

minutea,seconds,houra=12;

sbitSCLK=P1^0;//DS1302时钟输入

sbitDATE=P1^1;//DS1302数据输入

sbitREST=P1^2;//DS1302复位端口

sbitSET=P1^4;//DS1302设置模式选择位

sbitADD=P1^5;//增加

sbitRED=P1^6;//减小

sbitCANL=P1^7;

voiddelay1ms(inti)//1毫秒延时

{

intj,k;

while(i--)

for(j=76;j>1;j--);

for(k=29;k>1;k--);

}

voiddelaynus(unsignedcharn)//延时若干微秒

{

unsignedchari;

for(i=0;i

}

/***********蜂鸣器模块************/

sbitbeep=P3^6;//位定义,定义P.6位fmp

voiddely500(void)

{

unsignedchari;

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

{

_nop_();

}

}

voidbaojing(unsignedcharn)

{

unsignedcharx,i;

while(n--)

{

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

{

for(x=0;x<200;x++)

{

beep=~beep;

dely500();

}

}

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

{

for(x=0;x<200;x++)

{

beep=~beep;

dely500();

dely500();

}

}

}

}

/*******DS1302模块*************/

voidWrite1302(unsignedchardate)//向1302写数据

{

unsignedchari;

SCLK=0;

delaynus

(2);

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

{

DATE=date&0x01;

SCLK=1;

delaynus

(2);

SCLK=0;

delaynus

(2);

date>>=1;

}

}

voidWriteSet1302(unsignedcharcmd,unsignedchardate)//根据相应的命令输入相应的数据

{

REST=0;

SCLK=0;

REST=1;

Write1302(cmd);

delaynus(5);

Write1302(date);

SCLK=1;

REST=0;

}

unsignedcharRead1302(void)//读取1302数据

{

unsignedchari,date;

delaynus

(2);

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

{

date>>=1;

if(DATE==1)

date|=0x80;

SCLK=1;

delaynus

(2);

SCLK=0;

delaynus

(2);

}

returndate;

}

unsignedcharReadSet1302(unsignedcharcmd)//根据命令读取1302相应的值

{

unsignedchardate;

REST=0;

SCLK=0;

REST=1;

Write1302(cmd);

delaynus

(2);

date=Read1302();

SCLK=1;

REST=0;

returndate;

}

voidIntDS1302(void)//DS1302初始化

{

unsignedcharflag;

flag=ReadSet1302(0x81);

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

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

WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((0/10)<<4|(0%10)));//根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((0/10)<<4|(0%10)));//根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((0/10)<<4|(0%10)));//根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((0/10)<<4|(0%10)));//根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根据写年寄存器命令字,写入年的初始值

WriteSet1302(0x90,0xa5);//打开充电功能选择2K电阻充电方式

WriteSet1302(0x8E,0x80);//根据写状态寄存器命令字,写入保护指令

}

}

/***************液晶显示模块*****************/

sbitRS=P2^5;

sbitRW=P2^6;

sbitE=P2^7;

sbitBF=P0^7;

/*液晶忙检测*/

bitBusyTest(void)

{

bitresult;

RS=0;

RW=1;

E=1;

_nop_();

_nop_();

_nop_();

result=BF;

_nop_();

_nop_();

_nop_();

E=0;

returnresult;

}

/*写指令*/

voidWrite_com(unsignedcharcommand)

{

while(BusyTest()!

=0);

RS=0;

RW=0;

E=0;

_nop_();

_nop_();

_nop_();

P0=command;

_nop_();

_nop_();

_nop_();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

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

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