找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4945|回复: 4
打印 上一主题 下一主题
收起左侧

温湿度传感器sht20 STC15单片机驱动程序

  [复制链接]
跳转到指定楼层
楼主
ID:393141 发表于 2020-7-15 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
温湿度传感器sht20驱动程序,IIC通讯,非常实用的C51驱动程序

单片机源程序如下:
  1. #include "STC15W4K32S4.h"
  2. #include <intrins.h>
  3. #include "sht20.h"
  4. #include "delay.h"


  5. #define uchar unsigned char
  6. #define uint  unsigned int



  7. // 测量分辨率 RH 12BIT、T 14BIT,测量时间RH 29ms、T 85ms
  8. // 测量分辨率 RH 8BIT、T 12BIT,测量时间RH 4ms、T 22ms
  9. // SCL 时钟,延时2us

  10. sbit sda=P1^3;        //数据线
  11. sbit scl=P1^4;        //时钟线




  12. void start(void)       //1 启动
  13. {
  14.         sda=1;
  15.         delay2us();
  16.         scl=1;
  17.         delay2us();
  18.         sda=0;
  19.         delay2us();
  20.         scl=0;
  21.         delay2us();
  22. }


  23. void stop(void)       //2        停止
  24. {
  25.         sda=0;
  26.         delay2us();
  27.         scl=1;
  28.         delay2us();
  29.         sda=1;
  30.         delay2us();
  31.         scl=0;
  32.         delay2us();
  33. }


  34. void ACK (void)       //3         应答
  35. {        
  36.         sda=0;
  37.         delay2us();

  38.         scl=1;
  39.         delay2us();               
  40.         scl=0;
  41.         delay2us();         
  42. }

  43. void noACK (void)     //非应答
  44. {
  45.         scl=1;
  46.         delay2us();
  47.         sda=0;        
  48.         scl=0;
  49.         delay2us();
  50. }


  51. bit getACK(void)     //4        接受应答
  52. {
  53.         bit ack1=0;

  54.         sda=1;
  55.         delay2us();        
  56.                   
  57.         scl=1;
  58.         delay2us();
  59.         
  60.         ack1=sda;

  61.         scl=0;
  62.         delay2us();

  63.         return ack1;        
  64. }


  65. void send(uchar DATA)   //5 发送一字节
  66. {
  67.         uchar Bit_Counter=8;
  68.         

  69.         while(Bit_Counter>0)
  70.         {
  71.                
  72.                 sda=(bit)(DATA&0x80);
  73.                 DATA<<=1;
  74.                                 
  75.                 scl=1;
  76.                 delay2us();
  77.                 scl=0;
  78.                 delay2us();
  79.                                          
  80.                 Bit_Counter--;
  81.         }
  82.         
  83. }  


  84. unsigned char Read()      //6        接受一字节
  85. {
  86.         unsigned char x=0,y=8;

  87.         sda=1;

  88.         while(y>0)
  89.         {
  90.                 scl=1;
  91.                 delay2us();


  92.                 if(sda)
  93.                 x=x|0x01;
  94.                 else
  95.                 x=x&0xfe;
  96.                

  97.                 scl=0;
  98.                 delay2us();
  99.                
  100.                 if(y>1)                        
  101.                 x=x<<1;

  102.                 y--;
  103.         }

  104.         return x;
  105. }


  106. void SHT2x_init()    // 1传感器初始化&软复位
  107. {
  108.         start();
  109.         send(add_w);
  110.         getACK();
  111.         send(RST_code);
  112.         getACK();
  113.         stop();
  114.         delay15ms();
  115.         sda=1;
  116.         scl=1;
  117. }


  118. unsigned char SHT2x_user_register()   // 2传感器用户寄存器读取
  119. {
  120.         uchar register_data;

  121.         start();
  122.         send(add_w);
  123.         getACK();
  124.         send(user_code_r);
  125.         getACK();
  126.                         
  127.         start();
  128.         send(add_r);
  129.         getACK();
  130.         register_data=Read();
  131.         noACK();
  132.         stop();

  133.         return register_data;
  134. }


  135. void SHT2x_Resolution()          // 3 传感器测量分辨率设置                                
  136. {                                // 测量分辨率设置RH 8 BIT、T 12 BIT,测量时间 RH4ms、T22ms
  137.         start();
  138.         send(add_w);
  139.         getACK();
  140.         send(user_code_w);
  141.         getACK();
  142.         send(0x3b);
  143.         getACK();
  144.         getACK();
  145.         stop();        
  146. }



  147. bit SHT2x_battery()             // 4传感器低电压检测
  148. {                               // 此状态在每次测量后更新
  149.         uchar battery;

  150.         start();
  151.         send(add_w);
  152.         getACK();
  153.         send(user_code_r);
  154.         getACK();
  155.                         
  156.         start();
  157.         send(add_r);
  158.         getACK();
  159.         battery=Read();
  160.         noACK();
  161.         stop();

  162.         battery=(battery&0x40)>>6;
  163.         return battery;
  164. }



  165. /***********测量结果***********/

  166. // 1 湿度测量
  167. // 启动>>发送地址+写操作>>接受ACK>>湿度测量命令>>接受ACK>>启动>>发送地址+读操作>>接受ACK>>测量时间延时>>读取高位数据>>ACK>>读取地位数据>>NO_ACK>>停止
  168. // 计算结果。返回结果
  169. unsigned int RH_Result()   
  170. {
  171.         unsigned int RH_Data;
  172.         unsigned long RH=0;        
  173.         start();
  174.         send(add_w);
  175.         getACK();
  176.         send(RH_code);
  177.         getACK();        
  178.         start();
  179.         send(add_r);
  180.         getACK();  
  181.         delay29ms();
  182.         RH_Data=Read();
  183.         ACK();         
  184.         RH_Data=RH_Data<<8;  
  185.         RH_Data=RH_Data|Read();
  186.         noACK();
  187.         stop();
  188.                
  189.         RH_Data=RH_Data&0xfffc;               
  190.         RH=RH_Data*12500L;
  191.         RH=RH>>16;
  192.         RH=RH-600;

  193.         return RH;
  194. }

  195. // 2 温度测量
  196. // 启动>>发送地址+写操作>>接受ACK>>温度测量命令>>接受ACK>>启动>>发送地址+读操作>>接受ACK>>测量时间延时>>读取高位数据>>ACK>>读取地位数据>>NO_ACK>>停止
  197. // 计算结果。返回结果

  198. unsigned int T_Result()
  199. {
  200.         unsigned int T_Data;
  201.         unsigned long T=0;        

  202.         start();
  203.         send(add_w);
  204.         getACK();
  205.         send(T_code);
  206.         getACK();                 
  207.         start();
  208.         send(add_r);
  209.         getACK();           
  210.         delay85ms();        

  211.         T_Data=Read();
  212.         ACK();        
  213.         T_Data=T_Data<<8;            
  214.         T_Data=T_Data|Read();
  215.         noACK();
  216.         stop();

  217.         T_Data=T_Data&0xfffE;               
  218.         T=T_Data*17572L;
  219.         T=T>>16;
  220.         T=T-4685;

  221.         return T;
  222. }  
复制代码

所有资料51hei提供下载:
sht20 driver.zip (53.54 KB, 下载次数: 276)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:119977 发表于 2020-12-8 10:43 | 只看该作者
我想问一个问题 负温度怎么表示的
回复

使用道具 举报

板凳
ID:554837 发表于 2021-5-22 19:39 | 只看该作者
感谢大佬提供的代码
回复

使用道具 举报

地板
ID:90613 发表于 2021-9-22 13:14 | 只看该作者
哎,看错了,单程AHT20了,SHT20太贵了用不起。。。。
回复

使用道具 举报

5#
ID:837601 发表于 2021-10-27 08:31 | 只看该作者
请问SHT85能用这个程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表