求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}; //有小数点的
uchar code table1[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ; //没小数点的
void display(uchar shi,uchar ge,uchar shifen,uchar baifen,uchar qianfen);
void delay(uint z) //延时子函数
{
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) //循环进行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; // 分离数据
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);
}