温度万年历的单片机实现实验报告Word文档下载推荐.docx

上传人:b****1 文档编号:4199074 上传时间:2023-05-02 格式:DOCX 页数:15 大小:285.18KB
下载 相关 举报
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第1页
第1页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第2页
第2页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第3页
第3页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第4页
第4页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第5页
第5页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第6页
第6页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第7页
第7页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第8页
第8页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第9页
第9页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第10页
第10页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第11页
第11页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第12页
第12页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第13页
第13页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第14页
第14页 / 共15页
温度万年历的单片机实现实验报告Word文档下载推荐.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

温度万年历的单片机实现实验报告Word文档下载推荐.docx

《温度万年历的单片机实现实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《温度万年历的单片机实现实验报告Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。

温度万年历的单片机实现实验报告Word文档下载推荐.docx

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="

}

六、心得与总结

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

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

在这短暂的一个星期课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 

动手制作的能力,在各种其它能力上也都有了提高。

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

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

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

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

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

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

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

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

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