搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2014-2-10 11:33:05 | 显示全部楼层 |阅读模式

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

#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_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //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[6];   
uint data AD_RecSBUF[10];            //接收数据
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[AD_Point]=(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[i];
           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[ACCEL_XOUT+0]=i+0x30;    //取个位数
    display_buf[ACCEL_XOUT+1]='.';
    i=t/100;
    t=t%100;
    display_buf[ACCEL_XOUT+2]=i+0x30;     //取百位数
    i=t/10;
    t=t%10;
    display_buf[ACCEL_XOUT+3]=i+0x30;    //取十位数
    i=t%10;
    display_buf[ACCEL_XOUT+4]=i+0x30;    //取个位数
    display_buf[ACCEL_XOUT+5]='A';

   }

//*************************************//
//                         主程序
//*************************************//
void main()
{
           delay(500);
           initial_lcd();              //LCD屏初始化
    clr_screen();                         //LCD清屏
        InitADC();
        delay(150);
        while(1)
        { delay(500);
          disp_char();
          GetADCResult();
          Display();                          
        }  
  }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表