|  | 
 
| 
51单片机数控电源 tlc5615+tlc1543程序
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  * b( S0 S7 B! A- C, o0 p" g1 {, R2 O& r
 0 R8 J+ U! ?4 r5 `5 T
 数控电源,51单片机+tlc5615+tlc1543$ m' g/ V; i" j0 E; @
 & r' K( g) X0 g6 p8 k
 源程序:
 ( D5 G4 G: \+ e1 q0 m/*最大电流为6A,最大电压为40V*/
 : @6 o& K/ }: y#include<reg52.h>
 ' m4 i/ M1 @' E' F# |5 E3 @sbit sclk5615=P1^0;                                                                                                                                /*dac tlc5615串行时钟*/
 X" A$ O; Y4 E0 z; U+ j; l6 ~5 `sbit din5615=P1^1;                                                                                                                                 /*dac tlc5615串行数据输入*/& b5 M2 l6 J1 ]- b
 sbit cs5615=P1^2;                                                                                                                                  /*dac tlc5615片选*/6 T2 g3 J, j  Y( ]- ?
 sbit dout5615=P1^3;                                                                                                                                /*dac tlc5615串行数据输出*/
 - P. e  I2 `: a& D9 Fsbit eoc1543=P3^0;
 l' g* y! l; R$ \4 Xsbit sclk1543=P3^1;
 3 v3 }* C" d* h& h" l' J, s' e' lsbit addr1543=P3^2;7 B  b! S( }1 q& Y
 sbit dout1543=P3^3;
 ( ^' g" \6 M8 F) D9 d/ d5 osbit cs1543=P3^4;
 . M# \% A  S' T1 B/ l% s6 K4 bvoid Delayms(unsigned int t)                                                                                                    //延时毫秒函数:
 2 r, X2 A8 k0 ^# x! `{1 I" o4 |2 N1 n! x
 unsigned int x,y;9 U$ q' ^: M" I- g& i" R+ X0 N9 T
 for(x=t;x>0;x--)9 {  ^2 c1 C% n* S  ?7 d
 for(y=120;y>0;y--);) X5 }- p1 H) b
 }. G! q4 [4 z& I$ \+ G8 f) u% S
 void TLC1543_init(void)
 ! [* a1 t9 ^3 Q! v{, J" I8 [$ y% D
 cs1543=1;' x  P/ r7 k: e6 f9 w# L
 sclk1543=0;
 $ X: d0 ?" ]" f/ W6 ^}
 ( ^0 A% ~: z+ k: u' K5 vunsigned int ReadADC_TLC1543(unsigned char ch)
 ) f$ ]8 l8 Q  _7 I{  q' z. [1 {1 T4 j; }
 unsigned char temp;2 R( q( p; Y( C8 x/ l8 }
 unsigned int adc_value=0;. `/ ^/ z1 M% q2 A, Q. ^
 ch<<=4;$ s0 e! `8 S3 t
 cs1543=0;
 2 A5 [% H( {  R7 ]  t) x: e    for(temp=0;temp<10;temp++)         // 将判断语句改为 temp<12
 6 R0 ]" b4 j% i* M    {                                       // 程序可移殖至 TLC2543.
 % r' t" l9 Y& _        adc_value<<=1;
 ! g3 Z6 L1 G/ d' n/ [, r        ch<<=1;
 # e' N5 d5 N2 n6 w        addr1543=CY;( p$ k7 d' a, O) D" U7 P3 X
 if(dout1543)   " D2 m* N6 Y9 N1 L3 z
 adc_value+=1;
 ( t9 @! v& |' G% q3 S        sclk1543=1;
 % n6 c5 g5 E& Q/ B: S        Delayms(1);! T1 A  l3 m) L
 sclk1543=0;4 W; {  J& [5 i6 f9 ^  f  k
 }   ~  t3 M5 T; C- P
 cs1543=1;
 2 _8 S6 Q* o1 ]$ o  d    return adc_value;+ d$ k, Z5 Z, f3 ^4 A
 }# {% @/ n0 g5 I- W% Z* ?/ p( ]
 void WriteTLC5615(unsigned int wdata)                                                                                //写TLC5615数据函数:9 d, u. @4 W9 y2 J6 I
 {# o2 L- T( M, j
 unsigned char i;
 # M- J2 t: D" [& @        cs5615=0;                                                                                                                                        //片选使能
 2 R- X. b( n  T0 D) R* l        wdata<<=2;                                                                                                                                //将数据左移两位,补两位扩展位,组成12位数据写入
 & p3 f* M- w/ L) Q$ J! E8 [% j        for(i=0;i<12;i++)                                                                                                                //写入12位数据
 % w! `) D8 r, V        {
 # a. v! h: S5 V; r" x2 [                sclk5615=0;
 , D# I+ F% j8 ]- ?. D) V                din5615=(wdata&0x0800)?1:0;                                                                                                //取出最高位(第11位)写入
 , k, |, u5 K+ n' ^3 M                sclk5615=1;                                                                                                                                //上升沿送数据# F3 D8 X! o% e
 wdata<<=1;                                                                                                                        //下一位移到最高位
 o+ E% H0 K6 N: Z% u        }/ N6 t( ^5 }! A1 H. O+ o0 @9 e
 cs5615=1;                                                                                                                                        //片选禁止
 * ^* t& p' V% b% l& b2 x' A7 U}
 3 I" v, ^+ n% T+ h# O- D) `+ d2 j/ y# ~float get_average(unsigned char ch,unsigned char time)
 7 ~' k# a1 Y* U) `. V7 M  X% c{+ q4 f- N" d7 v) D8 ?+ I7 Q# P
 unsigned char i;
 6 I6 Y9 @/ [+ L# X0 I3 ~        float v;
 , k; @* T6 h0 }5 M        v=ReadADC_TLC1543(ch);
 ; d/ }; m0 A8 K" Z" {+ f( A9 q        for(i=0;i<time;i++)
 , i* P* \* k$ k        {* q) z" i. l) U% H
 v+=v;3 z7 e. I* E' g
 Delayms(5);
 + j1 Y, Z& P- S! l! `; P& Q9 a% w% p        }: V; z( N8 G/ l8 @* A
 return v/time;  t4 B: M+ T0 |4 f. H
 }! y1 C/ q* r) F1 d. F% r
 /*unsigned char KEY_Scan()
 2 R- Y  v, i* B  ?! l2 C" y6 C& @{$ Y. k  c/ m3 O# m- P
 unsigned char temp=0;: [5 A% `; |# F
 unsigned char com=0x55,com1=0,com2=0;6 v4 H! Y5 ~- T* }1 [
 P2=0xf0;
 3 ^; h) ]/ y: ]. }: i4 [        if(P2!=0xf0)+ Z  f* n6 |) u& L2 J5 w
 {3 c- l9 s  D1 V9 }' N  C9 Y7 ^( Q
 com1=P2;
 ! [% B& \  V% }0 e$ y0 |                P2=0x0f;
 2 n4 X5 j# Z+ P) B; i* s                com2=P2;
 ( c4 |) ?! i; m        }0 _* p( \* X7 x+ G0 N+ |  C
 P2=0xf0;* {5 t/ O8 [- k* C! F7 p
 while(P2!=0xf0);
 + [! C* d( P# M& F. ~2 p        temp=com1|com2;
 - R, E/ n4 d- D/ ~9 r4 n        switch(temp)
 ) A& q. g4 d  }/ h1 A- F( }: A        {: G. y5 o" B5 v  V
 case 0xee:com=0;break;
 1 M7 L" X3 l" @& l& M" s                case 0xed:com=1;break;
 y9 A0 C; W. }0 ?' ^- }8 ^$ D                case 0xeb:com=2;break;
 3 O7 C' a( @* E- M' m2 \# Y* g: C: t                case 0xe7:com=3;break;
 & W& W' v4 r9 h                case 0xde:com=4;break; 2 T' P& ^9 J' c$ C! s) m2 d; Y
 case 0xdd:com=5;break;
 % y8 \5 r! ]( [" E3 z3 ^                case 0xdb:com=6;break;- p' y0 P) _9 P( ~
 case 0xd7:com=7;break;3 Z: m7 R& _6 c6 Y9 t
 case 0xbe:com=8;break;
 ) k5 Y* S2 G  C2 E8 A  [                case 0xbd:com=9;break;* p; ~$ X3 [0 w9 ?9 C0 I) x, c
 case 0xbb:com=10;break;; c8 |" C4 P8 y# `; f2 x' V& ^: q
 case 0xb7:com=11;break;
 $ z) a5 a. P4 A                case 0x7e:com=12;break;
 6 K! U4 A. c/ S                case 0x7d:com=13;break;$ o( f5 ^4 t. ?$ y/ W  c
 case 0x7b:com=14;break;
 ' p7 @7 }& U0 ?% y( O3 b                case 0x77:com=15;break;                                  ( o5 Z6 [. j6 s( k" c
 }6 B, x- u& }/ {+ a* J7 c
 return(com);
 # k( y% q# y/ S+ J# p2 D}*/
 ! T7 T2 Y- b1 E8 s; jvoid main(void)                                                                                                                        1 B* t6 e$ J% d
 {
 5 b4 g, \. O  M6 b        float dat1,dat2,volt,current;
 . T6 _5 o0 v: y9 j! N+ ?        TLC1543_init();                                                                                                                ) H) @. p: m# {" r9 ~2 k7 X) j
 while(1)% e. A2 s$ ^+ s' P$ W8 `
 {
 ! |/ u; ^4 x. g: K+ D5 M& |                WriteTLC5615(100);/*向dac写入数据*/
 ) @# R( W, M4 f8 z                dat1=get_average(0,10);/*通道0测电压*/
 & p8 a9 }3 W& T; l% K1 n+ E# k                dat2=get_average(1,10);/*通道1测电流*/
 5 @: N  A' [+ I9 ~6 o                volt=dat1*8;/*最大电压为40v,分压为5v,分压倍数为8倍*/* }" z2 `: R5 ?' W
 current=dat2*6/5;/*最大电流6A,采样电阻为1mΩ,采样电阻上面最大电压为6mv,差分放大100倍,即最大电压为6v,分压电阻分压后变成5v*/
 : H$ A- S6 P; X2 {) _: t+ c( J9 J( q
 ; Z7 h5 [; c2 L0 j$ z$ G: X: H
 ! n: A2 @2 X! E2 }0 ~7 T' v' k( ]
 …………余下代码请下载附件…………
 % U& v' S" z* j, ^8 G4 u5 ^: ]* c3 N8 N; u+ K
 下载:$ R7 l4 X0 J" L; u  I* d
 " O  t' k" J3 z, @, h
 7 Z1 m, }0 Q- ~8 K
 
 | 
 |