AT89C52与SHT10和1602液晶测温湿度的程序.docx
《AT89C52与SHT10和1602液晶测温湿度的程序.docx》由会员分享,可在线阅读,更多相关《AT89C52与SHT10和1602液晶测温湿度的程序.docx(15页珍藏版)》请在冰豆网上搜索。
![AT89C52与SHT10和1602液晶测温湿度的程序.docx](https://file1.bdocx.com/fileroot1/2023-2/28/2a1794c7-639b-4f05-9a9a-10bda2e07f22/2a1794c7-639b-4f05-9a9a-10bda2e07f221.gif)
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方便液晶显示