求51單片機測交流電壓的程序
樓主 可以請教一下問題嗎 就是這個單片機的ADC的編程問題和外圍連接問題 我弄了一個這樣的程序 不過好像有誤差挺大的,還有那個外部的連接問題怎樣改 加入我要測量超過5v的電壓
#include "Text2.h" //stc12c5a60s2頭文件
#define uchar unsigned char
#define uint unsigned int
unsigned char data adc_dat =0x30;
uchar ge,shi,shifen,baifen,qianfen;
float vin,R;
int vins;
sbit dula=P3^6;
uchar code table[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //有小數(shù)點的
uchar code table1[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //沒小數(shù)點的
void display(uchar shi,uchar ge,uchar shifen,uchar baifen,uchar qianfen);
void delay(uint z) //延時子函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main(void)
{
unsigned long i;
unsigned char status;
ADC_CONTR|=0x80; //打開AD轉換電源
for(i=0;i<10000;i++); //延時
P1ASF=0x04; //選擇通道P1.2轉換
ADC_CONTR=0xE2;
for(i=0;i<10000;i++); //延時
while(1) //循環(huán)進行AD轉換
{
ADC_CONTR|=0x08; //重新進行AD轉換
status=0;
while(status==0) //等待AD轉換結束
{
status=ADC_CONTR&0x10;
}
ADC_CONTR&=0xE7; //將ADC FLAG清零
adc_dat=ADC_RES; //保存結果
for(i=100;i>0;i--) //轉換100次
{
adc_dat=ADC_RES;
R+=adc_dat;
}
R/=100.0; //求平均值
vin=R*5.0/256;
vin=vin*1000;
vins=(int)vin;
ge=vins/1000%10; // 分離數(shù)據(jù)
shi=vins/1000/10;
shifen=vins%1000/100;
baifen=vins%1000%100/10;
qianfen=vins%1000%100%10;
display(shi,ge,shifen,baifen,qianfen);
}
}
void display(uchar shi,uchar ge,uchar shifen,uchar baifen,uchar qianfen)
{
dula=1;
P2=0xfe;
dula=0;
dula=1;
P0=table1[shi];
dula=0;
delay(5);
dula=1;
P2=0xfd;
dula=0;
dula=1;
P0=table[ge];
dula=0;
delay(5);
dula=1;
P2=0xfb;
dula=0;
dula=1;
P0=table1[shifen];
dula=0;
delay(5);
dula=1;
P2=0xf7;
dula=0;
dula=1;
P0=table1[baifen];
dula=0;
delay(5);
dula=1;
P2=0xef;
dula=0;
dula=1;
P0=table1[qianfen];
dula=0;
delay(5);
}