温度万年历的单片机实现实验报告Word文档下载推荐.docx
- 文档编号:4199074
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:15
- 大小:285.18KB
温度万年历的单片机实现实验报告Word文档下载推荐.docx
《温度万年历的单片机实现实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《温度万年历的单片机实现实验报告Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
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
LCD1602液晶屏
四、方案结构图
此方案由于只用到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读写选择/******************************************************************************
#include<
reg51.h>
intrins.h>
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_();
//这三句很重要
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;
/*
显示头文件:
#ifndef__DISPLAY_H__
#define__DISPLAY_H__
#defineucharunsignedchar
voiddelayx5ms(intdcnt);
voidLcmInit(void);
voidClrLine(ucharline);
voidWrite1Line(ucharline,uchar*buf);
voidWrData2Addr(ucharaddr,uchardat);
voiddisall();
voidoffall();
显示C源代码:
#include"
1602.h"
#defineLCMP0
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
//同上,该指令要写两次
delayx5ms
(1);
//延迟5ms
WrCommand(0x06);
//地址加一,字符不移动
WrCommand(0x0c);
//开显示,光标不显示,光标不闪烁
WrCommand(0x01);
//清屏
//指定行清屏子程序
voidClrLine(ucharline)
unsignedchari=0;
WrCommand(0x80+line);
//指向擦除行的首字符位
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++)
WrData(*buf++);
voidWrData2Addr(ucharaddr,uchardat){
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]='
case3:
Dispbuf1[1]='
Dispbuf1[2]='
case4:
Dispbuf0[12]='
Dispbuf0[13]='
Dispbuf0[14]='
case5:
Dispbuf0[9]='
Dispbuf0[10]='
case6:
Dispbuf0[6]='
Dispbuf0[7]='
case7:
Dispbuf0[3]='
Dispbuf0[4]='
break;
default:
*Dispbuf0="
"
*Dispbuf1="
}
六、心得与总结
经过万年历的设计,让我学到了很多,让我认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。
有一些灵活的技巧就需要我们认真的阅读元件的数据手册,从中索取对自己有用的信息。
在这短暂的一个星期课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、
动手制作的能力,在各种其它能力上也都有了提高。
更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。
而这是以后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。
通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 万年历 单片机 实现 实验 报告