|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机数控电源 tlc5615+tlc1543程序
" k3 G& o: D1 g B4 Z) N: ^
0 S+ q" n# p8 Y. G* M2 n. }
4 N {# y4 N$ r6 K' o( H数控电源,51单片机+tlc5615+tlc1543' o& ^" U1 e, v" o9 T; F+ ?
+ S. `4 Q4 A: b源程序:
( l$ Z. W; J$ Y" P5 Y7 |9 }- g/*最大电流为6A,最大电压为40V*/
" b' u1 A9 j o. C$ p8 a1 L/ |+ w#include<reg52.h>- O) r2 X/ W6 O
sbit sclk5615=P1^0; /*dac tlc5615串行时钟*/9 D% z7 i( r3 q2 H4 i |, R ^4 e; E
sbit din5615=P1^1; /*dac tlc5615串行数据输入*/7 ~ s5 ~8 K5 s) E; {2 X% W% j; k! ?% ?
sbit cs5615=P1^2; /*dac tlc5615片选*/) W% A2 |& h; K! b
sbit dout5615=P1^3; /*dac tlc5615串行数据输出*/% K V8 [. V# C! T6 v
sbit eoc1543=P3^0;. E' [1 F3 m: V) a+ X
sbit sclk1543=P3^1;
+ _! N$ n9 p3 U: B+ n4 x" qsbit addr1543=P3^2;; @6 n5 G$ s, [$ |
sbit dout1543=P3^3;& g, k& e8 `; C+ q* e
sbit cs1543=P3^4;
/ ?9 j% C% { [void Delayms(unsigned int t) //延时毫秒函数:% i. c0 l* t1 ?/ M* w
{
& g, x* k2 u. j/ L: ~( k E unsigned int x,y;
4 P& h. D" w& q: n! C for(x=t;x>0;x--)
" s! A* g/ ^' y/ ^. j% B" h1 i for(y=120;y>0;y--);
$ }/ c3 `! D* j: ~9 I& S2 P" R; o}
# F! }9 t/ v4 ]6 Hvoid TLC1543_init(void), Z7 P3 w9 V" g% x) X/ ^
{) n" T# z# s! _# Y0 H& Q R
cs1543=1;8 Q: t8 L1 a- c! D% x# g+ i
sclk1543=0;5 x# H# u# ^7 o( }5 x
}9 D0 E2 @' [3 c- n; I2 U
unsigned int ReadADC_TLC1543(unsigned char ch); o p- W% ?/ r0 j# S( l# g: T
{- M( w1 F# }: ~
unsigned char temp;
5 ^! W: {# U$ Z* `5 a unsigned int adc_value=0;
% t' u9 M M( H* @" H4 Q ch<<=4;
7 Z$ V9 T# g2 m cs1543=0;
% m: k1 G+ p( [1 f: f: y, x for(temp=0;temp<10;temp++) // 将判断语句改为 temp<124 T, p/ w6 C: y9 }9 g
{ // 程序可移殖至 TLC2543.
, m B8 q/ e; L% j adc_value<<=1;- C H& F/ a6 y* Z
ch<<=1;
1 K5 E) Y1 F7 C addr1543=CY;
1 O# Y; T& @" x. M& W' l# c if(dout1543) 4 G6 R3 _2 I' h. z2 e
adc_value+=1;
8 t$ G9 i9 f* O$ p7 L* Q! H0 [ sclk1543=1;
6 n8 \7 @% e3 O Delayms(1);' { [6 S6 p( H4 m" H
sclk1543=0;
k" a+ [! _( t/ |5 Y0 m } * l5 m+ T4 n# _7 _
cs1543=1;
& q6 P+ m7 r, h3 F8 v return adc_value;9 _! d+ m/ K) R1 }$ g
} S8 T4 H8 ^9 C k: ` c
void WriteTLC5615(unsigned int wdata) //写TLC5615数据函数:4 I' ~+ [6 C9 x2 j! C5 c: R
{
3 p( g) M9 ~& o3 a4 @! r unsigned char i;' K7 D. R& M9 o! @ `0 I
cs5615=0; //片选使能
' c2 t) v3 S) k" d/ k6 y wdata<<=2; //将数据左移两位,补两位扩展位,组成12位数据写入0 s8 V- M" n$ W
for(i=0;i<12;i++) //写入12位数据
* N6 @5 c) R1 x9 i; b {1 U( ~; b' ?# F
sclk5615=0;# @: |0 c" j- ?# I ?
din5615=(wdata&0x0800)?1:0; //取出最高位(第11位)写入
, L6 [1 e. ~$ q8 S2 b sclk5615=1; //上升沿送数据
/ V! M+ [, z6 z& ^0 ~1 ] wdata<<=1; //下一位移到最高位
: {& K7 T: T1 s. Q* I1 y6 H7 h }4 Y. [8 q7 J; `( {$ V
cs5615=1; //片选禁止
5 V5 T# p- C4 V# z/ I1 T* R0 X}9 `: C) d8 z3 j7 n5 h) [
float get_average(unsigned char ch,unsigned char time): [. V! K5 |- P1 f% f! ~
{
. B. B) C+ A# G* D1 Q7 `4 q/ A unsigned char i;
" o0 G: @/ ~& ^5 R4 b2 M float v;
0 T5 D, z6 L) P4 x$ `' e v=ReadADC_TLC1543(ch);* [& D" _8 }9 F9 [# J
for(i=0;i<time;i++)/ G. e- j2 m. R2 Y
{
) J6 I5 }7 r$ b2 P2 B v+=v;( Z/ _6 q5 S/ L, ]$ h4 S
Delayms(5);! V2 ~( E, }1 f. Y
}
0 O% x4 M) g$ R- m2 O+ L. w# X return v/time;
5 B, o3 i- \/ a2 a( G0 A$ @8 C}+ p! i# C6 ^% X( L, T! }+ P
/*unsigned char KEY_Scan(): A- y; p, ?' }) K! A
{0 C4 e% g# `* c6 d( C* ~6 Y0 y
unsigned char temp=0;% ^/ t0 c9 S% f8 u
unsigned char com=0x55,com1=0,com2=0;7 c) S6 f5 M R7 g. ~$ t
P2=0xf0;
1 g1 y4 {# K9 Q if(P2!=0xf0)$ r4 ^+ U5 {/ Y
{- ?0 x' p* g+ W6 A
com1=P2;2 X* n* {5 `. o
P2=0x0f;
$ `# d0 Z/ E: c+ {- q com2=P2;
( E. \2 @) m* I' W% L" L3 z$ y }0 x# |1 }( W( ^6 }, y
P2=0xf0;
' q# `6 k: A! R/ r2 X- Y2 e+ M while(P2!=0xf0); 5 a" q; m8 w0 F: N$ p2 D
temp=com1|com2;
6 B. D" j' e) ]7 l switch(temp)
5 L8 t+ v0 L' Q$ {$ N {8 X) l7 l( ? S+ B( y* }6 n
case 0xee:com=0;break;6 j$ F3 c' E q' S/ k, _4 X3 M
case 0xed:com=1;break;
5 \3 q; s. V9 m. Y: V9 d. o case 0xeb:com=2;break;1 r# k L8 ], U; w2 U
case 0xe7:com=3;break;
' t) H! V5 K/ E( I case 0xde:com=4;break;
$ [ B6 u1 b" \' s7 d case 0xdd:com=5;break;" M6 K2 z: ~8 m
case 0xdb:com=6;break;0 ?' u' O9 s6 P2 D
case 0xd7:com=7;break;9 L! p# L( i( z/ d: |% z
case 0xbe:com=8;break;
: v0 y0 |( C" k case 0xbd:com=9;break;
. f% ` c1 B8 W/ L' p$ E% A case 0xbb:com=10;break;2 K% B1 E( a1 q' e+ X+ v
case 0xb7:com=11;break;( m! a' P; o2 c% a% |4 N
case 0x7e:com=12;break;
* ?) k5 N/ z. B. C0 v: A' K case 0x7d:com=13;break;" M' v* k a( T$ l% s
case 0x7b:com=14;break; 1 N4 C' b" A5 R( T" `
case 0x77:com=15;break;
( D- S S* ^* ^- w2 U5 ]! y3 H }
; W X, ~. \. F# a return(com);1 H7 w3 ~4 v6 P3 s/ O4 y, T f
}*/& T1 q8 J1 {. H& ?6 p0 u# ?1 ~5 L4 e. }2 @
void main(void) 4 o9 A; }& S/ G; m, ^6 d: b" U o
{
4 U% ^0 _9 F) C ~. E float dat1,dat2,volt,current;
) k. J% B( f( m- j1 S. u: ] TLC1543_init(); & R1 }/ A6 }& l% z8 q
while(1)
! z4 M1 P+ |7 q {. T% e+ `* G, z4 j, S2 r, `
WriteTLC5615(100);/*向dac写入数据*/) [; l1 A8 X$ S7 Z
dat1=get_average(0,10);/*通道0测电压*/
7 S0 i5 E0 a) `- V h6 ^) r dat2=get_average(1,10);/*通道1测电流*/
6 ?1 _/ _$ v5 I6 [6 s volt=dat1*8;/*最大电压为40v,分压为5v,分压倍数为8倍*/
R- J; t1 z3 a. C/ c6 O. E current=dat2*6/5;/*最大电流6A,采样电阻为1mΩ,采样电阻上面最大电压为6mv,差分放大100倍,即最大电压为6v,分压电阻分压后变成5v*/5 X! B N1 o1 w/ S& r# ~
9 v; I- v4 s2 ^& g% i
* P6 L" H7 @# V( A+ a8 N8 Y' h6 X
1 I* X+ {$ ]% M…………余下代码请下载附件…………
' u/ S$ g/ R% p1 C9 C% i* U7 ~7 |
$ `9 K/ R8 j C W) V下载:
" m# X. c8 H% o# ?) g5 I( x5 W1 [* ]3 Z4 {$ F
3 D# y4 b2 i) B+ e& M+ w7 ^- ] |
|