久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11604|回復: 10
打印 上一主題 下一主題
收起左側

stc15w單片機內部自帶ADC采集熱敏電阻溫度數據顯示

  [復制鏈接]
跳轉到指定樓層
樓主
利用STC15W內部自帶的ADC采集熱敏電阻的數據,熱敏電阻的型號是50K,MF58-503-3950數據手冊上傳   MF58+503J3950.pdf (170.65 KB, 下載次數: 90)

這個程序在開發板上的現象如下圖所示:

代碼如下:


  1. /*******************************************************************************
  2. * 文件名: ADC轉換器使用
  3. * 描  述: 實用的溫度測試---熱敏電阻
  4. * 功  能:中斷方式
  5. * 作  者:大核桃QQ597627977
  6. * 版本號:1.0.1(2017.05.23)
  7. *******************************************************************************/
  8. #include "stc15w.h"//頭文件
  9. #include "intrins.h"



  10. /*******************************************************************************
  11. * 文件名: 重定義
  12. * 描  述:   
  13. * 功  能:
  14. * 作  者:大核桃
  15. * 版本號:1.0.1(2017.05.23)
  16. *******************************************************************************/
  17. typedef unsigned char uint8;
  18. typedef unsigned int  uint16;
  19. typedef unsigned long uint32;

  20. #define ADC_POWER   0x80            //ADC電源控制位
  21. #define ADC_FLAG    0x10            //ADC完成標志
  22. #define ADC_START   0x08            //ADC起始控制位
  23. #define ADC_SPEEDLL 0x00            //540個時鐘
  24. //#define ADC_SPEEDL  0x20            //360個時鐘
  25. //#define ADC_SPEEDH  0x40            //180個時鐘
  26. //#define ADC_SPEEDHH 0x60            //90個時鐘

  27. /*******************************************************************************
  28. * 文件名:全局變量定義區域
  29. * 描  述:
  30. * 功  能:
  31. * 作  者:大核桃
  32. * 版本號:1.0.1(2015.03.03)
  33. *******************************************************************************/
  34. bit flag_ad1 = 0;//溫度采集完成標志
  35. bit flag_coll1 = 0;//數據采集間隔
  36. uint16 Adresult_temp1 = 0;//采集的AD數值xx
  37. uint8 ad_count = 0; //采集AD的次數計數器
  38. uint16 ResTemp;//溫度臨時結果
  39. uint16 Temper;//溫度最終結果
  40. uint16 temp1,temp2,Sensor;//臨時結果存放
  41. uint16 Adresult1; //最終結果存放

  42. /*******************************************************************************
  43. * 文件名:共陽數碼管真值表
  44. * 描  述:
  45. * 功  能:
  46. * 作  者:大核桃
  47. * 版本號:1.0.1(2015.03.03)
  48. *******************************************************************************/
  49. code uint8 LedChar[] = {
  50.         0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  51.         0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0X1C,0x46,0x23,0x48,0xc1
  52. };

  53. uint16 code TempTab0_15[][2] = {//溫度轉換表,此表為 0~40 度
  54.         {962,0},{959,10},{956,20},{953,30},{950,40},{947,50},{944,60},{940,70},{937,80},{933,90},{929,100},
  55.         {925,113},{924,115},{923,117},{922,119},
  56.         {921,123},{920,125},{919,127},{918,129},
  57.         {917,131},{916,133},{915,135},{914,137},{913,139},
  58.         {912,143},{911,145},{910,147},{909,149},
  59. };

  60. uint16 code TempTab16_20[][2] = {//溫度轉換表,此表為 0~40 度
  61.         {908,151},{907,153},{906,155},{905,157},{904,159},
  62.         {903,161},{902,163},{901,165},{900,167},{899,169},
  63.         {898,171},{897,173},{896,175},{895,177},{894,179},
  64.         {893,181},{892,183},{891,185},{890,187},{889,189},
  65.         {888,191},{887,193},{886,195},{885,197},{884,199},
  66.         {883,201},{882,203},{881,205},{880,207},{879,208},{878,209},
  67. };

  68. uint16 code TempTab21_25[][2] = {//溫度轉換表,此表為 0~40 度
  69.         {877,210},{876,211},{875,213},{874,215},{873,217},{872,219},
  70.         {871,221},{870,223},{869,225},{868,227},{867,229},
  71.         {866,230},{865,231},{864,233},{863,235},{862,237},{861,239},
  72.         {860,240},{859,241},{858,243},{857,245},{856,247},{855,248},{854,249},
  73.         {853,250},{852,251},{851,253},{850,255},{849,257},{848,259},

  74. };

  75. uint16 code TempTab26_30[][2] = {//溫度轉換表,此表為 0~40 度
  76.         {847,260},{846,261},{845,263},{844,265},{843,267},{842,269},
  77.         {841,270},{840,271},{839,273},{838,275},{837,277},{836,279},
  78.         {835,280},{834,281},{833,283},{832,285},{831,287},{830,288},{829,289},
  79.         {828,290},{827,291},{826,293},{825,295},{824,297},{823,298},{822,299},
  80.         {821,300},{820,301},{819,303},{818,305},{817,307},{816,308},{815,309},
  81. };

  82. uint16 code TempTab31_35[][2] = {//溫度轉換表,此表為 0~40 度
  83.         {814,310},{813,311},{812,313},{811,315},{810,317},{809,318},{808,319},
  84.         {807,320},{806,321},{805,323},{804,325},{803,327},{802,328},{801,329},
  85.         {800,330},{799,331},{798,332},{797,334},{796,335},{795,337},{794,338},{793,339},
  86.         {792,340},{791,341},{790,343},{789,345},{788,347},{787,348},{786,349},
  87.         {785,350},{784,351},{783,352},{782,353},{781,355},{780,357},{779,358},{778,359},

  88. };

  89. uint16 code TempTab36_40[][2] = {//溫度轉換表,此表為 0~40 度
  90.          {777,360},{776,361},{775,362},{774,363},{773,365},{772,367},{771,368},{770,369},
  91.         {769,370},{768,371},{767,372},{766,373},{765,375},{764,377},{763,378},{762,379},
  92.         {761,380},{760,381},{759,382},{758,383},{757,385},{756,387},{755,388},{754,389},
  93.         {753,390},{752,391},{751,392},{750,393},{749,395},{748,397},{747,398},{746,399},
  94.         {745,400},{744,401},{743,402},{742,403},{741,405},{740,407},{739,408},{738,409},
  95. };


  96. /*******************************************************************************
  97. * 文件名:單獨位定義
  98. * 描  述:   
  99. * 功  能:
  100. * 作  者:大核桃
  101. * 版本號:1.0.1(2017.05.23)
  102. *******************************************************************************/
  103. sbit LED0 = P1^0;//第1組LED
  104. sbit LED1 = P1^1;//第2組LED
  105. sbit LED2 = P1^2;//第3組LED                                 
  106. sbit LED3 = P1^3;//第4組LED
  107. sbit LED4 = P1^4;//第5組LED
  108. sbit LED5 = P3^2;//第6組LED
  109. sbit LED6 = P0^0;//第7組LED
  110. sbit LED7 = P0^1;//第8組LED

  111. sbit LEDS1 = P3^3;//數碼管1
  112. sbit LEDS2 = P3^4;//數碼管2
  113. sbit LEDS3 = P3^6;//數碼管3
  114. sbit LEDS4 = P3^7;//數碼管4

  115. /*******************************************************************************
  116. * 文件名:函數前置聲明
  117. * 描  述:   
  118. * 功  能:
  119. * 作  者:大核桃
  120. * 版本號:1.0.1(2017.05.23)
  121. *******************************************************************************/
  122. void Mcu_Port_Init();
  123. void LedScan();
  124. void Delay500ms(); //24MHZ
  125. void Time0_Init();//定時器0
  126. void InitADC(void);
  127. uint16 Get_Adc_Temp(uint8 times); //AD轉換與查表處理程序
  128. void ADC_Refresh(void);

  129. /*******************************************************************************
  130. * 文件名
  131. * 描  述: 主函數  
  132. * 功  能:入口
  133. * 作  者:大核桃
  134. * 版本號:1.0.1(2017.05.23)
  135. *******************************************************************************/
  136. void main(void)
  137. {                                       
  138.         Mcu_Port_Init();//IO上電初始化
  139.         Time0_Init();
  140.         InitADC();

  141.         while(1)
  142.         {
  143.                 Get_Adc_Temp(16); //AD轉換與查表處理程序
  144.                 ADC_Refresh();        
  145.         }
  146. }

  147. /*******************************************************************************
  148. * 文件名:void LedScan()
  149. * 描  述: LED刷新
  150. * 功  能:
  151. * 作  者:大核桃
  152. * 版本號:1.0.1(2017.05.23)
  153. *******************************************************************************/
  154. void LedScan()
  155. {
  156.         static uint8 i = 0;

  157.         P2 = 0Xff;
  158.         switch(i)
  159.         {
  160.                 case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[Temper / 100 % 10];i++;break;
  161.                 case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[Temper / 10 % 10];i++;break;
  162.                 case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[17];i++;break;
  163.                 case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[18];i = 0;break;

  164.                 default:break;
  165.         }
  166. }

  167. /*******************************************************************************
  168. * 文件名:void InitADC(void)
  169. * 描  述: //初始化 AD 轉換
  170. * 功  能:
  171. * 作  者:大核桃
  172. * 版本號:1.0.1(2015.03.03)
  173. *******************************************************************************/
  174. void InitADC(void)
  175. {
  176.         P1ASF = 0xE0; //設置 P1 口為模擬口
  177.         ADC_RES = 0; //清除結果寄存器
  178.         CLK_DIV |= 0x20; //ADRJ 為 1,ADC_RES 存放高兩位結果,ADC_RESL 存放低 8 位結果
  179.     //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;
  180.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;                    //ADC上電并延時
  181. }

  182. /*******************************************************************************
  183. * 文件名:void adc_isr() interrupt 5 using 1
  184. * 描  述: 中斷服務程序
  185. * 功  能:
  186. * 作  者:大核桃
  187. * 版本號:1.0.1(2015.03.03)
  188. *******************************************************************************/
  189. void adc_isr() interrupt 5 using 1
  190. {
  191.         EADC = 1;//開ADC中斷

  192.         ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標志
  193.         ResTemp = ADC_RES;
  194.         ResTemp <<= 8;
  195.         ResTemp |= ADC_RESL;
  196.         flag_ad1 = 1; //電壓采集完成標志
  197.         ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;

  198.         EADC = 0;//關閉中斷               

  199. }

  200. /*******************************************************************************
  201. * 文件名:void Get_Adc_Temp(uint8 times)
  202. * 描  述: 溫度數據采集
  203. * 功  能:模塊化編程
  204. * 作  者:大核桃
  205. * 版本號:1.0.1(2017.05.23)
  206. *******************************************************************************/
  207. uint16 Get_Adc_Temp(uint8 times) //AD轉換與查表處理程序
  208. {
  209.    if(flag_coll1) //每次采集AD的時間間隔標志位
  210.    {
  211.                 if(ad_count < times)//連續采集16次后再把求總數據的平均值
  212.                 {
  213.                         if(flag_ad1 == 1)   //完成一次AD采樣
  214.                         {
  215.                                 flag_ad1 = 0;  //清除完成一次采樣的標志位

  216.                                 Adresult_temp1 = Adresult_temp1 + ResTemp;
  217.                                 ad_count++;
  218.                                 ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;
  219.                         }
  220.                 } //右移動一位數據就相當于整除以2
  221.                 else  //已經采集完16次數據,這個時候把總累加數據除以16就可以求得平均值了
  222.                 {
  223.                         Adresult_temp1 >>= 4;
  224.                         Adresult1 = Adresult_temp1;
  225.                         Adresult_temp1 = 0;//AD暫存清零
  226.                         ResTemp = 0;  //把采集AD的結果清零
  227.                         ad_count = 0; //把采集次數重新清零
  228.                 }
  229.    }

  230.    return  Adresult1;//返回采集的溫度數值
  231. }

  232. /*******************************************************************************
  233. * 文件名:void ADC_Refresh(void)
  234. * 描  述: 刷新溫度
  235. * 功  能:模塊化編程
  236. * 作  者:大核桃
  237. * 版本號:1.0.1(2017.05.23)
  238. *******************************************************************************/
  239. void ADC_Refresh(void)
  240. {
  241.         static uint8 i = 0;

  242.         if((Adresult1 >= 909) && (Adresult1 < 962))
  243.         {
  244.                 for (i = 0; i < sizeof(TempTab0_15); i++) //遍歷映射表
  245.                 {
  246.                         if (Adresult1 >= TempTab0_15[i][0]) //在表中找到當前,
  247.                         {
  248.                                 break;               
  249.                         }
  250.                 }

  251.                 Temper = TempTab0_15[i][1];
  252.         }
  253.         else if((Adresult1 >= 878) && (Adresult1 < 908))
  254.         {
  255.                 for (i = 0; i < sizeof(TempTab16_20); i++) //遍歷映射表
  256.                 {
  257.                         if (Adresult1 >= TempTab16_20[i][0]) //在表中找到當前,
  258.                         {
  259.                                 break;               
  260.                         }
  261.                 }

  262.                 Temper = TempTab16_20[i][1];
  263.         }
  264.         else if((Adresult1 >= 848) && (Adresult1 < 877))
  265.         {
  266.                 for (i = 0; i < sizeof(TempTab21_25); i++) //遍歷映射表
  267.                 {
  268.                         if (Adresult1 >= TempTab21_25[i][0]) //在表中找到當前,
  269.                         {
  270.                                 break;               
  271.                         }
  272.                 }
  273.                 Temper = TempTab21_25[i][1];
  274.         }
  275.         else if((Adresult1 >= 815) && (Adresult1 < 847))
  276.         {
  277.                 for (i = 0; i < sizeof(TempTab26_30); i++) //遍歷映射表
  278.                 {
  279.                         if (Adresult1 >= TempTab26_30[i][0]) //在表中找到當前,
  280.                         {
  281.                                 break;               
  282.                         }
  283.                 }
  284.                 Temper = TempTab26_30[i][1];
  285.         }
  286.         else if((Adresult1 >= 778) && (Adresult1 < 814))
  287.         {
  288.                 for (i = 0; i < sizeof(TempTab31_35); i++) //遍歷映射表
  289.                 {
  290.                         if (Adresult1 >= TempTab31_35[i][0]) //在表中找到當前,
  291.                         {
  292.                                 break;               
  293.                         }
  294.                 }
  295.                 Temper = TempTab31_35[i][1];
  296.         }
  297.         else if((Adresult1 >= 738) && (Adresult1 < 777))
  298.         {
  299.                 for (i = 0; i < sizeof(TempTab36_40); i++) //遍歷映射表
  300.                 {
  301.                         if (Adresult1 >= TempTab36_40[i][0]) //在表中找到當前,
  302.                         {
  303.                                 break;               
  304.                         }
  305.                 }

  306.                 Temper = TempTab36_40[i][1];
  307.         }
  308.                                 
  309. }  

  310. /*******************************************************************************
  311. * 文件名:void Time0_Init()
  312. * 描  述: 定時器0初始化
  313. * 功  能:10毫秒@11.0592MHz
  314. * 作  者:大核桃
  315. * 版本號:1.0.1(2017.05.23)
  316. *******************************************************************************/
  317. void Time0_Init(void)
  318. {
  319.         AUXR |= 0x80;   //定時器時鐘1T模式
  320.         TMOD &= 0xF0;        //設置定時器模式
  321.         TL0 = 0xCD;                //設置定時初值
  322.         TH0 = 0xD4;                //設置定時初值
  323.         ET0 = 1;
  324.         TR0 = 1;                //定時器0開始計時
  325.         EA = 1;               
  326. }

  327. /*******************************************************************************
  328. * 文件名:
  329. * 描  述: 中斷函數
  330. * 功  能:1毫秒@11.0592MHz
  331. * 作  者:大核桃
  332. * 版本號:1.0.1(2017.05.23)
  333. *******************************************************************************/
  334. void ET0_IRQHandler() interrupt 1
  335. {
  336.         static uint8 tmrcoll1 = 0;//數據采集間隔

  337.         EADC = 0;  //在定時中斷中禁止AD中斷

  338.     TL0 = 0xCD;                //設置定時初值
  339.         TH0 = 0xD4;                //設置定時初值

  340.         tmrcoll1++;//數據采集時間累加
  341.         if(tmrcoll1 >= 2) // 2 = 2ms  500HZ                                                                                                                                                                          //166*100 =16.6MS  
  342.         {
  343.             tmrcoll1 = 0;
  344.                 flag_coll1 = 1;//數據采集間隔標志位 2ms讀取一次數據
  345.         }

  346.         LedScan();

  347.         EADC = 1;  //在定時中斷中打開AD中斷
  348.                         
  349. }

  350. /*******************************************************************************
  351. * 文件名:void Mcu_Port_Init()
  352. * 描  述: io初始化
  353. * 功  能:
  354. * 作  者:大核桃
  355. * 版本號:1.0.1(2017.05.23)
  356. *******************************************************************************/
  357. void Mcu_Port_Init()
  358. {
  359.         IE = 0xa8;//允許AD轉換
  360.         //將P0口低二位配置為推挽輸出
  361.         //234567位配置位高阻輸入
  362.         P0M1 = 0xFC;//1111 1100
  363.         P0M0 = 0X03;//0000 0011
  364.         //P0 = 0X01;//第6個
  365.         //P0 = 0X02;//第7個
  366.         //高3位配置高阻輸入,用作模擬口
  367.         //其他配置推挽輸出,驅動LED
  368.         P1M1 = 0xE0;//1110 0000
  369.         P1M0 = 0X1F;//0001 1111
  370.         //P2口配置準雙向口
  371.         P2M1 = 0X00;
  372.         P2M0 = 0X00;
  373.         P2 = 0Xff; //上電為1111 1111


  374. //        //P54,P55口為推挽輸出
  375.         P5M1 = 0X00;
  376.         P5M0 = 0X00;
  377.         P5 = 0xFF;

  378.         //P37,P36,3.2,P3.3 P3.4口為推挽輸出
  379.         P3M1 = 0X00;
  380.         P3M0 = 0XFC;
  381.         P3 = 0X23; //0010 0111//第5個LED端口
  382.         
  383.         LED0 = 0;//第1組LED,如果使能請置為1
  384.         LED1 = 0;
  385.         LED2 = 0;
  386.         LED3 = 0;
  387.         LED4 = 0;
  388.         LED5 = 0;
  389.         LED6 = 0;
  390.         LED7 = 0;        
  391. }

  392. /*******************************************************************************
  393. * 文件名:void Delay500ms()                //@24.000MHz
  394. * 描  述:Y5內核延時
  395. * 功  能:
  396. * 作  者:大核桃
  397. * 版本號:1.0.1(2017.05.23)
  398. *******************************************************************************/
  399. void Delay500ms()                //@24.000MHz
  400. {
  401.         unsigned char i, j, k;

  402.         _nop_();
  403.         _nop_();
  404.         i = 46;
  405.         j = 153;
  406.         k = 245;
  407.         do
  408.         {
  409.                 do
  410.                 {
  411.                         while (--k);
  412.                 } while (--j);
  413.         } while (--i);
  414. }
復制代碼

程序代碼如下

012 熱敏電阻測溫.rar (56.27 KB, 下載次數: 172)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:477934 發表于 2019-2-20 17:29 | 只看該作者
有一點意思,收下
回復

使用道具 舉報

板凳
ID:85480 發表于 2019-7-5 23:37 | 只看該作者
下下來看看先  主要是看一下 轉換阻值表。 多謝!
回復

使用道具 舉報

地板
ID:579046 發表于 2019-7-6 17:22 | 只看該作者
很利好!
回復

使用道具 舉報

5#
ID:140183 發表于 2019-7-7 06:06 | 只看該作者
太好啦.謝謝分享!!!!
回復

使用道具 舉報

6#
ID:586048 發表于 2019-7-25 16:04 | 只看該作者
寫的超級好,收i下了
回復

使用道具 舉報

7#
ID:593506 發表于 2019-8-4 15:36 | 只看該作者
我先看看  學習下
回復

使用道具 舉報

8#
ID:366464 發表于 2021-1-30 15:45 | 只看該作者
努力學習中!
回復

使用道具 舉報

9#
ID:1049825 發表于 2022-10-31 19:50 | 只看該作者
樓主的帖子對初學者都有很好的參考價值.
回復

使用道具 舉報

10#
ID:404454 發表于 2022-10-31 20:13 | 只看該作者
買到10幾個都是10K的熱敏電阻,怎么樣修改溫度曲線顯示準確。
回復

使用道具 舉報

11#
ID:824664 發表于 2023-3-15 08:19 | 只看該作者
完美思路,值得學習。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精产国品一二三区 | 成人在线观看亚洲 | 亚洲激情在线 | 视频精品一区 | 日本欧美黄色片 | av网站免费在线观看 | 日韩精品成人一区二区三区视频 | 欧美一级久久 | 美女国内精品自产拍在线播放 | 亚洲一区二区在线 | 羞羞网站免费观看 | 亚洲成人av | 自拍偷拍亚洲视频 | 国产在线永久免费 | 亚洲精品1区 | 欧美综合久久 | 亚洲一区二区三区视频 | 日本韩国欧美在线观看 | 超黄毛片| 国产精品欧美一区二区三区不卡 | 国产一级免费视频 | 91精品久久久久 | 欧美日韩黄色一级片 | 精品国产1区2区3区 一区二区手机在线 | 久久久久91 | 91精品国产一区二区三区 | 午夜视频一区二区 | 一区二区三区欧美大片 | 日韩精品1区2区3区 成人黄页在线观看 | 国产福利一区二区 | 毛片一级片 | 久久久久久久国产 | 国产精品一区一区三区 | 国产一区二区三区网站 | 欧美极品在线 | 日韩欧美福利视频 | 五月天激情综合网 | 91久久国产综合久久 | 午夜视频在线免费观看 | 亚洲成人在线网 | 99精品欧美一区二区蜜桃免费 |