![]() |
發(fā)布時間: 2019-9-28 16:44
正文摘要:本帖最后由 如癡百感生 于 2019-9-28 16:58 編輯 計算部分弄錯了 ,,應(yīng)該是v=b*5/256;但結(jié)果還是不對,,沒問題了 自己把自己弄混了 抱歉 |
什么ADC也不說清楚 |
#include ”stc15w4k.h" #include <stdio.h> // 為使用KEIL自帶的庫函數(shù)printf而加入 加入串口可以在PC端實時查看電壓數(shù)據(jù) unsigned int ADC_P11() // ADC轉(zhuǎn)換函數(shù) { unsigned int i; // 用于軟件延時程序 unsigned char status; // 用于判斷AD轉(zhuǎn)換結(jié)束的標(biāo)志 unsigned int AD_Dat=0; // 10位AD轉(zhuǎn)換值 unsigned char Tmp; // 臨時變量用于將AD轉(zhuǎn)換出來的2個字節(jié)合成一個字節(jié) ADC_CONTR|=0x80; // 開AD轉(zhuǎn)換電源,第一次使用時要打開內(nèi)部模擬電源 for (i=0;i<10000;i++); // 適當(dāng)延時等待AD轉(zhuǎn)換供電穩(wěn)定,一般延時1ms以內(nèi)即可,為了縮短AD // 調(diào)用時間,可把這2行剪切到主程序中去。 P1ASF|=0x02; // 選擇P1.1作為AD轉(zhuǎn)換通道,0x02= 0000 0010 ADC_CONTR=0xE1; // 選擇P1.1作為AD轉(zhuǎn)換通道,最高轉(zhuǎn)換速度,清轉(zhuǎn)換完成標(biāo)志。 //for (i=0;i<1000;i++); // 如果是多通道模擬量進行AD轉(zhuǎn)換,則更換AD轉(zhuǎn)換通道后要適當(dāng)延時, // 使輸入電壓穩(wěn)定,延時量取20μs~200μs即可,與輸入電壓源的內(nèi)阻有關(guān),如果輸入電壓信號源的內(nèi) // 阻在10K以下,可不加延時,如果是單通道模擬量轉(zhuǎn)換,則不需要更換AD轉(zhuǎn)換通道,也不需要加延時。 ADC_CONTR|=0x08; // 啟動 A/D 轉(zhuǎn)換,ADC_START=1。 status=0; while(status==0) // 等待AD轉(zhuǎn)換結(jié)束。 { status=ADC_CONTR&0x10; // 判斷ADC_FLAG是否等于1,0x10=0001 0000B。 } ADC_CONTR&=0xE7; // 將ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。 AD_Dat = ADC_RES; // 默認(rèn)高字節(jié)高8位。 AD_Dat <<= 2; Tmp = ADC_RESL; // 默認(rèn)低字節(jié)低2位。 Tmp &= 0x03; // 屏蔽無關(guān)位 AD_Dat |= Tmp; // 高低字節(jié)拼接成一個10位數(shù)。 return AD_Dat; } mian函數(shù)下 float Vin; // 存放計算出來的外部輸入電壓 unsigned int ADvalue; // 存放AD轉(zhuǎn)換返回的結(jié)果 ADvalue=ADC_P11(); // 采樣P1.1口模擬輸入電壓 電瓶正極電壓 Vin=VCC*ADvalue/1023; // 注意是1023才正確 printf("%.3f ",Vin); //輸出電壓顯示。 |
能自己馬上發(fā)現(xiàn)錯誤并改正,真厲害! |
Powered by 單片機教程網(wǎng)