#include         //12M

#include

typedef unsigned char uint8;

typedef signed char fuint8;

typedef unsigned int uint16;

typedef signed int fuint16;

#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long

#define TC  0xF3 //温度测量

#define SH  0xF5 //湿度测量

#define WR        0xE6 //写寄存器

#define RD  0xE7 //读寄存器

#define RST 0xFe //软复位

/*================================================================

【  Name  】

【Function】SHT20的I2C地址

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

#define SHT20ADDR 0x80

/*================================================================

【  Name  】

【Function】应答位电平定义

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

#define ACK            0            //应答信号

#define NACK        1             //非应答信号

#define led_duan P0                //数码管段选//

#define led_wei P2                //数码管位选//

fuint16 value;

fuint16 ys;

bit dian = 0;

bit ad_ok = 0;

sbit        wei_1 = P2^0;

sbit        wei_2 = P2^1;

sbit        wei_3 = P2^2;

sbit        wei_4 = P2^3;

sbit        wei_5 = P2^4;

sbit        wei_6 = P2^5;

sbit        wei_7 = P2^6;

sbit led_dian = P0^5;

sbit        SDA = P3^4;

sbit        SCL =  P3^3;

uint8 xsjs = 0;

uint16 pca_s=0;

uint16 wendu,shidu;

uint8 xszc[7];        //显示缓冲区

uint8 code duan_ma[] = {

0x28,/*0*/

0x7E,/*1*/

0xA2,/*2*/

0x62,/*3*/

0x74,/*4*/

0x61,/*5*/

0x21,/*6*/

0x7A,/*7*/

0x20,/*8*/

0x60,/*9*/

};

uint8 code wei_ma [] = {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD};

/*================================================================

【  Name  】void Delay(uint t)

【Function】delay Nms

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void Delay(uint t)

{

uchar i;

while(t--)

{

for(i=0;i<200;i++);

}

}

/*------------------------------------------------------------*/

/**********************Simulation I2C Function*****************/

/*------------------------------------------------------------*/

/*================================================================

【  Name  】void I2CDelay (uchar t)

【Function】模拟IIC用的短延时 us

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void I2CDelay (uchar t)

{

while(t--);

}

/*================================================================

【  Name  】void I2CInit(void)

【Function】I2C初始化,空闲状态

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void I2CInit(void)

{

SDA = 1;

I2CDelay(1);

SCL = 1;

I2CDelay(1);

}

/*================================================================

【  Name  】void I2CStart(void)

【Function】I2C起始信号

【  Notes 】SCL、SDA同为高,SDA跳变成低之后,SCL跳变成低

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void I2CStart(void)

{

SDA = 1;                            //发送起始条件的数据信号--ZLG

SCL = 1;

I2CDelay(5);                    //起始条件建立时间大于4.7us,延时--ZLG

SDA = 0;                            //发送起始信号-ZLG

I2CDelay(5);                    //起始条件锁定时间大于4μs--ZLG

SCL = 0;                            //钳住I2C总线,准备发送或接收数据--ZLG

I2CDelay(5);

}

/*================================================================

【  Name  】void I2CStop(void)

【Function】I2C停止信号

【  Notes 】SCL、SDA同为低,SCL跳变成高之后,SDA跳变成高

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void I2CStop(void)

{

SDA = 0;                        //发送结束条件的数据信号--ZLG

SCL = 0;

I2CDelay(5);

SCL = 1;                        //发送结束条件的时钟信号--ZLG

I2CDelay(5);                //结束条件建立时间大于4μs--ZLG

SDA = 1;                        //发送I2C总线结束信号--ZLG

I2CDelay(5);

}

/*================================================================

【  Name  】uchar I2C_Write_Byte(uchar WRByte)

【Function】I2C写一个字节数据,返回ACK或者NACK

【  Notes 】从高到低,依次发送

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

uchar I2C_Write_Byte(uchar Write_Byte)         //Sendbyte

{

uchar i;

for(i=0;i<8;i++)              //要传送的数据长度为8位--ZLG

{

if(Write_Byte&0x80)              //判断发送位--ZLG

{

SDA = 1;

}

else

{

SDA = 0;

}

I2CDelay(1);

SCL=1;                                  //输出SDA稳定后,拉高SCL给出上升沿,从机检测到后进行数据采样

I2CDelay(5);                        //保证时钟高电平周期大于4μs--ZLG

SCL=0;

I2CDelay(1);

Write_Byte <<= 1;

}

I2CDelay(4);

SDA = 1;                                  //8位发送完后释放数据线,准备接收应答位-ZLG

SCL = 1;                      //MCU告知SHT2X数据发送完毕,等待从机的应答信号

I2CDelay(5);

/*以下是判断I2C总线接收应到应答信号是ACK还是NACK*/

if(SDA==1)                                   //SDA为高,收到NACK

return NACK;

else                                           //SDA为低,收到ACK

return ACK;

SCL=0;

I2CDelay(15);

}

/*================================================================

【  Name  】uchar I2C_Read_Byte(uchar AckValue)

【Function】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK

【  Notes 】从高到低,依次接收

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

uchar I2C_Read_Byte(uchar AckValue)//receivebyte

{

uchar i,RDByte=0;

SCL=0;                                                  //置时钟线为低,准备接收数据位--ZLG

SDA = 1;                                  //释放总线,置数据线为输入方式--ZLG

for (i=0;i<8;i++)

{

SCL = 1;                          //SCL高电平期间,采集SDA信号,并作为有效数据 //置时钟线为高使数据线上数据有效--ZLG

I2CDelay(2);

RDByte <<= 1;                  //移位

if(SDA==1)                           //采样获取数据

{

RDByte |= 0x01;

}

else

{

RDByte &= 0xfe;

}

I2CDelay(1);

SCL = 0;                             //下降沿,从机给出下一位值

I2CDelay(6);

}

/*以下是I2C总线发送应答信号ACK或者NACK*/

SDA = AckValue;                      //应答状态

I2CDelay(3);

SCL = 1;

I2CDelay(5);                  //时钟低电平周期大于4μs--ZLG

SCL = 0;                                  //清时钟线,钳住I2C总线以便继续接收--ZLG

I2CDelay(15);

//SDA = 1;

return RDByte;

}

/*================================================================

【  Name  】void SoftReset(void)

【Function】SHT20软件复位,主函数中调用

【  Notes 】从高到低,依次接收

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void SoftReset(void)

{

I2CInit();                       //I2C initialize

I2CStart();                      //start I2C

I2C_Write_Byte(SHT20ADDR&0xfe);  //I2C address + write

I2C_Write_Byte(0xfe);                         //soft reset

I2CStop();                       //stop I2C

}

/*================================================================

【  Name  】void SET_Resolution(void)

【Function】写寄存器,设置分辨率

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

void SET_Resolution(void)

{

I2CStart();                                                                         //Start I2C

if(I2C_Write_Byte(SHT20ADDR&0xfe)==ACK)       //I2C address + write + ACK

{

if(I2C_Write_Byte(0xe6)==ACK)                            //写用户寄存器

{

if(I2C_Write_Byte(0x83)==ACK);                            //设置分辨率   11bit RH% 测量时间:12ms(typ.) & 11bit T℃ 测量时间:9ms(typ.)

}

}

I2CStop();                                   //Stop I2C

}

/*================================================================

【  Name  】float ReadSht20(char whatdo)

【Function】非主机模式,读取函数函数

【  Notes 】

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

float ReadSht20(char whatdo)

{

float temp;

uchar MSB,LSB;

float Humidity,Temperature;

SET_Resolution();

I2CStart();

//        if(I2C_Write_Byte(SHT20ADDR&0xfe)==ACK)                  //I2C address + write + ACK 这个函数屏蔽掉才读出数据但是数据好像不对,读出的温度50多度环境温度只有20几度

{

if(I2C_Write_Byte(whatdo)==ACK)                      //Command

{

do

{

Delay(6);

I2CStart();

}while(I2C_Write_Byte(SHT20ADDR|0x01)==NACK);     //I2C address + read        + NACK

MSB = I2C_Read_Byte(ACK);                                              //Data(MSB)

LSB = I2C_Read_Byte(ACK);                                              //Data(LSB)

I2C_Read_Byte(NACK);                                                          //Checksum  + NACK

I2CStop();                                                                              //Stop I2C

LSB &= 0xfc;                                          //Data (LSB) 的后两位在进行物理计算前前须置‘0’

temp = MSB*256 + LSB;                                                          //十六进制转成十进制

if (whatdo==((char)0xf5))                                          //No Hold Master Mode,read humidity

{

/*-- calculate relative humidity [%RH] --*/

Humidity =(temp*125)/65536-6;                 //公式: RH%= -6 + 125 * SRH/2^16

return Humidity;                              //返回值:humidity

}

else                                                                                      //No Hold Master Mode,read temperature

{

/*-- calculate temperature [°C] --*/

Temperature = (temp*175.72)/65536-46.85;      //公式:T= -46.85 + 175.72 * ST/2^16

return Temperature;                                      //返回值:temperature

}

}

}

return 0;

}

//=========================================显示数据分解===========================================

void pv3_3_DATA(uint16 x)

{

uint8 a,b,c,d,e;

a = x/10000;

b = x%10000/1000;

c = x%1000/100;

d = x%100/10;

e = x%10;

xszc[2]=a;

xszc[3]=b;

xszc[4]=c;

xszc[5]=d;

xszc[6]=e;

}

//=====================================================================================

void main(void)

{

TMOD = 0x01;

TH0 = 0xF6;

TL0 = 0x3C;

TR0 = 1;

ET0 = 1;

EA = 1;

while(1)

{

if(ad_ok == 1)

{

//                EA = 0;

shidu=(ReadSht20(TC)*100);//湿度

//                EA = 1;

ad_ok = 0;

}

pv3_3_DATA(shidu);

}

}

//================================================================================================

void timer0(void) interrupt 1 using 2//

{

TH0 = 0xF6;

TL0 = 0x3C;

pca_s++;

if(pca_s == 200)

{

ad_ok = 1;

pca_s = 0;

}

led_wei = 0xFF;;

switch(xsjs)

{

case 0: led_duan = duan_ma[xszc[xsjs]];wei_1=0;break;

case 1: led_duan = duan_ma[xszc[xsjs]];wei_2=0;break;

case 2: led_duan = duan_ma[xszc[xsjs]];wei_3=0;break;

case 3: led_duan = duan_ma[xszc[xsjs]];wei_4=0;break;

case 4: led_duan = duan_ma[xszc[xsjs]];led_dian=dian;wei_5=0;break;

case 5: led_duan = duan_ma[xszc[xsjs]];wei_6=0;break;

case 6: led_duan = duan_ma[xszc[xsjs]];wei_7=0;

}

xsjs++;

if(xsjs == 7)xsjs = 0;

}

sht20中写用户寄存器_谁用过sht20这块温湿度传感器,有调通的程序分享下吧相关推荐

  1. sht20中写用户寄存器_数字输出温湿度传感器HTU21D和SHT21对比评测(图文)

    超小体积的温湿度一体数字输出模块由于体积小,精度高的特点,广泛应用于手机.通讯.HVAC.医疗.环境监测.家用电器.控制板等,近日从深圳市工采网(ISweek)拿到市面上最常用的HTU21D和SHT2 ...

  2. linux中更改用户密码_如何在Linux中更改用户密码

    linux中更改用户密码 In this tutorial, we will focus on how you can change a user's password in Linux. We wi ...

  3. python温湿度传感器源代码_在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)...

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  4. python温湿度传感器源代码_在树莓派上读取DHT11温湿度传感器python代码实现及常见问题(全面简单易懂)...

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  5. linux系统中mysql表中能添加中文_数据库学习之数据库增删改查(另外解决Mysql在linux下不能插入中文的问题)(二)...

    数据库增删改查 增加 首先我们创建一个数据库user,然后创建一张表employee create table employee( id int primary key auto_increment, ...

  6. 写笔记插件_梁宝川:这11条anki插件的使用常识分享给你

    每日写一篇文章的第2年195天 anki考研找梁宝川 在我们编辑anki笔记的过程当中,插件我担任着一个非常重要的角色. 因为插件可以帮我们将笔记形式变得更加丰富. 并且,也可以我们更加方便的操作an ...

  7. 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  8. java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

  9. php实训报告英文摘要,English Abstract _和大家分享下如何写英文摘要

    English Abstract _和大家分享下如何写英文摘要 刚刚在网上看到这样的好文章,所以想和大家分享下如何写英文摘要 Abstract 1 基本特性 2 时态 3 语态 4 语法修辞 5 一个 ...

  10. arduino 土壤温湿度传感器_智慧农业温室大棚环境监测传感器

    传感器是智慧农业温室大棚体系检测环节的重要组成部分,用于将温室环境因子等非电物理量转变为操控体系辨认的电信号,智慧农业温室大棚体系管理人员判别和处理问是环境监测状况主要依赖的传感器的主要技术指标有 : ...

最新文章

  1. 安装View Agent失败: The system must be rebooted before installation can continue
  2. CSS: 首字母字体变大时下划线不对齐的解决方法
  3. .NET 容器环境下创建应用 dump 文件
  4. 删除当前文件夹下特定名称文件
  5. 表数据都删了一半,可我的表文件咋还是那么大
  6. 微信小程序 开发文档
  7. 自定义委托,事件,参数的简单随笔
  8. TraceEventsDB event(跟踪事件)总结
  9. 在ftp服务器中上传文档的权限,ftp服务器 上传文件权限设置
  10. Word 首页如何不插入页码? 页码从正文开始,如何分节
  11. C++ and C# 从TLS握手二进制中获取SNI(服务器名称指示)域名
  12. Ubuntu 耳机和音响没有声音
  13. Word实用教程——五分钟教你如何在任意页开始添加页码
  14. mysql 分组查询最新
  15. Spring框架-JdbcTemplate
  16. flex布局之文字加图片
  17. rsync同步+inotify实时同步部署
  18. grep命令 |grep
  19. UVALive - 4394 (区间dp)
  20. 无聊的游戏 Beta 0.1

热门文章

  1. 启发式搜索之八皇后问题
  2. C#学习系列之H264解码
  3. Windows强制删除文件的方法
  4. 图书销售系统可行性分析报告
  5. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(11):一些图片
  6. ArcGIS Server Flex API接入MapABC地图
  7. 【单片机毕业设计】【mcuclub-jj-035】基于单片机的保险柜的设计
  8. 通用数据权限设计方案
  9. 利用机器学习方法确定各个特征的权重
  10. 国产数据库 OceanBase 二次刷榜 TPC-C,7 亿 tpmC