LZ19992005 发表于 2014-2-10 11:33:05

ACS712如何计算电流,我的程序哪有问题请点一下


测量电流不变,不知道为什么?

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include"lcd1602ac.h"

#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long

#define ADC_POWER   0x80            //AD电源控制
#define ADC_FLAG    0x10            //AD转换完成
#define ADC_START   0x08            //AD转换控制
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL0x20            //280 clocks
#define ADC_SPEEDH0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks

#define ADC0    0x00 //P1.0

sfr ADC_CONTR   =   0xBC;   //AD 转换控制寄存器      
sfr ADC_RES   =   0xBD;   //AD 转换结果寄存器高         
sfr ADC_RESL    =   0xBE;   //AD 转换结果寄存器低      
sfr P1ASF       =   0x9D;        //P1口模数转换功能控制寄存器

uint AD_Result;
uchar xdata AD_SBUF;   
uint data AD_RecSBUF;          //接收数据
uchar data AD_Point;
uchar data Rec,num,state;    //变量
unsigned long S=0;
float JiZhun_AD=2.5;
float AD_Data=0.0;
ulong AD_ad=0;

//***********************************************//
//                             显示子程序
//***********************************************//
void delay5(uint i)
{
        uint j,k;
        for(j=0;j<i;j++)
        for(k=0;k<60;k++);
}
//***********************************************//
//                             显示子程序
//***********************************************//
void Delay_ADC(uint n)
{
    uint x;

    while (n--)
    {
      x = 5000;
      while (x--);
    }
}

//***********************************************//
//                             AD初始化子程序
//***********************************************//
void InitADC()
{
    P1ASF = 0x01;                                      //选择P1.0作为A/D输入通道
    ADC_RES = 0x00;                                           //转换结果清0
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;      //0x10|0x00=0x10:开电源和设置A/D转换速度
    Delay_ADC(2);            
}
///***********************************************//
//                              AD数据转换子程序
//***********************************************//
GetADCResult()         
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC0 | ADC_START;        //打开电源,420CLK周期转换,选择P1.0作输入,AD转换控制
    _nop_();                                                //设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,才能保证值被写入ADC_CONTR寄存器            
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR&ADC_FLAG));       //等待转换结束=0x10 ADC_FLAG 位=1
    ADC_CONTR &= ~ADC_FLAG;            //清零转换结束标志位(ADC_FLAG 位=0)

           AD_RecSBUF=(ADC_RES*4+ADC_RESL+0X03);       //返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
    AD_Point++;
        if(AD_Point>9)AD_Point=0;            
}
void Display()
{
uchar i;
uint t;
        AD_Result=0;
        for(i=0;i<10;i++)
        AD_Result= AD_Result+ AD_RecSBUF;
           AD_Data = AD_Result*JiZhun_AD*2/1024;       
        AD_ad =(AD_Data-2.5)/0.1;                           //Vout(采样电压) = 2.5(0A基准) + 0.1(精确度为100mV/A)*Ip(电流)
        S=AD_ad;
    i=S/1000;                                                                                       
    t=S%1000;
    display_buf=i+0x30;    //取个位数
    display_buf='.';
    i=t/100;
    t=t%100;
    display_buf=i+0x30;   //取百位数
    i=t/10;
    t=t%10;
    display_buf=i+0x30;    //取十位数
    i=t%10;
    display_buf=i+0x30;    //取个位数
    display_buf='A';

   }

//*************************************//
//                       主程序
//*************************************//
void main()
{
           delay(500);
           initial_lcd();            //LCD屏初始化
    clr_screen();                         //LCD清屏
        InitADC();
        delay(150);
        while(1)
        { delay(500);
          disp_char();
          GetADCResult();
          Display();                          
        }
}
页: [1]
查看完整版本: ACS712如何计算电流,我的程序哪有问题请点一下