温度万年历的单片机实现实验报告.docx

上传人:b****5 文档编号:7657732 上传时间:2023-01-25 格式:DOCX 页数:13 大小:285.16KB
下载 相关 举报
温度万年历的单片机实现实验报告.docx_第1页
第1页 / 共13页
温度万年历的单片机实现实验报告.docx_第2页
第2页 / 共13页
温度万年历的单片机实现实验报告.docx_第3页
第3页 / 共13页
温度万年历的单片机实现实验报告.docx_第4页
第4页 / 共13页
温度万年历的单片机实现实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

温度万年历的单片机实现实验报告.docx

《温度万年历的单片机实现实验报告.docx》由会员分享,可在线阅读,更多相关《温度万年历的单片机实现实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

温度万年历的单片机实现实验报告.docx

温度万年历的单片机实现实验报告

 

一、温度万年历设计的目的和意义.............................1

 

一、温度万年历设计的目的和意义

随着社会的发展,信息量的不断提升以前对信息交换的要求提高,温度万年历的发展以及投入市场变得非常有必要。

本设计是基于51单片机并模拟日常所用的日历,而51系列单片机是各单片机中最为典型和最有代表性的一种。

通过本次设计,学习和巩固了单片机指令编程的相关知识,熟悉单片机各部件的组成及其功能。

 

本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电

子万年历。

传统的电子日历大都体积大,功耗大,显示不准确等特点。

为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。

另外本设计具有显示实时温度的功能。

传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。

本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。

最后,温度和时间都将通过LCD1602液晶显示器进行显示。

测试表明系统达到了设计要求的各项功能,各部分工作正常。

二、电路设计方案

采用AT89S52作为主控制系统;直接采用单片机定时计数器提供秒信号;LCD液晶显示屏作为显示。

三、原理设计

1.基本原理:

本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作;时钟电路直接采用单片机定时计数器提供秒信号;温度的采集由DS18B20构成;显示部份由LCD液晶显示屏显示。

同时还添加了提醒功能,通过蜂鸣器实现。

2.总体框图

 

图1

3.单元电路设计

◆单片机主控制模块的设计

AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。

单片机的最小系统如下图2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。

第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。

DS18B20性能

●独特的单线接口仅需一个端口引脚进行通信

●简单的多点分布应用

●无需外部器件

●可通过数据线供电

●零待机功耗

●测温范围-55~+125℃,以0.5℃递增

●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃

●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字

●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统

●负压特性:

电源极性接反时,传感器不会因发热而烧毁,但不能正常工作

●GND:

●DQ:

单线运用的数据输入/输出引脚

●VD:

可选的电源引脚

4.元件列表

元件列表器件

数量

光汇51单片机开发板

1

杜邦线

若干

DS18B20

1

LCD1602液晶屏

1

四、方案结构图

此方案由于只用到51单片机芯片,因此各个功能都是由编程来实现。

大体程序流程框图如下

 

按键调整结构图:

时钟调整一

时钟调整二

 

Protues电路图(部分):

温度万年历整体电路图

时钟调整按键图

时钟调整LCM显示图

 

五、温度万年历1602驱动及显示的详细设计

驱动部分的代码:

头文件如下:

#ifndef__1602_H__

#define__1602_H__

voidRdBusy(void);

voidWrCommand(charcommand);

voidWrData(charwrdata);

#endif

1602驱动源代码如下:

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

LCM1602驱动程序

8线间接控制方式

晶体频率12MHz

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

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

1602LCD各引脚接口说明

VSS电源地

VDD电源正极

VL液晶显示偏压

RS数据/命令选择

R/WRW读写选择/******************************************************************************

LCM1602驱动程序

8线间接控制方式

晶体频率12MHz

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

#include

#include

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

1602LCD各引脚接口说明

VSS电源地

VDD电源正极

VL液晶显示偏压

RS数据/命令选择

R/WRW读写选择

E使能信号

D0数据背光源正极

D1数据背光源负极

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

 

/*1602接口定义*/

#defineLCMP0

sbitRS=P2^5;//0,command;1,datajkhjholkhkk

sbitRW=P2^6;//0,write;1,read

sbitE=P2^7;//下降沿有效

/*常数定义*/

#defineCMD0//RS=0,命令

#defineDAT1//RS=1,数据

//模块忙闲判断

voidRdBusy(void)

{

charflag=0xff;

do

{

LCM=0xff;

RS=CMD;

RW=1;

E=1;

_nop_();

_nop_();

_nop_();//这三句很重要

flag=LCM;

E=0;

flag&=0x80;

}

while(flag);

}

//写命令

voidWrCommand(charcommand)

{

LCM=command;

RS=CMD;

RW=0;

E=1;

E=0;

RW=1;

RdBusy();//等待LCM完成本次操作

}

//写数据

voidWrData(charwrdata)

{

LCM=wrdata;

RS=DAT;

RW=0;

E=1;

E=0;

RW=1;

RdBusy();//等待LCM完成本次操作

}

/*

E使能信号

D0数据背光源正极

D1数据背光源负极

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

显示头文件:

#ifndef__DISPLAY_H__

#define__DISPLAY_H__

#defineucharunsignedchar

 

voiddelayx5ms(intdcnt);

voidLcmInit(void);

voidClrLine(ucharline);

voidWrite1Line(ucharline,uchar*buf);

voidWrData2Addr(ucharaddr,uchardat);

voiddisall();

voidoffall();

#endif

显示C源代码:

#include

#include"1602.h"

#defineLCMP0

#defineucharunsignedchar

externucharflag;

externucharyear,month,date,day,hour,minu,sec;

externucharDispbuf0[16];

externucharDispbuf1[16];

externcodeucharNum2Asc[16];

externcodeucharWEEK[21];

externuchars1num;

//延迟子程序,基数5ms

voiddelayx5ms(intdcnt)

{

inttmp;

for(;dcnt>0;dcnt--)

{

tmp=0x230;

while(tmp--)continue;

}

}

//模块初始化

voidLcmInit(void)

{

LCM=0;

delayx5ms(40);//延迟200ms

WrCommand(0x38);//8bit接口,两行显示,5×7点阵

delayx5ms

(2);//延迟10ms

WrCommand(0x38);//同上,该指令要写两次

delayx5ms

(1);//延迟5ms

WrCommand(0x06);//地址加一,字符不移动

WrCommand(0x0c);//开显示,光标不显示,光标不闪烁

WrCommand(0x01);//清屏

}

//指定行清屏子程序

voidClrLine(ucharline)

{

unsignedchari=0;

WrCommand(0x80+line);//指向擦除行的首字符位

for(;i<16;i++)

WrData('');

}

voidWrite1Line(ucharline,uchar*buf)

{

ucharaddr=0,i;

if(line==0)

addr=0x80;

else

addr=0xc0;

WrCommand(addr);

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

WrData(*buf++);

}

voidWrData2Addr(ucharaddr,uchardat){

WrCommand(addr);

WrData(dat);

}

voiddisall(){

Dispbuf0[3]=Num2Asc[year/10];

Dispbuf0[4]=Num2Asc[year%10];

Dispbuf0[6]=Num2Asc[month/10];

Dispbuf0[7]=Num2Asc[month%10];

Dispbuf0[9]=Num2Asc[date/10];

Dispbuf0[10]=Num2Asc[date%10];

Dispbuf0[12]=WEEK[day*3];

Dispbuf0[13]=WEEK[day*3+1];

Dispbuf0[14]=WEEK[day*3+2];

Dispbuf1[1]=Num2Asc[hour/10];

Dispbuf1[2]=Num2Asc[hour%10];

Dispbuf1[4]=Num2Asc[minu/10];

Dispbuf1[5]=Num2Asc[minu%10];

Dispbuf1[7]=Num2Asc[sec/10];

Dispbuf1[8]=Num2Asc[sec%10];

Write1Line(0,&Dispbuf0[0]);

Write1Line(1,&Dispbuf1[0]);

}

voidoffall(){

switch(s1num){

case1:

Dispbuf1[7]='';

Dispbuf1[8]='';

break;

case2:

Dispbuf1[4]='';

Dispbuf1[5]='';

break;

case3:

Dispbuf1[1]='';

Dispbuf1[2]='';

break;

case4:

Dispbuf0[12]='';

Dispbuf0[13]='';

Dispbuf0[14]='';

break;

case5:

Dispbuf0[9]='';

Dispbuf0[10]='';

break;

case6:

Dispbuf0[6]='';

Dispbuf0[7]='';

break;

case7:

Dispbuf0[3]='';

Dispbuf0[4]='';

break;

default:

*Dispbuf0="";

*Dispbuf1="";

}

Write1Line(0,&Dispbuf0[0]);

Write1Line(1,&Dispbuf1[0]);

}

六、心得与总结

经过万年历的设计,让我学到了很多,让我认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。

有一些灵活的技巧就需要我们认真的阅读元件的数据手册,从中索取对自己有用的信息。

在这短暂的一个星期课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。

更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。

而这是以后最实用的,真的是受益匪浅。

要面对社会的挑战,只有不断的学习、实践,再学习、再实践。

同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。

通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。

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

当前位置:首页 > 农林牧渔 > 林学

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

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