微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ADC0809采回来的电压值不正确

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;

}

求助求助

  i=Read_AD();  //读AD数据
                v=i*0.01961;
                display(i);
为什么不是显示V? 自己在看看程序把,还有不少问题

嗯呢,已经改过,谢谢

已经解决,原因是仿真用的adc0808,高地位和adc0809相反,接反了,而2.3.5的二进制码正好高低为对称,所以显示没错,1和4显示相反,小数显示错乱。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top