温湿度传感器sht20驱动程序,IIC通讯,非常实用的C51驱动程序
单片机源程序如下:
#include "STC15W4K32S4.h"
#include #include "sht20.h" #include "delay.h" #define uchar unsigned char #define uint unsigned int // 测量分辨率 RH 12BIT、T 14BIT,测量时间RH 29ms、T 85ms // 测量分辨率 RH 8BIT、T 12BIT,测量时间RH 4ms、T 22ms // SCL 时钟,延时2us sbit sda=P1^3; //数据线 sbit scl=P1^4; //时钟线 void start(void) //1 启动 { sda=1; delay2us(); scl=1; delay2us(); sda=0; delay2us(); scl=0; delay2us(); } void stop(void) //2 停止 { sda=0; delay2us(); scl=1; delay2us(); sda=1; delay2us(); scl=0; delay2us(); } void ACK (void) //3 应答 { sda=0; delay2us(); scl=1; delay2us(); scl=0; delay2us(); } void noACK (void) //非应答 { scl=1; delay2us(); sda=0; scl=0; delay2us(); } bit getACK(void) //4 接受应答 { bit ack1=0; sda=1; delay2us(); scl=1; delay2us(); ack1=sda; scl=0; delay2us(); return ack1; } void send(uchar DATA) //5 发送一字节 { uchar Bit_Counter=8; while(Bit_Counter>0) { sda=(bit)(DATA&0x80); DATA<<=1; scl=1; delay2us(); scl=0; delay2us(); Bit_Counter--; } } unsigned char Read() //6 接受一字节 { unsigned char x=0,y=8; sda=1; while(y>0) { scl=1; delay2us(); if(sda) x=x|0x01; else x=x&0xfe; scl=0; delay2us(); if(y>1) x=x<<1; y--; } return x; } void SHT2x_init() // 1传感器初始化&软复位 { start(); send(add_w); getACK(); send(RST_code); getACK(); stop(); delay15ms(); sda=1; scl=1; } unsigned char SHT2x_user_register() // 2传感器用户寄存器读取 { uchar register_data; start(); send(add_w); getACK(); send(user_code_r); getACK(); start(); send(add_r); getACK(); register_data=Read(); noACK(); stop(); return register_data; } void SHT2x_Resolution() // 3 传感器测量分辨率设置 { // 测量分辨率设置RH 8 BIT、T 12 BIT,测量时间 RH4ms、T22ms start(); send(add_w); getACK(); send(user_code_w); getACK(); send(0x3b); getACK(); getACK(); stop(); } bit SHT2x_battery() // 4传感器低电压检测 { // 此状态在每次测量后更新 uchar battery; start(); send(add_w); getACK(); send(user_code_r); getACK(); start(); send(add_r); getACK(); battery=Read(); noACK(); stop(); battery=(battery&0x40)>>6; return battery; } /***********测量结果***********/ // 1 湿度测量 // 启动>>发送地址+写操作>>接受ACK>>湿度测量命令>>接受ACK>>启动>>发送地址+读操作>>接受ACK>>测量时间延时>>读取高位数据>>ACK>>读取地位数据>>NO_ACK>>停止 // 计算结果。返回结果 unsigned int RH_Result() { unsigned int RH_Data; unsigned long RH=0; start(); send(add_w); getACK(); send(RH_code); getACK(); start(); send(add_r); getACK(); delay29ms(); RH_Data=Read(); ACK(); RH_Data=RH_Data<<8; RH_Data=RH_Data|Read(); noACK(); stop(); RH_Data=RH_Data&0xfffc; RH=RH_Data*12500L; RH=RH>>16; RH=RH-600; return RH; } // 2 温度测量 // 启动>>发送地址+写操作>>接受ACK>>温度测量命令>>接受ACK>>启动>>发送地址+读操作>>接受ACK>>测量时间延时>>读取高位数据>>ACK>>读取地位数据>>NO_ACK>>停止 // 计算结果。返回结果 unsigned int T_Result() { unsigned int T_Data; unsigned long T=0; start(); send(add_w); getACK(); send(T_code); getACK(); start(); send(add_r); getACK(); delay85ms(); T_Data=Read(); ACK(); T_Data=T_Data<<8; T_Data=T_Data|Read(); noACK(); stop(); T_Data=T_Data&0xfffE;
上一篇:基于51单片机的可调数字时钟程序
下一篇:详细LCD1602串行或者并行数据传输51单片机程序
推荐阅读最新更新时间:2024-11-17 17:05