找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 9420|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

基于CC2530(IAR)SHT10溫濕度傳感器程序調(diào)試

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
便宜環(huán)境IAR for 51,單片機(jī) TI CC2530,傳感器CC2530!!


單片機(jī)源程序如下:
  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時(shí)鐘
  14. #define SHT10_SDA_PIN P1_6 //SHT10數(shù)據(jù)線
  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. * 函數(shù)名稱:initIO
  24. *
  25. * 功能描述:SHT10串行通信IO初始化
  26. *
  27. * 參 數(shù):無(wú)
  28. *
  29. * 返 回 值:無(wú)
  30. **************************************************************************************************/
  31. void initIO(void)
  32. {
  33.     P1DIR|= 0xc0;                                
  34.     P1INP &= 0xbf;
  35.     SHT10_SDA_HIGH();
  36.     SHT10_SCL_LOW();
  37. }
  38. /**************************************************************************************************
  39. * 函數(shù)名稱:s_write_byte_to_sht10
  40. *
  41. * 功能描述:向SHT10寫一個(gè)字節(jié)
  42. *
  43. * 參 數(shù):value -- 需寫入的字節(jié)值
  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) //將一個(gè)字節(jié)的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. * 函數(shù)名稱:s_receive_byte_from_sht10
  82. *
  83. * 功能描述:從SHT10讀取一個(gè)字節(jié)
  84. *
  85. * 參 數(shù):ack -- 讀取數(shù)據(jù)后,向SHT10發(fā)送ACK
  86. *
  87. * 返 回 值:val -- 讀取的字節(jié)值
  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. * 函數(shù)名稱:transstart
  118. *
  119. * 功能描述:?jiǎn)?dòng)SHT10,開始與SHT10通信
  120. *
  121. * 參 數(shù):無(wú)
  122. *
  123. * 返 回 值:無(wú)
  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. * 函數(shù)名稱:s_connectionreset
  146. *
  147. * 功能描述:與SHT10通信復(fù)位
  148. *
  149. * 參 數(shù):無(wú)
  150. *
  151. * 返 回 值:無(wú)
  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. * 函數(shù)名稱:measure
  170. *
  171. * 功能描述:發(fā)送命令、讀取SHT10溫度或濕度數(shù)據(jù)
  172. *
  173. * 參 數(shù):*p_checksum -- 校驗(yàn)和
  174. * mode -- 讀取數(shù)據(jù)類型(3為溫度,5為濕度)
  175. *
  176. * 返 回 值:er -- 操作結(jié)果
  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. * 函數(shù)名稱:tempera_humi_read
  216. *
  217. * 功能描述:調(diào)用相應(yīng)函數(shù),讀取溫度和濕度數(shù)據(jù)并校驗(yàn)和計(jì)算
  218. *
  219. * 參 數(shù):*t -- 溫度值
  220. * *h -- 濕度值
  221. *
  222. * 返 回 值:無(wú)
  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(); //啟動(dòng)傳輸
  231.   error = 0;
  232.   error += measure(&checksum,MEASURE_HUMI); //讀取濕度數(shù)據(jù)并校驗(yàn)
  233.   humi = d1*256+d2;
  234.    
  235.   error += measure(&checksum,MEASURE_TEMP); //讀取溫度數(shù)據(jù)并校驗(yàn)
  236.   temp = d1*256+d2;
  237.   if(error != 0)
  238.   {
  239.     connectionreset(); //讀取失敗,通信復(fù)位
  240.   }   
  241.   else //讀取成功,計(jì)算數(shù)據(jù)
  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.    串口初始化函數(shù)                               
  263. ****************************************************************/
  264. void initUARTSEND(void)
  265. {

  266.     CLKCONCMD &= ~0x40;                          //設(shè)置系統(tǒng)時(shí)鐘源為32MHZ晶振
  267.     while(CLKCONSTA & 0x40);                     //等待晶振穩(wěn)定
  268.     CLKCONCMD &= ~0x47;                          //設(shè)置系統(tǒng)主時(shí)鐘頻率為32MHZ
  269.    
  270.   
  271.     PERCFG = 0x00;                                //位置1 P0口
  272.     P0SEL = 0x3c;                                //P0_2,P0_3,P0_4,P0_5用作串口
  273.     P2DIR &= ~0XC0;                             //P0優(yōu)先作為UART0

  274.     U0CSR |= 0x80;                                //UART方式
  275.     U0GCR |= 9;                                       
  276.     U0BAUD |= 59;                                //波特率設(shè)為19200
  277.     UTX0IF = 0;                                 //UART0 TX中斷標(biāo)志初始置位0
  278. }
  279. /****************************************************************
  280. 串口發(fā)送字符串函數(shù)                       
  281. ****************************************************************/
  282. void UartTX_Send_String(char *Data,int len)
  283. {
  284.   int j;
  285.   for(j=0;j<len;j++)
  286. ……………………

  287. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
SHT10溫濕度傳感器程序調(diào)試.rar (557.71 KB, 下載次數(shù): 98)




評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
a1071689010 + 5 贊一個(gè)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:267563 發(fā)表于 2017-12-27 10:51 | 只看該作者
感謝樓主,謝謝分享,iar for 51和iar for 8051有區(qū)別嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:347697 發(fā)表于 2018-6-8 16:22 | 只看該作者
贊一個(gè)
回復(fù)

使用道具 舉報(bào)

地板
ID:426741 發(fā)表于 2018-12-20 21:16 | 只看該作者
不錯(cuò),值得參考
回復(fù)

使用道具 舉報(bào)

5#
ID:448790 發(fā)表于 2019-1-8 21:28 | 只看該作者
為什么我用就用不了呢,各位大佬求救一下。程序用的一模一樣。我懷疑是硬件問題。電路是不是需要其他東西啊
回復(fù)

使用道具 舉報(bào)

6#
ID:448790 發(fā)表于 2019-1-8 22:22 | 只看該作者
樓主,你能說(shuō)一下你的SHT10電路怎么接的嗎?
回復(fù)

使用道具 舉報(bào)

7#
ID:519846 發(fā)表于 2019-4-23 19:13 | 只看該作者

贊一個(gè)
回復(fù)

使用道具 舉報(bào)

8#
ID:688636 發(fā)表于 2020-3-18 14:59 來(lái)自手機(jī) | 只看該作者
這個(gè)有原理圖嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:1011444 發(fā)表于 2023-5-18 10:07 | 只看該作者
資料很好,謝謝分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表