找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F2K60S2單片機(jī)+esp8266+NTC APP溫度測量制作

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:355489 發(fā)表于 2018-11-25 19:46 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
準(zhǔn)備材料:
STC15F2K60S2
esp8266
NTC熱敏電阻
10K電阻一個
連接線若干
手機(jī)APP:NetAssist
參考貼子:http://www.torrancerestoration.com/bbs/dpj-57255-1.html

接線圖:


APP界面:


單片機(jī)源程序如下:
  1. #include<ADC.c>

  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. #define RELOAD_COUNT 0xFA         //宏定義波特率發(fā)生器的載入值
  5. #define MAIN_Fosc                22118400L        //定義主時鐘        
  6. #define        Timer1_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))                //Timer 1 重裝值, 對應(yīng)300KHZ
  7. #define        Timer2_Reload        (65536UL -(MAIN_Fosc / 4 / BaudRate1))        //Timer 2 重裝值, 對應(yīng)300KHZ
  8. #define        BaudRate1                115200UL        //選擇波特率

  9. #define ID_ADDR_ROM 0xeff7      //60K程序空間的MCU
  10. #define ID_ADDR_RAM 0xef        //對于只有256字節(jié)RAM的MCU(大部分系列)存放地址為0EFH

  11. unsigned int code Ttable[106][2]={//溫度與電阻阻值對應(yīng)關(guān)系表格
  12. 0,3274,//0度對應(yīng)阻值32.74k
  13. 1,3111,//1度對應(yīng)阻值31.11k
  14. 2,2957,//2度對應(yīng)阻值29.57k
  15. 3,2812,//
  16. 4,2674,//
  17. 5,2545,6,2422,7,2306,8,2196,9,2092,10,1993,11,1900,12,1811,
  18. 13,1728,14,1648,15,1573,16,1501,17,1433,18,1369,19,1308,20,1250,
  19. 21,1194,22,1142,23,1092,24,1045,
  20. 25,1000,//25度對應(yīng)阻值10k               
  21. 26,957,//26度對應(yīng)阻值9.57k
  22. 27,916,28,877,29,840,30,805,31,771,32,739,33,709,34,679,35,652,
  23. 36,625,37,600,38,576,39,553,40,531,41,510,42,490,43,471,44,453,
  24. 45,435,46,418,47,402,48,387,49,372,50,358,51,345,52,332,53,320,
  25. 54,308,55,297,56,286,57,276,58,266,59,256,60,247,61,238, 62,230,
  26. 63,222,64,214,65,207,66,199,67,193,68,186,69,180,70,174,71,168,
  27. 72,162,73,157,74,        152,75,        147,76,        142,77,        137,78,        133,79,        128,
  28. 80,        124,81,        120,82,        116,83,        113,84,        109,85,        106,
  29. 86,        102,//86度對應(yīng)阻值1.02k
  30. 87,        99,//87度對應(yīng)阻值0.99k
  31. 88,        96,89,        93,90,        90,91,        88,92,        85,93,        82,94,        80,95,        78,
  32. 96,        75,97,        73,98,        71,99,        69,100,67,101,65,102,63,103,61, 104,59,
  33. 105,58//105度對應(yīng)阻值0.58k
  34. };       

  35. #define receive_max 50          //串口接收緩沖長度   
  36. uchar Recive_table[receive_max];        //用于接收wifi模塊反饋到MCU上的數(shù)據(jù)
  37. u8 receive_count=0; //接受數(shù)據(jù)的個數(shù)
  38. u16 NTC_R;//定義熱敏電阻阻值變量
  39. int temperature;//定義溫度存儲變量
  40. sbit LED0=P3^7;

  41. uchar sent_table[receive_max];  


  42. void Uart_Init()//使用定時器1作為波特率發(fā)生器
  43. {
  44.     SCON |= 0x40;               //8位數(shù)據(jù)
  45.     P_SW1 &=  ~0xc0;       //UART1 使用P30 P31口  默認(rèn)
  46.     TR1 = 0;                    //關(guān)閉定時器
  47.     TR1 = 0;                        //波特率使用Timer1產(chǎn)生
  48.     AUXR &= ~0x01;                //S1 BRT Use Timer1;
  49.     TMOD &= ~(1<<6);   //Timer1 set As Timer
  50.     TMOD &= ~0x30;     //Timer1_16bitAutoReload;2
  51.     AUXR |=  (1<<6);        //Timer1 set as 1T mode
  52.     TH1 = (u8)(Timer1_Reload >> 8);
  53.     TL1 = (u8)Timer1_Reload;
  54.     TR1  = 1;
  55.     PS = 1; //高優(yōu)先級中斷
  56.     REN = 1;        //允許接收
  57.     ES  = 1;        //允許中斷
  58.     EA = 1;                //允許全局中斷
  59. }

  60. void Delay_ms(u16 n)
  61. {
  62.         unsigned int  i,j;
  63.         for(i=0;i<n;i++)
  64.                 for(j=0;j<123;j++);
  65. }

  66. void sendByte(uchar b)
  67. {   ES=0;
  68.     SBUF = b;
  69.     while(!TI);
  70.     TI=0;
  71.     ES=1;
  72. }
  73. void sendString(uchar *s)
  74. {
  75.     while(*s != '\0') //字符串默認(rèn)結(jié)尾'\0',以此來判斷字符串的結(jié)束
  76.     {
  77.         sendByte(*s++);
  78.     }
  79. }


  80. void ESP8266_Set(uchar *puf) // 數(shù)組指針*puf指向字符串?dāng)?shù)組
  81. {
  82.     sendString(puf);
  83.     Delay_ms(10);
  84.     sendString("\r\n");//回車
  85. }

  86. void ESP8266_Sent(uchar *puf)      // 數(shù)組指針*puf指向字符串?dāng)?shù)組
  87. {
  88.     ESP8266_Set("AT+CIPSEND=0,60");
  89.     sendString(puf);
  90.     Delay_ms(10);
  91.     sendString("\r\n");   //回車
  92. }

  93. void ESP8266_Init()
  94. {
  95.         Delay_ms(2000);
  96.         Delay_ms(1000);
  97.         ESP8266_Set("AT+CIPMUX=1"); //啟動多連接
  98.     Delay_ms(5000);
  99.     LED0=!LED0;
  100.     ESP8266_Set("AT+CIPSERVER=1,333");//建立server,端口為333
  101. }


  102. void T_dis(){//溫度處理函數(shù)采集到的阻值與二維數(shù)組的阻值進(jìn)行比較,從而獲得相對應(yīng)的溫度值。
  103.          unsigned char i;
  104.         temperature = 0;
  105.          for(i=105;i<106;i--)  {
  106.                 if(NTC_R >= Ttable[i][1] && NTC_R < Ttable[i-1][1]){
  107.                    temperature=(Ttable[i][0]+1);
  108.                    break;
  109.                 }
  110.         }
  111. }


  112. void ADC_config(void)
  113. {
  114.         ADC_InitTypeDef                ADC_InitStructure;                                //結(jié)構(gòu)定義
  115.         ADC_InitStructure.ADC_Px        = ADC_P10 | ADC_P11 | ADC_P12;        //設(shè)置要做ADC的IO,        ADC_P10 ~ ADC_P17(或操作),ADC_P1_All
  116.         ADC_InitStructure.ADC_Speed     = ADC_360T;                        //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
  117.         ADC_InitStructure.ADC_Power     = ENABLE;                        //ADC功率允許/關(guān)閉        ENABLE,DISABLE
  118.         ADC_InitStructure.ADC_AdjResult = ADC_RES_H8L2;                //ADC結(jié)果調(diào)整,        ADC_RES_H2L8,ADC_RES_H8L2
  119.         ADC_InitStructure.ADC_Polity    = PolityLow;                //優(yōu)先級設(shè)置        PolityHigh,PolityLow
  120.         ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中斷允許                ENABLE,DISABLE
  121.         ADC_Inilize(&ADC_InitStructure);                                        //初始化
  122.         ADC_PowerControl(ENABLE);                                                        //單獨(dú)的ADC電源操作函數(shù), ENABLE或DISABLE
  123. }
  124. // convert to char
  125. char convert(u8 i) {
  126.         switch(i){
  127.                 case 0:
  128.                 return '0';
  129.                 case 1:
  130.                 return '1';
  131.                 case 2:
  132.                 return '2';
  133.                 case 3:
  134.                 return '3';
  135.                 case 4:
  136.                 return '4';
  137.                 case 5:
  138.                 return '5';
  139.                 case 6:
  140.                 return '6';
  141.                 case 7:
  142.                 return '7';
  143.                 case 8:
  144.                 return '8';
  145.                 case 9:
  146.                 return '9';
  147.                 default:
  148.                 return i;
  149.         }
  150. }


  151. void ShowResult(uchar ch)
  152. {
  153.     u16 adc_res10,//測量設(shè)定通道adc值
  154.         bandgap,  //bandgap預(yù)儲存校準(zhǔn)值,單位毫伏
  155.     adc_9gallery_res; //測量第九通道(bandgap)值

  156.     float power_voltage,        //系統(tǒng)供電電壓,單位毫伏
  157.     R,ADC_voltage;     //設(shè)定通道電壓值,單位毫伏
  158.    
  159.     uchar code *cptr; //定義ROM(代碼)區(qū)指針
  160.    // uchar  idata *iptr;//定義RAM(內(nèi)存)區(qū)指針
  161.    
  162.     cptr = ID_ADDR_ROM;         //從程序區(qū)讀取BandGap電壓值(單位:毫伏mV)
  163.     bandgap=*cptr++;
  164.     bandgap<<=8;
  165.     bandgap+=*cptr;
  166.     /*iptr = ID_ADDR_RAM;         //從內(nèi)存區(qū)讀取BandGap電壓值(單位:毫伏mV)
  167.     bandgap=*iptr++;              //兩種方法結(jié)果一樣,上面的方法需要在下載式勾選"在ID號前添加重要測試參數(shù)"選項(xiàng),才可在程序中獲取此參數(shù)
  168.     bandgap<<=8;                  //下面的方法不需要
  169.     bandgap+=*iptr; */  
  170.     //測量設(shè)定通道adc值
  171.     ADC_RES = 0;                    //清除結(jié)果寄存器
  172.     P1ASF = 0x80;                   //設(shè)置P1口為AD口
  173.     Get_ADC10bitResult(ch);
  174.     Get_ADC10bitResult(ch);                 //讀三次獲得穩(wěn)定
  175.     adc_res10= Get_ADC10bitResult(ch);
  176.     //測量第九通道(bandgap)值
  177.     ADC_RES = 0;                    //清除結(jié)果寄存器
  178.     P1ASF = 0x00;                   //設(shè)置讀第九通道
  179.     Get_ADC10bitResult(0);                 //測bandgap時,調(diào)用此函數(shù)時通道數(shù)只能填0
  180.     Get_ADC10bitResult(0);                 //讀三次獲得穩(wěn)定
  181.     adc_9gallery_res=Get_ADC10bitResult(0);
  182.     //計(jì)算系統(tǒng)供電電壓
  183.     power_voltage= (float)bandgap*1024/adc_9gallery_res;
  184.     //計(jì)算ADC通道測得電壓值
  185.     ADC_voltage= (float)bandgap*adc_res10/adc_9gallery_res;
  186.         R=1000*ADC_voltage/(power_voltage-ADC_voltage);
  187.         NTC_R=R;//把float浮點(diǎn)數(shù)轉(zhuǎn)化為int型
  188. }


  189. void main()
  190. {
  191.       
  192.         Uart_Init();
  193.         ESP8266_Init();
  194.         Delay_ms(20);//待系統(tǒng)穩(wěn)定
  195.         ADC_config();
  196.        
  197.         while(1){

  198.                 ShowResult(7);

  199.         if(receive_count > 0)//如果接受到數(shù)據(jù)
  200.         {
  201.             Delay_ms(500);
  202.             receive_count = 0;//接收計(jì)數(shù)清0
  203.                          if(Recive_table[9]=='0') {
  204.                                
  205.                                  sent_table[receive_max]= '\0';
  206.                                
  207.                                 sent_table[0]='N';
  208.                                 sent_table[1]='T';
  209.                                 sent_table[2]='C';
  210.                                 sent_table[3]='=';
  211.                                 sent_table[4]=convert(NTC_R/1000);
  212.                                 sent_table[5]=convert(NTC_R%1000/100);
  213.                                 sent_table[6]=convert(NTC_R%100/10);
  214.                                 sent_table[7]=convert(NTC_R%10);
  215.                                
  216.                                 T_dis();
  217.                                 sent_table[8]='T';sent_table[9]='=';
  218.                                
  219.                                 sent_table[10]=convert(temperature%1000/100);
  220.                                 sent_table[11]=convert(temperature%100/10);
  221.                                 sent_table[12]=convert(temperature%10);
  222.                        
  223. ……………………

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

所有資料51hei提供下載:
NTC10K溫度計(jì).zip (3.21 MB, 下載次數(shù): 117)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:282506 發(fā)表于 2018-12-2 17:13 | 只看該作者
謝謝了!樓主辛苦了!。。。。。。。。。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:437861 發(fā)表于 2018-12-2 19:26 | 只看該作者
不錯啊
回復(fù)

使用道具 舉報(bào)

地板
ID:85480 發(fā)表于 2019-6-26 16:40 | 只看該作者
不錯不錯 學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

5#
ID:207421 發(fā)表于 2019-6-27 13:21 | 只看該作者
不錯,8266也不錯。
回復(fù)

使用道具 舉報(bào)

6#
ID:589418 發(fā)表于 2019-7-24 10:36 | 只看該作者
溫度測量誤差為多少?
回復(fù)

使用道具 舉報(bào)

7#
ID:248392 發(fā)表于 2019-7-24 18:03 | 只看該作者
不錯不錯 學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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