|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机数控电源 tlc5615+tlc1543程序+ V$ k* P/ x0 `- f
A6 a0 ~$ q0 s, U) R' T; z5 d
& g. x0 i! \1 F0 v4 e& _数控电源,51单片机+tlc5615+tlc1543% S% q+ c8 z2 V8 I
! m# q( T6 X _* s5 }) @
源程序:- M0 j! q: K' o9 p) p1 R( u
/*最大电流为6A,最大电压为40V*/
. p: a% K2 V+ ~4 g0 F#include<reg52.h>( D/ E" L0 n% K8 y$ x
sbit sclk5615=P1^0; /*dac tlc5615串行时钟*/* C" O3 j) g* I. _& ~& m/ w
sbit din5615=P1^1; /*dac tlc5615串行数据输入*/* g* U, X) T8 K" i7 S
sbit cs5615=P1^2; /*dac tlc5615片选*/
' d3 O3 [- D7 y( Fsbit dout5615=P1^3; /*dac tlc5615串行数据输出*/0 ^$ z `4 {0 h" r9 a1 K4 ?
sbit eoc1543=P3^0;
# O" N3 l: V& W6 j; Dsbit sclk1543=P3^1;
# y- T( U. P' S1 V/ usbit addr1543=P3^2;" N4 n4 k& t0 h* J
sbit dout1543=P3^3;
3 r& g5 w8 f: asbit cs1543=P3^4;4 m$ M9 I6 z; h `( ~2 y
void Delayms(unsigned int t) //延时毫秒函数:
( u E# R5 p v$ o( n{
: l! C- i! E9 @8 P, y( l, o$ H unsigned int x,y;2 ?( S/ h; l/ b, G9 Q6 t
for(x=t;x>0;x--)
9 `) |5 p! h& R# O( l: Z$ E& V for(y=120;y>0;y--);
* Q2 ?' f8 y7 D2 p}9 ]0 a R' _5 _3 a
void TLC1543_init(void)9 j$ R" R% W( d0 K; L8 h
{6 F6 H$ |! ~9 B" |0 o5 u+ `; L
cs1543=1;8 D. z. P0 Q, c* F$ J* D5 L
sclk1543=0;; e; `& h$ ~; X r: D6 y/ o* q
}
5 J, \1 H+ p3 z% U! _: P- Qunsigned int ReadADC_TLC1543(unsigned char ch)
# T0 s+ [9 }. t! L5 R/ F3 x$ u7 W{0 O& p1 b" p+ x) r1 g% `' ]
unsigned char temp;
, x! I/ w. O/ Z. { unsigned int adc_value=0;9 w3 n7 _* D' g! d
ch<<=4;
& W2 b4 x7 ?. s8 [0 b cs1543=0;
1 E2 Z3 f3 K( g6 @9 _4 n for(temp=0;temp<10;temp++) // 将判断语句改为 temp<12
6 W0 n& h: A( L$ X. w; ^4 B+ u* q { // 程序可移殖至 TLC2543.
) Q0 h( j/ J4 {7 c: [. J adc_value<<=1;$ K; ~4 z7 k- C% [! P2 Y/ i
ch<<=1;/ y5 O3 X! G/ ~) \! n
addr1543=CY;
& e- E0 ^* b, t if(dout1543)
3 S( r+ {8 d- b/ y adc_value+=1; D9 y6 u! O; r5 P) f
sclk1543=1;2 D* w m* R( s, P2 ^
Delayms(1);. n7 F# V3 U/ d/ @
sclk1543=0;$ K( e. k- y! b2 ]& N
}
$ s! \. B" B' t! c, L1 {$ Q9 o cs1543=1;0 u( W9 v9 S6 C: e' _( w. d
return adc_value;
5 V9 `! z! R7 S' c}
$ b, [3 _( o& D& ~* K- k: B/ @void WriteTLC5615(unsigned int wdata) //写TLC5615数据函数:# G7 T- E! t: @
{3 h% @$ k7 w" W% R# H# Q! f( Y# K
unsigned char i;
! |/ o( @( T/ \, D& n+ U }6 n$ Q8 n4 ?6 { cs5615=0; //片选使能
, G2 ~. L# N$ v6 U wdata<<=2; //将数据左移两位,补两位扩展位,组成12位数据写入$ d4 i, q" K1 I: W- @# x) d/ _# }4 T
for(i=0;i<12;i++) //写入12位数据
1 b+ i1 M2 s/ }* p. H5 s {* o3 R2 l+ @: ?, i& n( j
sclk5615=0;
: w/ U W. y, w: P4 G2 L! \ din5615=(wdata&0x0800)?1:0; //取出最高位(第11位)写入( E$ Q. J6 I4 @+ J' M# c0 w: {
sclk5615=1; //上升沿送数据
. x# }( |5 N U( x* G' L wdata<<=1; //下一位移到最高位
7 w& @/ K+ M6 c( @9 y' G: P3 H5 ^9 \2 k }
+ ~* V8 B8 d3 S+ o6 { cs5615=1; //片选禁止% }! Y# K$ [- T( d( m
}1 d6 ^3 k7 M$ Q9 N# Z
float get_average(unsigned char ch,unsigned char time)
. |7 u9 L; t" M{, }6 d8 p& m5 L* Q: \
unsigned char i;
/ E/ S: H5 l8 L! h8 e; j4 v9 `( b float v;, B+ i% i6 r* w' \" m2 o8 G: {
v=ReadADC_TLC1543(ch);# R. J: R$ q! R& }1 D
for(i=0;i<time;i++), ?; [) o9 A* }4 s0 L0 k
{
. q8 K5 ^" z+ r- c v+=v;7 F- ]( M- @" F& ]# p! I1 t/ v
Delayms(5);3 z! g- ~ `, Q
}' p4 ~% N$ M6 d* F2 ]. O; W
return v/time;& x; b, B+ K; k6 x
}
?3 {9 P/ |" u4 q; w6 N5 b k/*unsigned char KEY_Scan(). p4 k3 l+ D7 G0 W
{
D m/ P. Y2 K6 [6 m, H/ n. M unsigned char temp=0;4 C8 N( b+ Q2 @, y$ Y
unsigned char com=0x55,com1=0,com2=0;5 m9 r" Z) o7 ~1 d- Z& D5 @- `
P2=0xf0;, [& l) F( H. h2 X; A- t
if(P2!=0xf0)
% t- y# x% ]0 `! i" | {- V* {' W+ M. f( T7 t# r" j
com1=P2;4 z5 U# g( @# Q
P2=0x0f; x1 Z2 Q! v( h" s3 P* J* V
com2=P2;
! h8 c% a( |+ ^' J3 z) V }
1 m6 b: L ?+ S# {. k2 [ P2=0xf0;
0 A* o8 o( M, J( M; y while(P2!=0xf0); # U* Q% j9 n. s
temp=com1|com2;
, u/ I5 J% R3 B4 g. G7 V2 h! y switch(temp)
) l+ o f, K8 _ {
, z, V% ^5 w1 R* {9 Z* Q/ u! G case 0xee:com=0;break;% i* N% {/ C1 x1 T' z l W M; @
case 0xed:com=1;break;. f$ l4 p* x2 j( H7 `" ?
case 0xeb:com=2;break;. N) E% e7 \% N( n: m! D
case 0xe7:com=3;break;: D: M" V6 K8 b
case 0xde:com=4;break; 8 r! u# F+ f% w2 g/ n
case 0xdd:com=5;break;
1 Q4 W! Y; O6 V9 E case 0xdb:com=6;break;8 y3 S7 B4 v, ^$ L5 f7 Q
case 0xd7:com=7;break;% F: [4 c) e/ e! c/ @( g' X6 k
case 0xbe:com=8;break;
- s1 p; D L5 F9 F ]" } case 0xbd:com=9;break;# ?0 p4 l/ L! ~
case 0xbb:com=10;break;' O7 W" ~$ q2 G, {
case 0xb7:com=11;break;
; C4 [) E5 E$ X! k) w4 f: n! K case 0x7e:com=12;break;
6 x" d% T0 p$ f/ x# t case 0x7d:com=13;break;1 j; p$ B% ^4 |8 [6 {6 R$ ?
case 0x7b:com=14;break; : `7 A: g, O. q1 }" d0 w
case 0x77:com=15;break;
6 R) @% Q6 n% W4 r$ e l4 G/ t }
, ~2 [5 `. k9 @2 L return(com);5 i' y& }9 H' O3 y: u
}*/
9 B2 n4 s9 s. J9 U8 Y5 O" Y6 A! avoid main(void)
5 D. ?3 C3 v& O' \+ H- P! _{ J: ^, L/ F5 Q
float dat1,dat2,volt,current;0 |; x4 L0 Y+ y! w" h
TLC1543_init(); ; o' y; s. M; H8 v g
while(1); W% d% d# |$ P H9 H. ^
{& ~8 S9 C: N, \5 h! e/ `( @
WriteTLC5615(100);/*向dac写入数据*/6 n1 {% e; e: Q4 g
dat1=get_average(0,10);/*通道0测电压*/
$ w, X' V4 ] T7 L" ? h- { dat2=get_average(1,10);/*通道1测电流*/& m% P9 @% K J0 T0 \, T
volt=dat1*8;/*最大电压为40v,分压为5v,分压倍数为8倍*/2 m5 M. v$ c5 m }0 U8 t
current=dat2*6/5;/*最大电流6A,采样电阻为1mΩ,采样电阻上面最大电压为6mv,差分放大100倍,即最大电压为6v,分压电阻分压后变成5v*/
2 }! c, q9 L3 u4 ?( v
+ V% A- b' Y( T+ r) l" k/ ^1 m. L" `9 n" w. z$ _2 `- [
6 ]. t# T2 a: J/ Z
…………余下代码请下载附件…………
8 k* ^! l, i( A& ~) S
0 _: c. B& h! e0 T" R% s4 ?下载:& a* M/ [' H: H% b9 @' j0 U
* P9 i, Z# q" ~; a; b5 {' O
' L/ I, I/ k; l: Q0 s2 z9 y, O: s |
|