51单片机中用ADC0804模数转换电子线路的一个问题

2024-12-05 05:43:42
推荐回答(1个)
回答1:

Vin+:输入模拟量电压值,0-5V
Vmax:输入模拟量电压最大值,一般是+5V
Vmin:输入模拟量电压最小值,一般是0V
Vref:参考电压,一般是2.5V、

////////////////////////////////////////////////////////////////////////
//名称:单片机控制ADC0804模数转换实现电压测量(0~5V)
//作者:飞星科技 http://hi.baidu.com/saishm
//芯片:AT89S52
//晶振:12M
//编译器:伟福6000
//日期:2007-08-23
////////////////////////////////////////////////////////////////////////
//控制口定义//////////////////////
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ad0_7 P0 //AD数据口
sbit cs=P1^0; //芯片选择信号,控制芯片的启动和结果读取,低电平有效
sbit rd=P1^1; //读数据控制,低电平有效
sbit wr=P1^2; //AD转换起动控制,上升沿有效
sbit intr=P1^3; //AD转换结束输出低电平
uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//5ms延时子程序/////////////////
void delay(uint i)
{ uint j;
for(;i>0;i--)
for(j=0;j<410;j++);
}
//启动AD转换子程序//////////////////////////////////////////////////////////
void start_ad(void)
{ cs=0; //允许进行A/D转换
wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
while(intr); //查询转换结束产生INTR 信号(低电平有效)
cs=1; //停止AD转换
}
//读A/D数据子程序///////////////////////////////////////
read_ad()
{ uint ad_data;
ad0_7=0xff;
cs=0; //允许读
rd=0; //读取转换数据结果数据结果
_nop_();
ad_data=ad0_7; //把数据存到ad_data中
rd=1;cs=1; //停止A/D读取
return(ad_data);
}
//数据处理与显示子程序//////////////////////////////////////
//说明:当输入电压为5V时,A/D输出为FFH,即输入电压=AD数据*(5/255)=AD数据/(255/5)=AD数据/51
// 用四位数码管进行显示,数码管的A~H接于P3口,公共端从最低位是P2.0,最高位是P2.3
void data_shout(uint ad_data)
{ uint a=50,one,two,three,four;
four=ad_data/51; //第四位数码管(最高位)
three=ad_data%51*10/51; //第三位数码管
two=ad_data%51*10%51*10/51; //第二位数码管
one=ad_data%51*10%51*10%51*10/51; //第一位数码管(最低位)
while(a--)
{ P3=led[one];
P2=0xfe;
delay(1);
P3=led[two];
P2=0xfd;
delay(1);
P3=led[three];
P2=0xfb;
delay(1);
P3=led[four]-0x80; //显示小数点
P2=0xf7;
delay(1);
}
}
int main(void)
{ while(1)
{ start_ad(); //启动AD
data_shout(read_ad()); //读AD数据并显示
}
}