万年历报告.docx

上传人:b****7 文档编号:16324609 上传时间:2023-07-12 格式:DOCX 页数:58 大小:587.90KB
下载 相关 举报
万年历报告.docx_第1页
第1页 / 共58页
万年历报告.docx_第2页
第2页 / 共58页
万年历报告.docx_第3页
第3页 / 共58页
万年历报告.docx_第4页
第4页 / 共58页
万年历报告.docx_第5页
第5页 / 共58页
万年历报告.docx_第6页
第6页 / 共58页
万年历报告.docx_第7页
第7页 / 共58页
万年历报告.docx_第8页
第8页 / 共58页
万年历报告.docx_第9页
第9页 / 共58页
万年历报告.docx_第10页
第10页 / 共58页
万年历报告.docx_第11页
第11页 / 共58页
万年历报告.docx_第12页
第12页 / 共58页
万年历报告.docx_第13页
第13页 / 共58页
万年历报告.docx_第14页
第14页 / 共58页
万年历报告.docx_第15页
第15页 / 共58页
万年历报告.docx_第16页
第16页 / 共58页
万年历报告.docx_第17页
第17页 / 共58页
万年历报告.docx_第18页
第18页 / 共58页
万年历报告.docx_第19页
第19页 / 共58页
万年历报告.docx_第20页
第20页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

万年历报告.docx

《万年历报告.docx》由会员分享,可在线阅读,更多相关《万年历报告.docx(58页珍藏版)》请在冰点文库上搜索。

万年历报告.docx

万年历报告

大连民族学院

单片机课程设计

 

题目:

万年历

专业:

班级:

姓名:

指导教师:

完成日期:

 

摘要

 

第二章方案论证…

第三章系统硬件电路设计

第四章系统软件设计

第五章调试

第六章总结

第七章参考文献

 

 

摘要

本次设计是以单片机STC89C51为核心元件,通过DS12B887能够准确的计时,采用1602液晶显示屏动态显示时间,实现具有年、月、日、星期、时、分、秒等功能,同时具备年、月、日、星期、时、分、秒校准功能的数字时钟。

它具有走时精确,显示直观等特点。

另外具有校时功能,利用单片机实现的数字时钟具有编程灵活,便于功能的扩充等优点。

本次设计可分为两部分:

硬件部分、软件部分。

硬件部分包括:

STC89C51单片机、DS12B887时钟芯片、1602LCD液晶显示器。

主要由STC89C51单片机、实时时钟芯片电路、液晶显示输出电路、键盘输入电路、测温电路、报警电路、串口电路、稳压电路八部分组成。

具体说来,系统智能控制部分由单片机及其相关的外围电路组成,外围电路包括复位电路、晶振电路、键盘设计、电源电路。

利用单片机将复位电路、动态显示电路、电源电路等正确的连接在一起,并通过单片机的编程来实现万年历的功能。

软件部分包括了液晶显示模块、温度模块、时钟模块。

第1章设计任务和要求

1.1设计任务

利用单片机、时钟芯片DS12B887、温度传感器DS18B20、1602液晶等实现日期、时间、温度显示的万年历。

1.2设计要求

(1)掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。

(2)以单片机STC89C51为核心元件,通过DS12B887能够准确的计时,采用1602液晶显示屏动态显示时间,实现具有年、月、日、星期、时、分、秒等功能,同时具备年、月、日、星期、时、分、秒校准功能的数字时钟。

(3)通过DS18B20能够实时、准确的检测当前环境温度。

(4)实现闹钟功能。

第二章方案论证

本系统以AT89C52单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。

因此本设计可分为一下模块:

显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。

下面对各个模块逐一进行论证分析:

2.1实时时间计算模块

方案

(1):

STC89C51单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。

方案

(2):

DS12B887有两个功能:

一是为系统提供实时的时间日历信息;二是送出一个周期为125ms的方波作为MCU89C51外部中断INT0的中断源,以产生周期性中断采集数据。

DS12887主要功能包括非易失性时日历时钟、报警器、百年历、可编程中断、方波发生器和114字节的非易失静态RAM。

使用DS12887时应注意以下几点:

Vcc正常情况下为5V,当Vcc降至4.25V时,所有的输入被忽略,输出为高阻状态,Vcc降至3V时,外部电源被关断,内部锂电池为实时时钟和RAM供电,在断电情况下,时钟继续运行,其中的数据可保存十年以上不会丢失。

DS12887有两种工作时序,即MOTOROLA和INTEL时序,由MOT引脚的电平指定,当MOT引脚为高电平时选择MOTOROLA时序,当MOT引脚为低电平时选择INTEL时序,图中选为INTEL时序,这时芯片的DS引脚接系统的读信号/RD,R/W引脚接系统的写信号/WR。

AS引脚用于分离数据地址总线AD7-AD0上的地址和数据信息,连接到MCU的ALE引脚。

RESET引脚的信号对日历时钟和RAM没有影响,但它影响DS12887的命令和状态寄存器的内容,在图中直接将RESET连至Vcc,这样可以保证DS12887在进入或退出电源失效状态时,其工作状态不受RESET引脚的影响。

DS12887有一个可编程输出方波引脚SQW,从该引脚可以输出频率为2Hz-256Hz的方波,在系统中正是利用此引脚输出周期为125MS的方波,作为MCU外部中断/INT0的中断源实现周期性中断,每当中断发生时,MCU读一二次输入口,检查电表是否转过一圈,在整点时还要采一次三相电流和电压。

除此之外DS12887内部还有128字节的RAM的单元,其中前10个字节用于存放日历时钟信息,字节0为秒,字节2为分,字节4为时,字节6为星期,字节7为日,字节8为月,字节9为年,字节0AH-0DH用作控制和状态寄存器,剩下的114字节为用户RAM,所有的这128字节都是掉电非易失性的。

DS12B887是内置锂电池的日历时钟芯片,并有128字节带掉电保护的RAM,使用十分方便。

综合上述两种方案,宜采用方案

(2)实现实时计时功能。

2.2液晶显示模块

方案

(1):

数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。

要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。

由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。

方案

(2):

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.

方案(3):

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。

每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。

1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:

清屏、左移右移、光标显示。

而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。

综合比较上述两种方案,应采用方案(3)组成本设计的显示模块。

2.3温度采集模块

方案

(1):

热敏电阻是开发早、种类多、发展较成熟的敏感元器件.热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化.

通过一定的电路可以将周围环境的温度变化转化成电压的变化,通过AD转化器件将信号传输给单片机进行分析,从而测出当前环境温度,但误差大,不稳定,对环境要求较高。

方案

(2):

数字温度传感器DS18B20采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

测量温度范围宽,测量精度高,在使用中不需要任何外围元件,支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温,供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。

因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。

因此非常适合本系统使用。

综上比较上述两种方案,宜采用方案

(2)构成本设计的实时温度采集模块。

第三章系统硬件电路设计

3.1液晶模块设计

3.1.1、1602液晶功耗较小可直接与单片机接口相接,电源直接与电源电路相接,使用单片机的P1口与1602进行通信。

3.1.2功能特性介绍

(1)+5V电压,对比度可调

(2)内含复位电路

(3)提供各种控制命令,如:

清屏、字符闪烁、光标闪烁、显示移位等多种功能

(4)有80字节显示数据存储器DDRAM

(5)内建有160个5X7点阵的字型的字符发生器CGROM

(6)8个可由用户自定义的5X7的字符发生器CGRAM

3.1.3接口信号说明

图3.11602引脚说明

3.1.4基本操作时序

(1)读状态:

输入:

RS=L,RW=H,E=H输出:

D0~D7=状态字

(2)写指令:

输入:

RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:

(3)读数据:

输入:

RS=H,RW=H,E=H输出:

D0~D7=数据

(4)写数据:

输入:

RS=H,RW=L,D0~D7=数据,E=高脉冲输出:

3.1.5显示说明

图3.21602显示设置

3.1.6接口电路

图3.3液晶显示模块

3.2时钟模块设计

该块有两个功能:

一是为系统提供实时的时间日历信息;二是送出一个周期为125ms的方波作为MCU89C51外部中断INT0的中断源,以产生周期性中断采集数据。

该模块主要由DS12887组成。

DS12887是实时日历时钟芯片,其主要功能包括非易失性时日历时钟、报警器、百年历、可编程中断、方波发生器和114字节的非易失静态RAM。

使用DS12887时应注意以下几点:

Vcc正常情况下为5V,当Vcc降至4.25V时,所有的输入被忽略,输出为高阻状态,Vcc降至3V时,外部电源被关断,内部锂电池为实时时钟和RAM供电,在断电情况下,时钟继续运行,其中的数据可保存十年以上不会丢失。

DS12887有两种工作时序,即MOTOROLA和INTEL时序,由MOT引脚的电平指定,当MOT引脚为高电平时选择MOTOROLA时序,当MOT引脚为低电平时选择INTEL时序,图中选为INTEL时序,这时芯片的DS引脚接系统的读信号/RD,R/W引脚接系统的写信号/WR。

AS引脚用于分离数据地址总线AD7-AD0上的地址和数据信息,连接到MCU的ALE引脚。

RESET引脚的信号对日历时钟和RAM没有影响,但它影响DS12887的命令和状态寄存器的内容,在图中直接将RESET连至Vcc,这样可以保证DS12887在进入或退出电源失效状态时,其工作状态不受RESET引脚的影响。

DS12887有一个可编程输出方波引脚SQW,从该引脚可以输出频率为2Hz-256Hz的方波,在系统中正是利用此引脚输出周期为125MS的方波,作为MCU外部中断/INT0的中断源实现周期性中断,每当中断发生时,MCU读一二次输入口,检查电表是否转过一圈,在整点时还要采一次三相电流和电压。

除此之外DS12887内部还有128字节的RAM的单元,其中前10个字节用于存放日历时钟信息,字节0为秒,字节2为分,字节4为时,字节6为星期,字节7为日,字节8为月,字节9为年,字节0AH-0DH用作控制和状态寄存器,剩下的114字节为用户RAM,所有的这128字节都是掉电非易失性的。

3.2.1DS12887管脚图

DS12887是内置锂电池的日历时钟芯片,并有128字节带掉电保护的RAM,使用十分方便。

其管脚图如下:

图3.4DS12b887管脚图

AD0-AD7:

地址/数据,应接P0口

MOT:

总线类型选择,与89C51连接时接地。

CS:

片选AS:

地址选通,与89C51连接时接ALE。

R/W:

读/写控制,与89C51连接时接WD。

DS:

数据选通,与89C51连接时接RD。

RESET:

复位,接+5V。

IRQ:

中断请求输出。

3.2.2接口电路

图3.5接口电路模块图

3.3温度模块

DS18B20通过单总线实现与单片机的通信,每个DS18B20都有一个唯一的序列号,可以方便的实现组网检测。

3.3.1单总线介绍

(1)单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。

(2)单总线通常要求外接一个约为4.7K—10K的上拉电阻,这样,当总线闲置时其状态为高电平。

3.3.2DS18B20特性介绍

(1)DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:

(2)采用单总线的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

(3)测量温度范围宽,测量精度高DS18B20的测量范围为-55℃~+125℃;在-10~+85°C范围内,精度为±0.5°C。

(4)在使用中不需要任何外围元件。

(5)支持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多点测温。

(6)供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。

因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。

(7)测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位。

(8)负压特性电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

(9)掉电保护功能DS18B20内部含有EEPROM,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。

(10)DS18B20具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的

3.3.3DS18B20管脚图

 

图3.6DS18B20管脚图

3.3.4DS18B20时序

DS18B20的工作协议流程是:

初始化→ROM操作指令→存储器操作指令→数据传输。

其工作时序包括:

(1)初始化时序

(2)写时序

(3)读时序

3.3.5接口电路

图3.7测温电路模块

3.4报警模块

报警模块采用单片机输出一定频率的方波从而使蜂鸣器发出声音,接口电路如下

图3.8报警电路模块

3.5按键控制模块

设置模块采用四个按键与P2.0、P2.1、P2.2、P2.3相接组成独立按键,接口电路如下

图3.9按键电路模块

3.6稳压电路

为了解决电压不稳定的问题,故采用7805进行稳压,接口电路如下

图3.10稳压电路模块

3.7串口电路

串口电路主要由MAX232组成,从而达到了电源电平转换的功能,接口电路如下

图3.11串口电路模块

第四章系统软件设计

由于C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C语言编写。

4.1程序框图

系统程序采用模块化设计,主要由液晶显示、温度采集、时钟三大模块组成。

总的程序框图如下:

 

图4.1程序框图

第五章调试

在焊接电路板的过程中防止出现虚焊、漏焊、错焊是我组最在意的方面,因此最后焊出的电路板符合设计要求。

不过在调试中还是遇到了一些问题。

由于在设计原理图时没有考虑到要结合C语言编程,导致在调试过程中液晶无法正常显示时间。

我组经过仔细检查、讨论,为方便总线定义,ALE口地址锁存,决定在P3.2口处废一根线。

可喜的是,电路板最终调试成功。

另外,在给电路板下入程序后出现LCD液晶显示屏显示亮度不好,起初我们找不出原因,但经过分析,就发现这是可变变阻的问题,我们可以一边旋转滑动变阻器,一边观看LCD显示屏,直到看到合适的亮度为止。

第六章结论

本次课程设计我组设计的是一个具有年、月、日、星期、时、分、秒等功能,同时具备温度检测、闹钟功能的万年历。

本次课程设计可以圆满完成,跟老师的指导与我组成员的努力是分不开的。

这次课程设计从开始到制作成功前后用了三个星期。

当电子万年历可以成功实现时,那种激动和喜悦只有自己可以体会。

在整个设计过程中,我们通过观看AD6教学视频,懂得了如何画原理图及器件封装,懂得了如何制作PCB及布线布局。

我们还通过上网查找资料较好的完成了编程的设计,达到了预期的目的,完了课程设计的要求。

埋头苦干的过程是苦涩的,在书山中查找资料的过程是疲倦的,但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来收获的喜悦,不付出怎能得到回报,一分耕耘一分收获,有付出才会有回报,就在这痛苦与快乐的交替中,我们学到了知识,学到了技术,更学到了做人的道理。

第七章参考文献

【1】刘岩川《单片机原理及接口技术》

【2】张齐朱宁西《单片机系统设计与开发》

【3】江志红《51单片机技术与应用系统开发案例精选》

【4】周立功单片机开发网

附录1程序及注释

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharkaiqi;

sbitdscs=P2^7;

sbitdsas=P3^2;

sbitdsrw=P3^6;

sbitdsds=P3^7;

#include//使用_nop_()函数

/*************************************************/

//函数申明//

/*************************************************/

voiddelay_temp(uchark);//标准延时函数

voiddelay(uints);//LCD延时函数

voidinit_first();//初始化显示

voidinit_18b20();//复位ds18b20

voidwrite_18b20(uchardat);//写ds18b20数据

ucharread_18b20();//读ds18b20数据

voidread_word_18b20();//读数据并转换温度,进行显示

voiddisp_tp(ucharnum);//温度显示

voidinit_LCD();//初始化LCD1602

voidwrite_data(uchardate);//写LCD1602显示数据

voidwrite_com(ucharcom);//写LCD1602指令

voidtemp_display(ucharnum);

sbitDQ=P3^5;

sbitrs=P2^4;

sbitrw=P2^5;

sbiten=P2^6;

sbitbeep=P3^4;//蜂鸣器报警引脚,P10=1时报警

sbits1=P2^0;//4个按键:

k0--加上限值,k1--减上限值,k2--加下限值,k3--减下限值

sbits2=P2^1;

sbits3=P2^2;

sbits4=P2^3;

uinttvalue;//温度值

uchartflag;//温度正负标志

ucharcodedis0[]={"Welcome!

"};

ucharcodedis1[]={0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x00};//初始化等待界面,进程的代码

ucharcodedis2[]={"T:

+-"};

ucharcodedis3[]={0x06,0x09,0x06,0x00,0x00,0x00,0x00,0x00,//温度符号代码(。

0x00,0x00,0x06,0x09,0x08,0x08,0x09,0x06};//温度符号代码(C)

uchardatatemp_data[5];//储存温度值的数据

ucharcodedis4[]={"alarmclkset"};

/*************************************************/

//主函数//

/*************************************************/

voiddidi_an()

{

beep=1;

}

voidtemp_display(ucharnum)

{

//初始化LCD1602

init_18b20();//复位ds18b20

read_word_18b20();

disp_tp(num);

}

/*************************************************/

//开机初始化显示----欢迎等待界面//

/*************************************************/

voidinit_first()//初始化显示

{

ucharn,a,b,temp;

ucharz;

beep=1;

P2=0x0f;

init_LCD();//初始化LCD1602

write_com(0x84);

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

{

write_data(dis0[n]);

delay(10);

}

delay(100);

write_com(0x40);//写1602,RAM地址

for(a=0;a<8;a++)//写入自定义字符,用于LCD显示

{

write_data(dis1[a]);

}

temp=0xc0;//赋初始化显示,进程标志的初始地址

for(b=0;b<16;b++)//显示进程标志的进度

{

write_com(temp);//写进程命令

write_data(0);//显示进程标志

delay(100);

temp++;

}write_com(0x40);//写1602,RAM地址

for(z=0;z<16;z++)//写入自定义字符(温度符号),用于LCD显示

{

write_data(dis3[z]);

}

delay(50);

}

/*************************************************/

voidinit_LCD()//初始化LCD1602

{

write_com(0x01);//清屏

write_com(0x38);//8位数据,双列,5*7字形

write_com(0x0c);//开启显示屏,关光标,光标不闪烁

write_com(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

write_com(0x80);//写LCD初始显示地址

}

/*************************************************/

voidwrite_com(ucharcom)//写LCD1602指令

{

rs=0;//选择指令寄存器

rw=0;//选择写

P1=com;//把命令字送入P0

delay(5);//延时一小会儿,让1602准备接收数据

en=1;//使能线电平变化,命令送入1602的8位数据口

en=0;

}

/*************************************************/

voidwrite_data(uchardate)//写LCD显示数据

{

rs=1;//选择数据寄存器

rw=0;//选择写

P1=date;//把要显示的数据送入P1

delay(5);//延时一小会儿,让1602准备接收数据

en=1;//使能线电平变化,数据送入1602的8位数据口

en=0;

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2