AT89C52与SHT10和1602液晶测温湿度的程序.docx

上传人:b****8 文档编号:11384798 上传时间:2023-02-28 格式:DOCX 页数:15 大小:18.23KB
下载 相关 举报
AT89C52与SHT10和1602液晶测温湿度的程序.docx_第1页
第1页 / 共15页
AT89C52与SHT10和1602液晶测温湿度的程序.docx_第2页
第2页 / 共15页
AT89C52与SHT10和1602液晶测温湿度的程序.docx_第3页
第3页 / 共15页
AT89C52与SHT10和1602液晶测温湿度的程序.docx_第4页
第4页 / 共15页
AT89C52与SHT10和1602液晶测温湿度的程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

AT89C52与SHT10和1602液晶测温湿度的程序.docx

《AT89C52与SHT10和1602液晶测温湿度的程序.docx》由会员分享,可在线阅读,更多相关《AT89C52与SHT10和1602液晶测温湿度的程序.docx(15页珍藏版)》请在冰豆网上搜索。

AT89C52与SHT10和1602液晶测温湿度的程序.docx

AT89C52与SHT10和1602液晶测温湿度的程序

/*************端口定义********************

P1.0------SCK(SHT10)

P1.1------DATA(SHT10)

P0------DB0~DB7(LCD1602)

P2.0------RS(LCD1602)

P2.1------RW(LCD1602)

P2.2------E(LCD1602)

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

#include

#include

#include

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

//按键设置

sbitTEM_UP=P1^2;

sbitTEM_DOWN=P1^3;

sbitHUM_UP=P1^4;

sbitHUM_DOWN=P1^5;

sbitSHEZHI_ENTER=P1^6;

sbitSHEZHI_EXIT=P1^7;

floatf_tem_up_value=50.0;

floatf_tem_down_value=-30.0;

floatf_hum_up_value=10.0;

floatf_hum_down_value=100.0;

//1602液晶端口定义******

sbitLcdRs=P2^0;

sbitLcdRw=P2^1;

sbitLcdEn=P2^2;

sbitACC0=ACC^0;

sbitACC7=ACC^7;

ucharstr[7];

//向LCD写入命令或数据************************************************************

#defineLCD_COMMAND0//Command

#defineLCD_DATA1//Data

#defineLCD_CLEAR_SCREEN0x01//清屏

#defineLCD_HOMING0x02//光标返回原点

//设置显示模式************************************************************

#defineLCD_SHOW0x04//显示开

#defineLCD_HIDE0x00//显示关

#defineLCD_CURSOR0x02//显示光标

#defineLCD_NO_CURSOR0x00//无光标

#defineLCD_FLASH0x01//光标闪动

#defineLCD_NO_FLASH0x00//光标不闪动

//设置输入模式************************************************************

#defineLCD_AC_UP0x02

#defineLCD_AC_DOWN0x00//default

#defineLCD_MOVE0x01//画面可平移

#defineLCD_NO_MOVE0x00//default

unsignedcharLCD_Wait(void);

voidLCD_Write(bitstyle,unsignedcharinput);

/***********1602液晶显示部分子程序****************/

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidLCD_Write(bitstyle,unsignedcharinput)

{

LcdRs=style;

P0=input;

delay(5);

LcdEn=1;

delay(5);

LcdEn=0;

}

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

}

voidLCD_SetInput(unsignedcharInputMode)

{

LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//初始化LCD************************************************************

voidLCD_Initial()

{

LcdEn=0;

LCD_Write(LCD_COMMAND,0x38);//8位数据端口,2行显示,5*7点阵

LCD_Write(LCD_COMMAND,0x38);

LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);//开启显示,无光标

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);//清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);//AC递增,画面不动

}

//液晶字符输入的位置************************

voidGotoXY(unsignedcharx,unsignedchary)

{

if(y==0)

LCD_Write(LCD_COMMAND,0x80|x);

if(y==1)

LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//将字符输出到液晶显示

voidPrint(unsignedchar*str)

{

while(*str!

='\0')

{

LCD_Write(LCD_DATA,*str);

str++;

}

}

voidzhuanhuan(floata)//浮点数转换成字符串函数

{

memset(str,0,sizeof(str));

sprintf(str,"%f",a);

}

voidwelcome()

{

LCD_Initial();

GotoXY(0,0);

Print("Welcome!

");

GotoXY(0,1);

Print("Codeofsht10");

delay(200);

}

/*--------------------------------------

;模块名称:

delay_n10us();

;功能:

延时函数,延时约n个10us

较精确的延时函数,"_nop_()"延时1us@12M晶振

;-------------------------------------*/

voiddelay_n10us(uintn)//延时n个10us@12M晶振

{

uinti;

for(i=n;i>0;i--)

{

_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();

}

}

//*********************第一部分LCD1602设置END****************************************

//*********************第二部分DHT90设置START****************************************

sbitSCK=P1^0;//定义通讯时钟端口

sbitDATA=P1^1;//定义通讯数据端口

typedefunion

{unsignedinti;//定义了两个共用体

floatf;

}value;

enum{TEMP,HUMI};//TEMP=0,HUMI=1

#definenoACK0//用于判断是否结束通讯

#defineACK1//结束数据传输

//adrcommandr/w

#defineSTATUS_REG_W0x06//00000110

#defineSTATUS_REG_R0x07//00000111

#defineMEASURE_TEMP0x03//00000011

#defineMEASURE_HUMI0x05//00000101

#defineRESET0x1e//00011110

/****************定义函数****************/

voids_transstart(void);//启动传输函数

voids_connectionreset(void);//连接复位函数

chars_write_byte(unsignedcharvalue);//DHT90写函数

chars_read_byte(unsignedcharack);//DHT90读函数

chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode);//测量温湿度函数

voidcalc_dht90(float*p_humidity,float*p_temperature);//温湿度补偿

/*--------------------------------------

;模块名称:

s_transstart();

;功能:

启动传输函数

;-------------------------------------*/

voids_transstart(void)

//generatesatransmissionstart

//_____________

//DATA:

|_______|

//______

//SCK:

___||___||______

{

DATA=1;SCK=0;//Initialstate

_nop_();

SCK=1;

_nop_();

DATA=0;

_nop_();

SCK=0;

_nop_();_nop_();_nop_();

SCK=1;

_nop_();

DATA=1;

_nop_();

SCK=0;

}

/*--------------------------------------

;模块名称:

s_connectionreset();

;功能:

连接复位函数

;-------------------------------------*/

voids_connectionreset(void)

//communicationreset:

DATA-line=1andatleast9SCKcyclesfollowedbytransstart

//_____________________________________________________________

//DATA:

|_______|

//_______________

//SCK:

__||__||__||__||__||__||__||__||__||______||___||______

{

unsignedchari;

DATA=1;SCK=0;//Initialstate

for(i=0;i<9;i++)//9SCKcycles

{

SCK=1;

SCK=0;

}

s_transstart();//transmissionstart

}

/*--------------------------------------

;模块名称:

s_write_byte();

;功能:

SHT10写函数

;-------------------------------------*/

chars_write_byte(unsignedcharvalue)

//----------------------------------------------------------------------------------

//writesabyteontheSensibusandcheckstheacknowledge

{

unsignedchari,error=0;

for(i=0x80;i>0;i/=2)//shiftbitformasking

{

if(i&value)DATA=1;//maskingvaluewithi,writetoSENSI-BUS

elseDATA=0;

SCK=1;//clkforSENSI-BUS

_nop_();_nop_();_nop_();//pulswithapprox.3us

SCK=0;

}

DATA=1;//releaseDATA-line

SCK=1;//clk#9forack

error=DATA;//checkack(DATAwillbepulleddownbyDHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。

_nop_();_nop_();_nop_();

SCK=0;

DATA=1;//releaseDATA-line

returnerror;//error=1incaseofnoacknowledge//返回:

0成功,1失败

}

/*--------------------------------------

;模块名称:

s_read_byte();

;功能:

SHT10读函数

;-------------------------------------*/

chars_read_byte(unsignedcharack)

//readsabyteformtheSensibusandgivesanacknowledgeincaseof"ack=1"

{

unsignedchari,val=0;

DATA=1;//releaseDATA-line

for(i=0x80;i>0;i/=2)//shiftbitformasking

{SCK=1;//clkforSENSI-BUS

if(DATA)val=(val|i);//readbit

_nop_();_nop_();_nop_();//pulswithapprox.3us

SCK=0;

}

if(ack==1)DATA=0;//incaseof"ack==1"pulldownDATA-Line

elseDATA=1;//如果是校验(ack==0),读取完后结束通讯

_nop_();_nop_();_nop_();//pulswithapprox.3us

SCK=1;//clk#9forack

_nop_();_nop_();_nop_();//pulswithapprox.3us

SCK=0;

_nop_();_nop_();_nop_();//pulswithapprox.3us

DATA=1;//releaseDATA-line

returnval;

}

/*--------------------------------------

;模块名称:

s_measure();

;功能:

测量温湿度函数

;-------------------------------------*/

chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)

//makesameasurement(humidity/temperature)withchecksum

{

unsignederror=0;

unsignedinti;

s_transstart();//transmissionstart

switch(mode){//sendcommandtosensor

caseTEMP:

error+=s_write_byte(MEASURE_TEMP);break;

caseHUMI:

error+=s_write_byte(MEASURE_HUMI);break;

default:

break;

}

for(i=0;i<65535;i++)if(DATA==0)break;//waituntilsensorhasfinishedthemeasurement

if(DATA)error+=1;//ortimeout(~2sec.)isreached

*(p_value)=s_read_byte(ACK);//readthefirstbyte(MSB)

*(p_value+1)=s_read_byte(ACK);//readthesecondbyte(LSB)

*p_checksum=s_read_byte(noACK);//readchecksum

returnerror;

}

/*--------------------------------------

;模块名称:

calc_dht90();

;功能:

温湿度补偿函数

;-------------------------------------*/

voidcalc_dht90(float*p_humidity,float*p_temperature)

//calculatestemperature[C]andhumidity[%RH]

//input:

humi[Ticks](12bit)

//temp[Ticks](14bit)

//output:

humi[%RH]

//temp[C]

{constfloatC1=-4.0;//for12Bit

constfloatC2=+0.0405;//for12Bit

constfloatC3=-0.0000028;//for12Bit

constfloatT1=+0.01;//for14Bit@5V

constfloatT2=+0.00008;//for14Bit@5V

floatrh=*p_humidity;//rh:

Humidity[Ticks]12Bit

floatt=*p_temperature;//t:

Temperature[Ticks]14Bit

floatrh_lin;//rh_lin:

Humiditylinear

floatrh_true;//rh_true:

Temperaturecompensatedhumidity

floatt_C;//t_C:

Temperature[C]

t_C=t*0.01-40;//calc.temperaturefromticksto[C]

rh_lin=C3*rh*rh+C2*rh+C1;//calc.humidityfromticksto[%RH]

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;//calc.temperaturecompensatedhumidity[%RH]

if(rh_true>100)rh_true=100;//cutifthevalueisoutsideof

if(rh_true<0.1)rh_true=0.1;//thephysicalpossiblerange

*p_temperature=t_C;//returntemperature[C]

*p_humidity=rh_true;//returnhumidity[%RH]

}

//*********主函数*****************

voidmain(void)

{

valuehumi_val,temp_val;

unsignedcharerror,checksum;

LcdRw=0;

s_connectionreset();

welcome();//显示欢迎画面

delay(2000);

LCD_Initial();

while

(1)

{

//shezhi();

error=0;

error+=s_measure((unsignedchar*)&humi_val.i,&checksum,HUMI);//measurehumidity

error+=s_measure((unsignedchar*)&temp_val.i,&checksum,TEMP);//measuretemperature

if(error!

=0)

s_connectionreset();//incaseofanerror:

connectionreset

else

{

humi_val.f=(float)humi_val.i;//convertsintegertofloat

temp_val.f=(float)temp_val.i;//convertsintegertofloat

calc_dht90(&humi_val.f,&temp_val.f);//计算湿度与温度

GotoXY(0,0);//

Print("Tep:

");

GotoXY(0,1);

Print("Hum:

");

zhuanhuan(temp_val.f);//转换温度为uchar方便液晶显示

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

当前位置:首页 > 初中教育 > 语文

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

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