|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机数控电源 tlc5615+tlc1543程序* I! K: d" @5 a# s8 Q& c
& n" C! N6 e, D# j3 o/ ]9 Y1 R3 a8 z$ Y0 x0 w
数控电源,51单片机+tlc5615+tlc1543+ |, [3 a) W+ v- [# \* |! L( [- X
# w4 p2 Z h* m( S
源程序:
+ k9 g6 W; W4 E& d/*最大电流为6A,最大电压为40V*/
8 }0 X0 \6 H% Z) J2 ~5 i' ^#include<reg52.h>
1 ] i. s) j, s2 m2 K6 fsbit sclk5615=P1^0; /*dac tlc5615串行时钟*/: ]' s [9 U0 o& [/ @8 [3 b
sbit din5615=P1^1; /*dac tlc5615串行数据输入*/9 N$ {+ q0 O A: B5 n$ n0 b, ^+ A
sbit cs5615=P1^2; /*dac tlc5615片选*/
7 ?/ p# w& L; R& J" w0 [sbit dout5615=P1^3; /*dac tlc5615串行数据输出*/
' ~! V) F. e( c: }- \* g# V8 D ~2 }sbit eoc1543=P3^0;
% r# G! n# T5 U0 u: \sbit sclk1543=P3^1;) ]5 B" H/ H" |( w( x
sbit addr1543=P3^2;5 w9 ~' d K4 x7 k$ I, _3 Y
sbit dout1543=P3^3;
- u* p& _5 X( Osbit cs1543=P3^4;
( @0 f0 e* M- [7 yvoid Delayms(unsigned int t) //延时毫秒函数:7 |" Q' @+ J+ Y8 ^* V3 _! m0 v# O
{, X! p6 m7 [! a" d( Q8 m' t8 j
unsigned int x,y;
+ e! [9 Q9 _- a0 w7 a for(x=t;x>0;x--)
9 R2 P6 d4 T4 U for(y=120;y>0;y--);( k, ?! c2 B' H
}+ \! S& C* B" l) ]* D* }; l! p
void TLC1543_init(void)
5 E2 q5 u, ]: M- {" R{2 N2 @! K t7 r' q5 I
cs1543=1;& W, G, j' {9 X2 B
sclk1543=0;
) D) X9 N( ]4 [, q, W a}
$ _7 l( {; J6 ^- U1 m$ B$ Dunsigned int ReadADC_TLC1543(unsigned char ch)
+ M2 ?, p$ S- ^{2 [: i5 n; P9 H, G- d q
unsigned char temp;$ f1 {$ C7 k& @8 h& B: }
unsigned int adc_value=0;% S$ k( c' X9 d1 g; N8 _. O
ch<<=4;) N2 h. s/ {9 B9 a( L
cs1543=0;+ N2 Q& Q7 {6 o: }" i- w
for(temp=0;temp<10;temp++) // 将判断语句改为 temp<12
. R& F0 ^5 z$ l4 X2 E9 H) V0 ] { // 程序可移殖至 TLC2543.
+ `9 M- }: G+ O' I+ _' \ adc_value<<=1;& j: r, S% E7 W& Q' R c1 o2 [& M
ch<<=1;; U! ?+ `, J% R$ V
addr1543=CY;
) Q6 G( F9 a& [# r- a& U if(dout1543) 7 b! M! r& M* Y) ]+ I3 y2 X, w, T: ^
adc_value+=1;
' q8 |) @% p8 x% b {$ | sclk1543=1;
7 y* f0 }, |9 c7 V5 J7 m Delayms(1);
* {/ V. e$ K6 c9 S: ^! A" ` sclk1543=0;9 f3 B3 v/ u$ D. q) w6 Q
}
) B8 z% k3 U. U2 n& H( [ cs1543=1;
$ B- { x& g$ G( u. K8 Y return adc_value;
- j5 H8 ]& @( J& g$ {* {4 h}& h# A% s! {' ]+ s
void WriteTLC5615(unsigned int wdata) //写TLC5615数据函数:, y9 M9 S+ A- `' _2 s
{" O( @$ I* w! z1 R" D* q: E
unsigned char i;
% h- e( z, k) ~ cs5615=0; //片选使能
% K0 Y# i! k& q% j' y* ` wdata<<=2; //将数据左移两位,补两位扩展位,组成12位数据写入
* U/ N# C8 g& C* Q for(i=0;i<12;i++) //写入12位数据
/ O5 b0 G& M9 e- p/ Y* X {4 X' B1 k2 X# P2 m$ q
sclk5615=0;( K9 }2 f, y. J: F
din5615=(wdata&0x0800)?1:0; //取出最高位(第11位)写入
8 {8 A1 o3 p; n+ A, ?. [- @& F$ h sclk5615=1; //上升沿送数据8 i# D8 v' q6 Z0 S! D+ [! S2 p
wdata<<=1; //下一位移到最高位! C+ l* ]4 T |7 R* Y- L) M
}
: i! x! e8 |8 v& I7 W: {4 i8 Y4 J cs5615=1; //片选禁止
: J* ]8 O) X& q}- w2 ~& _; |2 Z( B
float get_average(unsigned char ch,unsigned char time)$ E [8 b% w2 w: d
{
! r9 n' n3 Q* s1 K& B unsigned char i;) E% F2 m1 w8 y i$ [
float v;: X5 s( S, p3 f$ G% P
v=ReadADC_TLC1543(ch);
" A* h1 {5 m4 |7 s2 {# v; ` for(i=0;i<time;i++); s6 | E3 X$ j5 g$ [4 y+ B9 y
{
/ O+ W3 F6 C: i5 k2 b6 o% g v+=v;! R0 j& F( J% M4 k# Z- ~
Delayms(5);
2 t ` E, q/ Q9 }7 F5 E4 \# n }9 m( ~0 G b8 @4 a! Y
return v/time;5 |# e. N' L& E8 y
}& ?+ e9 b/ b% y9 B- Y3 P
/*unsigned char KEY_Scan()5 X5 i1 W" P% G2 c
{( ]9 I: t3 ~8 W) t
unsigned char temp=0;
; P' S: l4 u& u- v! C! W9 l- E unsigned char com=0x55,com1=0,com2=0;" X; v( ]6 t! M. H$ N7 u. s
P2=0xf0;1 F/ t- E5 x' M& q3 {3 c7 B) f
if(P2!=0xf0)
$ x$ O& U& w' I8 r {
" y1 }- b% }) X e/ S* s7 G com1=P2;
4 o( d' h) f. `# z5 A) S P2=0x0f;/ D1 |: @0 {0 D$ q- y; ^( j
com2=P2;
6 Z5 \8 `9 \& u# j3 _5 P }
( [; b% m1 a j& Q8 f& }- `! [2 S P2=0xf0;* ?: M5 Z' H) }" e$ R2 O
while(P2!=0xf0);
! Z0 s4 W- K: M( d! P- H: Z+ o% j4 y" M temp=com1|com2;& t, t0 t& X+ ?! }0 g y1 k; C6 K
switch(temp)
* O8 u2 w2 O( D7 D/ ?7 g3 d) k' V {% V( {$ d( h. f$ ?9 ] N
case 0xee:com=0;break;+ T/ x! z8 c8 |# F. s$ D5 m
case 0xed:com=1;break;3 D( F: h/ g6 o* E: @2 T
case 0xeb:com=2;break;
+ A/ j) p6 F7 A" s case 0xe7:com=3;break;. l$ m4 C' Q( S7 p' Y% l: K
case 0xde:com=4;break;
3 [# l, S) [2 e case 0xdd:com=5;break;
) z' x$ q8 P. p& r case 0xdb:com=6;break;
- ~, A. j- M2 y& D7 L- [ case 0xd7:com=7;break;4 p6 Z+ C" v. L) m1 n* H
case 0xbe:com=8;break;
7 U( A( b. v. {3 S case 0xbd:com=9;break;1 y3 Z3 T8 z) W/ s: H+ f5 }1 m, O
case 0xbb:com=10;break;7 y3 {% u" H% y# w R5 n/ x% i- j
case 0xb7:com=11;break;$ _ O- a& t8 x- K* I
case 0x7e:com=12;break;6 s# i& W) ?! ~
case 0x7d:com=13;break;
0 R+ ?* N9 J$ Q5 h- p# Q9 @ case 0x7b:com=14;break;
0 n$ c0 r, i1 T case 0x77:com=15;break;
5 h5 E) _2 x7 t( ]1 X }' `1 P% r* B" q3 ?/ Z. z. o/ c
return(com);
/ X* k$ x. g4 M}*/1 C; d) p: b( \8 u
void main(void)
& Y, I! W6 ^( t; D3 ?{1 T4 i3 E; Y7 A* J: o1 F7 P! j
float dat1,dat2,volt,current;
0 [; a; o1 C: v; v! r$ k3 s9 Y: x TLC1543_init();
7 o: t! J0 k+ R, h7 f while(1)
- g5 E2 f9 t6 F {
/ |' ^/ S1 f% T WriteTLC5615(100);/*向dac写入数据*/) O" `9 }. i" y% |- I. w
dat1=get_average(0,10);/*通道0测电压*/* \. `& Q' f" Z- i
dat2=get_average(1,10);/*通道1测电流*/
3 x. @! M7 K' W* ?5 s volt=dat1*8;/*最大电压为40v,分压为5v,分压倍数为8倍*/' r$ V* j& ~* h5 ]5 H, r
current=dat2*6/5;/*最大电流6A,采样电阻为1mΩ,采样电阻上面最大电压为6mv,差分放大100倍,即最大电压为6v,分压电阻分压后变成5v*/; h1 h) D( G' B7 @' K6 `, F4 _
8 P0 r- c1 e2 U& Z" e: L
1 v1 _) m* m9 f6 Z' ~3 K4 ~5 k) u" N8 a) X
. I; A! p, y/ y& A1 x, c( [0 Q
…………余下代码请下载附件…………' D3 y, j( R M0 u4 b5 N
+ L- ^9 d8 Z4 b7 R
下载:
; v1 |2 d" d4 e$ A0 _6 s( n: ~6 |& z1 [% Q4 Y
- S$ C0 b+ J/ h D S
|
|