一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 5186|回复: 7

[51单片机] STC如何把电流转换成电压呢?

[复制链接]
发表于 2012-1-2 21:34 | 显示全部楼层 |阅读模式
想做个电流表,在网上搜索了2天没进展,只知道要显示电流的话,需要把电流转换成电压,然后看到最简单的方法是用电阻,然后测量电阻端的电压,但是没有具体的例子,下面是在阿莫那找到的电压表,有那位高手能告诉我怎么改成电流表不

ourdev_671294BJTC15.jpg

C代码如下:
//-----------------------------------------------------------------
#include <intrins.H>                  //头文件
#include "STC_NEW_8051.H"             //STC自己的头文件
#define uint unsigned int             //宏定义
#define uchar unsigned char
uint abc,tongd0,tongd7;               //定义uint型变量
uchar tt0;                            //定义uchar型变量
sbit gewei=P2^0;                      //个十百千位的位声明
sbit shiwei=P2^1;
sbit baiwei=P2^2;
sbit qianwei=P2^3;
sbit dian=P0^7;                       //小数点的声明
uchar code led[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //定义0-9数字的编码
void delay(uint z)                    //延时函数
{
     uint x,y;
     for(x=z;x>0;x--)
     for(y=100;y>0;y--);
}
void display()                        //显示函数
{
     qianwei=0;                       //显示千位
     P0=led[abc/1000];
     dian=0;
     delay(50);
     qianwei=1;

     baiwei=0;                        //显示百位
     P0=led[abc%1000/100];
     delay(50);
     baiwei=1;

     shiwei=0;                        //显示十位
     P0=led[abc%100/10];
     delay(50);
     shiwei=1;

     gewei=0;                         //显示个位
     P0=led[abc%10];
     delay(50);
     gewei=1;
}

//以下直接引用自STC的网站数模转换的例子-------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
//SPEED1 SPEED0  A/D转换所需时间
#define AD_SPEED   0x60 //  0110,0000   1      1   70 个时钟周期转换一次,  
//CPU工作频率21MHz时 A/D转换速度约 300KHz
//#define AD_SPEED   0x40 //0100,0000   1      0     140 个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000   0      1     280 个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000   0      0     420 个时钟周期转换一次

uint get_AD_result(uchar channel)                   //模数转换程序
{
     uchar AD_finished=0;                           //存储 A/D 转换标志
     ADC_RES = 0;
     ADC_RESL = 0;
     channel &= 0x07;                               //0000,0111 清0高5位
     ADC_CONTR = AD_SPEED;
     _nop_();
     ADC_CONTR |= channel;                          //选择 A/D 当前通道
     _nop_();
     ADC_CONTR |= 0x80;                             //启动 A/D 电源
     delay(1);                                                //使输入电压达到稳定
     ADC_CONTR |= 0x08;                             //0000,1000 令 ADCS = 1, 启动A/D转换,  
     AD_finished = 0;  
     while (AD_finished ==0 )                       //等待A/D转换结束
     {
           AD_finished = (ADC_CONTR & 0x10);        //0001,0000 测试A/D转换结束否
     }
     ADC_CONTR &= 0xE7;                             //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,  
     return (ADC_RES*4+ADC_RESL);                   //返回 A/D 高8位+低2位转换结果
}

//------下面是主函数--------
void main()                                         //主程序
{                                                   //进入主程序后先对定时器初始化

      TMOD=0x01;                                    //设定定时器0工作方式   
      TH0=(65536-10000)/256;                        //定时器0高8位装初值  12M晶振定时10毫秒
      TL0=(65536-10000)%256;                        //定时器0低8位装初值   
      ET0=1;                                        //开定时器0中断
      TR0=1;                                        //启动定时器0
      EA=1;                                         //开总中断

      P1ASF = 0x81;                                 //1000,0001, 将 P1.0 P1.7 置成模拟口
//    ADRJ = AUXR1^2:
//    0: 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器
//    1: 10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器
      AUXR1 &= ~0x04;                               //0000,0100, 令 ADRJ=0
//    AUXR1 |= 0x04;                                //0000,0100, 令 ADRJ=1
      ADC_CONTR |= 0x80;                            //1000,0000 打开 A/D 转换电源

      while(1)
     {
           abc=(tongd0*1.0/tongd7)*2500;            //让abc等于通道0和通道7转换后的运算结果
           display();                               //显示具体数字
     }
}

void timer0() interrupt 1                           //定时器0服务程序
{
      TH0=(65536-10000)/256;                        //再装一次初值
      TL0=(65536-10000)%256;
      tt0++;
      if(tt0==20)                                   //200ms转换一次
     {  
           tt0=0;
           tongd0=get_AD_result(0);                 //转换P0.0通道
           tongd7=get_AD_result(7);                 //转换P0.7通道
     }
}
发表于 2012-1-2 22:48 | 显示全部楼层
在电流流回GND的一端,串一个小的取样电阻,取其电压放大,AD读取。
回复

使用道具 举报

 楼主| 发表于 2012-1-2 23:31 | 显示全部楼层
在电流流回GND的一端,串一个小的取样电阻,取其电压放大,AD读取。
chillmax 发表于 2012-1-2 22:48 https://www.yleee.com.cn/images/common/back.gif

我学单片机没多久,不大能理解,不知道能否随意画个图示,或者帮我改下电路图呢,谢谢了
回复

使用道具 举报

发表于 2012-1-3 00:46 | 显示全部楼层
本帖最后由 mytomatoes 于 2012-1-3 00:48 编辑

我的“番茄负载”电流采样部分的电路是酱紫的。
差分放大20倍。

屏幕快照 2012-01-03 上午12.45.12.png
回复

使用道具 举报

 楼主| 发表于 2012-1-3 02:01 | 显示全部楼层
我的“番茄负载”电流采样部分的电路是酱紫的。
差分放大20倍。
mytomatoes 发表于 2012-1-3 00:46 https://www.yleee.com.cn/images/common/back.gif


在手电看到你5月份发的一个帖子,是你放电器的源码,可惜115不能下载了,不知道能否发出来呢?
回复

使用道具 举报

发表于 2012-1-3 14:30 | 显示全部楼层
回复 5# lyz8
那是好久之前的部分源码了…………
回复

使用道具 举报

 楼主| 发表于 2012-1-3 21:46 | 显示全部楼层
回复  lyz8
那是好久之前的部分源码了…………
mytomatoes 发表于 2012-1-3 14:30 https://www.yleee.com.cn/images/common/back.gif



   我只想要电流部分的
回复

使用道具 举报

发表于 2012-1-4 01:23 | 显示全部楼层
回复 7# lyz8

晕,这个还要?根据得到的电压计算就可以了啊。。。。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-5 05:52 , Processed in 0.031006 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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