標(biāo)題:
stc15w單片機(jī)內(nèi)部自帶ADC采集熱敏電阻溫度數(shù)據(jù)顯示
[打印本頁(yè)]
作者:
dabing89
時(shí)間:
2018-10-13 14:32
標(biāo)題:
stc15w單片機(jī)內(nèi)部自帶ADC采集熱敏電阻溫度數(shù)據(jù)顯示
利用STC15W內(nèi)部自帶的ADC采集熱敏電阻的數(shù)據(jù),熱敏電阻的型號(hào)是50K,MF58-503-3950數(shù)據(jù)手冊(cè)上傳
MF58+503J3950.pdf
(170.65 KB, 下載次數(shù): 90)
2018-10-13 14:26 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
這個(gè)程序在開(kāi)發(fā)板上的現(xiàn)象如下圖所示:
溫度顯示.JPG
(94.26 KB, 下載次數(shù): 95)
下載附件
2018-10-13 14:31 上傳
代碼如下:
/*******************************************************************************
* 文件名: ADC轉(zhuǎn)換器使用
* 描 述: 實(shí)用的溫度測(cè)試---熱敏電阻
* 功 能:中斷方式
* 作 者:大核桃QQ597627977
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
#include "stc15w.h"//頭文件
#include "intrins.h"
/*******************************************************************************
* 文件名: 重定義
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號(hào):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完成標(biāo)志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
//#define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
//#define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
//#define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
/*******************************************************************************
* 文件名:全局變量定義區(qū)域
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號(hào):1.0.1(2015.03.03)
*******************************************************************************/
bit flag_ad1 = 0;//溫度采集完成標(biāo)志
bit flag_coll1 = 0;//數(shù)據(jù)采集間隔
uint16 Adresult_temp1 = 0;//采集的AD數(shù)值xx
uint8 ad_count = 0; //采集AD的次數(shù)計(jì)數(shù)器
uint16 ResTemp;//溫度臨時(shí)結(jié)果
uint16 Temper;//溫度最終結(jié)果
uint16 temp1,temp2,Sensor;//臨時(shí)結(jié)果存放
uint16 Adresult1; //最終結(jié)果存放
/*******************************************************************************
* 文件名:共陽(yáng)數(shù)碼管真值表
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號(hào):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] = {//溫度轉(zhuǎn)換表,此表為 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] = {//溫度轉(zhuǎn)換表,此表為 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] = {//溫度轉(zhuǎn)換表,此表為 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] = {//溫度轉(zhuǎn)換表,此表為 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] = {//溫度轉(zhuǎn)換表,此表為 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] = {//溫度轉(zhuǎn)換表,此表為 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},
};
/*******************************************************************************
* 文件名:單獨(dú)位定義
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號(hào):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;//數(shù)碼管1
sbit LEDS2 = P3^4;//數(shù)碼管2
sbit LEDS3 = P3^6;//數(shù)碼管3
sbit LEDS4 = P3^7;//數(shù)碼管4
/*******************************************************************************
* 文件名:函數(shù)前置聲明
* 描 述:
* 功 能:
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void Mcu_Port_Init();
void LedScan();
void Delay500ms(); //24MHZ
void Time0_Init();//定時(shí)器0
void InitADC(void);
uint16 Get_Adc_Temp(uint8 times); //AD轉(zhuǎn)換與查表處理程序
void ADC_Refresh(void);
/*******************************************************************************
* 文件名
* 描 述: 主函數(shù)
* 功 能:入口
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void main(void)
{
Mcu_Port_Init();//IO上電初始化
Time0_Init();
InitADC();
while(1)
{
Get_Adc_Temp(16); //AD轉(zhuǎn)換與查表處理程序
ADC_Refresh();
}
}
/*******************************************************************************
* 文件名:void LedScan()
* 描 述: LED刷新
* 功 能:
* 作 者:大核桃
* 版本號(hào):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 轉(zhuǎn)換
* 功 能:
* 作 者:大核桃
* 版本號(hào):1.0.1(2015.03.03)
*******************************************************************************/
void InitADC(void)
{
P1ASF = 0xE0; //設(shè)置 P1 口為模擬口
ADC_RES = 0; //清除結(jié)果寄存器
CLK_DIV |= 0x20; //ADRJ 為 1,ADC_RES 存放高兩位結(jié)果,ADC_RESL 存放低 8 位結(jié)果
//ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START; //ADC上電并延時(shí)
}
/*******************************************************************************
* 文件名:void adc_isr() interrupt 5 using 1
* 描 述: 中斷服務(wù)程序
* 功 能:
* 作 者:大核桃
* 版本號(hào):1.0.1(2015.03.03)
*******************************************************************************/
void adc_isr() interrupt 5 using 1
{
EADC = 1;//開(kāi)ADC中斷
ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標(biāo)志
ResTemp = ADC_RES;
ResTemp <<= 8;
ResTemp |= ADC_RESL;
flag_ad1 = 1; //電壓采集完成標(biāo)志
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;
EADC = 0;//關(guān)閉中斷
}
/*******************************************************************************
* 文件名:void Get_Adc_Temp(uint8 times)
* 描 述: 溫度數(shù)據(jù)采集
* 功 能:模塊化編程
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
uint16 Get_Adc_Temp(uint8 times) //AD轉(zhuǎn)換與查表處理程序
{
if(flag_coll1) //每次采集AD的時(shí)間間隔標(biāo)志位
{
if(ad_count < times)//連續(xù)采集16次后再把求總數(shù)據(jù)的平均值
{
if(flag_ad1 == 1) //完成一次AD采樣
{
flag_ad1 = 0; //清除完成一次采樣的標(biāo)志位
Adresult_temp1 = Adresult_temp1 + ResTemp;
ad_count++;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | 6;
}
} //右移動(dòng)一位數(shù)據(jù)就相當(dāng)于整除以2
else //已經(jīng)采集完16次數(shù)據(jù),這個(gè)時(shí)候把總累加數(shù)據(jù)除以16就可以求得平均值了
{
Adresult_temp1 >>= 4;
Adresult1 = Adresult_temp1;
Adresult_temp1 = 0;//AD暫存清零
ResTemp = 0; //把采集AD的結(jié)果清零
ad_count = 0; //把采集次數(shù)重新清零
}
}
return Adresult1;//返回采集的溫度數(shù)值
}
/*******************************************************************************
* 文件名:void ADC_Refresh(void)
* 描 述: 刷新溫度
* 功 能:模塊化編程
* 作 者:大核桃
* 版本號(hào):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]) //在表中找到當(dāng)前,
{
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]) //在表中找到當(dāng)前,
{
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]) //在表中找到當(dāng)前,
{
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]) //在表中找到當(dāng)前,
{
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]) //在表中找到當(dāng)前,
{
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]) //在表中找到當(dāng)前,
{
break;
}
}
Temper = TempTab36_40[i][1];
}
}
/*******************************************************************************
* 文件名:void Time0_Init()
* 描 述: 定時(shí)器0初始化
* 功 能:10毫秒@11.0592MHz
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void Time0_Init(void)
{
AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xD4; //設(shè)置定時(shí)初值
ET0 = 1;
TR0 = 1; //定時(shí)器0開(kāi)始計(jì)時(shí)
EA = 1;
}
/*******************************************************************************
* 文件名:
* 描 述: 中斷函數(shù)
* 功 能:1毫秒@11.0592MHz
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void ET0_IRQHandler() interrupt 1
{
static uint8 tmrcoll1 = 0;//數(shù)據(jù)采集間隔
EADC = 0; //在定時(shí)中斷中禁止AD中斷
TL0 = 0xCD; //設(shè)置定時(shí)初值
TH0 = 0xD4; //設(shè)置定時(shí)初值
tmrcoll1++;//數(shù)據(jù)采集時(shí)間累加
if(tmrcoll1 >= 2) // 2 = 2ms 500HZ //166*100 =16.6MS
{
tmrcoll1 = 0;
flag_coll1 = 1;//數(shù)據(jù)采集間隔標(biāo)志位 2ms讀取一次數(shù)據(jù)
}
LedScan();
EADC = 1; //在定時(shí)中斷中打開(kāi)AD中斷
}
/*******************************************************************************
* 文件名:void Mcu_Port_Init()
* 描 述: io初始化
* 功 能:
* 作 者:大核桃
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void Mcu_Port_Init()
{
IE = 0xa8;//允許AD轉(zhuǎn)換
//將P0口低二位配置為推挽輸出
//234567位配置位高阻輸入
P0M1 = 0xFC;//1111 1100
P0M0 = 0X03;//0000 0011
//P0 = 0X01;//第6個(gè)
//P0 = 0X02;//第7個(gè)
//高3位配置高阻輸入,用作模擬口
//其他配置推挽輸出,驅(qū)動(dòng)LED
P1M1 = 0xE0;//1110 0000
P1M0 = 0X1F;//0001 1111
//P2口配置準(zhǔn)雙向口
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個(gè)LED端口
LED0 = 0;//第1組LED,如果使能請(qǐng)置為1
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
}
/*******************************************************************************
* 文件名:void Delay500ms() //@24.000MHz
* 描 述:Y5內(nèi)核延時(shí)
* 功 能:
* 作 者:大核桃
* 版本號(hào):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);
}
復(fù)制代碼
程序代碼如下
012 熱敏電阻測(cè)溫.rar
(56.27 KB, 下載次數(shù): 172)
2018-10-13 14:32 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
struct00
時(shí)間:
2019-2-20 17:29
有一點(diǎn)意思,收下
作者:
elec_hangzhou
時(shí)間:
2019-7-5 23:37
下下來(lái)看看先 主要是看一下 轉(zhuǎn)換阻值表。 多謝!
作者:
滾回去上學(xué)
時(shí)間:
2019-7-6 17:22
很利好!
作者:
qxdqx
時(shí)間:
2019-7-7 06:06
太好啦.謝謝分享!!!!
作者:
hzw854025403
時(shí)間:
2019-7-25 16:04
寫(xiě)的超級(jí)好
,收i下了
作者:
cz288
時(shí)間:
2019-8-4 15:36
我先看看 學(xué)習(xí)下
作者:
zuiqf1978
時(shí)間:
2021-1-30 15:45
努力學(xué)習(xí)中!
作者:
wyl138
時(shí)間:
2022-10-31 19:50
樓主的帖子對(duì)初學(xué)者都有很好的參考價(jià)值.
作者:
hu2018y
時(shí)間:
2022-10-31 20:13
買(mǎi)到10幾個(gè)都是10K的熱敏電阻,怎么樣修改溫度曲線(xiàn)顯示準(zhǔn)確。
作者:
sdlyyy
時(shí)間:
2023-3-15 08:19
完美思路,值得學(xué)習(xí)。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1