EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程1 Z% e6 D9 Y0 q9 G$ R9 v1 n4 z
, d x2 T! }8 @
# f2 }+ `2 J/ p1 j, N实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
" s: c! Z/ l g7 g' d& Z电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。
" U3 b; U; U9 K( d) C) E不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。 7 p- N' U2 K# s! K3 _
电路原理图 ![]()
' L' ?3 l% {8 D/ s# k2 u( E![]()
% T6 h3 \' h+ V& y5 E![]()
/ S: P# H h# Z% c![]()
3 o4 ^, i3 N/ `+ j+ Q$ d![]()
5 V0 o7 L* z: |7 p- E3 D- ` P7 C+ ]( j+ f: F
#include<reg52.h>( j0 |5 ]$ W3 m: n7 X% I9 R% g5 \- \
#include<intrins.h>/ t/ B% I0 e, D# j+ z
#define uint unsigned int- q9 c' D: e% k7 E1 h) p
#define uchar unsigned char
. Z, d( x# @. E' A6 Zuint LCD[6]; //电压数据转换成LCD1602液晶字符显示% u- ?" G- h h" l$ @& W
uint Volt;
' o+ a' s6 B1 A! P//***********TLC549管脚配置*********//; g* D" [: W, [2 X5 R, H! U
//sbit DO = P1^0; //时钟' s4 b3 n: l8 }1 y/ O# }1 k
//sbit CS = P1^1; //片选
?! f$ V, J" G' T//sbit CLK = P1^2; //数据输出
. t! ]4 W* \' E/ ]//*********************************/// I7 M: Y; }' E5 f) d
sbit RS = P2^0; //1602液晶数据/命令选择端
5 b) {1 T( _7 Z; h2 \$ p) ?sbit RW = P2^1; //1602液晶读写端
+ O8 e: E" N! Z: S4 g' Jsbit E = P2^2; //1602液晶使能端$ {: U! r2 U6 {/ {
sbit X1 = P2^3;
/ \- D: n' f3 @4 O$ t/ X5 q2 Tsbit X2 = P2^4;
! I2 `& I1 k! O$ Rsbit X3 = P2^5;
# l6 ?8 ?4 K* m |sbit CS=P1^2; //片选引脚% c6 {8 c! }& V
sbit CLK=P1^3; //时钟脉冲引脚
8 Q9 ?& P: r: l; a7 M, m, D* u, \* Lsbit SDO=P1^0; //数据输出引脚- g' C" f. {# X u3 U
sbit SDI=P1^1; //数据输入引脚/ M/ h) i1 i8 ?& ^4 N3 p0 @
sbit EOC=P1^4; //转换结束引脚/ d; }% E0 R W6 s' X( s5 z
//*********ADC0809管脚配置************//& Y( A9 W. T+ S
//sbit ALE = P1^3; //地址锁存允许信号1 o7 ]$ x5 b3 ?& u+ w+ p# `
//sbit CLK = P1^4; //时钟脉冲输入端
4 I! O5 n1 X' d1 b' {! Y) A//sbit ST = P1^5; //A/D转换启动信号' A9 B& c5 a1 e
//sbit EOC = P1^6; //A/D转换结束信号8 T# K u$ Q ]1 U
//sbit OE = P1^7; //数据输出允许信号5 Q- {: l# p. @. Q
//sbit ADD_A = P1^0; //地址选择输入端
$ W- J1 A2 l' r7 d//sbit ADD_B = P1^1;$ i$ H6 A& Q( o m* R2 N
//sbit ADD_C = P1^2;
9 H% V- m2 I: H( u; n//************************************//4 I/ T; j9 [0 a! K6 X$ Q
// Function Prototypes$ ?& g# ~& f+ L& _9 J
void check_busy(void);
1 y0 f' @( T1 d- |( n# Xvoid write_command(uchar com);$ D4 {9 j1 o3 N5 }) o+ M* x
void write_date(uchar date);
! o! B" k" }( ~2 @' F3 w3 M+ ^8 Xvoid LCD_init(void);
6 q) i: Y/ _# R7 qvoid string(uchar ad ,uchar *s);
9 t7 B* |3 r8 a) z//void lcd_test(void);
4 F# a9 B9 s% ]: e/ A: fvoid delay(uint);4 D1 F6 G2 D0 @, W
void Volt_To_LCD1602(void);2 W W9 _2 w; H( B- ?! `1 M4 J
void delay_ms(uint xms);# Z2 F X8 ]% u1 g& L
void Data_Conversion(void);9 A% W( [/ p! |( d' m0 W
//uchar TLC549_ADC(void);
o# W6 R( a! l: f3 K/*******************************************8 T; a z5 F5 n2 L
LCD1602 driver mapped as IO peripheral
1 a; `* }! ~; M6 v# u*******************************************/
7 l! h. @9 B# P% ?) W// Delay8 V0 t4 ^ Y9 @( J
// Delay8 m# `9 {; l( C+ }, o
void delay(uint j)0 ^: `# p. z7 u! P' ^! L }4 p+ w" G
{ ) K# d4 X! U% J F* L R3 ?, Q
uchar m = 60;+ @' a" D3 R# \' J2 u) p* _/ j x
for(; j>0; j--)3 n" M! y0 u. k+ k
{ $ w+ H3 M. N! M- Z2 W+ s u
while(--m);
! H Y9 l+ o \5 j9 z6 d$ i* @, a m = 59;9 \; u0 i6 B6 H' `0 }6 A; n
while(--m);
3 Z% b# c& H2 G" J. M& M3 P5 g/ w m = 60;# B1 _7 ?5 g+ ^2 A: F- r6 {* |% m
}
7 u V( }2 v! b7 v) v}
* w1 s% m, e, I2 X( w6 ~$ j5 Y6 F! t5 A
// Test the Busy bit
$ }- v' v) l/ \' p8 _void check_busy(void)
0 b3 l; \8 p! S3 Z: x. C{ % j: f5 h3 _& N2 v
do
5 j {' Y6 A/ d8 r' I4 r { : }/ R/ ?9 y8 o8 N* c
P0 = 0xff;( {. V5 T% y% l! z* Z
E = 0;
( w) D' z/ m5 Q; X: w) C RS = 0; 3 F% B v8 T# u$ }( S, t
RW = 1;+ B6 x0 L! G$ L" k" x0 K
E = 1;0 d+ ?0 `! O8 {" O
_nop_();/ P- L# Y" l- L1 x" h5 c( r
} while(P0 & 0x80);
! {" \5 x. w# _ E = 0;/ e, d+ g* N% j0 p' h {2 g
}# R& Y: ~9 x' S) A9 }& A
& m8 s2 J5 z; C5 ]" J
// Write a command. B0 f1 e! _0 r$ S- P
void write_command(uchar com)/ `/ N1 N9 R" {
{
5 {+ ?4 o& {5 h check_busy();
: a/ r4 o: f0 n* D8 ^/ E8 V: d E = 0;) E4 W5 v0 Y" v- F( b* v: U
RS = 0;
+ V6 Z: F z) H) I) l RW = 0;
' S. I; C1 T1 l P0 = com;* L4 Q) U/ q. I0 |0 ^7 k6 \
E = 1;
+ b! q- c8 s9 v _nop_();9 R' \2 m& D; Y& i, \5 y* v
E = 0;
* |# ?6 e b, N7 ` delay(1);
% e; S" B: m" r8 P3 m6 T h+ U}$ a- F4 A6 k Y6 U0 f7 {+ d
$ k) S1 [& y! P! n
// Write Data
! z" I( _, S2 I2 ]1 Vvoid write_date(uchar date)
' G3 u% L- A o7 s{
3 R p3 Z3 s2 e5 f( b3 m6 L3 p check_busy();
: m/ C# ~* X6 J- E4 j( H E = 0;
Z/ K. e& X# V+ O8 }! u! b RS = 1;
0 m8 b/ |9 `5 u- ^9 l& F RW = 0;
0 x6 @" f" n+ R$ {: t g P0 = date;# `. {5 @- [, W# Q5 u6 l
E = 1;
' j/ |1 F' j# ]2 ] _nop_();, q+ o$ K: m3 s. g6 l* E3 b, [
E = 0;
. \5 ]/ \6 G X5 a; s4 Y delay(1); X$ P6 {& e) u( L3 i4 F3 H) G2 {
}5 i& a3 y9 d m0 X8 ^6 t
5 Y5 [0 n' g# P3 I( s
// Initialize LCD controller N( |" X* Z. K: E+ r w0 [
void LCD_init(void)
# [+ \3 X W! t1 R$ y: I{
; X# c( d5 f# Y; x1 V( U/ I5 l write_command(0x38); // 8-bits, 2 lines, 7x5 dots
0 _' G- [$ J/ E$ |: J) A' X- p write_command(0x0C); // no cursor, no blink, enable display! v% j4 d4 }: v
write_command(0x06); // auto-increment on
) T4 d X" @9 x* @8 U; L {/ X write_command(0x01); // clear screen5 y; P9 A I/ w3 \0 ]
delay(1);
5 x% B( z+ @. u6 Q" M}
h2 s# g: [3 |& ^ _5 D# |
/ S2 g3 j( `& S4 Q* `; b ^// Display a string; @: N/ e- X, w5 X
void string(uchar ad, uchar *s)
5 R1 @: W, t F4 I7 j4 ^. V3 R7 x6 {{ ! a: ?, M, a5 P8 w6 m( y1 I) _
write_command(ad);
+ t% u4 o7 i4 b8 B8 [# i while(*s>0) [: U( |# Z- E. W" |0 R: S( m
{
$ V( G6 Z& |. P. g2 S write_date(*s++);% p8 z! m3 A6 ]. H9 A9 B, u" O
delay(100);
- F/ ^3 f' R4 r# K& f }7 r4 w/ ~# P# k
}3 e* Z; p: n8 u7 \. w( ?3 T" I8 k
//****************************************************//
- D( }% N4 U3 X% `) U, [) V//函数名:delay_ms(uint xms)8 i$ B0 b) ]) G
//函数功能:ms级延时函数4 o4 u4 x# Y$ A G4 {. D) P# i
//***************************************************//0 v% E8 \. U* ^, _7 l
7 i* F) I* P: B: e7 V8 |void delay_ms(uint xms)
. C! {4 w6 p* Z2 n& ^{) A6 w% N6 B0 H/ a3 A, e/ L
uint x,y;
" q* h% Q- `. m+ G$ Z for(x=xms;x>0;x--): C0 R: D7 M# f) s
for(y=110;y>0;y--);
2 Q" z3 }+ q) \! g + k1 d( Q; X1 h
}- f+ k+ X6 ?6 R8 W: b m
/*
: @ X( r# O* c, p- J zvoid ADC0808_Init()
7 ~( X, M$ p; p( u{
/ P. ?. P4 d8 B' J4 d: C ST=0;' ]# k( L! T7 d+ n3 V
OE=0;
8 b( D H7 B* E) r) A}$ A+ o! g8 a0 m
*/
3 m( i: l8 A& }+ r$ M5 K2 p5 ]" h//***************************************************//
' {' ?' y3 _% q( k//函数名称:ADC0808_ADC()/ o. l4 u6 N" }. L2 i V
//函数功能:读取一次A/D转换的数据
! X& F" I* |1 K# Z//***************************************************//1 J! B- E3 `3 V0 F& k
/* V+ h$ W8 u2 H$ j
void ADC0808_ADC()
) |9 f& ]( a' X- c. |, O& j8 h{
1 a8 L/ t/ ?1 D! ` ST=0;3 Q- q/ n+ w! [8 @' t% ]
ST=1;' a! ]( s* B# I8 Y. J! f; a
ST=0;: t+ }; I5 d! x6 H. T0 c+ P( v! M% ?
//OE=0;
x, A9 P( Q' H6 a while(EOC==0); //自动发送0 ?8 }! ]4 ?7 s. @- B1 }2 D
OE=1;. N4 }' f! A! R$ `4 ~
' D% R, \) @! \& w. S' z. m}
; [' |) W) Y& W( R*/
; A H/ [8 j- P' o3 h//***************************************************//
' Y* l; N1 q1 `: S. c# t# ?* M//函数名称:TLC549_ADC()7 x0 ?! C* l, J2 D4 d
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换$ N1 [, o( V6 h4 A$ a2 P
//**************************************************//
}# }" ], Y3 R/*
- n! b9 V/ U( G2 E( G+ Xuchar TLC549_ADC(void)
! `2 @* o m, ^" B( j{$ P5 c# T* _& X) K4 ?7 [4 ?
uchar n, tmp;
+ g7 B1 o A9 z1 L; b6 r
) x2 ~3 R# {) S CS = 1; //CS置高,片选无效
- Z+ T+ o) P' N1 w$ p CLK = 0;
' n' P# ?& M' [; e s4 N- c5 ^4 x9 {$ L. \! g* U8 X, f( e( h
CS = 0; //CS置低,片选有效,同时DO输出高位
! a& x1 T M8 O5 v2 ^$ ]( [. A2 j8 Y _nop_();4 J0 _+ v! T) J5 {( D: D
_nop_(); //适当延迟时间1.4us Setup Time! Q! B8 Y( g6 ]4 j
& ^' g$ F: m/ ^- j1 Q for(n = 0; n < 8; n++) //串行数据移位输入
3 r: U( q1 t4 k7 U d) H2 { { 8 H: M+ w/ f" U( u5 n, v1 @% F
tmp <<= 1;
6 }3 z" x' M) l- O tmp |= DO;5 Q: B/ b7 Q9 d
K+ R' f7 |3 R, m+ j/ E CLK = 1; //0.4us' A. l2 ?2 w) O* @- W
_nop_(); //CLK transition time Max 0.1us/ I% @- b( D3 J4 A0 o6 j
CLK = 0; //0.4us & Z: @' y0 @( a; a
}
$ ?$ ^, d# L+ q' R* p CS = 1; //CS置高,片选无效
$ ~' i5 V3 W: Y% j/ o; I8 k for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us% B; \% Q6 ^/ x7 x; _
return (tmp);
* w5 N* y; V2 }/ D2 a: ^, Y}
; j% `% {6 e. Y, |/ M$ v/ d*/
7 [% w' w* E+ t+ j/ {& {+ _//****************************************//6 m, o; d3 i! ] ]7 J3 R
//函数功能:将模拟信号转换为数字信号0 ?; Z1 t- j) Z8 [
//函数名称:TLC2543_ADC()8 [9 R2 N, B6 y7 O1 L+ x
//输入参数:uchar CH_i& J$ f! i6 |& T9 c9 _
//输出参数:uint类型
" ]. `2 @7 l1 H/ F2 U, e/ S//****************************************//! p- N& x* J7 | j& c% G6 p9 V' p) s
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值5 Y& }- O" [1 m/ N$ J
{
; E6 x5 A0 ]1 r" i' j7 m unsigned int AD_Val = 0;0 ?$ l8 Y' f1 V: P* O8 J4 P
unsigned char i;2 y2 f/ S/ P: O) R1 C x+ {
CS = 1; //一个转换周期开始
3 Z* ]7 E& F+ I/ C& ?: x. q EOC = 0;
9 h ]" f" f6 L3 \. H" ~ CLK = 0; //为第一个脉冲做准备
; P) v/ `2 P* K! z' t( V# y _nop_();
9 B& D" ]" h/ \( v: } _nop_();
, [; J6 [7 z& v4 G CS = 0; //CS置0片选有效7 g, X. y9 z3 S5 f/ |6 R* L4 {. j
EOC = 1; //EOC开始应设置为高电平
7 T% ^( F" y v9 b3 m" ^4 V CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
5 T9 J1 \, K. o; t D% u CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
. f$ `- _9 k0 i5 Q2 Q2 V, z5 T4 p for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
% f/ Y: U! E; A# J0 ^6 d3 | {
+ J$ H' E4 z3 u* R
+ X ^8 e4 v* y4 T1 f AD_Val>>=1; //将读取结果逐位右移(先输出的是低位)
( s" U9 ]5 @) ?& r CLK=0;0 r3 @7 h' D9 L5 I) k4 ~% g) ~
_nop_();
1 z+ ^* w% J( \, ~ if((CH_i&0x80)==0x80) 3 d( x% Y9 d. ?( ^/ S6 t4 D2 x( O
SDI=1;
2 ^) k, q- R2 S else
( q! S/ t/ \0 ~! w& M' e SDI=0;- l3 i2 D9 n/ y# P: E* t
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
) L* O* X2 M! J1 X c1 {$ y CLK=1;
. n0 O/ N/ t* I- M' d _nop_();) Y9 Y. w. v5 p, G+ n, q
if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位' m. ]" g7 M9 \
{
2 v) f" S! c" @; G' }! R$ ^ AD_Val|=0x800;
7 B5 R/ G! g. B6 z8 F! i }. \% M/ ~1 K, Y0 M2 K7 ~, e9 j l9 O" }
else
, }: D4 ~; i2 V. X- W& w0 P {1 k/ Q, m2 M' m
AD_Val|=0x000; ' y# y- b# v+ x. Z1 q2 X
}+ I; x- t: L( d7 y) P: \; }
}9 P" a$ `: W# B+ ^# m& J
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高& V7 {; o& y6 j
for(i=8;i<12;i++) //读取转换值的第8至第11位" Z* T# P/ p3 K
{. ?# _ M. I+ |1 r$ @
AD_Val>>=1; b# q4 _* p$ ?$ h6 G; m2 |- g- |
CLK=0;
% \8 F- N+ q+ J2 r" ~7 u8 b _nop_(); ' `: p( M1 D8 S" ]! b, s
CLK=1; ' y9 q. r; O( b8 g
_nop_();
" `0 I r! D5 Z8 P/ v& W if(SDO==1)
8 V# k5 b) K- Q/ i2 e0 B {
0 O3 V) m/ i) n: @ T3 d( Y4 e AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位. k. g2 x* X3 z4 ] c
}
$ T- `9 g* N) Z- l# I8 |$ R else5 H* x. }9 Y/ f( b
{' f3 p B% D- k# c) R- P
AD_Val|=0x000; //第12位写 ‘0’
) U3 ~, n3 `. D- {# A }
: H8 _/ j# [" e) m! a5 i, \ } & ]& }$ P2 B6 V1 N6 D, i
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,& v- U& R/ N7 W
_nop_(); //给硬件一点转换时间! l" i. ~$ z( B- w/ R
_nop_();
, a9 |7 f. O3 D7 T, t1 V+ s6 T _nop_();/ Z( y7 h! ]/ F" F' A
_nop_();
+ u0 v9 k7 `- ?# u _nop_();: Q& H. X2 w# H
_nop_();
, h; B. E( U0 |- K4 Y: E0 x8 M CS=1; // 停止转换,高电平无效
- @# K! i7 R4 g }1 k' } EOC=0;
, r" L7 m! O f return AD_Val;/ D# d# k# O% Q9 i7 j1 b
} 1 A! x% a. w, f
; o5 X) a: X% H( ?; W
//****************************************//
z+ o$ v2 y8 {/ ~6 ~//函数名称 ata_Conversion()5 W* x) p, y- G) }
//函数功能:电压换算( F: B2 a2 G3 o+ z! _% W- H
//*****************************************//
" |4 y. A7 j# {) Hvoid Data_Conversion(void)2 c' s+ X h) A; H& Q' c
{
% B$ [0 P; g( {# s uint ad_val;
2 {) I E8 K1 O9 F& M( n) i- O3 V unsigned char o,p,k,l;2 t. {' [! d/ e4 u. t
7 p8 L( e3 ?/ A% ]$ z b ad_val = TLC2543_ADC(4);
, u u1 ]+ F" w9 N& M o=ad_val/1000; //取千位数字9 x: y- i3 [! I# Q/ C6 j5 s
p=(ad_val%1000)/100; //取百位数字
$ ~, C, s7 G, n# ^/ N) v) G k=(ad_val%100)/10; //取十位数字
. { S! P" I0 b' G; j7 l l=ad_val%10; //取个位数字
7 r/ P5 w) H/ v( d write_command(0x80+0x40);' U+ T& R# W: W% n! g8 I
write_date(0X30+o);( ?; _) ^( p7 x
write_date(0x30+p);
7 O# M8 Z) \3 Z) ?! {6 P' A6 U write_date(0x30+k); c$ m, e" t5 | N3 O) X
write_date(0x30+l);- u2 Y$ H, l! R9 h+ `3 w3 E5 B8 P
//delay_ms(1000);
; |- h0 w/ e" N/ V* S if((X3==0)&&(X2==0)) //0-5V
7 L6 }" V. E! V: Q. R( G {) a, x3 W; Q, h' g
//ADD_A = 0;
& h# |( o: G6 n5 A //ADD_B = 1;
9 ^: N: g" X, F! H+ v2 Q //ADD_C = 0;6 P# Q' U" D8 _, s
Volt = 5.0 / 4096 * ad_val*1000; //(100-500)
6 b% g2 S/ o/ O, c LCD[0] = Volt/1000; //千位2 a3 M$ s6 ^5 |- k5 `) l2 A% ~3 l
- `* k8 Z* X" Y# e/ W C8 F! `( u LCD[1] = Volt/100%10; //百位4 v- q6 G( [ R& @! O5 `
LCD[2] = Volt/10%10; //十位
6 Z5 q/ w% X& ?7 P LCD[3] = '.'; //小数点6 C8 w. n. m1 Q7 Y
LCD[4] = Volt%10; //个位
g2 Y# W' e( c( U7 L LCD[5] = 'V'; //字符V
& O f5 B; g) ~' Q- B* Z/ b 4 v2 I5 z: x/ a+ M0 Z
write_command(0x80+8);
" Q, O9 k( F; w8 X. K write_date(0x30+LCD[0]);
0 W y, W$ ]& h
0 y( q9 ~9 s! r) l write_date(0x30+LCD[1]);- I4 V4 N2 U% e5 e/ K! K( g
write_date(0x30+LCD[2]);3 Y+ E5 ?- M( r, z
write_date(LCD[3]);7 p5 _ m3 W. @5 i. U9 K3 G
write_date(0x30+LCD[4]);
W5 ~ k% }9 t7 A/ G write_date(LCD[5]);
& b. `5 D" B6 B: Y9 Z }
' y7 K+ g1 F7 Y$ V8 `8 J8 a if((X3==1)&&(X2==0)) //5-50V8 Z8 u: o; k+ j! \, t; y
{
( F) R9 \$ [ g5 E* z6 u //ADD_A = 1;
* E K/ b9 G" E' K! M) A //ADD_B = 0;5 f- p7 w( r$ H* M0 {) u
//ADD_C = 0;
8 z( e% c% Q$ q2 [: D9 |+ \ Volt = 5.0/4096*ad_val*1000; //(50-500)7 A% }! s" J) }* u
LCD[0] = Volt/1000; //千位7 Z' w. `, M' v# H9 s: I- C- y
; |: L/ p6 G1 O4 r: ^2 l' @
LCD[1] = Volt/100%10; //百位
$ ^. W9 D, v+ t- L$ K ) G$ f6 U: J( a
LCD[2] = Volt/10%10; //十位' J4 O% |( T6 Q. b& i
LCD[3] = '.'; //小数点) Y4 I5 P) X- L& |5 _
LCD[4] = Volt%10; //个位* b# Y# p. ?* {7 q
LCD[5] = 'V'; //字符V
! B% G0 {% _( O j! q2 R $ g( D7 t& x, E9 B
write_command(0x80+8);
; U* d: q& v% M' x' `2 W write_date(0x30+LCD[0]);- l/ M1 B6 G* G
9 R) u. N& F8 R, G5 X) ?1 o. m write_date(0x30+LCD[1]);/ ?5 I8 S* o& d [) o+ T! z
8 b- Y$ S1 z4 Y$ Y: Y ?6 G
write_date(0x30+LCD[2]);' i. x6 G4 n+ m- ?( ~" D9 @
write_date(LCD[3]);
* k: q& @* ~. E+ |# ]3 ~, S write_date(0x30+LCD[4]);
( N, l4 a6 W3 W9 J! g1 Y8 i3 [6 z. ` ^ write_date(LCD[5]);, N9 |- k% j. T1 O5 o3 Q% p# W
}2 n2 K5 Y0 _- g* Q
if((X3==1)&&(X2==1)) //50V-500V' x% H" U/ n1 Y! ?$ v: q: K
{. L. ], O7 S& v$ q
//ADD_A = 0;
- U5 e3 H$ x1 ]0 s //ADD_B = 0;7 ?% M$ G" O0 P, l: x
//ADD_C = 0;
M6 J) E' m) M Volt = 5.0/4096*ad_val*1000; //(500-5000)
# Y }, {7 P6 N: ]+ ]1 y' G' J& G LCD[0] = Volt/1000; //千位
. [% f" |; n: C7 l. `7 c , \- [: h# E8 O$ d- Y+ Z4 H
LCD[1] = Volt/100%10; //百位
+ M. j& |1 c; @4 O/ P. ~ - p5 |+ g4 A* T& L8 S. G9 h
LCD[2] = Volt/10%10; //十位
/ {+ I9 V5 E; s. G3 ^ LCD[3] = '.'; //小数点$ l- `3 m/ K' ?8 Q! j! p1 z0 |
LCD[4] = Volt%10; //个位
# a! m+ I- t0 _, `. y: b) X LCD[5] = 'V'; //字符V
( h, c% B$ s1 e1 t
7 K# g+ }0 O8 Q [ write_command(0x80+8);8 g+ Q8 R* ] v% T
write_date(0x30+LCD[0]);
+ q$ e' S' t* \4 l+ N
' |4 T1 m& S: m* y write_date(0x30+LCD[1]);1 P0 W2 W0 ^8 Z! p
- ?2 r% @- @% A* M, [# C2 r write_date(0x30+LCD[2]);7 Z/ @, ~8 {: S# H% e- u% V4 Y0 |
write_date(LCD[3]);9 Q. y( E& L0 C7 Q' ~" H1 Z
write_date(0x30+LCD[4]);
9 e! o( K {7 z# H( j% ]% X" F write_date(LCD[5]);
/ B$ h, L2 H. x7 ~- I" o }. j- o+ A1 d* Y, F/ E
}
7 g( d- Q# p) {% A( T0 s1 @ i0 d
" O: r: J, K! \% V5 z9 w% l' R; z, nvoid Volt_To_LCD1602(void)
! C# _) H3 O/ }- T{
7 Q& I. L+ r7 d; F$ e% j! I Data_Conversion(); //电压换算并放大1000倍
0 m- J# f2 j; n& L1 b) U" T& x}
' q7 z, ^4 p: o5 P- S
* q* {( A' r+ B1 Mint main()2 \& X d+ `6 x. l" D
{
2 @! {. I+ _0 @- v) S5 i! Z* c( { //uint m;
" L- u) C4 R2 M) L LCD_init();
; u3 g$ [, L% \ //ADC0808_Init();9 E, I1 M e( n t, b
//ADC0808_ADC();& [5 g8 w. p: p6 ?+ w# o* E* G
delay_ms(100);
L E& O1 `. b write_command(0x01);6 X6 V% Q; n- M* w
write_command(0x80);
4 g7 c8 r1 [5 H, ?4 T, Y) @# W, Z string(0x80,"Voltage:");: t7 O& a( X# y9 T
//delay_ms(2000);" Z9 H" [1 _/ j W; A* N
; `# Y; P% \+ |& F- |4 L
while(1)- }, v, l( p7 b- U i- \0 m
{! y" L- t1 \$ u# u* ]6 P4 g
" X$ l! s7 G6 i( G% G" q delay_ms(50);
, K- h0 l# c3 ]! n Volt_To_LCD1602();
( b3 k3 d3 q+ A& P- e% {% L4 \9 R9 D //delay_ms(4000);3 X5 I' i1 W! h% J( @ M- N* n
2 i+ X4 r( E2 Q/ b8 z+ K
}
$ W( c1 p% _4 C! Z; b}
6 B6 U1 N! K& u8 k0 Q: G8 p# b
下载: + ~1 p) M2 ~+ x4 N( G
|