仿真原理图如下
单片机源程序如下:
#include
#include "lcd.h"
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define NACK 0
#define ACK 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define RESET 0x1E //000 1111 0
ulong volt;//测量的电压值
sbit Data=P2^3; //定义数据线
sbit CLK=P3^3;//定义时钟信号口
sbit DIN=P3^1;//定义2543数据写入口
sbit DOUT=P3^0;//定义2543数据读取口
sbit CS=P3^2;//定义2543片选信号口
sbit Data_P = P2^4; // SHT11传感器的数据管脚
sbit Sck_P = P2^3; // SHT11传感器的时钟管脚
sbit BEEP =P2^5;
uchar tmpe,h;
uchar rec_dat[9]; //用于显示的接收数据数组
uchar temp_max = 30;
uchar humi_min = 60;
ulong C2_max = 3500000;
ulong LUX_max = 3500000;
ulong C2_now = 0;
ulong LUX_now = 0;
unsigned char temp; // 保存温度
unsigned char humi; // 保存湿度
enum { TEMP,HUMI };
typedef union //定义共用同类型
{
unsigned int i;
float f;
}value;
int display = 0;
void delay(uchar ms)
{ // 延时子程序
uchar i;
while(ms--)
{
for(i = 0;i<250;i++);
}
}
char ShtWriteByte(unsigned char value)
{
unsigned char i,error=0;
for(i=128;i>0;i>>=1) // 高位为1,循环右移
{
if (i&value)
Data_P=1; // 和要发送的数相与,结果为发送的位
else
Data_P=0;
Sck_P=1;
_nop_(); // 延时3us
_nop_();
_nop_();
Sck_P=0;
}
Data_P=1; // 释放数据线
Sck_P=1;
error=Data_P; // 检查应答信号,确认通讯正常
_nop_();
_nop_();
_nop_();
Sck_P=0;
Data_P=1;
return error; // error=1 通讯错误
}
char ShtReadByte(unsigned char ack)
{
unsigned char i,val=0;
Data_P=1; // 释放数据线
for(i=0x80;i>0;i>>=1) // 高位为1,循环右移
{
Sck_P=1;
if(Data_P)
val=(val|i); // 读一位数据线的值
Sck_P=0;
}
Data_P=!ack; // 如果是校验,读取完后结束通讯
Sck_P=1;
_nop_(); // 延时3us
_nop_();
_nop_();
Sck_P=0;
_nop_();
_nop_();
_nop_();
Data_P=1; // 释放数据线
return val;
}
void ShtTransStart(void)
{
Data_P=1;
Sck_P=0;
_nop_();
Sck_P=1;
_nop_();
Data_P=0;
_nop_();
Sck_P=0;
_nop_();
_nop_();
_nop_();
Sck_P=1;
_nop_();
Data_P=1;
_nop_();
Sck_P=0;
}
void ShtConnectReset(void)
{
unsigned char i;
Data_P=1; //准备
Sck_P=0;
for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位
{
Sck_P=1;
Sck_P=0;
}
ShtTransStart(); //启动传输
}
char ShtMeasure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
{
unsigned error=0;
unsigned int i;
ShtTransStart(); // 启动传输
switch(mode) // 选择发送命令
{
case 1 : // 测量温度
error+=ShtWriteByte(0x03);
break;
case 2 : // 测量湿度
error+=ShtWriteByte(0x05);
break;
default:
break;
}
for(i=0;i<65535;i++)
if(Data_P==0)
break; // 等待测量结束
if(Data_P)
error+=1; // 如果长时间数据线没有拉低,说明测量错误
*(p_value) =ShtReadByte(1); // 读第一个字节,高字节 (MSB)
*(p_value+1)=Sht
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』