EDA365电子论坛网

标题: 单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码 [打印本页]

作者: wu68aq    时间: 2019-1-10 13:35
标题: 单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码
单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码
! ~/ Q& Q% k. z  K6 J9 w, Q
/ b$ b5 e" E! y- C0 N
$ x: [* ]' ^3 ]6 j3 _, ?6 Z( M
这是我刚做的一个20~200A大电流检测电路,通过ADC0809转换成数字信号,通过LED显示结果,包括原理图,仿真文件,源代码。7 Y( h3 H% U  |/ r4 G2 S
将R1的电压采样到ADC0809,转换为数字信号,输入单片机
& s& p" \+ U) F( Q. I
6 u( a7 z/ F6 j% Q& [) r* X0 @AD画的原理图(附件中可以可以下载):0 x  o5 r5 A- N2 _, ^6 |+ X

$ v/ ^& J, u- ^: V/ W- I* C* ]7 ?5 }
) H7 h5 @9 ~4 c7 I$ {

* c* c) v% r9 Q单片机源程序:
0 {, E, M7 m3 Z# ]9 k3 d) F
//------------------------------51单片机头文件7 p2 c% Z6 S+ L% |' z. D
#include<reg51.h>6 }# Q8 J+ O$ m" |" L8 [/ s# L

9 ^/ X. ^' p/ D4 x4 g/ G//各数字的数码管段码(共阴)
* W8 }) {' `" h- Iunsigned char code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示数组{0,1,2,3,4,5,6,7,8,9}9 d! b" j3 ]. W) a

! K" {$ K4 w, }0 ?sbit CLK=P3^3;    //时钟信号
' I" G6 A+ _/ p! Ysbit ST=P3^6;     //启动信号,由低电平到高电平时间段复位 ,高电平到低电平时间段开始转换
) Z* l! T& k; [+ `5 wsbit EOC=P3^5;    //转换结束信号,当转换结束时会自动变成高电平. ]! n* ?" _; t" R8 C
sbit OE=P3^4;     //输出使能 ,当OE为高电平时开启输出端,OE为低电平时禁止输出
9 g5 R, I& r1 U" \: W- Usbit W1=P2^4;     //定义W1表示P2.4位,第一位数码管控制端, 为0时亮,为1时灭2 ~6 `& J: x# i# w
sbit W2=P2^3;          //定义W2表示P2.3位,第二位数码管控制端, 为0时亮,为1时灭& W/ g8 u4 s# W4 v! l
sbit W3=P2^2;          //定义W3表示P2.2位,第三位数码管控制端, 为0时亮,为1时灭* z, p  Z# }8 t  w
sbit key=P3^7;          //定义按键控制key为P3.7/ J. ~- |4 A! C5 ?' g
//----------------------------1ms延时函数
3 {$ `+ {' ~( O/ @) kvoid Delayms(unsigned char ms)( b$ d- B" d% _8 E3 K/ X; M8 T- q
{
8 E; a0 }5 H6 F3 [/ K. funsigned char i;) k2 X' I7 d) G. Y3 f% h
while(ms--)
7 @* X' L! `/ X! a6 yfor(i=0;i<120;i++);
6 [/ q( f- C! w}
: j+ n4 m* J+ q. ]0 b# H% o  A$ h. F//---------------------------显示转换结果(动态扫描模式)$ S: \& i- }, T/ |
void Display(unsigned int d)2 |" m% X- G2 A' U( X+ P! e
{
2 C& [4 O1 O1 D7 _3 t. _+ w& c        d=d*1.0/256*5*40;  //将数字量转换成模拟量的公式为5V*(d/256),采样电压值为电流值*100欧姆,所以要获得实际电流值,即为采样电压值*40倍 (n1:n2=4000:1)
( y1 \0 F: [# C2 `& A
9 w" g; c  H  l        W1=0;   //第一个数码管亮
) x0 p& w( k; @7 w        P0=DSY_CODE[d%10];  //显示第一个数码管的值 为P1的值除以10取余
( R" k+ @% V* Q& l. t1 M+ j$ {+ B        Delayms(6);                        //延时5ms
1 ~/ P5 p. X) u        W1=1;   //第一个数码管灭7 a0 w( T, e* Z5 u% g) T) K9 I

- D* g8 U3 K' F        W2=0;0 H" K; J& ^: }  r6 z
        P0=DSY_CODE[d%100/10];        //显示第二个数码管的值 为P1的值除以100取余 再除以10取整
$ H; n" e8 W# Q8 c* `4 n        Delayms(6);2 f" K, m1 j( }- K' E& n1 }% d6 ~
        W2=1;
. H7 j0 B# i: _3 V& U! d* {* a% }4 o( t& F" [8 e( Z: ?
        W3=0;
) r2 p; d: [/ Y        P0=DSY_CODE[d/100];           //显示第三个数码管的值 为P1的值除以100取整, b: ^' `: T3 ~3 l5 }* l$ F+ l
        Delayms(6);& L# s8 r# H" q# o3 Q. J
        W3=1;
8 q, q: f$ T+ u* d% K8 j2 k            }
& l6 w  i* A- v//-------------------------------------------------主程序
/ i8 j' \5 }, o: j! Yvoid main()- Y* @! F1 F0 y" B7 f
{                                                                                 
, P) J* i3 K  Z. n* d2 s* w, m        TMOD=0x02; //16位定时器0工作模式设置为21 J1 A; T+ ?+ e. s
        TH0=0x14;  //设置定时器高8位初值为0x14
7 k( Y/ x  c4 a5 g8 ^        TL0=0x00;  //设置定时器低8位初值为0x00
! F0 I; e' x* {% t: z6 e* R& W        TR0=1;           //开启定时器0开关
  b0 f, S& u2 J5 ?+ g        ET0=1;           //开启定时器0中断开关, |9 N" i  W- Q7 g$ s4 q$ W8 j
        EA=1;           //开启中断总开关
, Z! c0 g$ z" o  U6 c3 r* C* v5 U( _; w2 M! H. t
//---------------启动 A/D 转换/ A2 h, P5 c6 c3 Q: c9 a

( \/ k, |7 p( N/ O//---------开始按键-----7 \: E' a9 Z6 H; j9 L
A:        while(key==1);     //等待按键按下% ?2 {( B; E8 I. ~0 F8 N
        Delayms(1);               //延时1ms2 ]$ ~; w0 [3 d$ V- W+ _! S( t
        if(key==0)         //延时1ms后按键还是按下了,说明按键确实按下了(按键消抖功能) 6 l: t* M7 e2 N  f) J. W
        while(key==0);           //当按键松开时,循环转换和显示
% `) {1 Q+ a% z/ F  |" h3 i1 i  u$ y* h0 s5 Z- D
                while(1)
9 x( M3 r* t- Y1 ?                {3 s" B" P& D9 `% ]/ V
                ST=0;) Z" \" c) r; k4 \
                ST=1;- r  U- }: o( `; `
                ST=0;  
& R" S; T+ O, u: z6 ~! B$ i, f8 S* J
                while(EOC==0);   //等待转换完成& a# w5 R8 j/ ^5 C2 U: M8 e
                OE=1;                          //开启输出端% m; p& Q# D6 L5 j/ k
6 t# N7 e* y0 ?: @1 Y' o, p0 d
                Display(P1);     //将输出到单片机P1端口上的数字信号在LED显示出来6 n- h( x6 |' R4 ?
                OE=0;            //关闭输出端
: g% R4 q3 F2 ]8 \7 R2 I, x$ ]( h' c5 }! v
//------停止按键---------
. e5 e9 v- h& E7 i0 g           if(key==0)
/ {4 p" R+ m, R                   {2 Y" c2 S) ~3 F$ I" O* p
                        Delayms(1);1 Z- O$ t6 w+ ?- M  Q. h% @# H/ J
                    if(key==0)         //延时1ms后按键还是按下了,说明按键确实按下了(按键消抖功能)
# b4 k5 w; i4 P5 a                        while(key==0);           //当按键松开时4 a$ q! U% J0 a( M2 A0 Y0 `
/ L; L  S% G# e$ u

( `6 p2 c  Q0 e( B…………限于本文篇幅 余下代码请下载附件…………$ y1 J5 M1 A  r) K" A& z/ s

. i5 A$ n0 ~/ F/ k
" k7 y, ]5 I% f  t4 P) u$ ^全部资料打包下载:  `# k+ W) s# D! T4 A0 p
7 k% f: l: C4 a' v9 p3 t* P
: R5 ]4 C& _9 Z% Y

, z, p% P1 e  Y( k& h# v
作者: Mhza    时间: 2019-1-10 16:53
好东东,谢谢楼主分享
作者: xiaoqi0323    时间: 2019-8-27 18:52
hao
' x6 g- Y$ H: O
作者: jinniuxing    时间: 2019-8-28 09:42
谢谢分享!; D/ f! @9 s0 ]8 g/ n

作者: fox_gale    时间: 2019-8-28 11:04
学习下
作者: lwssg182    时间: 2019-9-1 15:04
学习一下
2 L' \6 z- [- \0 F  h& O
作者: colcol    时间: 2019-10-12 21:24
多谢分享                    
  t3 @& D' s$ h7 e- {+ m
作者: chencol    时间: 2019-12-6 19:24
谢谢分享
作者: hxl520521    时间: 2020-2-13 09:35
谢谢分享
作者: hxl520521    时间: 2020-2-13 09:37
好人
作者: wangoo1    时间: 2020-5-17 21:53
这个不错 值得一看
作者: 六十六号公路    时间: 2020-9-10 10:46
谢谢
作者: 桂花载酒少年游    时间: 2020-11-23 16:06
11111111111111111111111115 ^+ y2 r2 W& x2 w7 h

作者: 不想不念    时间: 2021-5-23 14:44
学习学习666666666666666
作者: sljzyjj    时间: 2021-5-27 11:20
下载下来看一看
作者: SZ高级Dg    时间: 2021-5-27 15:05
555
作者: 1057222898    时间: 2021-5-27 18:59
谢谢分享
作者: surfingsss    时间: 2021-6-29 12:06
谢谢谢谢
作者: gcshyb    时间: 2022-6-1 14:50
8888888888
作者: ksjohn    时间: 2023-1-21 15:54
多谢分享!!!1 |# Q4 ^6 m5 e  N# i

作者: 宋羽凡    时间: 2025-5-19 09:56
谢谢大佬!
# @6 W  ]5 W( q. _; J




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2