AT89C52与SHT10和1602液晶测温湿度的程序Word文档下载推荐.docx
- 文档编号:7159474
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:15
- 大小:18.36KB
AT89C52与SHT10和1602液晶测温湿度的程序Word文档下载推荐.docx
《AT89C52与SHT10和1602液晶测温湿度的程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《AT89C52与SHT10和1602液晶测温湿度的程序Word文档下载推荐.docx(15页珍藏版)》请在冰点文库上搜索。
//向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>
y--);
}
voidLCD_Write(bitstyle,unsignedcharinput)
LcdRs=style;
P0=input;
delay(5);
LcdEn=1;
LcdEn=0;
voidLCD_SetDisplay(unsignedcharDisplayMode)
LCD_Write(LCD_COMMAND,0x08|DisplayMode);
voidLCD_SetInput(unsignedcharInputMode)
LCD_Write(LCD_COMMAND,0x04|InputMode);
//初始化LCD************************************************************
voidLCD_Initial()
LCD_Write(LCD_COMMAND,0x38);
//8位数据端口,2行显示,5*7点阵
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);
Codeofsht10"
delay(200);
/*--------------------------------------
;
模块名称:
delay_n10us();
功能:
延时函数,延时约n个10us
较精确的延时函数,"
_nop_()"
延时1us@12M晶振
-------------------------------------*/
voiddelay_n10us(uintn)//延时n个10us@12M晶振
uinti;
for(i=n;
i>
i--)
_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;
DATA=0;
s_connectionreset();
连接复位函数
voids_connectionreset(void)
//communicationreset:
DATA-line=1andatleast9SCKcyclesfollowedbytransstart
//_____________________________________________________________
//_______________
__||__||__||__||__||__||__||__||__||______||___||______
unsignedchari;
for(i=0;
i<
9;
i++)//9SCKcycles
{
}
s_transstart();
//transmissionstart
s_write_byte();
SHT10写函数
chars_write_byte(unsignedcharvalue)
//----------------------------------------------------------------------------------
//writesabyteontheSensibusandcheckstheacknowledge
unsignedchari,error=0;
for(i=0x80;
i/=2)//shiftbitformasking
if(i&
value)DATA=1;
//maskingvaluewithi,writetoSENSI-BUS
elseDATA=0;
//clkforSENSI-BUS
//pulswithapprox.3us
//releaseDATA-line
//clk#9forack
error=DATA;
//checkack(DATAwillbepulleddownbyDHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。
returnerror;
//error=1incaseofnoacknowledge//返回:
0成功,1失败
s_read_byte();
SHT10读函数
chars_read_byte(unsignedcharack)
//readsabyteformtheSensibusandgivesanacknowledgeincaseof"
ack=1"
unsignedchari,val=0;
{SCK=1;
if(DATA)val=(val|i);
//readbit
//pulswithapprox.3us
if(ack==1)DATA=0;
//incaseof"
ack==1"
pulldownDATA-Line
elseDATA=1;
//如果是校验(ack==0),读取完后结束通讯
returnval;
s_measure();
测量温湿度函数
chars_measure(unsignedchar*p_value,unsignedchar*p_checksum,unsignedcharmode)
//makesameasurement(humidity/temperature)withchecksum
unsignederror=0;
unsignedinti;
switch(mode){//sendcommandtosensor
caseTEMP:
error+=s_write_byte(MEASURE_TEMP);
break;
caseHUMI:
error+=s_write_byte(MEASURE_HUMI);
default:
for(i=0;
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
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;
constfloatC3=-0.0000028;
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
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;
calc_dht90(&
humi_val.f,&
temp_val.f);
//计算湿度与温度
GotoXY(0,0);
//
Print("
Tep:
"
GotoXY(0,1);
Hum:
zhuanhuan(temp_val.f);
//转换温度为uchar方便液晶显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AT89C52 SHT10 1602 液晶 测温 湿度 程序