EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程
2 C5 s. d5 t8 a2 f+ c: ^1 L* w: r8 \/ d7 K" d$ n
3 t$ W, N! `9 f: x0 a$ U% W实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.& j9 B3 l- j& w7 i3 L. t
电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。 ~4 U& S4 d' F8 v3 G; m; s" U) ?
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
( j/ ?- D& Y: V1 G" H! y
电路原理图 6 a, G) }9 P$ w; K4 ^ f0 O
2 R0 H7 z( _- o+ `/ `
+ t8 L4 r( z) _& l4 L
. E' b1 L8 u2 f( i" @$ ]2 L
![]()
% b% A9 k% }- p5 @8 ` g0 Z' Y: q0 f; C* g+ Y( X( P
#include<reg52.h>
" \0 q/ I' |: m" f8 W1 v#include<intrins.h>$ y3 J* W9 I0 }( s
#define uint unsigned int5 P1 g/ [+ p: a" \4 n
#define uchar unsigned char
5 z. ?8 j7 `& F6 [uint LCD[6]; //电压数据转换成LCD1602液晶字符显示
/ E* D' m5 K- g* j9 ]- Zuint Volt;/ u ~8 n* e6 p9 r, H0 h
//***********TLC549管脚配置*********//% J8 J8 x* \& I% X
//sbit DO = P1^0; //时钟; I4 Q% o4 r- L4 a
//sbit CS = P1^1; //片选
( H5 f1 @3 J0 u) V) E& { j//sbit CLK = P1^2; //数据输出+ R6 E9 {" b8 `" V
//*********************************//
5 l4 p% y) g, b2 Tsbit RS = P2^0; //1602液晶数据/命令选择端
! j# C: s" l; W! e& G- z. xsbit RW = P2^1; //1602液晶读写端; F1 H- t" r3 G/ @ q( m
sbit E = P2^2; //1602液晶使能端' |8 n! |) r# Q% w+ b8 I! A/ Y
sbit X1 = P2^3;" i1 A+ l0 D ^4 L
sbit X2 = P2^4;
' }; `, A1 o; V* M) d7 L- h* d: qsbit X3 = P2^5;
0 _! o: d5 x bsbit CS=P1^2; //片选引脚) |" q( f. Y5 w
sbit CLK=P1^3; //时钟脉冲引脚/ n E7 O& l0 C, J7 t1 B
sbit SDO=P1^0; //数据输出引脚
+ c3 t2 B% m" Q$ [. Gsbit SDI=P1^1; //数据输入引脚
" o) P2 Y7 E) H0 A8 m- tsbit EOC=P1^4; //转换结束引脚$ M/ S1 g4 y8 T8 W& z+ A
//*********ADC0809管脚配置************/// g' W0 ?( Q) \# F M
//sbit ALE = P1^3; //地址锁存允许信号6 r* a4 B, ]9 x$ W8 e
//sbit CLK = P1^4; //时钟脉冲输入端
% G6 L( J1 J/ U8 M: x1 M//sbit ST = P1^5; //A/D转换启动信号
5 h+ `. @* i/ s: l//sbit EOC = P1^6; //A/D转换结束信号$ c$ r* M. X& A
//sbit OE = P1^7; //数据输出允许信号* o' ?( Q, k4 [% E( d1 C
//sbit ADD_A = P1^0; //地址选择输入端: n/ i7 d8 t5 v8 t1 }
//sbit ADD_B = P1^1;
* t- D9 q; f1 k5 k- n& x//sbit ADD_C = P1^2;
* q' U( o, ]! f//************************************//
" X9 z+ W: Y5 {+ f2 W. v// Function Prototypes
& b2 L, r; i+ q. S2 s3 X8 D8 v: M; evoid check_busy(void); u6 B' W2 m( P( {8 }) U
void write_command(uchar com);
9 q$ r2 V. A2 v; Mvoid write_date(uchar date);8 R" _2 ?1 q, E) k; r7 p; J* {& z, N9 N
void LCD_init(void);' o5 M- S! I4 Y: ]
void string(uchar ad ,uchar *s);
6 n/ F2 N0 b. q8 T2 l//void lcd_test(void);8 n8 n8 B* z" }+ S [
void delay(uint);
/ q% g: N! ?" A7 Y8 f' ^3 Svoid Volt_To_LCD1602(void);) `9 Q! P* R! x9 Z6 K6 h. @1 P
void delay_ms(uint xms);, Q) Y+ ^$ h# j
void Data_Conversion(void);
6 H) Q: _4 {1 v: A! W8 V* Q. P//uchar TLC549_ADC(void);
5 ^, ^8 C) G" p; Z. Y' P; R/******************************************** ^" E5 |% R) A1 l! t2 t9 k* G" w* x
LCD1602 driver mapped as IO peripheral6 Q) p* F3 n. ]: j
*******************************************/ / |, `7 T( d2 u
// Delay
) E4 }$ G9 J% U$ v3 V% O; N9 A// Delay
# M. ?( h# W8 e! [! @void delay(uint j)
! W! u8 m/ c- o7 Q" x* ^( k{ ; \& f( Z4 U% S4 n0 [
uchar m = 60;
4 e" m) u) ]( c v+ G9 P6 T for(; j>0; j--)4 f; U0 \4 G' u8 U
{ ( A4 e+ P- ]4 _5 @7 x7 _+ V5 q+ {/ U1 t
while(--m);- q3 u9 Z& ~4 X: h
m = 59;+ l( ]+ Z3 H ]2 \
while(--m);/ y. K0 z' H$ H* p- V. V+ U( Z
m = 60;( \' G& P: P* v3 L+ l7 p0 ?, S
}& f2 o7 J2 h: H, z s3 W! B! ~
}3 i. \) f3 @0 S. t- p+ _
+ P& L, v; H( R1 u: r4 n- |// Test the Busy bit
( G% C( ~9 ?. N* S' Zvoid check_busy(void) k$ H) m/ f8 Z/ l2 J
{ 0 i1 l: C1 u( E0 o. X! v6 h/ {
do4 L- `! k5 }/ t6 M V
{
2 F& `/ d& c) F2 M% L( ~ P0 = 0xff;
4 x$ I& h" O+ P& v" l" M I' Z E = 0;
; E3 D) f2 p z RS = 0; ! \3 k- v, f: L% f) u. u
RW = 1;
! R- R. }; j& J4 E E = 1;# Y, k( G9 b& A" J5 H4 q0 }, X1 U: N
_nop_();
* F& |( t) j1 x7 y6 Y1 w } while(P0 & 0x80);' V7 W. U" T1 U, i# n- ?7 {
E = 0;
* N# K0 X. C0 T* c6 z}- w) p. q h0 _0 d* M
% U3 ^* K1 v, N, m
// Write a command5 L/ s8 o% @% v" b
void write_command(uchar com): w& j9 r: {; ~9 j' N
{
. ?5 \1 F6 k! c: ^$ @/ X# j check_busy();
+ s* x% g T- w E = 0;9 P% v: V/ H: W
RS = 0;# }& W. x+ L4 K, p! |; E- f& n
RW = 0;
+ M& K5 g+ u& Y9 z) F9 e' V6 { P0 = com;
9 {& S9 v! l3 f) h E = 1;
- Q5 E8 k" P. E9 C& [ _nop_();. j5 `3 m& J7 A) U% N* t
E = 0;( C( S1 M) L: {7 P, r1 c+ i$ a5 K
delay(1);" _* r/ d7 n& M
}
g; t, _* i+ b' X7 ?* u4 f7 p7 [9 n* M2 ]+ T1 ^6 ], f
// Write Data- @4 O! Q$ u. L" J( D
void write_date(uchar date)
- `3 S+ L- N0 s" p{ ( D6 i8 x0 w0 A' f0 _0 q
check_busy();
& t4 y8 g; ]9 N' [2 B E = 0;
6 q7 ]* i5 Y& s7 Y% r RS = 1;% {; }/ S$ O' @6 j ~0 g! n3 O
RW = 0;1 U0 L' e& A+ I1 F0 P) v
P0 = date;- A/ ], A7 D: d' ^
E = 1;2 H( n0 i& O9 @8 h: r6 J- x' Z
_nop_();
( G0 x+ y8 B- v6 M E = 0;- X M3 C) g) `
delay(1);
, l9 f/ S$ h M& {}. l$ w$ Q) \9 g9 |7 T% I
5 A9 k! ~: C& M( u% `$ W' u// Initialize LCD controller" H" l# f7 |2 P3 j. g. E2 t
void LCD_init(void)- a6 Z* v# l, e7 I. d
{ & e- Y5 A% }/ ]/ [7 K& S6 k
write_command(0x38); // 8-bits, 2 lines, 7x5 dots
. L& o5 O3 B' U* C9 j8 U z$ S" l write_command(0x0C); // no cursor, no blink, enable display* ~6 H" [1 e4 G0 z
write_command(0x06); // auto-increment on
9 w D1 A/ r9 r% E% S: `5 w write_command(0x01); // clear screen
) J' {; {0 W. E delay(1);( }9 j0 O3 S0 e7 I- @
}3 _! z5 y. K I: |: ?
$ N- C( T; h+ s1 [3 B7 y2 e8 J// Display a string
; O7 F) [, M, V5 hvoid string(uchar ad, uchar *s)
/ W0 b# _/ Q+ o/ w2 `{
: x4 z1 g% r+ G7 k write_command(ad);7 Q$ ]/ C! `3 ?+ M7 ^
while(*s>0)7 X9 j: n3 \( `
{ & ]3 H6 G x7 Q) y4 f1 P
write_date(*s++);
* P* q2 W" g$ C5 l' n delay(100);' N2 u# B& R8 U7 B0 Y+ A0 I
}* q6 k4 s1 @( \9 M% R4 L% r7 s
}
* d4 n3 j& _ o' n! F//****************************************************//
E% l5 c% K4 b' c9 f1 T//函数名:delay_ms(uint xms)
& A7 J! p/ f0 Z% I3 T//函数功能:ms级延时函数# c7 i7 t. }9 m7 P0 e& d
//***************************************************//! i& q. }% v8 F0 k" P5 a( E
4 b( s& D6 z. g3 ivoid delay_ms(uint xms)# L; e) j) a4 P3 T
{
8 H p+ }! _' Z6 P6 P( s' x uint x,y;% C9 u( m, a) y2 I* M
for(x=xms;x>0;x--)
* s7 B9 j$ `- v( R. e! R" A for(y=110;y>0;y--);
! u+ b0 B) g7 I; a- \, d 6 ^- q; ?& T: e8 C4 ?
}
8 p+ A; S: y6 g6 K% \0 `1 K4 {/*
0 `0 Y$ M, L+ o8 xvoid ADC0808_Init()
+ m. L/ @$ s6 P5 Q4 g) ]{
# K% t9 ~" J; K% g+ ? ST=0;
9 F% H9 u/ r1 ?! T( R OE=0;
4 a, |6 M# r) y8 G1 O}
" r; Z1 D) d1 K*/
+ W% d! K" c% j# g6 x//***************************************************//' ]* q" z/ @' X- I' k8 l* z
//函数名称:ADC0808_ADC()- M$ f, d3 O4 C7 G
//函数功能:读取一次A/D转换的数据
0 `6 o5 V: `2 d) k6 m//***************************************************//
; H; N c5 U. Q. N" |/*
9 c3 b2 \$ t* z4 ]5 L% V9 i/ G8 qvoid ADC0808_ADC(): N. x: z3 s1 t7 T' i4 F# v K
{
* @4 O3 r& B1 i1 ~0 q7 t ST=0;
( s* `& T0 t1 a E2 ^7 { ST=1;; y k0 P9 r' }; v. V3 {# q/ W9 N
ST=0;
1 u% m; [' c! I% s, [ //OE=0;% [: d0 |9 S+ S' W
while(EOC==0); //自动发送& h8 M2 C# M$ _
OE=1;2 e8 | z8 K% t+ i: X/ j3 O5 e
; F. x7 f3 X3 f
}/ `$ t* p9 l. a- j0 f
*/& \" z. E2 V4 L+ t. V
//***************************************************//1 W" e$ D5 F6 h9 z( \7 H: v
//函数名称:TLC549_ADC()
q+ n* q: e) n//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换+ p% y; S2 x& P0 i1 @. O1 m
//**************************************************//
" b. |; a0 m1 J* X3 t% Q/*2 Q; H: r; ` j }. c
uchar TLC549_ADC(void)) q6 ?; E/ \% \
{
1 S4 D: x- @ u" J uchar n, tmp;- x0 B) r& ]$ `# e* A
$ N* K! y: C" k4 d) y
CS = 1; //CS置高,片选无效: Q* E" }. c9 Z
CLK = 0;1 x$ f/ X, e) ]; z2 }6 a. ?
( V- O" p$ z# L$ k u
CS = 0; //CS置低,片选有效,同时DO输出高位
% ^8 I. }$ O, i- N6 X _nop_();
2 y" ?9 L$ y3 s. Z8 [$ h& [ _nop_(); //适当延迟时间1.4us Setup Time
+ x4 {0 j+ ?* N! ~) p1 \
; l5 R( y& T0 m: J for(n = 0; n < 8; n++) //串行数据移位输入
. t+ r% ?% x7 i+ r. g: @ {
6 N7 Z4 p3 O0 l3 |; n# N& x tmp <<= 1;3 C/ w3 m3 @9 \+ D: Z
tmp |= DO;
$ M- K+ B( N6 j6 x / R3 t7 {* Q% R8 ?" l
CLK = 1; //0.4us) v6 M3 t/ T; E2 \4 N
_nop_(); //CLK transition time Max 0.1us
1 e* m% ^- X0 l1 ~ CLK = 0; //0.4us
. c' N: {. i. i; ?( F% Y R: l }
1 O' S7 w5 I4 A7 d CS = 1; //CS置高,片选无效8 D; N- i$ }$ l
for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us
* p& C5 n# |' u( u5 x return (tmp);8 a1 x% D8 p) ?6 T
}$ \) d3 y* S% Q+ o8 f
*/1 V9 P( l% P7 j! N
//****************************************// ^) H, J( `& E6 L1 M u
//函数功能:将模拟信号转换为数字信号
1 @8 D% z7 i. E//函数名称:TLC2543_ADC()3 Z R& ~8 [$ h* n
//输入参数:uchar CH_i8 {9 ~7 b" {6 ?5 M4 u2 _- k5 V
//输出参数:uint类型
& X* G8 r1 j$ W//****************************************//( R/ O L7 @- j% [
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值* P3 }" v, i2 A. Z5 f
{
) N# t* K x7 Q/ T unsigned int AD_Val = 0;
/ ~# h$ L3 S% K unsigned char i;
) ?8 d+ Z3 \% U3 ^8 T CS = 1; //一个转换周期开始4 a# {0 M& U# t" E# X9 C
EOC = 0;
( N, |7 }, |( j+ D; e+ \4 E CLK = 0; //为第一个脉冲做准备
& ?( e" V0 ?- q3 Q( H _nop_();6 U9 \- h6 B- k+ D$ ]
_nop_();. v' D8 ]* W f9 ^
CS = 0; //CS置0片选有效
( L8 Q: c" k Y* m EOC = 1; //EOC开始应设置为高电平9 `* ]( t* k9 w2 F2 Z9 ^' V
CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置* M# ~* K% G8 f) s$ L
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位. S: n! |3 |. }6 r5 M) x: [/ |
for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果$ T" B. V- c0 R
{
. z2 v+ h" x# p) v3 _ 1 u8 M2 I! k3 o% [, w
AD_Val>>=1; //将读取结果逐位右移(先输出的是低位)
9 e1 n" Y. r7 o CLK=0;, P5 ?+ @+ z/ k* {
_nop_();: e2 a3 a6 n% g/ R; j- M
if((CH_i&0x80)==0x80) - m z5 J, m5 N6 @3 z' k+ F" c! }
SDI=1; - d* d/ w5 x/ d. B/ C
else6 N( w* r) f1 K) a; w' f; s
SDI=0;
7 ^% H' s% [# ~% i0 D2 M CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
1 ~: R9 E7 ^9 i3 F4 c8 @& K CLK=1;
0 i0 g. V7 b8 O U( O _nop_();
G, e9 R! E! X& C if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位% H) K* Z; x7 ^
{
1 w `: y% ^0 W5 \" C AD_Val|=0x800;
6 [2 u: j6 T1 ]5 Z# Z- ? }
- ?$ O$ {* z8 c9 f! c else; o# o8 n& U8 @7 w
{
* _4 f# j/ W- o- J* p! c AD_Val|=0x000; - J0 P9 e: s8 G0 K# G
}* j( r/ j( \4 n
}0 R" Y6 n7 C3 G1 T; t4 a+ J
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高/ | W- K- C7 D# M7 [4 u7 \' Y
for(i=8;i<12;i++) //读取转换值的第8至第11位
5 j- ^* b* T4 T. N5 P* O6 u' W3 N {2 i# C+ |* f; l
AD_Val>>=1;6 M) a7 \' e4 d/ z: Q# j0 z* o
CLK=0; 3 A4 _* y* a2 H+ `* X! E
_nop_(); 4 W6 ^/ v) m* C. s6 a' c
CLK=1;
2 z1 p U9 b, S# e1 M6 u _nop_();4 s2 z6 k3 y) n2 L
if(SDO==1) 6 n- A# a# A1 I; U+ i
{
, p! k ^* m6 `: R+ A AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
' ^, n3 \$ o/ f" @- n: v( U }
2 N+ q7 T0 Y* U- ?( \) X/ p else7 ]0 Z; |0 \6 }3 R7 Z9 q9 |
{- T7 l( E% T# I: R0 V
AD_Val|=0x000; //第12位写 ‘0’
7 n: G" L* {5 [, N$ E) V }
6 j4 C$ V% M1 }3 ?+ o% L: r/ B" n7 J6 r5 ` }
9 D7 _: w( ?- O+ g' G9 _& _ CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换," G+ Q9 w8 B# ]5 E' I0 w$ U. H( ^9 C
_nop_(); //给硬件一点转换时间
6 b! q- k# S8 y- R _nop_();: W, a& I; P: k8 J& B
_nop_();1 k F8 j- }3 m+ \
_nop_();2 Z+ d; R0 W* X: V( }) Z
_nop_();
0 { B4 v5 d* S( S/ P _nop_();1 H1 J8 s' L- ~8 ]8 b7 N
CS=1; // 停止转换,高电平无效2 {# I! c) H! \+ @ L7 o% Y5 L
EOC=0; 2 R! K6 ?# _ j" N$ q
return AD_Val;( L) A! Z3 ?2 l
}
) O2 p* k4 }% J2 D# x5 ~8 T. y2 ^/ W: }+ a7 b- O/ L
//****************************************//
* j% y, _* S) n9 v' t. f4 ~/ {; q//函数名称 ata_Conversion()& t7 P1 J8 i; G( [9 v2 t
//函数功能:电压换算0 @9 |' z4 A) U* q+ R' I
//*****************************************//
4 Q, ]0 E1 o0 L4 \' _( ?void Data_Conversion(void)! w; X" [$ C3 Y6 m3 b5 r! o
{0 K$ _. h: }! v8 \, \& l- m
uint ad_val;- [$ u5 u4 k# G
unsigned char o,p,k,l;1 p$ B6 W& Q, ^! l7 K
* L$ P. E4 }" o, s# F G: n* j9 I) Z0 k' Z
ad_val = TLC2543_ADC(4);& l3 g( d& |( h2 Y+ r& |4 ^
o=ad_val/1000; //取千位数字
( o. Y4 x9 M7 I4 W p=(ad_val%1000)/100; //取百位数字0 ~2 y; E/ ^- ~6 p
k=(ad_val%100)/10; //取十位数字
" M; W- ]' J2 j4 }( v l=ad_val%10; //取个位数字& v) ]7 |0 N% M7 @9 a$ B* Q
write_command(0x80+0x40);! m8 g9 |! M# ~/ Q" ~! C
write_date(0X30+o);
; W& N1 f( M0 \% N' \ write_date(0x30+p);
. v/ o. ^- o0 }9 L9 q write_date(0x30+k);3 u3 u4 x8 K) V( X
write_date(0x30+l);
& Q& r: l5 |) i/ P8 @4 v //delay_ms(1000);/ r) Y* d: G% |
if((X3==0)&&(X2==0)) //0-5V
0 M: \1 j& \- k. E {7 e5 [; H" R# ?6 p. ~* u( h7 k9 d
//ADD_A = 0;
8 k) Y2 A1 I- M //ADD_B = 1;7 T l3 W8 K, U/ G, m" y. M5 L. d4 T' C
//ADD_C = 0;1 I% Z1 e9 H9 ? y/ J
Volt = 5.0 / 4096 * ad_val*1000; //(100-500)) K) B$ U: c$ N$ n
LCD[0] = Volt/1000; //千位
& e D5 E' o) M$ V8 U" R2 c 6 I, @/ v# m; d. j: W t* d9 d6 n
LCD[1] = Volt/100%10; //百位
( B" d/ K+ `& W5 X/ X0 H$ I LCD[2] = Volt/10%10; //十位
. N9 }3 |4 L1 g$ n LCD[3] = '.'; //小数点 f7 O: U5 I; L( N
LCD[4] = Volt%10; //个位1 x4 K, p% G( g# L; V l
LCD[5] = 'V'; //字符V
7 `: c- t! B( i/ \( b) w' f* n 2 s& f0 x2 p- U$ Y* N/ ^/ j
write_command(0x80+8);. x3 O7 g$ t8 ]
write_date(0x30+LCD[0]);
k$ K$ v$ U; G ?1 f7 s, B
& n6 Q: w: Q; u( i9 V write_date(0x30+LCD[1]);
$ g) \# N2 G+ x4 i3 d0 O1 j write_date(0x30+LCD[2]);/ n. o5 K& C# q
write_date(LCD[3]);
* C9 S3 z7 @, t1 r d write_date(0x30+LCD[4]);
) `1 A. H$ |5 |/ a; [1 ]/ h! o write_date(LCD[5]);; I2 K0 }' V& e, W6 K6 d( S
}! l- M2 L1 |) o4 D8 n
if((X3==1)&&(X2==0)) //5-50V
. W. U% @9 [+ H2 W7 ? {
+ l- P0 w: u' m$ e) ? //ADD_A = 1;
4 u- ^# C% d, u* f" Z //ADD_B = 0; o/ A0 i/ K6 F( ~" _
//ADD_C = 0;
: A+ |- F) @+ S, R- t Volt = 5.0/4096*ad_val*1000; //(50-500)7 s% b: B4 M: a* ?& r) h9 _
LCD[0] = Volt/1000; //千位4 C f7 @& Z g: J/ Q) @
* I2 d4 V7 c, w0 f' ?+ r
LCD[1] = Volt/100%10; //百位. D( `8 L; u1 l$ Z6 P: a: G
% N$ O) V* Z. q) L1 Q! c& n* H( {; N
LCD[2] = Volt/10%10; //十位
/ X, S' [2 s- h5 f3 B& w LCD[3] = '.'; //小数点& E$ }% m% l) W) B
LCD[4] = Volt%10; //个位
$ k4 v3 U9 A( J0 F0 }: X LCD[5] = 'V'; //字符V
& N- F6 A8 H% C8 w
% u- u# b! ^) R1 X! l1 X write_command(0x80+8);; K% Z/ y3 X; o9 h0 c }
write_date(0x30+LCD[0]);
' v# X6 n5 K& U5 E+ p& h" J" F7 ] * ~7 i7 g, U' d
write_date(0x30+LCD[1]);& I2 u8 q0 q2 b; P
6 Q& R; Y2 `6 s" [0 m
write_date(0x30+LCD[2]);
8 J0 o5 j, ]/ R- W; G! J; h write_date(LCD[3]);
) q. {, \; C) j! {3 s write_date(0x30+LCD[4]);4 n+ ]7 w2 c! `0 F
write_date(LCD[5]);
1 O7 T( m' u6 w. g" c. B) }0 Z1 P }: f6 g& C0 V9 h1 V
if((X3==1)&&(X2==1)) //50V-500V. B+ y: j- Y' j- v+ x A$ I5 {
{
2 H/ s8 }4 z0 r9 g. @9 h //ADD_A = 0;# y- h0 W! V: i1 k) s4 X
//ADD_B = 0;/ R9 d0 ^; _3 b/ G" E
//ADD_C = 0;
3 j H! p" P8 [, g% K8 C6 F; ]1 b Volt = 5.0/4096*ad_val*1000; //(500-5000)) o# Q1 z' y6 j3 \1 s1 j
LCD[0] = Volt/1000; //千位 o. ]+ A- A. p
% W1 L, `; V4 g J LCD[1] = Volt/100%10; //百位4 F& n6 L5 L& o6 R2 m
1 Z( x! C, ?& M+ o# ~. N# E LCD[2] = Volt/10%10; //十位5 Q. L4 O+ P2 d( X& l/ |
LCD[3] = '.'; //小数点9 q) S* ~$ q [
LCD[4] = Volt%10; //个位
' O. _/ z% k, _3 L6 v LCD[5] = 'V'; //字符V ) G6 z# n$ r$ ~! _- B0 N5 c
P& \- U' g6 I1 P+ n; R write_command(0x80+8);6 m7 ~3 m' K9 e) J2 S
write_date(0x30+LCD[0]);4 _0 ]8 U4 g9 L" t9 G0 H
- O' H4 Q$ u& u. z7 B
write_date(0x30+LCD[1]);. V: W8 z+ b: v, M" l/ |9 A
/ D9 b9 c9 S$ G- v2 M" W write_date(0x30+LCD[2]);) P2 C4 R7 \( `6 E& E% Z) ?
write_date(LCD[3]);4 X! J$ \# k; }* }: [
write_date(0x30+LCD[4]);8 r( }' {5 {, U$ l3 r# M! |+ c' o
write_date(LCD[5]);
- E: U' g' [0 u4 `8 s }
. D q. D5 R3 \/ d}
# C6 w: k' ]/ [$ N* n' P" @1 t# _0 a- _
void Volt_To_LCD1602(void)+ a# B7 z7 L f% s7 e/ s% \, @
{ % e$ a& W- p# G5 `* J' h# A
Data_Conversion(); //电压换算并放大1000倍8 K6 @; E3 M7 C. b9 ?
}
8 y- ~- S* ~7 r4 | / B3 i3 {. v6 A
int main()( T' H5 H7 W7 S. P* T0 m
{
4 x0 w' N( t8 U4 C: P. c( E* L //uint m;$ i( k" Z$ A' I
LCD_init();
) L- r E. ^# A s5 e //ADC0808_Init();4 J; R1 B3 N. o7 z* t3 v% L
//ADC0808_ADC();
/ l$ O, Y+ \+ e( ` delay_ms(100);
, j' H q) W4 I6 u2 T% g write_command(0x01);3 }4 x5 Z/ C9 S2 H
write_command(0x80);7 ~( i8 U9 g, z; a" V1 M
string(0x80,"Voltage:");
8 }! }% g' Q4 O6 f //delay_ms(2000);
" W; e7 O H' }1 a$ ^# \' y e. |& X [. u, t. @; p
while(1)
8 O+ c# f% G+ f0 a+ @" @3 \4 w {9 H: B7 O( ?/ C6 J
! q( s$ V8 N8 `1 _7 W K& K: j
delay_ms(50);
; U# ^6 X. D4 t& u% L- U/ V Volt_To_LCD1602();
9 u+ ^; n1 G: ^& z7 _ //delay_ms(4000);
, H$ x+ C8 U+ @: r7 h2 J
; _ c5 x6 Q6 X* A* B( }1 Z; X }
^9 F1 U3 h7 ^+ D2 ?4 `}: H6 H T; x' S8 |1 u
下载: 6 o. z! }0 Q8 H8 ~
|