#include ”stc15w4k.h"
#include <stdio.h> // 為使用KEIL自帶的庫函數printf而加入
加入串口可以在PC端實時查看電壓數據
unsigned int ADC_P11() // ADC轉換函數
{
unsigned int i; // 用于軟件延時程序
unsigned char status; // 用于判斷AD轉換結束的標志
unsigned int AD_Dat=0; // 10位AD轉換值
unsigned char Tmp; // 臨時變量用于將AD轉換出來的2個字節合成一個字節
ADC_CONTR|=0x80; // 開AD轉換電源,第一次使用時要打開內部模擬電源
for (i=0;i<10000;i++); // 適當延時等待AD轉換供電穩定,一般延時1ms以內即可,為了縮短AD
// 調用時間,可把這2行剪切到主程序中去。
P1ASF|=0x02; // 選擇P1.1作為AD轉換通道,0x02= 0000 0010
ADC_CONTR=0xE1; // 選擇P1.1作為AD轉換通道,最高轉換速度,清轉換完成標志。
//for (i=0;i<1000;i++); // 如果是多通道模擬量進行AD轉換,則更換AD轉換通道后要適當延時,
// 使輸入電壓穩定,延時量取20μs~200μs即可,與輸入電壓源的內阻有關,如果輸入電壓信號源的內
// 阻在10K以下,可不加延時,如果是單通道模擬量轉換,則不需要更換AD轉換通道,也不需要加延時。
ADC_CONTR|=0x08; // 啟動 A/D 轉換,ADC_START=1。
status=0;
while(status==0) // 等待AD轉換結束。
{
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; // 默認高字節高8位。
AD_Dat <<= 2;
Tmp = ADC_RESL; // 默認低字節低2位。
Tmp &= 0x03; // 屏蔽無關位
AD_Dat |= Tmp; // 高低字節拼接成一個10位數。
return AD_Dat;
}
mian函數下
float Vin; // 存放計算出來的外部輸入電壓
unsigned int ADvalue; // 存放AD轉換返回的結果
ADvalue=ADC_P11(); // 采樣P1.1口模擬輸入電壓 電瓶正極電壓
Vin=VCC*ADvalue/1023; // 注意是1023才正確
printf("%.3f ",Vin); //輸出電壓顯示。
|