EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程, P9 j) p. y' }
' c! [" S1 s G* J( V' C$ G4 @0 u+ p, V* ?! \: q
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
, F2 x3 R% t1 P5 `电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。' E0 e4 `* v8 C- s' G9 y+ w2 F
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。 " F1 x$ t! }4 S/ c& r& T% b
电路原理图 2 [) p8 @5 m2 Z, s
8 U" z4 u# O' d9 s
![]()
2 K% |5 V8 H: N5 K$ s1 m![]()
# O) L; F1 L8 S9 p, Q1 T( O0 h7 A* B![]()
; C8 R: k# W% W0 c1 {- c/ U+ C6 d; V( ^* K0 j4 n! o
#include<reg52.h>( Y q7 ^( [7 S6 x1 k: j; r
#include<intrins.h>1 k) ]9 h0 i; D& B
#define uint unsigned int2 T" d( w# T$ h7 o) E
#define uchar unsigned char
_6 X @$ b- G; p6 A) |% {7 Nuint LCD[6]; //电压数据转换成LCD1602液晶字符显示& J- A7 F% W- {
uint Volt;/ j7 S& Y+ N% V1 N( \
//***********TLC549管脚配置*********//
; w. d/ ~. t, s4 m' S//sbit DO = P1^0; //时钟7 x: P" r% a Y' x
//sbit CS = P1^1; //片选
& v! `3 W9 G" x7 I1 p//sbit CLK = P1^2; //数据输出
% q4 f; j+ b \4 q7 W//*********************************//. V- r6 F& A& e8 e
sbit RS = P2^0; //1602液晶数据/命令选择端
+ B- t$ @' `/ s; t8 U* X; Asbit RW = P2^1; //1602液晶读写端
- x2 ~0 \. L& _& H) F$ G: Isbit E = P2^2; //1602液晶使能端
$ n( _7 @9 o% Ysbit X1 = P2^3;
5 ]3 b. {* C% M* \ ~) C0 K" Fsbit X2 = P2^4;
% T" T( C) _1 y; |sbit X3 = P2^5; m" s% c T# {- O& x) n
sbit CS=P1^2; //片选引脚6 ~8 W5 [5 o* }$ `6 I
sbit CLK=P1^3; //时钟脉冲引脚
& K2 r! z- M: I/ osbit SDO=P1^0; //数据输出引脚0 p0 P# t+ l4 N' R" @# w
sbit SDI=P1^1; //数据输入引脚1 @4 `5 r7 t5 [7 y" V8 f e
sbit EOC=P1^4; //转换结束引脚( w: ^2 x! x3 T! w3 ~8 C4 C) Q
//*********ADC0809管脚配置************//
6 t; b4 N0 I( Q6 E//sbit ALE = P1^3; //地址锁存允许信号% Y% z9 {/ |( N* ^2 [& q
//sbit CLK = P1^4; //时钟脉冲输入端* |1 d) A& s- t/ u9 Z
//sbit ST = P1^5; //A/D转换启动信号6 S" V! F8 t5 Z$ L8 E& c
//sbit EOC = P1^6; //A/D转换结束信号
# c$ }$ i# D, I1 z//sbit OE = P1^7; //数据输出允许信号1 C8 X, g1 T1 f+ \) ^6 T
//sbit ADD_A = P1^0; //地址选择输入端
( p8 @9 m; `5 @; ]1 Y+ g: X//sbit ADD_B = P1^1;4 _7 h* @. n- l+ d& r1 z, s$ ~* t8 k
//sbit ADD_C = P1^2; H3 m7 |' R8 ^/ W" [: c) |! K
//************************************//; Z, g" T6 I& t6 L; g- ?! \. k
// Function Prototypes
1 f9 v B9 A2 dvoid check_busy(void);! z h4 x+ M8 h) r
void write_command(uchar com);
. Q" F- Z, u' Gvoid write_date(uchar date);3 \- }1 H2 L: ?" o2 i) t
void LCD_init(void);' R6 N( P/ ^- o7 |3 J
void string(uchar ad ,uchar *s);
2 Z: B8 H: ^, S7 u; ^$ M//void lcd_test(void);
- z3 c; C* S0 u& M# u6 tvoid delay(uint);7 E3 i+ e3 e/ @5 f. F3 y; O
void Volt_To_LCD1602(void); k5 A }3 L; `3 x
void delay_ms(uint xms);$ H" E) T2 }! w" I
void Data_Conversion(void);3 ` \ E0 S" R- e+ E, U A
//uchar TLC549_ADC(void);
$ ]% T7 O; P. k1 }* d! B/*******************************************
7 a8 [; z* b$ g3 L4 w9 J8 X6 p LCD1602 driver mapped as IO peripheral
4 |/ e3 I8 p9 I- x7 v, x: S*******************************************/ 0 Z3 M$ }# f$ \" b
// Delay$ M) _8 v0 ]7 H8 l+ U8 A
// Delay2 a9 m6 v) I5 f+ V/ M( W* {% S
void delay(uint j)! T7 R+ \% Z. i! } ^
{ % ]$ w7 d4 s7 f g+ t8 W+ q' y4 n
uchar m = 60;
7 x$ @& ~! o! ]* J1 A for(; j>0; j--)) v* w$ A" k* K8 B8 R
{
! T! w) C9 M, O while(--m);1 A2 [! }$ B5 T) G0 S/ d7 k
m = 59;5 w2 B( X8 i6 m4 n1 ?
while(--m);
% v) I f* m! o" M( } m = 60;
' T% P: c' j- [5 s, M; h# i }
0 z3 h+ v& P \( c; @- ~6 J/ H* X}
& b0 @5 U2 q) c9 k0 {
" Y/ @5 f; m8 _ j// Test the Busy bit6 ?9 D. R- A0 J/ x& {* w" C
void check_busy(void)# o! @) J$ v$ s5 n8 z
{
( j: g4 [& F& p do
; d- f+ D4 E% [" N, |" D: j- J0 w {
- u: b( o0 u2 [- w n P0 = 0xff;- M. J& R+ y" J4 ~0 U! [# p9 N; ], g
E = 0;
0 U* M3 n& { M, ]( T) l! ] RS = 0; ) i& p. L' [ s; \* O/ \& q
RW = 1;
- |- K1 F P V! P9 ~4 w7 Q E = 1;2 l, ?; V+ A* O% [8 \0 c( p
_nop_();0 Z: h( l) l+ l% X5 }
} while(P0 & 0x80);
5 s4 l# I. M2 M. l. F E = 0;
4 D# }" D$ m' p}
" f0 p5 a0 x9 y9 u9 M5 E A. L+ e2 ?3 q& |; x0 y- |
// Write a command
2 e7 V+ q! }! v, Z( C( Ivoid write_command(uchar com)
7 t3 P& R4 R+ c{ / j! P. U/ ^& o9 a. i" j# _
check_busy(); _7 ^) L- l4 R. w* N1 a( J
E = 0;
- O) r* U% h1 f7 x RS = 0;; }% e% ]+ x" Z+ z2 i. M
RW = 0; I- y% g) Z; W) c) G
P0 = com;2 X( q3 W3 t% {, N" a& X: f
E = 1;) a0 D4 |& l6 J6 Q
_nop_();
9 `0 | Y; \7 o E = 0;# U1 ~/ B2 s% c. C% N; n
delay(1);2 _+ W+ T" M; y- _' X! j8 Q& g
}
- B2 s+ H7 u" Y; D# }; k7 c" r$ U
- ^7 Y2 t% t: l! N3 O% u9 P0 h// Write Data
4 C V8 G5 ?: T& p! lvoid write_date(uchar date)
; C l9 D5 H" ]! L; V{
" [, f: o: O3 f& c, i. N check_busy();+ y$ l& L& U8 r5 A0 O$ F0 l( c
E = 0;
7 Q7 W( P+ D+ B# V RS = 1;/ T2 O' C1 x) K& l( ?
RW = 0;
! |: ~+ g/ L7 B0 [ P0 = date;, L5 @7 y3 F& `6 m1 l9 q- v2 e
E = 1;
6 G8 F% A; ?# S3 Y7 \+ y9 H# } _nop_();
* Q/ O- {% ~* f! G9 l. y E = 0;
: v" i* c5 Z7 j6 k; L delay(1);
1 p) Y3 k% x$ M" v) f1 G& q9 `}- F9 z2 Z9 B0 u
9 r6 I. F7 `5 |" M3 v) y8 J; N/ D' h// Initialize LCD controller" {6 h8 l- L+ ~3 m" j
void LCD_init(void)
+ n4 U+ f3 n. k{ 9 Y+ i+ x n2 l, r }9 ?+ V
write_command(0x38); // 8-bits, 2 lines, 7x5 dots0 U9 U3 i7 }( c |( y$ Q9 ~/ g
write_command(0x0C); // no cursor, no blink, enable display
3 ?" N" @& i' L8 ?! p1 K write_command(0x06); // auto-increment on
3 y$ d5 _$ H; \' U& x write_command(0x01); // clear screen
9 F9 J! M2 }; ] delay(1);
. g/ h" E5 }- s( V. v; W}" R V. O+ G% J/ b2 B6 o" n" ]( `
: S+ u5 O4 m! D. u, K1 M# ^3 U
// Display a string3 l6 k" [* V7 r
void string(uchar ad, uchar *s)
! _" ^" Q8 v2 Q$ @# U: k{
# t: r8 ?% y8 W z! ^ write_command(ad);2 `6 P; S- b5 s+ _' b
while(*s>0)
; E; t5 c( \% ] {
1 A- R3 U( t: }7 q& T8 O write_date(*s++);- R$ [3 A% m# I2 Z& z' Y
delay(100);
+ |3 O& L! l, L }: c1 ^. T j! Z
}
1 n7 g- A) V$ o# a& c& p" Q//****************************************************//
7 ?& e9 V9 U& J6 _* b//函数名:delay_ms(uint xms)# _) I0 c% M, ?% ^2 F2 K! l
//函数功能:ms级延时函数( s8 }6 M, i9 t. r# y; i& w' I
//***************************************************//
3 ]6 D/ f6 s |8 _$ T N) U" Y. Y \6 g3 g& J V+ J
void delay_ms(uint xms). Q/ \/ C' ]: p6 _4 n) N( _
{
. p7 i; I! h' w0 J uint x,y;
/ a* l, R! D/ h T# _# ] for(x=xms;x>0;x--)
- ^8 q: Z1 Z- F' a" N- s8 k for(y=110;y>0;y--);
) d! @5 E! a' { % C/ g5 y8 z7 \( k! M( F
}! G2 t0 k. n: k7 b: l
/*$ f, i* y, X+ r. L8 w9 c' Z
void ADC0808_Init()
' t* z+ s7 |! t5 g; u{
1 l( F. A% V) M" ]$ ^( F4 x2 b ST=0;
' x8 q" p/ s: N9 r OE=0;. H. A2 A, Q: a, O- @3 ]8 b
}7 I* o* _3 `6 S6 M) @6 f' ]
*/ Y3 {. T9 ?. ?, U+ o- p' V1 K1 k
//***************************************************//
7 V. }9 V' J5 n/ ^0 P) z//函数名称:ADC0808_ADC()
4 W/ i! x3 q b# v; g//函数功能:读取一次A/D转换的数据: K: {$ i- i3 R. G7 h$ a2 O2 U
//***************************************************//
" P }/ R$ ^$ F7 L# Y2 z7 |/*
+ X# R( d9 [% b! xvoid ADC0808_ADC()
( Q; j# z" h# V4 K" |) `{
; T4 z8 x: ~ Z ST=0;( e! E$ ~5 P) {/ z. G* L
ST=1;
+ e" i0 ~2 ?! v) t) ? ST=0;
H. ?8 [. ], D" ~" ^ //OE=0;
5 W4 }# \5 w0 `5 V. _5 @ while(EOC==0); //自动发送3 S) U) q' ^! Z" L% h& G2 S' ?
OE=1;
# z6 ]! D( G g. y9 h; o( }0 H9 M4 r; v- H
}
& J3 R1 z; c1 ~9 g# Q*// e" k; Y( m1 `0 g
//***************************************************//
5 }" O& F' i8 ^ w7 E+ e0 p. u+ g//函数名称:TLC549_ADC()
5 y4 X+ j5 }. Y0 z" T* h//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
( d# A U0 [. N5 X; i//**************************************************//1 \1 B4 `7 v# m- d
/*
% e4 _& ^" ~5 Q' k0 K3 u' e( ]uchar TLC549_ADC(void)
# N) n2 V% S) I* P{
+ m* k0 L( P& T% q4 |' k3 z uchar n, tmp;& R8 Q! b! J. S1 v, C% ^
! @% j* Z# u1 P/ L* p: o/ o CS = 1; //CS置高,片选无效 H; L# h. L* s+ P
CLK = 0;
7 M0 w" m G8 e/ X `
' i" @# _$ A- \* Q CS = 0; //CS置低,片选有效,同时DO输出高位! T5 G+ m4 ?$ G- G. M
_nop_();+ o) E/ o( `# a% `3 C5 c7 B
_nop_(); //适当延迟时间1.4us Setup Time
# \, l6 O- `* k1 ]2 ^
/ N- y5 Q. {; T: N; T( I+ @ for(n = 0; n < 8; n++) //串行数据移位输入& Y7 V* o; k- c% R7 V- _0 W
{ 4 n/ n8 g( Y/ M' Z
tmp <<= 1;
% |. }5 F! x) H( u tmp |= DO;
4 m& q* W! B" p/ o4 X# x- ^8 j2 d
4 S( ]" g7 d( v% p6 q8 ` CLK = 1; //0.4us& E2 [# X- k( r0 @3 k
_nop_(); //CLK transition time Max 0.1us
. p k) _% Q# x: ?: R CLK = 0; //0.4us - }- N2 F1 ^6 x3 K2 U
}
( t6 c+ f& \" h; c3 D% W' | CS = 1; //CS置高,片选无效7 v; q! T' Z7 p
for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us
' ]# V0 V F. z6 A$ n3 ` return (tmp);
3 z% Y: R2 w) Y) \$ [, l}& _& T& y5 E9 z( l6 j' A
*/
{( k! d9 q( b' O5 z2 a. k//****************************************//$ j3 S* K2 B _1 u; q5 ]( V B! o
//函数功能:将模拟信号转换为数字信号
% q9 K. F4 t/ E* x//函数名称:TLC2543_ADC()8 D" W0 w+ F) G/ w* [
//输入参数:uchar CH_i1 s3 ^5 s5 k: w8 ^
//输出参数:uint类型
2 y# C: o* [& q/ \2 m//****************************************//0 h _0 ]' y# K5 j- D r
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值
2 u+ l* u* S9 G* d4 _$ h; S{
L- I' j9 }+ i0 m5 M) S2 c& r unsigned int AD_Val = 0;3 ]4 T% @+ _+ a2 y7 S
unsigned char i;9 H' h6 v5 \% K& e! k
CS = 1; //一个转换周期开始9 F/ ^" ]3 j- r- F# R, w# S
EOC = 0;7 [4 t7 m7 H( }
CLK = 0; //为第一个脉冲做准备& [; Q8 [. L) ?* L5 q
_nop_();- R4 Z H9 o n% a4 \& F e
_nop_();
6 w3 c2 c ~9 g6 |( J CS = 0; //CS置0片选有效
4 T, r1 m. g3 n! k EOC = 1; //EOC开始应设置为高电平, V. ^2 i x; ]- z, Z$ A$ N
CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置5 c1 M/ c+ x6 ?
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
0 y! _3 p1 _& L7 E/ `: k for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
* e _+ _- Y* C* s1 D. u {
! B8 Q5 W: G" O% ?
. K" l1 p4 C) u9 t" f! z* x AD_Val>>=1; //将读取结果逐位右移(先输出的是低位) ; l, F; }6 r. S& L, N
CLK=0;1 D% X6 O F# m4 R- @" S
_nop_();9 h1 E( o, h+ T8 a: e& ?1 d
if((CH_i&0x80)==0x80) " F9 g8 T# y' }1 k3 }
SDI=1; 9 N: L8 O. b$ E8 ~3 C5 a
else
. A5 K9 x' w( W, @; M5 R# Y: n SDI=0;' u7 e6 r9 s$ Q. q$ o) J, v
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543' j# l" \, T% h/ K
CLK=1;
6 A% U. \3 M: J1 h0 d( a _nop_();
1 k! J! S$ M, i! @1 i0 E8 M; [ if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
( s. f) G1 j6 G {% O, G! [+ j1 W
AD_Val|=0x800;
, v. y3 @ E8 t- j( ?4 C' r }
& s! p. L% _ K5 X" g( j: P else% h) c, j6 P% P
{. d5 N E, `, J1 z0 P. I) v
AD_Val|=0x000; % ^9 l3 a$ R% Y3 _
}
5 _) P3 E7 B; c6 O5 U H, Z$ i }
B' E8 P) ~; [5 w3 c4 }0 z/ F7 x SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高. N& l# C& E4 e8 p5 ?0 y; {) B% e
for(i=8;i<12;i++) //读取转换值的第8至第11位
5 Y0 k8 V% @2 o {) g; w9 K3 x- y! X- d
AD_Val>>=1;
4 e. `. B" V' `' C+ d0 Q9 z7 j$ W: X CLK=0;
( t' ?6 j: ^) g. O, l c& | _nop_(); # Z9 c4 y9 n" E: G
CLK=1;
/ L0 Y1 {* m0 C! C7 C& d9 v; W _nop_();- V# S4 K2 @" _& R
if(SDO==1)
, d1 }8 u1 T' j" g/ B) o W2 Z9 r {
# K4 |$ I: y+ Q+ U3 X AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位- q0 H# z( W" v9 I' M) E2 I- @
}! u5 T- j( Z: ?& r6 \
else) q; H2 O' p2 h8 R0 [
{
# v- w6 Z# M8 ?. c. B0 X AD_Val|=0x000; //第12位写 ‘0’
6 @7 V, W2 c9 V! j }! j8 a* x+ I2 D8 F3 C! `
} " ], a. q- t! n5 J, Z) ]
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
1 `0 r% W9 H4 T3 H3 q' K J& n _nop_(); //给硬件一点转换时间1 L; J5 B2 ?' A3 k$ y' d
_nop_();3 ]1 _' x% @5 E; ~0 k$ C
_nop_();
4 v0 Z( C; v2 d _nop_();0 q2 _4 J A* @0 ]
_nop_();
- @! O) l1 r% N' K s8 B _nop_();
* F; I R, {, d1 ?: J5 R2 R CS=1; // 停止转换,高电平无效9 p1 L# K- p7 |! m4 d
EOC=0;
0 k* e2 i, o x return AD_Val;$ r" J. `4 }* W9 z! `
}
3 V" z+ s% A: M7 V. [: t2 O) a6 L
2 S* j/ A1 \; u( l2 P; ]/ e. X$ U//****************************************// Q! \+ S& C9 n+ o0 d
//函数名称 ata_Conversion()0 z7 }3 k/ ^1 p7 N
//函数功能:电压换算
6 Q5 e6 U7 C! w- Z* B) U4 x2 B7 W//*****************************************//! F; Y B; {- @9 T: C# A7 U
void Data_Conversion(void)
$ z) ~$ n; i, [6 n+ T3 C) g8 T{
7 ^- t2 C# f4 Q: t9 f. ^ uint ad_val;
2 ^# m* y) D" G$ K) B/ S unsigned char o,p,k,l;
& |/ j4 W, Z+ q7 v
r1 {; P2 Y4 S. U2 q" R7 a& R1 L ad_val = TLC2543_ADC(4);2 [* ~0 B+ ]' x: a4 G
o=ad_val/1000; //取千位数字0 \3 m, Y9 g: Y
p=(ad_val%1000)/100; //取百位数字
- \- L0 U6 }# `0 u* i k=(ad_val%100)/10; //取十位数字 v4 |9 p. ~- G2 x
l=ad_val%10; //取个位数字
7 e$ b1 q, d8 P9 \2 | write_command(0x80+0x40);4 g% p! m( w0 D. f$ c: q1 K- ?
write_date(0X30+o);
# `- n v& L* ^2 k$ ~/ Q$ O write_date(0x30+p);
& v2 L$ ~9 Z7 E write_date(0x30+k);* j2 j9 H3 g6 S$ L& Z# I4 x$ }
write_date(0x30+l);
& v6 s% h, N! G6 [ //delay_ms(1000);3 C0 _! c0 f$ n* D' y+ I, ~
if((X3==0)&&(X2==0)) //0-5V5 \0 V, G$ V! L% J
{" O' U1 p4 c" k; q& O3 p4 k
//ADD_A = 0;
/ a: ^2 A. I6 I& C4 O //ADD_B = 1;+ B, X! ]5 l& o |' ^6 b% _
//ADD_C = 0;
* G6 L3 |4 M- t3 |. m Volt = 5.0 / 4096 * ad_val*1000; //(100-500). ~. p& t; K5 U; Y' G
LCD[0] = Volt/1000; //千位
5 P: E" V# c# Q7 x+ ?; C 7 u' h" _! }* E: V- I3 ^0 o/ g: i
LCD[1] = Volt/100%10; //百位
5 T- w0 Q+ \* v% l8 |8 C LCD[2] = Volt/10%10; //十位, p( t+ \$ z3 s% ?6 P* s
LCD[3] = '.'; //小数点# X& W: r, V, ?4 N' @+ W" Y! ^/ R! v, A
LCD[4] = Volt%10; //个位" R7 |; I! K- Z; `- }
LCD[5] = 'V'; //字符V 4 T8 j4 G0 ~! V
% V4 p# m! _; V/ S
write_command(0x80+8);$ s3 @) Y, {1 h
write_date(0x30+LCD[0]); v1 `* {( n8 J9 d3 _5 O3 ~
" r( H) G- p" x8 H0 c4 @6 K/ R* o* c write_date(0x30+LCD[1]);
$ E- `0 m2 W2 @. D9 h ] write_date(0x30+LCD[2]);+ B; b3 O8 u! T5 d; o, k# P! {8 I
write_date(LCD[3]);( a& T! F( D, q$ Q9 u$ B0 T
write_date(0x30+LCD[4]);
' T; X' K9 u) N/ o4 }8 d write_date(LCD[5]);
) C; y9 @& s4 \( ?7 }$ e r! z }, J7 }4 a- Y% i
if((X3==1)&&(X2==0)) //5-50V0 f& j, i9 a+ p. x+ i+ K* D
{2 d4 b- u' p ]- }
//ADD_A = 1;
# F8 k$ l. k" _/ o/ C' m5 C% B //ADD_B = 0;
1 D) [. g' p A* Q( y //ADD_C = 0;
( F, P5 V4 E Y9 _1 p) X% O Volt = 5.0/4096*ad_val*1000; //(50-500)1 O" T: t! I5 s# f; D
LCD[0] = Volt/1000; //千位1 j! @2 u- I5 @5 ^- ~- B2 k, [
( o: _) m* e4 t2 e2 V LCD[1] = Volt/100%10; //百位
T: s6 g! {' n' w6 W
. z5 e8 J w; G6 X) t LCD[2] = Volt/10%10; //十位& u+ t; ?8 j% I: K' p* U
LCD[3] = '.'; //小数点2 g; f. h# N2 ~6 I
LCD[4] = Volt%10; //个位
( V* Q* a1 ~* i4 }3 w9 G LCD[5] = 'V'; //字符V
1 {1 m& Y) o+ V4 |. B
' x3 J; P' a+ V5 C- O write_command(0x80+8);
- n, m9 P# ^8 c write_date(0x30+LCD[0]);7 A; M$ Z5 C, m( D; g( W
7 I0 m! X3 M# i1 P+ h write_date(0x30+LCD[1]);
4 j4 m# m% x+ b/ [' L
) e" c2 z' u. ^* |+ r3 y write_date(0x30+LCD[2]);
8 Y9 y1 Y. r1 @* B' q$ c$ c write_date(LCD[3]);
6 F+ n3 h. B) V( I! k+ i write_date(0x30+LCD[4]);
8 W3 x( _) w& `# y- u write_date(LCD[5]);2 {0 ?8 t* ]% P# [/ @1 \6 k
}
# V, z B- ?% R# O8 n* a if((X3==1)&&(X2==1)) //50V-500V+ }/ r6 I+ f x2 F
{( u3 {# C4 W- f+ B$ |4 f& T4 p7 K
//ADD_A = 0;
& Y/ \% R. a1 T' T Q/ X; L# i //ADD_B = 0;; o# I: j, D% j6 ~4 e! O
//ADD_C = 0; Z' w0 A2 V; m- P& H
Volt = 5.0/4096*ad_val*1000; //(500-5000)
8 N+ P, Y. l& b/ [; g, C( O+ B( \ LCD[0] = Volt/1000; //千位6 j( D- q" m; k) o. y: f! X U
- s- ?: j3 b) @/ g LCD[1] = Volt/100%10; //百位
* P* N5 d% Q9 v, ?$ d4 T : V/ i/ w/ \5 O% d* c
LCD[2] = Volt/10%10; //十位
8 n P7 `6 E9 t9 M LCD[3] = '.'; //小数点
. }, y8 B2 d2 W. v LCD[4] = Volt%10; //个位8 a9 V* ~& d7 z6 ]& F6 y8 R
LCD[5] = 'V'; //字符V ) N6 b. M3 _( D- O! d
) A! }& o6 ^/ W
write_command(0x80+8);+ O1 o* m' X5 w& X1 ?6 b4 h j
write_date(0x30+LCD[0]);. i* w4 v. a- D1 ?
4 o9 D& e, l' k6 Y! x/ N9 L write_date(0x30+LCD[1]);& ]7 x, S5 [7 Y7 c3 h, \, j
L3 [: X4 v; \+ r: P! E0 v0 U$ z write_date(0x30+LCD[2]);
V' ?7 S" N6 G, U2 z( T! A# h write_date(LCD[3]);
" c/ y. _ q* l8 G, C B& T4 [ write_date(0x30+LCD[4]);3 k- a; c2 [' t2 l' `. V
write_date(LCD[5]);
6 l2 B6 t5 l1 M S8 e- F5 H+ l/ v }
8 A6 ~9 t* N2 Y' g$ ]0 C} o& B% `) e6 O* ]! Q$ e
2 J1 G. T0 y( _" H
void Volt_To_LCD1602(void)
( ?5 U3 S2 U$ E% ^! E; M, v% `3 G{
# i# x$ A/ _$ @6 L Data_Conversion(); //电压换算并放大1000倍
% E5 K$ t8 t% @9 u' u}
) S" c! W" n, r5 z Z
% p, c0 V: f! I/ vint main()+ j' d! v6 o# p6 \
{
c8 l* |& @5 ]/ F5 y: ]$ r //uint m;$ A$ N5 X. X; t) t' X& s8 F8 [
LCD_init();
4 V' a" k( g0 Z! R //ADC0808_Init();
% g4 x7 R" w8 P8 E% D# f& r //ADC0808_ADC();- F n, H/ O4 a. c v! S C$ N2 q1 K
delay_ms(100); 0 d n( E; K* |2 t& z
write_command(0x01);( O; u2 t# p/ P
write_command(0x80);
! F4 f( \, G" ]& h X' k2 ^ string(0x80,"Voltage:");
; }( W/ M* ~6 D4 E8 Z' s$ D& D2 u* ] //delay_ms(2000);- v5 C2 h/ O9 l2 Z5 Q( n$ ?
) j1 P, `: y0 F o. [8 E
while(1)
$ n y* t, a* P; K2 ]' _ {
" J8 }8 h# E8 a% I3 q* U: l, ]8 O6 V- I* ?% p6 U; |
delay_ms(50);& p F y4 l) E9 R
Volt_To_LCD1602();
8 d. T, Y" H, c( Z* Z //delay_ms(4000);
; ]& d2 _7 B% q4 f: n
6 ~2 a# [* @- r* E" ?# l3 H } |$ q1 P9 j! p2 Z# Z
}
+ Q! M2 m8 A( v) J+ d
下载: - f" B8 h4 H+ b, i) p! E0 _# Q- h [ E
|