利用STC15W內部自帶的ADC采集熱敏電阻的數據,熱敏電阻的型號是50K,MF58-503-3950數據手冊上傳
MF58+503J3950.pdf
(170.65 KB, 下載次數: 90)
2018-10-13 14:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
這個程序在開發板上的現象如下圖所示:
溫度顯示.JPG (94.26 KB, 下載次數: 95)
下載附件
2018-10-13 14:31 上傳
代碼如下:
- /*******************************************************************************
- * 文件名: ADC轉換器使用
- * 描 述: 實用的溫度測試---熱敏電阻
- * 功 能:中斷方式
- * 作 者:大核桃QQ597627977
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- #include "stc15w.h"//頭文件
- #include "intrins.h"
- /*******************************************************************************
- * 文件名: 重定義
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- typedef unsigned long uint32;
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個時鐘
- //#define ADC_SPEEDL 0x20 //360個時鐘
- //#define ADC_SPEEDH 0x40 //180個時鐘
- //#define ADC_SPEEDHH 0x60 //90個時鐘
- /*******************************************************************************
- * 文件名:全局變量定義區域
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2015.03.03)
- *******************************************************************************/
- bit flag_ad1 = 0;//溫度采集完成標志
- bit flag_coll1 = 0;//數據采集間隔
- uint16 Adresult_temp1 = 0;//采集的AD數值xx
- uint8 ad_count = 0; //采集AD的次數計數器
- uint16 ResTemp;//溫度臨時結果
- uint16 Temper;//溫度最終結果
- uint16 temp1,temp2,Sensor;//臨時結果存放
- uint16 Adresult1; //最終結果存放
- /*******************************************************************************
- * 文件名:共陽數碼管真值表
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2015.03.03)
- *******************************************************************************/
- code uint8 LedChar[] = {
- 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0X1C,0x46,0x23,0x48,0xc1
- };
- uint16 code TempTab0_15[][2] = {//溫度轉換表,此表為 0~40 度
- {962,0},{959,10},{956,20},{953,30},{950,40},{947,50},{944,60},{940,70},{937,80},{933,90},{929,100},
- {925,113},{924,115},{923,117},{922,119},
- {921,123},{920,125},{919,127},{918,129},
- {917,131},{916,133},{915,135},{914,137},{913,139},
- {912,143},{911,145},{910,147},{909,149},
- };
- uint16 code TempTab16_20[][2] = {//溫度轉換表,此表為 0~40 度
- {908,151},{907,153},{906,155},{905,157},{904,159},
- {903,161},{902,163},{901,165},{900,167},{899,169},
- {898,171},{897,173},{896,175},{895,177},{894,179},
- {893,181},{892,183},{891,185},{890,187},{889,189},
- {888,191},{887,193},{886,195},{885,197},{884,199},
- {883,201},{882,203},{881,205},{880,207},{879,208},{878,209},
- };
- uint16 code TempTab21_25[][2] = {//溫度轉換表,此表為 0~40 度
- {877,210},{876,211},{875,213},{874,215},{873,217},{872,219},
- {871,221},{870,223},{869,225},{868,227},{867,229},
- {866,230},{865,231},{864,233},{863,235},{862,237},{861,239},
- {860,240},{859,241},{858,243},{857,245},{856,247},{855,248},{854,249},
- {853,250},{852,251},{851,253},{850,255},{849,257},{848,259},
- };
- uint16 code TempTab26_30[][2] = {//溫度轉換表,此表為 0~40 度
- {847,260},{846,261},{845,263},{844,265},{843,267},{842,269},
- {841,270},{840,271},{839,273},{838,275},{837,277},{836,279},
- {835,280},{834,281},{833,283},{832,285},{831,287},{830,288},{829,289},
- {828,290},{827,291},{826,293},{825,295},{824,297},{823,298},{822,299},
- {821,300},{820,301},{819,303},{818,305},{817,307},{816,308},{815,309},
- };
- uint16 code TempTab31_35[][2] = {//溫度轉換表,此表為 0~40 度
- {814,310},{813,311},{812,313},{811,315},{810,317},{809,318},{808,319},
- {807,320},{806,321},{805,323},{804,325},{803,327},{802,328},{801,329},
- {800,330},{799,331},{798,332},{797,334},{796,335},{795,337},{794,338},{793,339},
- {792,340},{791,341},{790,343},{789,345},{788,347},{787,348},{786,349},
- {785,350},{784,351},{783,352},{782,353},{781,355},{780,357},{779,358},{778,359},
- };
- uint16 code TempTab36_40[][2] = {//溫度轉換表,此表為 0~40 度
- {777,360},{776,361},{775,362},{774,363},{773,365},{772,367},{771,368},{770,369},
- {769,370},{768,371},{767,372},{766,373},{765,375},{764,377},{763,378},{762,379},
- {761,380},{760,381},{759,382},{758,383},{757,385},{756,387},{755,388},{754,389},
- {753,390},{752,391},{751,392},{750,393},{749,395},{748,397},{747,398},{746,399},
- {745,400},{744,401},{743,402},{742,403},{741,405},{740,407},{739,408},{738,409},
- };
- /*******************************************************************************
- * 文件名:單獨位定義
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- sbit LED0 = P1^0;//第1組LED
- sbit LED1 = P1^1;//第2組LED
- sbit LED2 = P1^2;//第3組LED
- sbit LED3 = P1^3;//第4組LED
- sbit LED4 = P1^4;//第5組LED
- sbit LED5 = P3^2;//第6組LED
- sbit LED6 = P0^0;//第7組LED
- sbit LED7 = P0^1;//第8組LED
- sbit LEDS1 = P3^3;//數碼管1
- sbit LEDS2 = P3^4;//數碼管2
- sbit LEDS3 = P3^6;//數碼管3
- sbit LEDS4 = P3^7;//數碼管4
- /*******************************************************************************
- * 文件名:函數前置聲明
- * 描 述:
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void Mcu_Port_Init();
- void LedScan();
- void Delay500ms(); //24MHZ
- void Time0_Init();//定時器0
- void InitADC(void);
- uint16 Get_Adc_Temp(uint8 times); //AD轉換與查表處理程序
- void ADC_Refresh(void);
- /*******************************************************************************
- * 文件名
- * 描 述: 主函數
- * 功 能:入口
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void main(void)
- {
- Mcu_Port_Init();//IO上電初始化
- Time0_Init();
- InitADC();
- while(1)
- {
- Get_Adc_Temp(16); //AD轉換與查表處理程序
- ADC_Refresh();
- }
- }
- /*******************************************************************************
- * 文件名:void LedScan()
- * 描 述: LED刷新
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void LedScan()
- {
- static uint8 i = 0;
- P2 = 0Xff;
- switch(i)
- {
- case 0: LEDS4 = 0;LEDS1 = 1;P2 = LedChar[Temper / 100 % 10];i++;break;
- case 1: LEDS1 = 0;LEDS2 = 1;P2 = LedChar[Temper / 10 % 10];i++;break;
- case 2: LEDS2 = 0;LEDS3 = 1;P2 = LedChar[17];i++;break;
- case 3: LEDS3 = 0;LEDS4 = 1;P2 = LedChar[18];i = 0;break;
- default:break;
- }
- }
- /*******************************************************************************
- * 文件名:void InitADC(void)
- * 描 述: //初始化 AD 轉換
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2015.03.03)
- *******************************************************************************/
- void InitADC(void)
- {
- P1ASF = 0xE0; //設置 P1 口為模擬口
- ADC_RES = 0; //清除結果寄存器
- CLK_DIV |= 0x20; //ADRJ 為 1,ADC_RES 存放高兩位結果,ADC_RESL 存放低 8 位結果
- //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START; //ADC上電并延時
- }
- /*******************************************************************************
- * 文件名:void adc_isr() interrupt 5 using 1
- * 描 述: 中斷服務程序
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2015.03.03)
- *******************************************************************************/
- void adc_isr() interrupt 5 using 1
- {
- EADC = 1;//開ADC中斷
- ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標志
- ResTemp = ADC_RES;
- ResTemp <<= 8;
- ResTemp |= ADC_RESL;
- flag_ad1 = 1; //電壓采集完成標志
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;
- EADC = 0;//關閉中斷
- }
- /*******************************************************************************
- * 文件名:void Get_Adc_Temp(uint8 times)
- * 描 述: 溫度數據采集
- * 功 能:模塊化編程
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- uint16 Get_Adc_Temp(uint8 times) //AD轉換與查表處理程序
- {
- if(flag_coll1) //每次采集AD的時間間隔標志位
- {
- if(ad_count < times)//連續采集16次后再把求總數據的平均值
- {
- if(flag_ad1 == 1) //完成一次AD采樣
- {
- flag_ad1 = 0; //清除完成一次采樣的標志位
- Adresult_temp1 = Adresult_temp1 + ResTemp;
- ad_count++;
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;
- }
- } //右移動一位數據就相當于整除以2
- else //已經采集完16次數據,這個時候把總累加數據除以16就可以求得平均值了
- {
- Adresult_temp1 >>= 4;
- Adresult1 = Adresult_temp1;
- Adresult_temp1 = 0;//AD暫存清零
- ResTemp = 0; //把采集AD的結果清零
- ad_count = 0; //把采集次數重新清零
- }
- }
- return Adresult1;//返回采集的溫度數值
- }
- /*******************************************************************************
- * 文件名:void ADC_Refresh(void)
- * 描 述: 刷新溫度
- * 功 能:模塊化編程
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void ADC_Refresh(void)
- {
- static uint8 i = 0;
- if((Adresult1 >= 909) && (Adresult1 < 962))
- {
- for (i = 0; i < sizeof(TempTab0_15); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab0_15[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab0_15[i][1];
- }
- else if((Adresult1 >= 878) && (Adresult1 < 908))
- {
- for (i = 0; i < sizeof(TempTab16_20); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab16_20[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab16_20[i][1];
- }
- else if((Adresult1 >= 848) && (Adresult1 < 877))
- {
- for (i = 0; i < sizeof(TempTab21_25); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab21_25[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab21_25[i][1];
- }
- else if((Adresult1 >= 815) && (Adresult1 < 847))
- {
- for (i = 0; i < sizeof(TempTab26_30); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab26_30[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab26_30[i][1];
- }
- else if((Adresult1 >= 778) && (Adresult1 < 814))
- {
- for (i = 0; i < sizeof(TempTab31_35); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab31_35[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab31_35[i][1];
- }
- else if((Adresult1 >= 738) && (Adresult1 < 777))
- {
- for (i = 0; i < sizeof(TempTab36_40); i++) //遍歷映射表
- {
- if (Adresult1 >= TempTab36_40[i][0]) //在表中找到當前,
- {
- break;
- }
- }
- Temper = TempTab36_40[i][1];
- }
-
- }
- /*******************************************************************************
- * 文件名:void Time0_Init()
- * 描 述: 定時器0初始化
- * 功 能:10毫秒@11.0592MHz
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void Time0_Init(void)
- {
- AUXR |= 0x80; //定時器時鐘1T模式
- TMOD &= 0xF0; //設置定時器模式
- TL0 = 0xCD; //設置定時初值
- TH0 = 0xD4; //設置定時初值
- ET0 = 1;
- TR0 = 1; //定時器0開始計時
- EA = 1;
- }
- /*******************************************************************************
- * 文件名:
- * 描 述: 中斷函數
- * 功 能:1毫秒@11.0592MHz
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void ET0_IRQHandler() interrupt 1
- {
- static uint8 tmrcoll1 = 0;//數據采集間隔
- EADC = 0; //在定時中斷中禁止AD中斷
- TL0 = 0xCD; //設置定時初值
- TH0 = 0xD4; //設置定時初值
- tmrcoll1++;//數據采集時間累加
- if(tmrcoll1 >= 2) // 2 = 2ms 500HZ //166*100 =16.6MS
- {
- tmrcoll1 = 0;
- flag_coll1 = 1;//數據采集間隔標志位 2ms讀取一次數據
- }
- LedScan();
- EADC = 1; //在定時中斷中打開AD中斷
-
- }
- /*******************************************************************************
- * 文件名:void Mcu_Port_Init()
- * 描 述: io初始化
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void Mcu_Port_Init()
- {
- IE = 0xa8;//允許AD轉換
- //將P0口低二位配置為推挽輸出
- //234567位配置位高阻輸入
- P0M1 = 0xFC;//1111 1100
- P0M0 = 0X03;//0000 0011
- //P0 = 0X01;//第6個
- //P0 = 0X02;//第7個
- //高3位配置高阻輸入,用作模擬口
- //其他配置推挽輸出,驅動LED
- P1M1 = 0xE0;//1110 0000
- P1M0 = 0X1F;//0001 1111
- //P2口配置準雙向口
- P2M1 = 0X00;
- P2M0 = 0X00;
- P2 = 0Xff; //上電為1111 1111
- // //P54,P55口為推挽輸出
- P5M1 = 0X00;
- P5M0 = 0X00;
- P5 = 0xFF;
- //P37,P36,3.2,P3.3 P3.4口為推挽輸出
- P3M1 = 0X00;
- P3M0 = 0XFC;
- P3 = 0X23; //0010 0111//第5個LED端口
-
- LED0 = 0;//第1組LED,如果使能請置為1
- LED1 = 0;
- LED2 = 0;
- LED3 = 0;
- LED4 = 0;
- LED5 = 0;
- LED6 = 0;
- LED7 = 0;
- }
- /*******************************************************************************
- * 文件名:void Delay500ms() //@24.000MHz
- * 描 述:Y5內核延時
- * 功 能:
- * 作 者:大核桃
- * 版本號:1.0.1(2017.05.23)
- *******************************************************************************/
- void Delay500ms() //@24.000MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 46;
- j = 153;
- k = 245;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
復制代碼
程序代碼如下
012 熱敏電阻測溫.rar
(56.27 KB, 下載次數: 172)
2018-10-13 14:32 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|