基于51单片机的温湿度与时钟显示器文档格式.docx

上传人:b****3 文档编号:17893126 上传时间:2022-12-11 格式:DOCX 页数:26 大小:363.83KB
下载 相关 举报
基于51单片机的温湿度与时钟显示器文档格式.docx_第1页
第1页 / 共26页
基于51单片机的温湿度与时钟显示器文档格式.docx_第2页
第2页 / 共26页
基于51单片机的温湿度与时钟显示器文档格式.docx_第3页
第3页 / 共26页
基于51单片机的温湿度与时钟显示器文档格式.docx_第4页
第4页 / 共26页
基于51单片机的温湿度与时钟显示器文档格式.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

基于51单片机的温湿度与时钟显示器文档格式.docx

《基于51单片机的温湿度与时钟显示器文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温湿度与时钟显示器文档格式.docx(26页珍藏版)》请在冰豆网上搜索。

基于51单片机的温湿度与时钟显示器文档格式.docx

4、设计步骤及原理

步骤1:

原理图分析与设计

单片机最小系统原理图如图4-1-1所示:

图4-1-1

51单片机最小系统包括了主要由电源、复位、振荡电路以及扩展部分等部分组成。

对于电源供电模块可以通过USB电源线连接电脑供给,另外也可以用外部稳定的5V电源供电模块供给。

对于复位电路,本设计中采用按键复位方法。

按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。

对于时钟震荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。

而本次设计采用了12MHz的晶体振荡器作为震荡源。

温湿度传感器温湿度数据采集模块如图4-1-2所示,DHT11是一款有已校准数字信号输出的温湿度传感器。

精度湿度+-5%RH,温度+-2℃,量程湿度20-90%R温度0~50℃。

DHT11数图4-1-2

字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHT11传感器都在极为精确的湿度校验室中进行校准。

校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。

单线制串行接口,使系统集成变得简易快捷。

超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。

产品为4针单排引脚封装,连接方便。

本设计中采用DHT11传感器将采集的温度传送给单片机,然后内部进行BCD码转换,最后通过LCD1602液晶显示器显示出来。

LCD1602液晶显示器模块如图4-1-3所示,602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样。

本次设计中将多出来的15脚接上VCC,然后GND(16脚)接到单片机的P24口,然后通过按键K5图4-1-3

来控制P24口输出电平的状态从而

控制LCD1602液晶显示器的背光的开关。

仿真中由于无法仿真背光效果,只能通过LED状态

图4-1-4确定,如图4-1-4所示。

通过网上查阅LCD1602液晶显示器的芯片手册可以知道,将D0-D7八个数据口连接P0,然后通过RS、RW以及使能端E控制LCD的读写操作。

步骤2:

流程设计

通过对课本的学习以及课外学习的知识,然后根据自己的构想来设计实现怎么样的效果,通过对软件设计思路的分析,得到该设计的系统主程序流程图如图4-2-1所示:

 

图4-2-1

系统开始后,先对定时器以及显示器进行初始化,然后写入框架显示时间和温度。

当定时器中断时,内部对秒进行自加,加到60s后自动归零且分自加,其它时间标志位也是一样。

当然,每1s满时显示会刷新一次从新显示新的数据,温度函数也是按照指定时间进行测量刷新。

步骤3:

软件编程

1.建立LCD.H文件

#ifndef__LCD_H_

#define__LCD_H_

#include<

reg51.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineLCD1602_DATAPINSP0

sbitLCD1602_E=P2^7;

sbitLCD1602_RW=P2^5;

sbitLCD1602_RS=P2^6;

voidLcd1602_Delay1ms(uintc);

voidLcdWriteCom(ucharcom);

voidLcdWriteData(uchardat);

voidLcdInit();

#endif

2.建立LCD.C函数

#include"

LCD.h"

//包含自建立库文件

voidLcd1602_Delay1ms(uintc)//延时函数

{

uchara,b;

for(;

c>

0;

c--)

{

for(b=199;

b>

b--)

{

for(a=1;

a>

a--);

}

}

}

voidLcdWriteCom(ucharcom)

LCD1602_E=0;

LCD1602_RS=0;

LCD1602_RW=0;

LCD1602_DATAPINS=com;

Lcd1602_Delay1ms

(1);

LCD1602_E=1;

Lcd1602_Delay1ms(5);

LCD1602_DATAPINS=com<

<

4;

voidLcdWriteData(uchardat)

LCD1602_RS=1;

LCD1602_DATAPINS=dat;

LCD1602_DATAPINS=dat<

voidLcdInit()//初始化

LcdWriteCom(0x32);

LcdWriteCom(0x28);

LcdWriteCom(0x0c);

LcdWriteCom(0x06);

LcdWriteCom(0x01);

LcdWriteCom(0x80);

3.建立DHT11.H库文件

#ifndef__DHT11_H__

#define__DHT11_H__

#include<

intrins.h>

sbitDHT_DATA=P1^0;

bitDHT_Start();

bitDHT_ByteRead(unsignedchar*dat);

4.建立DHT11.C文件

DHT11.h"

voiddelay_ms(unsignedcharx)

unsignedchara;

while(x--)

for(a=0;

a<

114;

a++);

voiddelay_30us(void)

for(a=12;

voiddelay_40us(void)

unsignedchara,b;

for(b=3;

for(a=4;

bitDHT_Start()

{unsignedcharm=0;

DHT_DATA=1;

DHT_DATA=0;

delay_ms(20);

delay_40us();

if(DHT_DATA==1)

return0;

else

while((DHT_DATA==0)&

&

(m<

200))m++;

return1;

bitDHT_ByteRead(unsignedchar*dat)

{unsignedchartemp=0;

unsignedcharx,y;

unsignedcharm=0;

unsignedcharn=0;

unsignedcharmask=0x01;

unsignedcharsum=0;

for(y=0;

y<

5;

y++)

for(mask=0x80;

mask!

=0;

mask>

>

=1)

{

while(DHT_DATA==0&

m<

200)m++;

delay_30us();

if(DHT_DATA)

temp|=mask;

else

temp&

=(~mask);

while(DHT_DATA==1&

n<

200)n++;

}

*(dat+y)=temp;

temp=0;

}

for(x=0;

x<

4;

x++)

sum+=*(dat+x);

if((sum&

=0xff)==*(dat+4))

return1;

5.建立主函数main.c文件

sbitbeep=P1^0;

//

sbitBG=P2^4;

sbitK1=P1^1;

sbitK2=P1^2;

sbitK3=P1^3;

sbitK4=P1^4;

sbitK5=P1^5;

//sbitbeep=P2^0;

ucharcodetable0[]="

H:

"

;

ucharcodetable1[]="

T:

ucharcodetable2[]="

%"

ucharcodetable3[]="

C"

ucharcodetable_1[]="

2016-06-03"

ucharcodetable_2[]="

16:

00:

005"

ucharDHT[5];

uchartmp,i,j,k;

ucharcount,shi,fen,miao,month,day,week,year;

ucharK1num,K2num,K3num;

bitflag_1s=1;

voidDelay10ms(unsignedintx);

voidKeyscan();

voidKeyscan2();

voidWtimer(ucharad,uchardat);

voidmain()

LcdInit();

BG=1;

beep;

TMOD=0X01;

TH0=(65536-50000)/256;

/*11.0592MHz46080*/

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

LcdWriteCom(0X86);

for(j=0;

j<

10;

j++)

LcdWriteData(table_1[j]);

LcdWriteCom(0Xc6);

LcdWriteData(table_2[j]);

while

(1)

Keyscan();

Keyscan2();

if(flag_1s)

flag_1s=0;

DHT_Start();

tmp=DHT_ByteRead(&

DHT);

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

LcdWriteCom(0x80);

for(i=0;

i<

2;

i++)

LcdWriteData(table0[i]);

LcdWriteData(DHT[0]/10+'

0'

);

LcdWriteData(DHT[0]%10+'

LcdWriteData(table2[0]);

LcdWriteCom(0xC0);

LcdWriteData(table1[i]);

LcdWriteData(DHT[2]/10+'

LcdWriteData(DHT[2]%10+'

LcdWriteData(table3[0]);

//LcdWriteCom(0x07);

//Ò

Æ

Á

voidDelay10ms(unsignedintx)

unsignedintt;

while(x--)

for(t=0;

t<

t++);

voidTimer0()interrupt1

{

unsignedchart;

TH0=(65536-50000)/256;

/*11.0592MHz*/

TL0=(65536-50000)%256;

t++;

if(t%40==0)

flag_1s=1;

count++;

if(20==count)

count=0;

miao++;

if(60==miao)

miao=0;

fen++;

if(60==fen)

{

fen=0;

shi++;

if(24==shi)

{

shi=0;

day++;

week++;

if(week>

7)

week=1;

if(31==day)

{

day=1;

month++;

if(12==month)

{

month=1;

year++;

Wtimer(6-0x40+2,year);

}

Wtimer(6-0x40+5,month);

}

Wtimer(6-0x40+8,day);

}

Wtimer(6,shi);

}

Wtimer(9,fen);

Wtimer(12,miao);

voidKeyscan()

K1=1;

K2=1;

K3=1;

if(0==K1)

Delay10ms(5);

K1num++;

while(!

K1);

if(1==K1num)

TR0=0;

LcdWriteCom(0XC0+13);

LcdWriteCom(0X0F);

}

if(2==K1num)

LcdWriteCom(0XC0+10);

if(3==K1num)

LcdWriteCom(0XC0+7);

if(4==K1num)

LcdWriteCom(0x89);

if(5==K1num)

{

LcdWriteCom(0x8C);

if(6==K1num)

LcdWriteCom(0x8F);

if(7==K1num)

TR0=1;

K1num=0;

LcdWriteCom(0x0c);

if(0!

=K1num)

if(0==K2)

Delay10ms(5);

while(!

K2);

if(1==K1num)

miao++;

if(60==miao)

miao=0;

LcdWriteCom(0xc0+12);

Wtimer(12,miao);

LcdWriteCom(0xc0+13);

if(2==K1num)

{

fen++;

if(60==fen)

fen=0;

LcdWriteCom(0xc0+9);

Wtimer(9,fen);

LcdWriteCom(0xc0+10);

if(3==K1num)

shi++;

if(24==shi)

shi=0;

LcdWriteCom(0xc0+6);

Wtimer(6,shi);

LcdWriteCom(0xc0+7);

}

if(4==K1num)

year++;

if(30==year)

year=16;

LcdWriteCom(0x88);

Wtimer(0x08-0x40,year);

LcdWriteCom(0x89);

if(5==K1num)

month++;

if(13==month)

month=1;

LcdWriteCom(0x8B);

Wtimer(0x0B-0x40,month);

LcdWriteCom(0x8C);

if(6==K1num)

day++;

if(day>

31)

day=1;

LcdWriteCom(0x8E);

Wtimer(0x0E-0x40,day);

LcdWriteCom(0x8F);

}

if(0==K3)

K3);

miao--;

if(255==miao)

miao=59;

LcdWriteCom(0xc0+10+2);

LcdWriteCom(0xc0+11+2);

if(2==K1num)

fen--;

if(255==fen)

fen=59;

if(3==K1num)

shi--;

if(255==shi)

shi=23;

year--;

if(255==year)

month--;

if(255==month)

month=12;

day--;

if(day<

1)

day=31;

voidWtimer(ucharad,uchar

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

当前位置:首页 > 求职职场 > 面试

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

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