温度万年历的单片机实现实验报告.docx
- 文档编号:10824104
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:15
- 大小:283.92KB
温度万年历的单片机实现实验报告.docx
《温度万年历的单片机实现实验报告.docx》由会员分享,可在线阅读,更多相关《温度万年历的单片机实现实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
温度万年历的单片机实现实验报告
一、温度万年历设计的目的和意义.............................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]);
}
六、心得与总结
经过万年历的设计,让我学到了很多,让我认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。
有一些灵活的技巧就需要我们认真的阅读元件的数据手册,从中索取对自己有用的信息。
在这短暂的一个星期课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。
更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。
而这是以后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。
通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 万年历 单片机 实现 实验 报告