历史上的今天
今天是:2024年09月04日(星期三)
2020年09月04日 | SHT11数字温湿度传感器
2020-09-04 来源:51hei

单片机源程序如下:
#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); //读第一个字节,高字节 (MSB) *(p_value + 1) = s_read_byte(ACK); //读第二个字节,低字节 (LSB) *p_checksum = s_read_byte(noACK); //read CRC校验码 return error; // error=1 通讯错误 } /********************************************************
下一篇:基于51单片机的温度报警器
史海拾趣
|
DSP应用方式持续扩展 随着视频和静态图像使用的增长以及软件无线电(SDR)等可重复配置系统的需求增长,数字信号处理(DSP)的应用持续扩展。许多应用将重要的DSP处理与成本因素结合在一起,产生了对高性能、低成本DSP解决方案的需求。 FPGA及通用D ...… 查看全部问答> |
|
YTE xdata tempBuf2[512* 39 ]; #define ramFatTab (tempBuf2 + 512* 0) 我现在在一个C文件里定义上面这些,但是我现在要在一个工程的另外一个C文件里调用ramFatTab,但是如果 ...… 查看全部问答> |
|
大家好,我能获取文件的整个路径\"\\\\My Document\\\\1.txt\",现在想获取文件名1.txt,请问该怎么用strrchr()函数来做?我是在win32 application中做的,请不要用mfc。谢谢了… 查看全部问答> |
|
在RTC调试过程中,出现ALR寄存器数据复位不保存的情况,而CNT可以保存.按手册上讲,这两个寄存器都在后备域中,在未发生后备域复位的情况下,这些数据应该不保存才对啊,而现在ALR不保存,CNT却可以,这是为何??以下先贴初始化程序,后贴图,望有人能解 ...… 查看全部问答> |
|
刚才运行程序发现下午明明配置好的串口不能使用,重新上电后有串口数据不稳定的情况,经过仔细排查得出结论:串口使用前,要确定所选的驱动时钟信号已经稳定,否则会产生无法预料的结果… 查看全部问答> |




