找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10082|回复: 10
打印 上一主题 下一主题
收起左侧

stc15w单片机内部自带ADC采集热敏电阻温度数据显示

  [复制链接]
跳转到指定楼层
楼主
利用STC15W内部自带的ADC采集热敏电阻的数据,热敏电阻的型号是50K,MF58-503-3950数据手册上传   MF58+503J3950.pdf (170.65 KB, 下载次数: 88)

这个程序在开发板上的现象如下图所示:

代码如下:


  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, 下载次数: 167)


评分

参与人数 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 单片机教程网

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