EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程; S0 c6 Z d& P
: `5 o1 p0 U7 ~( s5 B$ c
; ]# D6 A3 A9 W% C. O实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
+ @' r6 I0 s0 {$ M; J电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。4 z. V+ x1 ]% [* O/ L0 `
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
: T+ O% C; N! C+ ~9 ]5 \2 R
电路原理图 6 |% X) A+ N" ?7 a+ Q8 h
![]()
1 c8 {% ^0 E8 O0 X8 }/ v % Z1 c8 \' r+ r+ [1 i5 F
![]()
# W" o I! f% j0 {0 P 1 O. i- ~" R- m. c3 g. t
2 a a( t1 q% M" ]; _7 \. w) s
#include<reg52.h>
& h5 u0 ]* h1 ^#include<intrins.h>
c8 U1 b+ I4 g#define uint unsigned int; K2 _( p4 p$ `6 F
#define uchar unsigned char$ p; g4 s( R4 ], S, J3 Q
uint LCD[6]; //电压数据转换成LCD1602液晶字符显示2 }5 v/ C% f6 p; n6 S. Z
uint Volt;9 C7 h! l) r# _/ E* p+ P( G
//***********TLC549管脚配置*********//
7 H/ y6 l8 T# K, _: X//sbit DO = P1^0; //时钟$ s. t( u. e6 D4 o8 Z/ g1 Y6 h$ M1 i
//sbit CS = P1^1; //片选
9 Q7 ~5 q2 o9 L& N8 v) c; C//sbit CLK = P1^2; //数据输出& {, |6 @# N1 I7 v: Q
//*********************************//1 `4 H+ s/ c& T8 `/ C, f0 S
sbit RS = P2^0; //1602液晶数据/命令选择端
9 n. N7 z2 r- w9 U0 asbit RW = P2^1; //1602液晶读写端
- f5 l3 N7 D, c+ m- U+ I) a# @sbit E = P2^2; //1602液晶使能端
6 N; |' H" E& A, f' R! K3 Y* d' Lsbit X1 = P2^3;
" A' x& F5 B/ w$ Jsbit X2 = P2^4;6 S- R) f- ]6 C, u' @: @' Z k/ K
sbit X3 = P2^5;
: W$ S$ K F0 }# E( T- _sbit CS=P1^2; //片选引脚
+ g! D) ?- i+ q1 {5 x3 Asbit CLK=P1^3; //时钟脉冲引脚' f" B7 } K. S' I. u+ w
sbit SDO=P1^0; //数据输出引脚
, G3 u, e) V0 p# R$ k& M; Csbit SDI=P1^1; //数据输入引脚+ y1 S3 n) c9 q4 r. c
sbit EOC=P1^4; //转换结束引脚+ ~3 N+ O9 I7 n
//*********ADC0809管脚配置************//
/ o9 |; S0 `! B( ^# u5 c//sbit ALE = P1^3; //地址锁存允许信号9 M# n4 ?+ p& V- P: _8 t
//sbit CLK = P1^4; //时钟脉冲输入端- {. i. }* N: D3 E9 O. C! Y. h+ v
//sbit ST = P1^5; //A/D转换启动信号, \( y% E. u0 u0 R
//sbit EOC = P1^6; //A/D转换结束信号: c! f" Z. M. q$ `. B2 Y
//sbit OE = P1^7; //数据输出允许信号2 d% m5 D7 E, f6 z
//sbit ADD_A = P1^0; //地址选择输入端6 P7 s( l0 m2 j. \; D
//sbit ADD_B = P1^1;( Z, S8 `: I* ~
//sbit ADD_C = P1^2;
0 `7 d; L( o" ~$ Y) L+ q, }//************************************//
. y# r4 S. H) w7 y// Function Prototypes
$ r4 E0 u9 A+ h) o( S; u2 @0 Avoid check_busy(void);; Y9 }/ C$ L7 Q" m# r
void write_command(uchar com);
8 a& z7 @ C& q3 Mvoid write_date(uchar date);: Z0 P& h& c2 e
void LCD_init(void);
/ u4 |/ O2 k, ]1 T2 h! Jvoid string(uchar ad ,uchar *s);6 r" K/ ?% i& Q' V
//void lcd_test(void);
% i( G7 a1 R# Lvoid delay(uint);
7 v/ U4 N1 i; v& b% fvoid Volt_To_LCD1602(void);) C) \2 w8 Z, |% K
void delay_ms(uint xms);: L* K/ z R2 m" x
void Data_Conversion(void);
; q1 _: u0 U: O1 c//uchar TLC549_ADC(void);# M" {0 L7 X& D: i: u5 R
/*******************************************1 ^" O7 b, ~- J# ^: P
LCD1602 driver mapped as IO peripheral
* g& d6 C- M* b7 k3 ~1 ^*******************************************/ ! M0 J5 Y, n; Q( q
// Delay
/ H0 F w; a, A' w3 Z! H% W// Delay
A. E6 H. I8 ]void delay(uint j)
& x. A5 U, l% z{ / z. y2 @. x& d" O ~5 |, p
uchar m = 60;+ ]' o2 \6 g9 g" \% q r
for(; j>0; j--)2 a4 b. m" ^5 T3 b/ @! V I; \
{
% o, T7 S6 u! e4 m: q while(--m);. M& z/ X5 L- t1 J! v, R* X, j
m = 59;) g6 f1 z2 U8 Z g# i. T
while(--m);0 x" [. ?. J+ U7 E; g( `8 @
m = 60;( C% M7 x9 Y* ~6 w' G
} A- g+ Q4 `, ~& g5 w: _+ D+ w& }
}' x, X0 i! u- ^* m5 I9 C
s% d) @0 c0 h' q9 H
// Test the Busy bit
2 T* d. ^5 ^: s# Yvoid check_busy(void). S8 j; R) i* e6 g, N+ g
{ ' Y! D( Z- B# K8 ~& \
do. K7 j* `0 P5 B+ N& t0 B: X' g
{ ; g+ C N7 [3 o) {
P0 = 0xff;
' t/ p& k! \; O. _' U E = 0;
2 {5 \- P, ~8 d9 M4 ~) n RS = 0; 5 V& ^0 l; \) z. f3 c2 K
RW = 1;0 O. ` h+ @0 W
E = 1;# a: j$ ]( Y, A \
_nop_();, {; `( W# R# `+ k( m7 l5 w
} while(P0 & 0x80);% `& r8 \' ]$ u: p
E = 0;% X) J5 R9 z' C H5 K
}
" E# R2 n4 ~3 R% z4 t/ c @2 r- z
2 B' E9 A% n, ?2 l) a& e// Write a command
( K, g5 d$ @( W* X; L, Tvoid write_command(uchar com)1 p- o: [' q- l& |& @" `
{ o' L! j" D; d* X2 t+ F0 \
check_busy();* J* W, [8 n. |. P1 i' m
E = 0;1 Y2 h% H6 s$ a. f7 f
RS = 0;" N8 d0 l& ]0 u
RW = 0;
" W, X' l* z( G$ b- v5 Q) H P0 = com;
9 b( h% K% {/ Y8 \3 |5 Y1 t8 p" N E = 1;1 q9 w+ z$ i" J! a* o% X! [! L
_nop_();
+ W H: V% l5 Q6 W. [ E = 0;
! k$ e$ M. t9 \# W delay(1);6 ]( f r$ V2 D' l
}
; C% ]# n& R0 r8 q) o+ }; v! X; T" q W" R0 _% p- F# O
// Write Data
. P9 Z$ R* T' Y' H3 kvoid write_date(uchar date)
\3 Y5 `# W7 \" B$ F# _' g6 m9 l{
$ M& p+ c7 E$ O* Q1 k& { ` check_busy();
' H3 ?5 M, ^1 i) E. e2 I% a E = 0;. E5 l& D. p4 G) R$ i- K$ A
RS = 1;
" c+ d) I6 I. l" }2 S2 A RW = 0;
" |0 G; c( }3 E/ Z# V9 ]& d P0 = date;2 ^, c8 Y3 z5 V
E = 1;: ]% I4 v2 n4 u6 S5 z
_nop_();
8 O3 {' A) |1 P4 U9 J6 `* ~ E = 0;- @# A. |8 G! @, J% y' s
delay(1); & r3 ~* a6 ], D% H3 O% D' p6 I4 y8 j2 h
}3 S" g# F7 A ~. h" Y9 `# ]$ v# `
# X; G0 d8 O9 p, {1 h- e
// Initialize LCD controller2 K1 \$ V) J. q( v: ?6 d* I. H
void LCD_init(void)
2 T$ A9 G( g! R6 L! `/ [8 g+ f{ 2 d. E8 g: P3 V- ~7 h/ P
write_command(0x38); // 8-bits, 2 lines, 7x5 dots
0 H6 c" A1 I" i4 s6 l3 d write_command(0x0C); // no cursor, no blink, enable display# e% B/ o, u. I/ c
write_command(0x06); // auto-increment on
3 p- x1 n3 Y5 s- x8 t* K1 P write_command(0x01); // clear screen( M+ U" E. `5 e
delay(1);
( _( R* @% x! o; e4 P3 U% j1 }}
! w1 W% A- d& A! \1 K
3 H% I: \1 H/ M7 x// Display a string
4 d9 O. m4 E9 x" Uvoid string(uchar ad, uchar *s)
9 d) ^9 A! V3 J# L% H6 g{
& w% B. J) [/ b write_command(ad);+ l! i* q! E/ b* Y7 m' `. F
while(*s>0)+ G: f3 M# F- v) \5 N5 F. O
{
! D0 c. C4 B' ~ write_date(*s++);4 j0 ?9 ]" S0 o, i" P2 G s2 E, \
delay(100);$ k6 F; N: X r2 Z4 p
}# m) \: j& J4 X* s
}3 a6 G! [5 |- o/ h# V2 [
//****************************************************//
- l, A. M$ Y) x, A# {//函数名:delay_ms(uint xms)
! m2 q3 p5 Q2 y# N8 A//函数功能:ms级延时函数
# Y/ e% p' O7 U" g# R//***************************************************//, e+ W6 l: S; y# R7 k( p
" _2 A! l' m8 j" a2 Jvoid delay_ms(uint xms)! h8 b& J$ Z9 j& h1 f! m) H. Y
{6 r k; Y) j* P6 w( A
uint x,y;
' w* _ n& i' G5 I2 R for(x=xms;x>0;x--)
+ W/ `6 N6 v+ F4 p3 o+ g$ S" j for(y=110;y>0;y--);
; G E- ^; i O7 X2 f4 ] ) j. u; x9 F# \5 [
}
2 [# J' q. b g9 m! r* d/*" E/ n) ?. }2 h# d4 j
void ADC0808_Init()
8 s: a. B( u1 Z1 \0 V{4 Y* C# `" \) u |# O4 U4 B
ST=0;
* O2 W3 `5 J2 z7 g OE=0;
; r1 b6 e- o) k" o% h# u$ C}* b$ F7 r3 Q- H3 F1 h
*/
2 Q2 d5 C- S$ v' M" ~7 E! {//***************************************************//& q7 u5 V+ G0 W' a/ g# C7 ~# _7 ] }
//函数名称:ADC0808_ADC()5 h; O* d; V5 k/ R" q& D4 q
//函数功能:读取一次A/D转换的数据' t0 t1 s3 X! d, O+ |- \
//***************************************************//
+ ?6 c% B6 O3 }/*
; C, |; x) ?" N X! k% Cvoid ADC0808_ADC()/ J4 l0 U5 ~3 U( J5 b% u$ U
{: a. @# `* s. s
ST=0;
- X- L5 M5 H5 O) g+ I* s, T ST=1; i+ B* ~! e, u+ c
ST=0;6 U$ `, }' t) T& f1 u1 N$ V
//OE=0;
7 t- M, i( b* P$ ` while(EOC==0); //自动发送
8 E4 m: F. ~* W/ I3 \ OE=1;; a x j( Z: R- W# G6 z# l% `; ?
3 R9 _6 m3 K. j2 _}. i9 u: h8 n+ c$ B3 O. i) l
*/
" F2 S+ w9 ^* ?//***************************************************//
" Y& n& c @+ A K0 e9 T//函数名称:TLC549_ADC()% R$ q3 a" d8 [* ^* p, p6 B0 a! @
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换3 n! u4 F7 r2 s9 Y( c
//**************************************************//8 W, E/ i: ^4 a# V- t/ J
/*" X- r' E; A; D, M
uchar TLC549_ADC(void)
4 o- m3 L' L6 U6 o# D/ W5 [) Q{
: a# K6 n3 d- ^ uchar n, tmp;6 ?" }# l( Y q; z% Y
; V' {/ Y+ }3 Z6 @/ V4 T2 [& X
CS = 1; //CS置高,片选无效
# m o: l) \" S- c) X! i) @3 z: ?! c CLK = 0;
2 K2 P; {( h- e4 [0 N1 w7 I) x) t" h' Q$ V6 y2 s! w
CS = 0; //CS置低,片选有效,同时DO输出高位
! ~/ A1 k4 I2 f: n C# u. e _nop_();
" \, R5 z6 I" k. H _nop_(); //适当延迟时间1.4us Setup Time
0 U" N: h3 M8 ?) e
7 C+ z) G: V3 D for(n = 0; n < 8; n++) //串行数据移位输入
' N9 w4 \( k2 `0 R) E4 O' m* Q {
+ w4 ?; V8 f, B8 e tmp <<= 1;
" D6 N, b" m# W% ^1 D! M( y9 b tmp |= DO;
# B1 ?* V; Q/ q# S( z# @ - u# R8 d! ?5 @' X1 k7 E, ?
CLK = 1; //0.4us/ S8 {$ x( M" X4 c; J
_nop_(); //CLK transition time Max 0.1us* x2 L! V3 f }- Y, J* I0 e
CLK = 0; //0.4us
% I: j$ ^1 I9 R% i }) a3 j9 e" }% O d3 h' m. h3 q
CS = 1; //CS置高,片选无效
) ~/ |- O" ]) V- Y1 w4 |; D6 c* g for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us: f+ A# P' l( a
return (tmp);
3 W8 x( Z1 [% ]% \* \}
8 K' X4 d, z& [0 s7 a*/" {2 k9 o2 Y' U. {" a$ t4 \
//****************************************//
& y9 f* ]/ N; b& c J//函数功能:将模拟信号转换为数字信号
! Y: k" t. N) I4 Q+ ^/ d//函数名称:TLC2543_ADC()
' P) g$ f& ?) U- T' a+ r//输入参数:uchar CH_i4 k$ d( [/ d( H, k% Q3 \/ r
//输出参数:uint类型+ x2 ?- u- \! p" P
//****************************************//
' i: L7 K* @: l$ D' _unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值5 z, w2 e, ]0 s- y3 ]" Q
{
6 s6 o9 |# w% k: t7 k. j/ } unsigned int AD_Val = 0;
1 e" h5 b# B) p! x2 m unsigned char i;
7 D6 c$ @7 `* K/ s2 P; L CS = 1; //一个转换周期开始3 E- ?( _+ L) Y9 s! \
EOC = 0;
2 }4 S- d: ?& Q' H( U# q CLK = 0; //为第一个脉冲做准备
, `" Q0 n# E( r% |, e! ]! S _nop_();8 A; G7 r$ W$ q- o3 K! b
_nop_();& p, t i% D1 C4 F1 b X2 `- x {
CS = 0; //CS置0片选有效" ]; j1 ]' }; m( l- B
EOC = 1; //EOC开始应设置为高电平
: M! r/ B) X7 T+ a/ D CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置( X9 j9 l+ C% \
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位5 h! L2 t$ y) l
for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果2 V( u5 ]/ \6 Y3 E4 @6 g
{) y9 I9 W: _# A# V- f
2 Q2 n5 i7 T8 E/ T) `; Y/ X3 O
AD_Val>>=1; //将读取结果逐位右移(先输出的是低位)
8 ?) R3 i* k; I3 ` CLK=0;
+ q/ a( L0 m# w- q3 ]( h _nop_();
& K6 z% R! n$ R$ P0 R! v! u if((CH_i&0x80)==0x80) 1 O$ c" T2 y! u; k4 \4 s& s
SDI=1;
2 ?$ c' ~- B/ Y" d else
% I4 j/ `, t' Z" p# K SDI=0;% l+ M+ ]) _5 E1 Y6 a
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543 x) I N& m2 T: @8 s
CLK=1;
" o8 T: N, o: B _nop_();
' a$ B5 a% X* t, q: C. @ if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
A9 }3 j9 ]2 k1 T {' D m2 G$ S6 E- `- a8 `
AD_Val|=0x800; 0 `* H# _, g7 T8 J; v& C
}+ l$ i" w' }5 D$ q
else
# X! ^5 B3 ]2 ~( c5 w {
. b" E0 T+ k- t AD_Val|=0x000; - Q# B6 @$ W4 C9 a, t9 P# G! M K+ f
}+ g k# u/ E" _8 ~. F: e0 t/ H3 n$ L
}& F; B/ V+ a7 @1 _
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高% T# @+ R2 M8 X
for(i=8;i<12;i++) //读取转换值的第8至第11位- ] n% X& w- o: o+ n: f
{) {7 h4 ]8 o( r, \
AD_Val>>=1;
5 Y1 R9 E1 [- z0 l2 }0 R CLK=0;
7 q, h O1 l0 w7 H; H9 t1 Z2 p- w! T _nop_();
0 W2 x" [" x" W# J/ s! L CLK=1;
3 @& N) G7 ~7 o' e7 w0 M& l s5 P _nop_();
' ?. W D; f4 M# w if(SDO==1) ; O8 b/ m7 e# C$ }% ]% X. f
{
u* x8 \0 p0 P+ y* j AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位! t# D$ A! J9 {! ^ \# ^
}. t# e+ X. V+ v p' f
else7 y8 ]% f" ~) U3 _- T9 v# Y0 g
{
: k$ b; T% O& ? AD_Val|=0x000; //第12位写 ‘0’
, r W$ [) {( i: P; M, X* I }
2 ^1 i, {- ~7 P) B% l } % v j6 `/ i6 O0 ]; A
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
4 I3 ~2 U$ [7 ?- L _nop_(); //给硬件一点转换时间
0 V. v3 C! Z* j! ? _nop_();3 ]8 P( g, h7 a( ^5 R* j' n4 @ r: F
_nop_();
. q" d! Z; R0 k% |! J _nop_();3 N [, L" R9 x8 ^! ?
_nop_();3 b2 g- F* [$ v% C/ q4 o7 T k
_nop_();
& u" }( X; ?$ j7 N* ?8 q CS=1; // 停止转换,高电平无效
$ m7 T% A) V4 D. t1 E% x EOC=0;
/ O7 i& f3 s# [. J return AD_Val;
$ Q4 L( ~0 k; d6 M& \9 A}
( f+ Z2 b5 J8 d0 L" m4 I5 \
Q7 y0 Y; [' f9 V" N//****************************************//
7 w F* B* n+ k; E0 @3 f5 A//函数名称 ata_Conversion()
( N/ @- \4 i* B# @4 @//函数功能:电压换算- P3 B9 { Y) }# y9 q; c% z' ~# ]4 E
//*****************************************//
1 ]! g' p, H; Y( F& D9 A: O! Nvoid Data_Conversion(void)4 K% J- Y1 v& v; ]( V( s$ j% }
{
o W+ n4 x' e+ w9 C uint ad_val;0 S' u9 r8 Z, W+ Y; K3 K7 Z8 ?# Y
unsigned char o,p,k,l;
: h4 J! N( ]; f7 i) G p
8 @8 N: M; b/ a# h! E ad_val = TLC2543_ADC(4);
0 X) P3 a9 O$ e4 I o=ad_val/1000; //取千位数字7 s+ Z+ K- [+ v- C" U
p=(ad_val%1000)/100; //取百位数字
$ }; q9 f( e _8 ]- e1 X k=(ad_val%100)/10; //取十位数字3 `' F- {1 v% [/ G; D+ T1 o
l=ad_val%10; //取个位数字, l! o% m1 D% u7 c
write_command(0x80+0x40);6 K" f, M1 u6 X$ c2 k- k8 c
write_date(0X30+o);
9 F: _7 j, M8 L U& U, [9 @/ Y write_date(0x30+p);
0 g8 D ~( O2 h+ B4 Y7 o write_date(0x30+k);
- w g& H5 l2 ]+ ` m i write_date(0x30+l);
/ J; V* {5 Y# {" r //delay_ms(1000);
9 Q8 H/ Q/ H# r4 V% | }) z if((X3==0)&&(X2==0)) //0-5V
1 ~$ H+ S# E+ z6 v) L {
/ m) K. v3 B! Y //ADD_A = 0;
- ?0 G0 i- C- H! a( [" K //ADD_B = 1;; [3 I$ {9 `& v8 ]# C
//ADD_C = 0;& M* z; ~9 E* H m' i6 T F8 h$ l) Z
Volt = 5.0 / 4096 * ad_val*1000; //(100-500)
$ n, X; C) c4 }# Z; ] LCD[0] = Volt/1000; //千位
+ l1 _5 J0 G/ g& ^8 h1 t
4 w1 J) p$ z% G- U6 W$ c! O LCD[1] = Volt/100%10; //百位
! q! G# B) [! f3 ]5 B LCD[2] = Volt/10%10; //十位
' ^1 q$ t' L) y1 p5 x% o; L LCD[3] = '.'; //小数点
" X: G6 ^2 \( d LCD[4] = Volt%10; //个位3 m( M) C8 Y& U( z$ |& l" {* Y* _9 j2 s
LCD[5] = 'V'; //字符V # X$ e y t# L& Y" e) B- J
# O3 G1 ]5 k1 C6 n write_command(0x80+8);4 H; I- Z+ O1 P5 w3 P
write_date(0x30+LCD[0]);! ~8 j6 y. U- x {: R2 p
+ I6 ?* d" _. d# B write_date(0x30+LCD[1]);
z: E3 X/ [. g8 o$ W write_date(0x30+LCD[2]);
+ ^& O9 \; c4 Q- k: F write_date(LCD[3]);
& y$ { M% v; n! S write_date(0x30+LCD[4]);
+ z+ r$ w4 O9 C2 H) l# Z6 V0 } write_date(LCD[5]);
; \5 Y) u. g/ D2 ~" v) K }
- L g' f* [' N- E" n if((X3==1)&&(X2==0)) //5-50V
0 `+ l1 F. K: u. i {
6 i1 {, {' c# X m! z; D% } //ADD_A = 1;: }6 P! l; _8 j- b3 U! W
//ADD_B = 0;4 w, a2 R$ z; s
//ADD_C = 0;7 q% m" X9 O! A; [2 _* p8 e% o
Volt = 5.0/4096*ad_val*1000; //(50-500)7 R/ [ J0 E& Y F' d6 ? b
LCD[0] = Volt/1000; //千位
& k' x3 ?# c9 y* X
) x) P4 S% F8 S6 E6 d+ G LCD[1] = Volt/100%10; //百位' b8 P2 G& ^* F( Y& C4 r+ \
0 I* ~1 \, i) Y LCD[2] = Volt/10%10; //十位
z. P9 B3 {4 b- ^% r$ ]# Z6 v. h LCD[3] = '.'; //小数点$ s( U2 l1 f9 [" I- T: \
LCD[4] = Volt%10; //个位
" n* n' N9 m3 G- V0 K LCD[5] = 'V'; //字符V $ y2 G: Z8 Z0 b% p! @1 W. f/ h
* ^; M, D6 E% E& m- P, o* j
write_command(0x80+8);
* j" t& o8 g& N: V! @ write_date(0x30+LCD[0]);
1 b# W% _/ X& }! }& i2 @# v' x2 I
8 {# z# a/ l) G _7 c( ?) T6 O: ~# z write_date(0x30+LCD[1]);( Y1 x9 ]* ?7 Z; M8 O
8 Q, M6 j% r6 k" m$ R1 L" K. \0 H
write_date(0x30+LCD[2]);' x( l/ T3 I" B0 h
write_date(LCD[3]);
8 b6 h+ \' @* {9 r- |; B' ` write_date(0x30+LCD[4]);$ R2 l) E ?4 O+ P) e4 k+ H
write_date(LCD[5]);4 _) u5 P. W% m+ w! C7 ^
}
6 Z5 h$ M5 X. M- u if((X3==1)&&(X2==1)) //50V-500V9 `; ` h$ y+ E: j+ Q0 b
{
0 V$ I# {' _% P* G- N* r //ADD_A = 0;6 Q% S; ^5 N3 i/ p4 _( a
//ADD_B = 0;
( p8 @( Q0 A- h, @6 A //ADD_C = 0;
2 p) |$ I4 G3 A; E. g Volt = 5.0/4096*ad_val*1000; //(500-5000)- P f2 R) k; y" t$ e+ n. G
LCD[0] = Volt/1000; //千位
! O# C4 L3 j+ t) u+ e0 Y
( }- m4 U4 G4 B d LCD[1] = Volt/100%10; //百位
( g. M# N( @! p& h" v9 d 8 b* @/ m( u) C& g5 ?, x+ o
LCD[2] = Volt/10%10; //十位% v' u5 T; o& A2 T( }5 [5 k0 H, N
LCD[3] = '.'; //小数点& U. V0 p6 O3 l5 V2 X. d, O
LCD[4] = Volt%10; //个位
1 d# _% |* j, t5 y; C1 K, ?4 ?4 u, a LCD[5] = 'V'; //字符V
' P8 t8 P9 e0 F* ]7 c8 T * q3 `/ s0 }& A4 `$ q& W- _
write_command(0x80+8);; D/ @: i4 K4 f3 `
write_date(0x30+LCD[0]);! y4 @6 a! s Z# ~& y- `! W2 F
: s9 u# n8 F7 k& B. F write_date(0x30+LCD[1]);* z2 t+ j5 [6 g5 |+ `, Z
( p" p _8 _+ n5 @; a% U
write_date(0x30+LCD[2]);
$ h% L' Q& J* x4 y, Y; n write_date(LCD[3]);
% `4 w. W# M/ ^6 P( Z# k) |% m" { j write_date(0x30+LCD[4]);" h1 u; F& A1 F" l
write_date(LCD[5]);* l& ^4 Q: k7 I( g7 u
}
) R7 @ X2 T! |}
# C1 `% J" }6 n) O, q1 Z
2 ?7 t7 O$ p% e0 A% ]; ~void Volt_To_LCD1602(void)
- J3 h* U1 f! P! E( X{
: f" R1 \8 X! \" C: a Data_Conversion(); //电压换算并放大1000倍* m. Y+ }, |! i
}
% g. \: D. e, O+ _4 i% M1 t 4 T& c# I& q/ J. S
int main()
& o7 z3 s! ^8 w, B% K{) [2 ~4 }/ b$ A
//uint m;; H# o$ t3 |3 m* L* A1 G
LCD_init();
# I" d$ f9 e4 Z- Y# A* s //ADC0808_Init();/ b, y3 g( s- o/ \" r; ~- }% T
//ADC0808_ADC();
% o A! C5 Z! P) q- f; T delay_ms(100); 0 }/ ~8 T) g8 p7 l
write_command(0x01);, h q# w* a( _7 j7 p# I
write_command(0x80);+ n8 U" H1 f, N
string(0x80,"Voltage:");/ P$ K/ M; F* Z6 ~8 K; \
//delay_ms(2000);* u% }6 h& I' ^, B/ x6 I& ~
* H- r( }" \1 h% F3 ~# v while(1)7 [- L, O) b$ i4 u9 ^4 o4 u) d
{
+ ~/ l, ~6 e$ e4 x. _$ b
! @- J* t4 D- q# w delay_ms(50);
; P0 d; w, R/ L Volt_To_LCD1602();
- K6 _) l: @. z- @+ Y //delay_ms(4000);0 ]2 F$ ?/ u0 Y5 e
/ S6 V5 z7 O# l- w4 X& t }/ e, ^, L7 p. B0 w
}
* ]; W. F% T0 |- b
下载: ' i! b# K9 P" n5 v. n& l% n
|