📄 get0809.c
字号:
/*
----------------------------------------------------------
; (c) Copyright xami All Rights Reserved
----------------------------------------------------------
; SOURCE_FILE: GET0809.C
; APPLICATION: 80c51\80c52
; DESCRIPTION: 取adc0809的数据,采用查询方式
; AUTHOR: xami
; DATE: 28 Apr. 2007
----------------------------------------------------------
<工作时序说明>
START: 上升沿使内部寄存器清零,下降沿开始转换;
ALE: 地址锁存允许信号,上升沿将输入地址(ADDC,ADDB,ADDC)
锁存,确定通道;
OE: 数据输出充许端,高电平时打开片内的三态锁存缓冲器,
将输出寄存器的数据放到数据线上;
EOC: 转换结束信号,高电平有效,在START信号上升沿之后0~8个
周期内变为低电平,转换结束变为高电平,可用作查询或中
断信号用;
CLK: 时钟信号,ADC0809工作频率f不大于640kHz,一般利用扩展
槽上的CLOCK信号(4.77MHz)8分频得到的596kHz信号.
----------------------------------------------------------
*/
unsigned char getadc0809(void) //取出ADC0809的数据,中断方式
{
unsigned char res;
P2_5=0; //选中ADC0809
WR=1;
delay(10);
WR=0;
delay(10);
WR=1; //(start ALE的电平)一起先上升沿,再下降沿,启动ADC0809
delay(10); //时序限定了,先要等待8个周期以上才能查询.
while(INT0!=0); //等待,当INT0不为0时等待
RD=0; //输出允许(OUT ENABLE)(查)
res= P0;
return(res);
}
/*采集电压的值,基于全为内部电路的情况下的测量*/
float get_u(void){
//程控:端口选择,输入电压范围为0.7~7v。
//-----------------------------------------------------------------
/*
//先设定到中间档
P2_0= 1; // 0.7/2 = 0.35 min
P2_1= 0; // 7/2 = 3.5 max
res_u= getadc0809();
if(res_u> 4){
P2_0= 0; // 0.7/20 = 0.035 min
P2_1= 0;} // 7*2.5 = 0.35 max
else if(res_u< 0.4){
P2_0= 0; // 0.7/0.2 = 3.5 min
P2_1= 1;} // 7/0.2 = 35 max
*/
//------------------------------------------------------------------
//改进:为了器件安全,先设定到最低增益档,再逐渐降增加增益
//放大转换
//------------------------------------------------------------------
P2_0= 0;
P2_1= 1;
res_u= ((float)getadc0809()/0.2)*0.0196; //0.025: 1/40
/*为了提高精度,尽可能提高增益*/
if(res_u< 0.7){
P2_0= 1;
P2_1= 0;
res_u= ((float)getadc0809()/2.0)*0.0196; //0.25: 1 /4 1~0.1
if(res_u< 0.7){
P2_0= 0;
P2_1= 0;
res_u= ((float)getadc0809()/20.0)*0.0196; //2.5: 10/4
}
}
//------------------------------------------------------------------
//衰减转换
//------------------------------------------------------------------
switch(mode_set_u_list){
case p20dB:{
res_u= res_u*(0.316*0.316);}break;
case p10dB:{
res_u= res_u*0.316;}break;
case p0dB: break;
case m10dB:{
res_u= res_u/0.316;}break;
case m20dB:{
res_u= res_u/(0.316*0.316);}break;
case m30dB:{
res_u= res_u/(0.316*0.316*0.316);}break;
default: break;
}
//------------------------------------------------------------------
return(res_u);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -