ADC0809采回来的电压值不正确
时间:10-02
整理:3721RD
点击:
求大神教,不知道为什么采回来的电压值,如果是整数的话,就没错,1v数码管就显示1,但是采小数的话,如1.2v的电压,数码管就会显示1.68,跪了,实在是找不出原因,希望大神指点
#include <reg52.h>
sbit CLK=P2^6;
sbit ST=P3^0;
sbit ALE=P2^7;
sbit OE=P2^5;
sbit EOC=P2^4;
sbit shi=P2^0;
sbit ge=P2^1;
sbit yi=P2^2;
sbit er=P2^3;
unsigned char leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
void DelayMs(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(float k)
{
float count;
count=k;
P0=leddata[(int)count/10];
shi=1;
DelayMs(10);
shi=0;
P0=leddata[(int)count%10]&0x7f;
ge=1;
DelayMs(10);
ge=0;
P0=leddata[(int)(count*10)%10];
yi=1;
DelayMs(10);
yi=0;
P0=leddata[(int)(count*100)%10];
er=1;
DelayMs(10);
er=0;
}
void display_init()
{
yi=0;
er=0;
shi=0;
ge=0;
}
void ADC0809_init() //AD初始化
{
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
ET0=1;
TR0=1;
EA=1;
DelayMs(2);
}
unsigned char Read_AD() //读AD
{
unsigned char temp=0;
while(EOC==0); //等待EOC
OE=1;
temp=P1; //取数据
DelayMs(1);
OE=0;
return temp;
}
void main()
{
int i=0;
float v=0.00;
P1=0xff;
ADC0809_init();
display_init();
ST=0;
while(1)
{
ST=1; //复位AD,启动AD
ST=0;
i=Read_AD(); //读AD数据
v=i*0.01961;
display(i);
}
}
void timer0(void) interrupt 1 //提供5KHz时钟给adc
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
CLK=~CLK;
}
#include <reg52.h>
sbit CLK=P2^6;
sbit ST=P3^0;
sbit ALE=P2^7;
sbit OE=P2^5;
sbit EOC=P2^4;
sbit shi=P2^0;
sbit ge=P2^1;
sbit yi=P2^2;
sbit er=P2^3;
unsigned char leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
void DelayMs(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(float k)
{
float count;
count=k;
P0=leddata[(int)count/10];
shi=1;
DelayMs(10);
shi=0;
P0=leddata[(int)count%10]&0x7f;
ge=1;
DelayMs(10);
ge=0;
P0=leddata[(int)(count*10)%10];
yi=1;
DelayMs(10);
yi=0;
P0=leddata[(int)(count*100)%10];
er=1;
DelayMs(10);
er=0;
}
void display_init()
{
yi=0;
er=0;
shi=0;
ge=0;
}
void ADC0809_init() //AD初始化
{
TMOD=0x01;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
ET0=1;
TR0=1;
EA=1;
DelayMs(2);
}
unsigned char Read_AD() //读AD
{
unsigned char temp=0;
while(EOC==0); //等待EOC
OE=1;
temp=P1; //取数据
DelayMs(1);
OE=0;
return temp;
}
void main()
{
int i=0;
float v=0.00;
P1=0xff;
ADC0809_init();
display_init();
ST=0;
while(1)
{
ST=1; //复位AD,启动AD
ST=0;
i=Read_AD(); //读AD数据
v=i*0.01961;
display(i);
}
}
void timer0(void) interrupt 1 //提供5KHz时钟给adc
{
TH0=(65536-200)/256;
TL0=(65536-200)%256;
CLK=~CLK;
}
求助求助
i=Read_AD(); //读AD数据
v=i*0.01961;
display(i);
为什么不是显示V? 自己在看看程序把,还有不少问题
嗯呢,已经改过,谢谢
已经解决,原因是仿真用的adc0808,高地位和adc0809相反,接反了,而2.3.5的二进制码正好高低为对称,所以显示没错,1和4显示相反,小数显示错乱。