数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2436|回复: 10

[C51] 长春疫重居家防疫,调试并分享STC15W@HTU21D模拟I2C驱动代码【附逻辑分析图】

[复制链接]
发表于 2022-3-17 10:50:57 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2022-3-17 10:56 编辑

闲话:
先上开场诗一首抒怀:
新年才过冬将去,
南风初至柳含绿。
各行才张人抖擞,
冰河初开新流急。
一夜醒来疫又起,
居家不出再防疫。
阳光融尽昨日雪,
长春不日定胜利。

话说,居家不出百无聊赖,又有前日拙作打油诗为证:

限行闭户宅内囚,
常看视讯常忧愁。
早茶午餐过晌酒,
只盼睡醒三杆头。
喇叭声声扰晨梦,
严遮密裹忙下楼。
相视无语远排队,
验明正身捅咽喉。

---------✄------------✄---------------------------------------------------
正题:
前几天发帖求教关于单片机模拟I2C总线以非主机模式驱动HTU21D时对单片机其他工作是否有影响?请教关于I2C总线问题https://www.mydigit.cn/thread-301611-1-1.html(出处: 数码之家)
虽然没能弄的很懂,但是闲来无事调试的这段STC15W单片机驱动HTU21D的代码还是调试完成了,分享于此也留作备份,新手用到时可以看看,高手发现问题时敬请指正。
注释:
1.代码没有拆分I2C.c和HTU21D.c,用到的朋友可以自己改编,如果用于各种屏幕显示时请自行匹配显示函数,如果用于串口助手演示时请自行匹配串口代码。
2.代码包含详细注解,后面的逻辑分析图片上也有注解,此处只粘贴代码不加文字讲解了。
3.代码由网上例程改编,如有雷同并不意外。

  1. //单片机:STC15W408AS
  2. //温湿度传感器:HTU21D
  3. #include <STC15W.H>

  4. #define uchar unsigned char         
  5. #define uint  unsigned int
  6. sbit SDAK=P1^2;
  7. sbit SCLK=P1^3;
  8. //----IIC总线的开始信号-------
  9. void i2c_start()
  10. {
  11.     SDAK=1;
  12.     delay_I2C();
  13.         SCLK=1;                //SCL高电平
  14.         delay_I2C();
  15.     SDAK=0;                //SCL高电平时期间SDA出现下降沿
  16.     delay_I2C();

  17. }
  18. //----IIC总线的停止信号--------
  19. void i2c_stop()
  20. {
  21.     SDAK=0;
  22.     delay_I2C();
  23.     SCLK=1;                //SCL高电平
  24.     delay_I2C();
  25.     SDAK=1;                //SCL高电平期间SDA出现上升沿
  26.     delay_I2C();
  27. }
  28. //----从机响应ACK状态查询函数-----------------------------
  29. //返回0--ACK、返回1--NAK
  30. bit Receive_ACK()
  31. {
  32. uchar i=0,ACK_Flag=0;

  33. SCLK=1;
  34. delay_I2C();
  35. //SCL高电平期间检测SDA是否被从机拉低或者超时未响应
  36. while((SDAK==1)&&i<250)
  37. {
  38. i++;
  39. }
  40. SCLK=0;
  41. delay_I2C();
  42. //以下返回检测状态
  43. if(i==250)//超时未响应为无应答状态
  44. {
  45. ACK_Flag=1;//返回NAK
  46. }
  47. if(i<250)//从机给出了应答、数据线出现了下跳信号
  48. {
  49. ACK_Flag=0;//返回ACK
  50. }
  51. return ACK_Flag;
  52. }
  53. //----主机向IIC总线发送ACK--------
  54. void Send_ack()
  55. {
  56.    SCLK=0;
  57.    delay_I2C();        
  58.    SDAK=0;
  59.    delay_I2C();
  60.    SCLK=1;
  61.    delay_I2C();        
  62.    SCLK=0;
  63.    delay_I2C();        
  64.    SDAK=1;
  65. }
  66. //----主机向IIC总线发送NACK--------
  67. void Send_nack()
  68. {
  69.    SCLK=0;
  70.    delay_I2C();        
  71.    SDAK=1;  
  72.    delay_I2C();
  73.    SCLK=1;
  74.    delay_I2C();
  75.    SCLK=0;
  76.    delay_I2C();        
  77. }
  78. //----向总线上写一个字节数据-------------------------------
  79. //通过数据左移利用C51寄存器可以位操作的CY位、发送数据的最高位
  80. void write_dat(uchar date)
  81. {
  82.     uchar i;
  83.     for(i=0; i<8; i++)
  84.     {
  85.         date=date<<1;        //将字节的第一位左移入CY位
  86.         SCLK=0;                        //拉低时钟准备主机发送
  87.         delay_I2C();
  88.         SDAK=CY;                //发送一位数据
  89.         delay_I2C();
  90.         SCLK=1;                        //拉高时钟等待从机读取
  91.         delay_I2C();
  92.     }
  93.     //完成一个8位字节数据的发送后释放总线
  94.     SCLK=0;                                //拉低SCL线准备主机后续的读写操作
  95.     delay_I2C();
  96.     SDAK=1;                                //拉高SDA线等待读写数据
  97.     delay_I2C();
  98. }
  99. //----在总线上读取一个字节数据--------------
  100. uchar read_dat()
  101. {
  102.     uchar i,k=0;
  103.     //首先释放总线
  104.         SCLK=0;                                //拉低SCL线准备主机后续的读写操作
  105.     delay_I2C();
  106.     SDAK=1;                                //拉高SDA线等待读写数据
  107.     delay_I2C();
  108.     for(i=0; i<8; i++)
  109.     {
  110.         SCLK=1;                //拉高时钟线读取SDA的状态(只有在SCL=1时SDA是稳定数据)
  111.         delay_I2C();
  112.         k=(k<<1)|SDAK;//K中的数据的最后一位根据SDA状态改变后再左移后存入K中
  113.         SCLK=0;                //拉低时钟线允许从机改变SDA线的状态
  114.         delay_I2C();
  115.     }
  116.     return k;
  117. }
  118. //----SHT20软件复位,主函数中调用----------------------------------------------------
  119. void SoftReset()
  120. {
  121. //复位I2C总线
  122.     SDAK = 1;
  123.     delay_I2C();
  124.     SCLK = 1;
  125.     delay_I2C();
  126. //复位HTU21D
  127.     i2c_start();     
  128.     write_dat(0x80);
  129.         Send_ack();
  130.     write_dat(0xfe);//发送复位指令
  131.         Send_ack();
  132.     i2c_stop();      
  133.         delay_ms(30);//等待复位操作完成
  134. }
  135. //----非主机模式,读取函数函数---------------------------------------------
  136. uint ReadSht20(uchar whatdo)
  137. {
  138.     float temp;//设置用于浮点运算的变量
  139.     uchar MSB,LSB;
  140.         uint HT;
  141.         delay_ms(100);
  142.     i2c_start();
  143.         write_dat(0x80);
  144.         Receive_ACK();
  145.         write_dat(whatdo);
  146.         Receive_ACK();
  147.         do  
  148.         {  
  149.         delay_I2C();  
  150.         i2c_start();   
  151.         write_dat(0x81);
  152.         }while(Receive_ACK()==1);//非主机模式、检测到SDA抬起时器件操作结束开始取出数据
  153.         MSB = read_dat();
  154.         Send_ack();
  155.         LSB = read_dat();
  156.         Send_nack();
  157.         i2c_stop();
  158.             LSB &= 0xfc;                              
  159.             temp = MSB*256 + LSB;                     
  160.             if (whatdo==0xf5)                  
  161.             {        
  162.                                 HT=(temp*125)/65536-6;
  163.             }
  164.                         if (whatdo==0xf3)                                         
  165.             {   
  166.                                 HT=(temp*175.72)/65536-46.85;
  167.                         }               
  168.     return HT*100;//数据放大100倍显示小数点后两位
  169. }
复制代码


















本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 3家元 +142 收起 理由
家睦 + 120
cutter + 12
jf201006 + 10 原創內容

查看全部打赏

 楼主| 发表于 2022-3-22 09:40:46 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2022-3-21 17:13:33 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-21 14:18:50 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 09:48:45 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2022-3-19 07:12:25 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2022-3-19 01:22:40 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 1家元 +20 收起 理由
慕名而来 + 20 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-3-18 22:20:39 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-18 21:31:25 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2022-3-17 12:55:58 | 显示全部楼层
游客请登录后查看回复内容

打赏

参与人数 1家元 +12 收起 理由
cutter + 12

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-17 12:33:09 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-12-14 02:58 , Processed in 0.156001 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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