单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2069|回复: 5
收起左侧

基于CC2530(IAR)SHT10温湿度传感器程序调试

[复制链接]
行者1253 发表于 2017-6-25 09:15 | 显示全部楼层 |阅读模式
便宜环境IAR for 51,单片机 TI CC2530,传感器CC2530!!!
0.png

单片机源程序如下:
  1. #include <ioCC2530.h>
  2. #include <stdio.h>
  3. #include "hal_mcu.h"

  4. #define  uint16  unsigned int
  5. #define  uint8 unsigned char

  6. #define STATUS_REG_W 0x06
  7. #define STATUS_REG_R 0x07
  8. #define MEASURE_TEMP 0x03
  9. #define MEASURE_HUMI 0x05
  10. #define RESET        0x1E
  11. #define noACK        0
  12. #define ACK          1

  13. #define SHT10_SCL_PIN P1_7 //SHT10时钟
  14. #define SHT10_SDA_PIN P1_6 //SHT10数据线
  15. #define SHT10_DATA_R()   P1DIR &= 0x7F
  16. #define SHT10_DAT_W()   P1DIR |= 0x80

  17. #define SHT10_SCL_HIGH()   (SHT10_SCL_PIN = 1)
  18. #define SHT10_SCL_LOW()    (SHT10_SCL_PIN = 0)

  19. #define SHT10_SDA_HIGH()  (SHT10_SDA_PIN = 1)
  20. #define SHT10_SDA_LOW()   (SHT10_SDA_PIN = 0)

  21. unsigned char d1,d2,d3;


  22. /**************************************************************************************************
  23. * 函数名称:initIO
  24. *
  25. * 功能描述:SHT10串行通信IO初始化
  26. *
  27. * 参 数:无
  28. *
  29. * 返 回 值:无
  30. **************************************************************************************************/
  31. void initIO(void)
  32. {
  33.     P1DIR|= 0xc0;                                
  34.     P1INP &= 0xbf;
  35.     SHT10_SDA_HIGH();
  36.     SHT10_SCL_LOW();
  37. }
  38. /**************************************************************************************************
  39. * 函数名称:s_write_byte_to_sht10
  40. *
  41. * 功能描述:向SHT10写一个字节
  42. *
  43. * 参 数:value -- 需写入的字节值
  44. *
  45. * 返 回 值:error -- 操作是否成功
  46. **************************************************************************************************/
  47. char write_byte_to_sht10(unsigned char value)
  48. {  
  49.     uint8 i;
  50.     uint8 error=1;
  51.    
  52.     SHT10_DAT_W();  
  53.     for (i=0x80;i>0;i/=2) //将一个字节的8位逐一输出   
  54.     {
  55.         if (i & value)
  56.         {
  57.             SHT10_SDA_HIGH();   
  58.         }
  59.         else
  60.         {
  61.             SHT10_SDA_LOW();   
  62.         }
  63.         SHT10_SCL_HIGH();   
  64.         halMcuWaitUs(5);
  65.         SHT10_SCL_LOW();
  66.         halMcuWaitUs(1);
  67.     }
  68.     SHT10_SDA_HIGH();  
  69.     SHT10_DATA_R();
  70.     SHT10_SCL_HIGH();
  71.     halMcuWaitUs(1);  
  72.     error = SHT10_SDA_PIN;  
  73.     halMcuWaitUs(3);
  74.     SHT10_DAT_W();
  75.     SHT10_SDA_HIGH();  
  76.     SHT10_SCL_LOW();   
  77.      
  78.     return error;   
  79. }

  80. /**************************************************************************************************
  81. * 函数名称:s_receive_byte_from_sht10
  82. *
  83. * 功能描述:从SHT10读取一个字节
  84. *
  85. * 参 数:ack -- 读取数据后,向SHT10发送ACK
  86. *
  87. * 返 回 值:val -- 读取的字节值
  88. **************************************************************************************************/
  89. char receive_byte_from_sht10(unsigned char ack)
  90. {
  91.     uint8 i;
  92.     uint8 val = 0;
  93.     SHT10_DAT_W();        
  94.     SHT10_SDA_PIN= 1;
  95.     SHT10_DATA_R();
  96.    
  97.     for (i=0x80;i>0;i/=2)  
  98.     {
  99.         SHT10_SCL_HIGH();
  100.         if (SHT10_SDA_PIN)
  101.         val = (val | i);
  102.         else
  103.         val = (val | 0x00);
  104.         SHT10_SCL_LOW();
  105.         halMcuWaitUs(5);
  106.     }
  107.     SHT10_DAT_W();
  108.     SHT10_SDA_PIN = !ack;
  109.     SHT10_SCL_HIGH();
  110.     halMcuWaitUs(5);
  111.     SHT10_SCL_LOW();
  112.     SHT10_SDA_HIGH();
  113.      
  114.     return val; //返回读取的值
  115. }
  116. /**************************************************************************************************
  117. * 函数名称:transstart
  118. *
  119. * 功能描述:启动SHT10,开始与SHT10通信
  120. *
  121. * 参 数:无
  122. *
  123. * 返 回 值:无
  124. **************************************************************************************************/
  125. void transstart(void)
  126. {
  127.     SHT10_DAT_W();
  128.     SHT10_SDA_HIGH();
  129.     SHT10_SCL_LOW();
  130.     halMcuWaitUs(1);;
  131.     SHT10_SCL_HIGH();
  132.     halMcuWaitUs(2);
  133.     SHT10_SDA_LOW();
  134.     halMcuWaitUs(2);
  135.     SHT10_SCL_LOW();  
  136.     halMcuWaitUs(5);
  137.     SHT10_SCL_HIGH();
  138.     halMcuWaitUs(2);
  139.     SHT10_SDA_HIGH();
  140.     halMcuWaitUs(2);
  141.     SHT10_SCL_LOW();
  142.     halMcuWaitUs(2);
  143. }

  144. /**************************************************************************************************
  145. * 函数名称:s_connectionreset
  146. *
  147. * 功能描述:与SHT10通信复位
  148. *
  149. * 参 数:无
  150. *
  151. * 返 回 值:无
  152. **************************************************************************************************/
  153. void connectionreset(void)
  154. {
  155.   SHT10_DAT_W();
  156.   unsigned char i;
  157.   SHT10_SDA_HIGH();
  158.   SHT10_SCL_LOW();
  159.   for(i=0;i<9;i++)
  160.   {
  161.     SHT10_SCL_HIGH();
  162.     halMcuWaitUs(2);
  163.     SHT10_SCL_LOW();
  164.     halMcuWaitUs(2);
  165.   }
  166.   transstart();
  167. }
  168. /**************************************************************************************************
  169. * 函数名称:measure
  170. *
  171. * 功能描述:发送命令、读取SHT10温度或湿度数据
  172. *
  173. * 参 数:*p_checksum -- 校验和
  174. * mode -- 读取数据类型(3为温度,5为湿度)
  175. *
  176. * 返 回 值:er -- 操作结果
  177. **************************************************************************************************/
  178. char measure( unsigned char *p_checksum, unsigned char mode)
  179. {
  180.   unsigned er=0;
  181.   unsigned int i,j;
  182.   transstart();
  183.   switch(mode)
  184.   {
  185.     case 3      :er+=write_byte_to_sht10(MEASURE_TEMP);break;
  186.     case 5        :er+=write_byte_to_sht10(MEASURE_HUMI);break;
  187.     default :break;
  188.   }
  189.   SHT10_DATA_R();
  190.   for(i=0;i<65535;i++)
  191.   {
  192.     for(j=0;j<65535;j++)
  193.     {
  194.       if(SHT10_SDA_PIN == 0)
  195.       {
  196.          break;
  197.       }
  198.     }
  199.     if(SHT10_SDA_PIN == 0)
  200.     {
  201.       break;
  202.     }
  203.   }
  204.    
  205.   if(SHT10_SDA_PIN)   
  206.   {
  207.     er += 1;
  208.   }
  209.     d1 = receive_byte_from_sht10(ACK);
  210.     d2 = receive_byte_from_sht10(ACK);
  211.     d3 = receive_byte_from_sht10(noACK);
  212.     return er;
  213. }
  214. /**************************************************************************************************
  215. * 函数名称:tempera_humi_read
  216. *
  217. * 功能描述:调用相应函数,读取温度和湿度数据并校验和计算
  218. *
  219. * 参 数:*t -- 温度值
  220. * *h -- 湿度值
  221. *
  222. * 返 回 值:无
  223. **************************************************************************************************/
  224. void tempera_humi_read(float *t,float *h )
  225. {
  226.   unsigned char error,checksum;
  227.   float humi,temp;
  228.   initIO();
  229.    
  230.   connectionreset(); //启动传输
  231.   error = 0;
  232.   error += measure(&checksum,MEASURE_HUMI); //读取湿度数据并校验
  233.   humi = d1*256+d2;
  234.    
  235.   error += measure(&checksum,MEASURE_TEMP); //读取温度数据并校验
  236.   temp = d1*256+d2;
  237.   if(error != 0)
  238.   {
  239.     connectionreset(); //读取失败,通信复位
  240.   }   
  241.   else //读取成功,计算数据
  242.   {   
  243.     temp = temp*0.01 - 39.6 ;
  244.     humi = (temp - 25) * (0.01 + 0.00008 * humi)
  245.             -0.0000028 * humi * humi + 0.0405 * humi-4;
  246.     if(humi>100)
  247.     {
  248.       humi = 100;
  249.     }
  250.     if(humi<0.1)
  251.     {
  252.       humi = 0.1;
  253.     }
  254.   }
  255.    
  256.   *t=temp;
  257.    
  258.   *h=humi*10;
  259.    
  260. }

  261. /****************************************************************
  262.    串口初始化函数                               
  263. ****************************************************************/
  264. void initUARTSEND(void)
  265. {

  266.     CLKCONCMD &= ~0x40;                          //设置系统时钟源为32MHZ晶振
  267.     while(CLKCONSTA & 0x40);                     //等待晶振稳定
  268.     CLKCONCMD &= ~0x47;                          //设置系统主时钟频率为32MHZ
  269.    
  270.   
  271.     PERCFG = 0x00;                                //位置1 P0口
  272.     P0SEL = 0x3c;                                //P0_2,P0_3,P0_4,P0_5用作串口
  273.     P2DIR &= ~0XC0;                             //P0优先作为UART0

  274.     U0CSR |= 0x80;                                //UART方式
  275.     U0GCR |= 9;                                       
  276.     U0BAUD |= 59;                                //波特率设为19200
  277.     UTX0IF = 0;                                 //UART0 TX中断标志初始置位0
  278. }
  279. /****************************************************************
  280. 串口发送字符串函数                       
  281. ****************************************************************/
  282. void UartTX_Send_String(char *Data,int len)
  283. {
  284.   int j;
  285.   for(j=0;j<len;j++)
  286. ……………………

  287. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SHT10温湿度传感器程序调试.rar (557.71 KB, 下载次数: 20)

评分

参与人数 1黑币 +5 收起 理由
a1071689010 + 5 赞一个!

查看全部评分

回复

使用道具 举报

a1071689010 发表于 2017-12-27 10:51 | 显示全部楼层
感谢楼主,谢谢分享,iar for 51和iar for 8051有区别吗
回复

使用道具 举报

无效楼层,该帖已经被删除
cferr 发表于 2018-6-8 16:22 | 显示全部楼层
赞一个
回复

使用道具 举报

610213748 发表于 2018-12-20 21:16 | 显示全部楼层
不错,值得参考
回复

使用道具 举报

shzn27 发表于 2019-1-8 21:28 | 显示全部楼层
为什么我用就用不了呢,各位大佬求救一下。程序用的一模一样。我怀疑是硬件问题。电路是不是需要其他东西啊
回复

使用道具 举报

shzn27 发表于 2019-1-8 22:22 | 显示全部楼层
楼主,你能说一下你的SHT10电路怎么接的吗?
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机. 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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