2019-03-24 19:58发布
#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charunsigned char code dis1[]={"TEM"};unsigned char code dis2[]={"HUM"};#define DATA P0sbit rs=P2^0;sbit rw=P2^1;sbit ep=P2^2;
/********************SHT11********************/
//#include<reg52.h>//#include<intrins.h>#include<math.h>#include<stdio.h>
#define TEM_TEST 0x03//温度检测命令#define HUM_TEST 0x05//湿度检测命令#define REG_READ 0x07//读寄存器#define REG_WRITE 0x06//写寄存器#define FUNCTION_SET 0x01//设置SHT11的工作精度为8位/湿度 12位温度//#define uint unsigned int//#define uchar unsigned char/**************************SHT11端口定义***************************/
sbit SHT11_DATA=P2^6;sbit SHT11_SCK=P2^5;uchar flag_tempeture=0; //显示温度位置的标志uchar flag_humidity=0; //显示湿度位置的标志
//uchar dat;uint i,temp1,temp2,dat=0,count;float tempeture1;float RHline,RHtrue;void delay(uint m){while(m--);}/***************************函数名称:Delay()函数功能:SHT11内部延时****************************/void Delay(){ ; ;}
/***************************函数名称:Delay_Ms()函数功能:SHT11检测等待延时函数说明:11ms/55ms/210ms 分别对应8位/12位/14位 测量结果对应的形参为N 则延时Nms****************************/void Delay_Ms(uint ms){ uint i,j; for(i=ms;i>0;i--) for(j=112;j>0;j--);}/**************************函数功能:SHT11启动时序***************************/void SHT11_Start(){ SHT11_SCK=1; SHT11_DATA=1; Delay(); SHT11_DATA=0; Delay(); SHT11_SCK=0; Delay(); SHT11_SCK=1; Delay(); SHT11_DATA=1;}
/******************************函数名称:SHT11_Sendbyte(uchar dat)函数功能: 向SHT11发送8bite数据******************************/void SHT11_Sendbyte(uchar dat){ uchar i; SHT11_SCK=0; Delay(); for(i=0;i<8;i++) { if(dat&0x80) { SHT11_DATA=1; Delay(); } else { SHT11_DATA=0; Delay(); } dat=dat<<1; SHT11_SCK=1; Delay(); SHT11_SCK=0; }}/*********************************函数名称SHT11_Answer():函数功能:检测SHT11的响应信号(在第九个时钟周期)***********************************/void SHT11_Answer(){ SHT11_SCK=1; Delay(); while(SHT11_DATA==1); SHT11_SCK=0; SHT11_DATA=1;}
/************************************函数名称:SHT11_Test_Finish()函数功能:检测SHT11温湿度检测是否完毕*************************************/void SHT11_Test_Finish(){ while(SHT11_DATA==1);}
/************************************函数名称:SHT11_Receivebyte()函数功能:从SHT11接收8bite数据*************************************/uchar SHT11_Receivebyte() { uchar i; SHT11_SCK=0; Delay(); for(i=0;i<8;i++) { SHT11_SCK=1; Delay(); dat=dat<<1; if(SHT11_DATA) { dat=dat|0x01; Delay(); } else { dat=dat&0xfe; Delay(); } SHT11_SCK=0; Delay(); } SHT11_DATA=1; //释放数据总线 return(dat); }
/***********************************函数名称:MCU_Answer()函数功能:单片机向SHT11发送应答信号*************************************/void MCU_Answer(){ SHT11_SCK=0; Delay(); SHT11_DATA=0; Delay(); SHT11_SCK=1; Delay(); SHT11_SCK=0; Delay(); SHT11_DATA=1; //释放数据总线 这条指令非常重要 不加的话导致单片机不能读取低8位}/***********************************函数名称:SHT11_End()当接收两个8byte数据后部接收CRC校验码************************************/void SHT11_End(){ SHT11_DATA=1; SHT11_SCK=1; Delay(); SHT11_SCK=0; Delay();}
/*************************************函数名称:void SHT11_Write_Register(uchar command ,uchar dat)函数说明:向SHT11的状态寄存器设置功能 command为REG_WRITE 0x06写寄存器 dat为 设置SHT11的功能 可以设置检测的数据位数***************************************/
void SHT11_Write_Register(uchar command ,uchar dat){ SHT11_Start(); SHT11_Sendbyte(command); SHT11_Answer(); SHT11_Sendbyte(dat); SHT11_Answer();}
/***************************************函数名称:uchar SHT11_Read_Register(uchar command)函数说明:command为REG_READ 0x07//读寄存器 返回值为状态寄存器的值 位6显示当前检测完一次数据后电源供电情况 当位6为0时表明VDD>2.47V 当位6为1时表明VDD<2.47V即电量不足 位0表明当前的测量分辨率 当位0为1时表明测量精度:8位/湿度 12位温度 当位0为0时表明测量精度:12位湿度 14位温度 默认为0*******************************************/uchar SHT11_Read_Register(uchar command){ uchar dat; SHT11_Start(); SHT11_Sendbyte(command); SHT11_Answer(); dat=SHT11_Receivebyte(); SHT11_End(); return(dat);}
/***************************************函数名称:SHT11_Measure(uchar command,uint time);函数功能:设置SHT11检测功能,并返回相应的检测结果函数说明:command形参用于设定温度检测还是湿度检测,time形参用于设定检测过程中的等待时间,以确定检测结果的位数11ms/55ms/210ms 分别对应8位/12位/14位 ****************************************/uint SHT11_Measure(uchar command,uchar time){ uint dat=0; uchar data_high,data_low; SHT11_Start(); SHT11_Sendbyte(command); SHT11_Answer(); Delay_Ms(time); SHT11_Test_Finish(); data_high=SHT11_Receivebyte(); MCU_Answer(); data_low=SHT11_Receivebyte(); SHT11_End(); dat=(dat|data_high); dat=(dat<<8)|data_low; return(dat);}/****************************************函数名称:Convert_Tempeture(uint dat);函数功能:将检测到的数据转化为相应的温度数据函数说明:温度转换公式--T=d1+d2*SOt 公式中的参数d1=-40,d2=0.01 适用于14位测量精度*****************************************/float SHT11_Convert_Tempeture14bit(uint dat){ float tempeture1; tempeture1=-40+0.01*dat; if(tempeture1>100.0) { flag_tempeture=1; } else if(tempeture1<0.0) { flag_tempeture=1; } else { flag_tempeture=0; } return(tempeture1);}
/*****************************************函数名称:SHT11_Convert_Humidity(uint dat,float temp)函数功能:将检测到的数据转化为相应的湿度数据函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化 SOrh为单片机接收到的数据) -----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline 公式中的参数:C1=-4,C2=0,0405,C3=-0.0000028 t1=0.01,t2=0.00008 适用于12位测量精度******************************************/float SHT11_Convert_Humidity12bit(uint dat,float temp){// float RHline,RHtrue; RHline=-4+0.0405*dat-0.0000028*dat*dat; RHtrue=(temp-25)*(0.01+0.00008*dat)+RHline; if(RHtrue<10.0) { flag_humidity=1; } else { flag_humidity=0; } return(RHtrue);}
/***************检查是否忙*******************/void checkstate(){ uchar dat; rs=0; rw=1; do{ DATA=0x00; ep=1; _nop_(); dat=DATA; ep=0; dat=0x80&dat; }while(!(dat==0x00)); }/**************写命令************************/sendcommand(uchar com){ checkstate(); rs=0; rw=0; DATA=com; ep=1; _nop_(); _nop_(); ep=0;}
bit lcd_bz(){bit result;rs= 0;rw= 1;ep= 1;_nop_();_nop_();_nop_();_nop_();result = (bit)(P0 & 0x80);ep= 0;return result;}void lcd_wcmd(unsigned char cmd){while(lcd_bz());//判断LCD是否忙碌rs= 0;rw= 0;ep= 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep= 1;_nop_();_nop_();_nop_();_nop_();ep= 0;}void lcd_pos(unsigned char pos){lcd_wcmd(pos | 0x80);}void lcd_wdat(unsigned char dat){while(lcd_bz());//判断LCD是否忙碌rs= 1;rw= 0;ep= 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep= 1;_nop_();_nop_();_nop_();_nop_();ep= 0;}void lcd_init(){lcd_wcmd(0x38);delay(1);lcd_wcmd(0x0c);delay(1);lcd_wcmd(0x06);delay(1);lcd_wcmd(0x01);delay(1);}
void main(void){ unsigned char i; lcd_init();// 初始化LCD delay(5); lcd_pos(0x01);//设置显示位置 i = 0; while(dis1 != ' '){ Lcd_wdat();//显示字符 i++;} lcd_pos(0x42);// 设置显示位置 i = 0; while(dis2 != ' '){ lcd_wdat(dis2);// 显示字符 i++;}}有警告,但是可以编译,生成的HEX文件在仿真的时候没有反应是怎么回事啊:????
最多设置5个标签!
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code dis1[]={"TEM"};
unsigned char code dis2[]={"HUM"};
#define DATA P0
sbit rs=P2^0;
sbit rw=P2^1;
sbit ep=P2^2;
/********************SHT11********************/
//#include<reg52.h>
//#include<intrins.h>
#include<math.h>
#include<stdio.h>
#define TEM_TEST 0x03//温度检测命令
#define HUM_TEST 0x05//湿度检测命令
#define REG_READ 0x07//读寄存器
#define REG_WRITE 0x06//写寄存器
#define FUNCTION_SET 0x01//设置SHT11的工作精度为8位/湿度 12位温度
//#define uint unsigned int
//#define uchar unsigned char
/**************************
SHT11端口定义
***************************/
sbit SHT11_DATA=P2^6;
sbit SHT11_SCK=P2^5;
uchar flag_tempeture=0; //显示温度位置的标志
uchar flag_humidity=0; //显示湿度位置的标志
//uchar dat;
uint i,temp1,temp2,dat=0,count;
float tempeture1;
float RHline,RHtrue;
void delay(uint m)
{
while(m--);
}
/***************************
函数名称:Delay()
函数功能:SHT11内部延时
****************************/
void Delay()
{
;
;
}
/***************************
函数名称:Delay_Ms()
函数功能:SHT11检测等待延时
函数说明:11ms/55ms/210ms 分别对应8位/12位/14位 测量结果
对应的形参为N 则延时Nms
****************************/
void Delay_Ms(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=112;j>0;j--);
}
/**************************
函数功能:SHT11启动时序
***************************/
void SHT11_Start()
{
SHT11_SCK=1;
SHT11_DATA=1;
Delay();
SHT11_DATA=0;
Delay();
SHT11_SCK=0;
Delay();
SHT11_SCK=1;
Delay();
SHT11_DATA=1;
}
/******************************
函数名称:SHT11_Sendbyte(uchar dat)
函数功能: 向SHT11发送8bite数据
******************************/
void SHT11_Sendbyte(uchar dat)
{
uchar i;
SHT11_SCK=0;
Delay();
for(i=0;i<8;i++)
{
if(dat&0x80)
{
SHT11_DATA=1;
Delay();
}
else
{
SHT11_DATA=0;
Delay();
}
dat=dat<<1;
SHT11_SCK=1;
Delay();
SHT11_SCK=0;
}
}
/*********************************
函数名称SHT11_Answer():
函数功能:检测SHT11的响应信号(在第九个时钟周期)
***********************************/
void SHT11_Answer()
{
SHT11_SCK=1;
Delay();
while(SHT11_DATA==1);
SHT11_SCK=0;
SHT11_DATA=1;
}
/************************************
函数名称:SHT11_Test_Finish()
函数功能:检测SHT11温湿度检测是否完毕
*************************************/
void SHT11_Test_Finish()
{
while(SHT11_DATA==1);
}
/************************************
函数名称:SHT11_Receivebyte()
函数功能:从SHT11接收8bite数据
*************************************/
uchar SHT11_Receivebyte()
{
uchar i;
SHT11_SCK=0;
Delay();
for(i=0;i<8;i++)
{
SHT11_SCK=1;
Delay();
dat=dat<<1;
if(SHT11_DATA)
{
dat=dat|0x01;
Delay();
}
else
{
dat=dat&0xfe;
Delay();
}
SHT11_SCK=0;
Delay();
}
SHT11_DATA=1; //释放数据总线
return(dat);
}
/***********************************
函数名称:MCU_Answer()
函数功能:单片机向SHT11发送应答信号
*************************************/
void MCU_Answer()
{
SHT11_SCK=0;
Delay();
SHT11_DATA=0;
Delay();
SHT11_SCK=1;
Delay();
SHT11_SCK=0;
Delay();
SHT11_DATA=1; //释放数据总线 这条指令非常重要 不加的话导致单片机不能读取低8位
}
/***********************************
函数名称:SHT11_End()
当接收两个8byte数据后部接收CRC校验码
************************************/
void SHT11_End()
{
SHT11_DATA=1;
SHT11_SCK=1;
Delay();
SHT11_SCK=0;
Delay();
}
/*************************************
函数名称:void SHT11_Write_Register(uchar command ,uchar dat)
函数说明:向SHT11的状态寄存器设置功能
command为REG_WRITE 0x06写寄存器
dat为 设置SHT11的功能 可以设置检测的数据位数
***************************************/
void SHT11_Write_Register(uchar command ,uchar dat)
{
SHT11_Start();
SHT11_Sendbyte(command);
SHT11_Answer();
SHT11_Sendbyte(dat);
SHT11_Answer();
}
/***************************************
函数名称:uchar SHT11_Read_Register(uchar command)
函数说明:command为REG_READ 0x07//读寄存器
返回值为状态寄存器的值
位6显示当前检测完一次数据后电源供电情况
当位6为0时表明VDD>2.47V 当位6为1时表明VDD<2.47V即电量不足
位0表明当前的测量分辨率
当位0为1时表明测量精度:8位/湿度 12位温度
当位0为0时表明测量精度:12位湿度 14位温度
默认为0
*******************************************/
uchar SHT11_Read_Register(uchar command)
{
uchar dat;
SHT11_Start();
SHT11_Sendbyte(command);
SHT11_Answer();
dat=SHT11_Receivebyte();
SHT11_End();
return(dat);
}
/***************************************
函数名称:SHT11_Measure(uchar command,uint time);
函数功能:设置SHT11检测功能,并返回相应的检测结果
函数说明:command形参用于设定温度检测还是湿度检测,
time形参用于设定检测过程中的等待时间,以确定检测结果的位数
11ms/55ms/210ms 分别对应8位/12位/14位
****************************************/
uint SHT11_Measure(uchar command,uchar time)
{
uint dat=0;
uchar data_high,data_low;
SHT11_Start();
SHT11_Sendbyte(command);
SHT11_Answer();
Delay_Ms(time);
SHT11_Test_Finish();
data_high=SHT11_Receivebyte();
MCU_Answer();
data_low=SHT11_Receivebyte();
SHT11_End();
dat=(dat|data_high);
dat=(dat<<8)|data_low;
return(dat);
}
/****************************************
函数名称:Convert_Tempeture(uint dat);
函数功能:将检测到的数据转化为相应的温度数据
函数说明:温度转换公式--T=d1+d2*SOt
公式中的参数d1=-40,d2=0.01
适用于14位测量精度
*****************************************/
float SHT11_Convert_Tempeture14bit(uint dat)
{
float tempeture1;
tempeture1=-40+0.01*dat;
if(tempeture1>100.0)
{
flag_tempeture=1;
}
else if(tempeture1<0.0)
{
flag_tempeture=1;
}
else
{
flag_tempeture=0;
}
return(tempeture1);
}
/*****************************************
函数名称:SHT11_Convert_Humidity(uint dat,float temp)
函数功能:将检测到的数据转化为相应的湿度数据
函数说明:相对湿度转换公式-----RHline=C1+C2*SOrh+C3*SOrh*SOrh(检测数据的线性化 SOrh为单片机接收到的数据)
-----RHtrue=(tempeture-25)*(t1+t2*SOrh)+RHline
公式中的参数:C1=-4,C2=0,0405,C3=-0.0000028
t1=0.01,t2=0.00008
适用于12位测量精度
******************************************/
float SHT11_Convert_Humidity12bit(uint dat,float temp)
{
// float RHline,RHtrue;
RHline=-4+0.0405*dat-0.0000028*dat*dat;
RHtrue=(temp-25)*(0.01+0.00008*dat)+RHline;
if(RHtrue<10.0)
{
flag_humidity=1;
}
else
{
flag_humidity=0;
}
return(RHtrue);
}
/***************检查是否忙*******************/
void checkstate()
{
uchar dat;
rs=0;
rw=1;
do{
DATA=0x00;
ep=1;
_nop_();
dat=DATA;
ep=0;
dat=0x80&dat;
}while(!(dat==0x00));
}
/**************写命令************************/
sendcommand(uchar com)
{
checkstate();
rs=0;
rw=0;
DATA=com;
ep=1;
_nop_();
_nop_();
ep=0;
}
bit lcd_bz()
{
bit result;
rs= 0;
rw= 1;
ep= 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0 & 0x80);
ep= 0;
return result;
}
void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());//判断LCD是否忙碌
rs= 0;
rw= 0;
ep= 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep= 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep= 0;
}
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//判断LCD是否忙碌
rs= 1;
rw= 0;
ep= 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep= 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep= 0;
}
void lcd_init()
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
delay(1);
}
void main(void)
[ 本帖最后由 Alex911 于 2011-5-18 16:26 编辑 ]{
unsigned char i;
lcd_init();// 初始化LCD
delay(5);
lcd_pos(0x01);//设置显示位置
i = 0;
while(dis1 != ' ')
{
Lcd_wdat();//显示字符
i++;
}
lcd_pos(0x42);// 设置显示位置
i = 0;
while(dis2 != ' ')
{
lcd_wdat(dis2);// 显示字符
i++;
}
}
有警告,但是可以编译,生成的HEX文件在仿真的时候没有反应是怎么回事啊:????
一周热门 更多>