单片机源程序如下:
#include
#include
#include "LCD1602.h"
/********************************************************
宏定义
********************************************************/
#define uint unsigned int
#define uchar unsigned char
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06
#define STATUS_REG_R 0x07
#define MEASURE_TEMP 0x03
#define MEASURE_HUMI 0x05
#define RESET 0x1e
enum { TEMP, HUMI };
typedef union //定义共用同类型
{
unsigned int i;
float f;
} value;
/********************************************************
位定义
********************************************************/
sbit SCK = P1 ^ 0;
sbit DATA = P1 ^ 1;
/********************************************************
变量定义
********************************************************/
uchar wendu[6];
uchar shidu[6];
/********************************************************
50us延时函数
********************************************************/
void delay_50us(uint t)
{
uint j;
for (; t>0; t--)
for (j = 19; j>0; j--);
}
/*******************************************************
液晶显示函数
********************************************************/
void displaywendu(void)
{
uchar i;
write_com(0x80+0x40);
write_data('T');
write_data(':');
for (i = 0; i<3; i++)
{
write_data(wendu[i]);
delay_50us(1);
}
for (i = 0; i<1; i++)
{
write_data('.');
delay_50us(1);
}
for (i = 4; i<5; i++)
{
write_data(wendu[i]);
delay_50us(1);
}
write_data(0xDF);
write_data('C');
}
/********************************************************
液晶显示函数
********************************************************/
void displayshidu(void)
{
uchar i;
write_com(0x80);
write_data('H');
write_data(':');
for (i = 0; i<3; i++)
{
write_data(shidu[i]);
delay_50us(1);
}
for (i = 0; i<1; i++)
{
write_data('.');
delay_50us(1);
}
for (i = 4; i<5; i++)
{
write_data(shidu[i]);
delay_50us(1);
}
write_data('%');
write_data('R');
write_data('H');
}
/********************************************************
SHT11写字节程序
********************************************************/
char s_write_byte(unsigned char value)
{
unsigned char i, error = 0;
for (i = 0x80; i>0; i >>= 1) //高位为1,循环右移
{
if (i&value) DATA = 1; //和要发送的数相与,结果为发送的位
else DATA = 0;
SCK = 1;
_nop_(); _nop_(); _nop_(); //延时3us
SCK = 0;
}
DATA = 1; //释放数据线
SCK = 1;
error = DATA; //检查应答信号,确认通讯正常
_nop_(); _nop_(); _nop_();
SCK = 0;
DATA = 1;
return error; //error=1 通讯错误
}
/********************************************************
SHT11读字节程序
********************************************************/
char s_read_byte(unsigned char ack)
{
unsigned char i, val = 0;
DATA = 1; //释放数据线
for (i = 0x80; i>0; i >>= 1) //高位为1,循环右移
{
SCK = 1;
if (DATA) val = (val | i); //读一位数据线的值
SCK = 0;
}
DATA = !ack; //如果是校验,读取完后结束通讯;
SCK = 1;
_nop_(); _nop_(); _nop_(); //延时3us
SCK = 0;
_nop_(); _nop_(); _nop_();
DATA = 1; //释放数据线
return val;
}
/********************************************************
SHT11启动传输
********************************************************/
void s_transstart(void)
{
DATA = 1; SCK = 0; //准备
_nop_();
SCK = 1;
_nop_();
DATA = 0;
_nop_();
SCK = 0;
_nop_(); _nop_(); _nop_();
SCK = 1;
_nop_();
DATA = 1;
_nop_();
SCK = 0;
}
/********************************************************
SHT11连接复位
********************************************************/
void s_connectionreset(void)
{
unsigned char i;
DATA = 1; SCK = 0; //准备
for (i = 0; i<9; i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
SCK = 1;
SCK = 0;
}
s_transstart(); //启动传输
}
/********************************************************
SHT11温湿度检测
********************************************************/
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
unsigned error = 0;
unsigned int i;
s_transstart(); //启动传输
switch (mode) //选择发送命令
{
case TEMP: error += s_write_byte(MEASURE_TEMP); break; //测量温度
case HUMI: error += s_write_byte(MEASURE_HUMI); break; //测量湿度
default: break;
}
for (i = 0; i<65535; i++) if (DATA == 0) break; //等待测量结束
if (DATA) error += 1; // 如果长时间数据线没有拉低,说明测量错误
*(p_value) = s_read_byte(ACK); //读第
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』