EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程) [1 X Z t/ V
5 @: l6 |$ R/ a L" ]7 h% F+ P- `6 j
% o: I6 m( ]' i% O1 n实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.3 f! R0 v! z( W) y" X2 k
电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。
* }% ^3 O# i+ p+ \8 @6 q不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
/ m9 x/ ^ U; n# s
电路原理图 / f# O+ H8 P' B# ]1 M
![]()
6 b% Z7 w/ J0 b( y' p o6 f& s 3 B" }; C/ g8 A/ Q4 R6 y
" p- L9 M. j3 ]% `
![]()
3 \3 V* }5 O% F+ Q2 g0 n+ n! n- e. O2 F/ {6 A. n2 u* R# L
#include<reg52.h>
, J! x. a" d" N3 B#include<intrins.h>
$ [1 S! W- o9 X; X#define uint unsigned int
1 }! ~% n6 w6 t) o$ m/ O r0 i#define uchar unsigned char5 D3 e' E8 w* t L/ c8 G
uint LCD[6]; //电压数据转换成LCD1602液晶字符显示3 T0 M7 Z. ?0 c$ z) \
uint Volt;+ ]& d J2 d) w7 I' `( J, ~7 W- c
//***********TLC549管脚配置*********//
H0 M0 O( C& g) C3 u6 I//sbit DO = P1^0; //时钟
1 \ U4 h6 f* x1 Z" r//sbit CS = P1^1; //片选5 O: z/ `+ n. `( U
//sbit CLK = P1^2; //数据输出
4 @! k3 y5 ]. w8 z! K5 ^- ^, H//*********************************//
( N, b2 }# Q( p/ i% n2 L Msbit RS = P2^0; //1602液晶数据/命令选择端
" y# s/ C; A* J D$ _8 J/ Osbit RW = P2^1; //1602液晶读写端9 T+ C# f7 `9 y) r! R: o
sbit E = P2^2; //1602液晶使能端
3 A) k9 @: ~* M* j4 c$ {sbit X1 = P2^3;0 v2 ?! ^4 h& R9 }+ e" E
sbit X2 = P2^4;9 U2 ?' H6 ]2 V
sbit X3 = P2^5;# `" B$ v$ G) Y* Q9 {( ~
sbit CS=P1^2; //片选引脚
7 M/ j9 v, f% K7 R7 |+ V' H ]1 Gsbit CLK=P1^3; //时钟脉冲引脚
. v5 j$ E0 }3 n: ?1 vsbit SDO=P1^0; //数据输出引脚
+ ^+ `' u- A F. S' z; Q* g9 c' ~sbit SDI=P1^1; //数据输入引脚2 Q, v* C% Z" w u
sbit EOC=P1^4; //转换结束引脚0 ~5 k, ?& `* s3 s2 D7 h
//*********ADC0809管脚配置************//
9 K, I: x5 B8 h; i//sbit ALE = P1^3; //地址锁存允许信号* T/ ^1 w) ~. j r2 v
//sbit CLK = P1^4; //时钟脉冲输入端
% M" Q/ |4 D; f2 [# j//sbit ST = P1^5; //A/D转换启动信号. o4 Y3 Z: y! a% J6 Y, t
//sbit EOC = P1^6; //A/D转换结束信号% {) k+ {- {8 m* |
//sbit OE = P1^7; //数据输出允许信号
+ E. c4 u% Q9 P; t6 R( O0 g//sbit ADD_A = P1^0; //地址选择输入端
+ i. I5 s, j* J//sbit ADD_B = P1^1;+ n- k6 D, O: D
//sbit ADD_C = P1^2;
4 q8 O+ @0 A' n//************************************//; s6 Q( R! O& k* }: e3 h
// Function Prototypes
6 a/ }4 [9 n% {/ e# jvoid check_busy(void);* z- A" b! K) C4 p' I( d$ Q5 L
void write_command(uchar com);
" b( m8 l6 ?4 R' g8 Yvoid write_date(uchar date);
1 F* r6 F! h r8 Zvoid LCD_init(void);
& u( z6 p$ A3 V5 g( x" ~void string(uchar ad ,uchar *s);
0 j# F8 W9 Z# U* a/ R$ H% a9 P5 O//void lcd_test(void);
- Y; l3 a& ^+ Cvoid delay(uint);& ?9 a. J2 u$ }8 T: M# J3 x
void Volt_To_LCD1602(void);
j ^1 R/ u+ R. Gvoid delay_ms(uint xms);2 {) n# m# K" S! g* f
void Data_Conversion(void);5 V. d! z% _: K- k- n
//uchar TLC549_ADC(void);
4 ~5 R8 r5 x; @$ e# P6 k/*******************************************1 O& k3 L; w* R9 c' B1 p
LCD1602 driver mapped as IO peripheral
( e3 y( N* y+ Q1 G5 P$ M*******************************************/
3 f) ]( i9 Z& h5 P2 c// Delay
; ^; a: I2 t! r, I D3 n6 u// Delay
' o0 H. h" ?+ G3 x9 y; k& Pvoid delay(uint j)
8 ?& g/ D6 L& P6 w{
% @/ O- u1 l* d& R3 o2 O uchar m = 60;
5 c4 _1 C j" y0 k! F0 ^ for(; j>0; j--)
' s3 S) k g% b2 w3 P { 5 j' C4 _' W, \8 w
while(--m);
; s% `3 k2 Y( q8 n9 l m = 59;5 e+ ?6 t7 e- |* `! `4 Q
while(--m);0 G+ v# r% f. J9 m; w( d8 z8 |
m = 60;
/ z/ k2 m, a$ w7 o }- l9 R* h- X# H: ~; [( s
}4 ]8 t: {( E3 K3 Q% X
8 p' ^5 A( ^1 j; E. V9 I# k( }
// Test the Busy bit, C" ?* r, D( Y# o# A& V( m7 {
void check_busy(void)6 e l( L$ o( l+ H
{ P, g6 f, I; G6 P8 Z' X8 N/ _
do
- ^0 `$ j4 u% O! c" Y8 G { ! m0 ~5 p' U, E9 q
P0 = 0xff;
4 N$ A$ J8 [. h( v1 T& q3 Z E = 0;. J' h. F. v# `' ?
RS = 0;
6 ^0 t E" ?& T5 e/ _% r( w RW = 1;
8 r3 R5 D2 K2 W ? E = 1;9 v# B5 p. D/ ^
_nop_();
3 c" ^4 H$ ^# e8 r6 G5 y) I- C } while(P0 & 0x80);
1 z& d3 ?2 L0 J& q4 f& i E = 0;- b" |. e/ n9 r5 T1 \. N9 T p
}# o; {3 j( o0 Z1 f* R, P- i
% H/ q' ~2 L4 h2 j+ x+ n( k% }// Write a command, L' J1 P9 {$ @9 }2 ? Y
void write_command(uchar com)
U& m$ D8 x4 s+ ^% x: F{
) Z/ b& A& r' |4 J. F check_busy();
: z( d+ Q, ~) F E = 0;
6 c/ a: z$ g+ Z2 r5 E RS = 0;. d( q9 {+ h; S' w' A" i
RW = 0;& F# Q& i) N2 I- n5 Z
P0 = com;
1 X% p( O: y; ]* [5 o# j% ? E = 1;
/ I8 K. A( ^; r) ~; }3 V* t _nop_();
# f _& Q- ]' C$ s r8 N E = 0;' C6 T* }4 O$ O
delay(1);+ d" \8 m) ]" y. Y. m( r3 p
}
' w* c! {* @* u- W: z' I1 `
/ o0 w/ e! P' w/ M$ w$ n7 E// Write Data
, D1 E- x3 L; M* _' |void write_date(uchar date)6 l) a# h. F4 s9 N1 T
{ / [0 R6 z- C3 N# {8 ]3 n
check_busy();
3 K: E# s7 H1 B2 u4 i1 Y' P% z E = 0; j1 I( ~& B& N( V
RS = 1;
9 Y1 _/ J3 x( ? RW = 0;
& S" v- O( C" g* [9 w: j, \3 n P0 = date;
C: S' e; H8 x1 |' v% y E = 1;# o( g' i9 b6 x! t0 R
_nop_();
, ~1 m" |7 r9 T# `4 i1 y" n E = 0;7 _7 `% S# x" Q1 j
delay(1);
: c( T6 p$ G6 Q' V}! g4 g2 B) ~ l+ \
0 m5 \6 d0 T+ p( F1 a// Initialize LCD controller
2 R* e! Z! y4 p# s$ K+ `void LCD_init(void)" `, p1 T$ n2 l5 Z! l
{ ( w% U/ m9 `( ^, \/ s' z
write_command(0x38); // 8-bits, 2 lines, 7x5 dots
8 ]# H! H& `' K4 q) U2 {5 ^+ l write_command(0x0C); // no cursor, no blink, enable display( f2 `- \2 ~ r# g) a! }
write_command(0x06); // auto-increment on
; H1 C+ c$ M, V0 s write_command(0x01); // clear screen4 j! q, ]& }3 ]( A0 h2 @
delay(1);
6 O3 x4 z8 l4 Y1 [& q' `}
( u1 W1 B- U" b4 k4 [7 ^. p2 A% o7 j( ]( F; c8 d
// Display a string
# N" l& z) s: fvoid string(uchar ad, uchar *s)
0 L+ G; k3 x5 d) X! M C4 V{
" Q% v0 }2 r' C" k7 W write_command(ad);
' }2 a K4 T4 q# S while(*s>0)
& m% S2 A- R; X# K# ?' O { 2 ?8 I1 V7 I& ^4 {+ \
write_date(*s++);
, k+ {7 z3 `& R# \0 q delay(100);+ s1 z3 J1 }0 _' A1 _$ h
}
d" a- j5 T) e {) r( S7 {}' }4 h* s* L' n: K" ?
//****************************************************//
o* j# K' j* @5 ?//函数名:delay_ms(uint xms): N% [: d/ ~. w: l+ a# v K" T# D3 C
//函数功能:ms级延时函数
/ s( S: a! T3 p8 [! i0 t//***************************************************//
9 o# R1 z0 h) h+ m+ F
9 \* [8 S+ S& Q* avoid delay_ms(uint xms)
9 J9 a4 u+ a# H, m{0 @* ~9 G. P' }( j2 S8 L) N
uint x,y;: ~6 `% [6 @& y3 o2 e
for(x=xms;x>0;x--)
9 a& q: b# N6 {# Y, b( j for(y=110;y>0;y--);2 D+ v. S, v# p( E" T' p
$ f# `' w" d9 C: r" Z% ]}
% u' M* Y2 u1 [' r! O/*
- h% k1 O8 @+ E. xvoid ADC0808_Init()
: q* e$ J- U/ k{# d. A3 C. c6 |* i0 t* T
ST=0;
% C6 l+ A, z7 G! n OE=0;5 r- [, }' H$ I% y
}
Z$ p; C+ l M$ y*/9 B( ]- ~; Q# n6 c6 E- H
//***************************************************//
^4 Y: ]0 j/ a! z2 a6 P$ z4 V) _//函数名称:ADC0808_ADC()
u" }1 f8 x" N" F2 m//函数功能:读取一次A/D转换的数据
! V/ M* m; I: ?" J$ j. e) }//***************************************************//
9 T; I7 R/ @; {' q. Z& X% O/*
7 b" {5 d/ `8 _0 u( o6 Z' xvoid ADC0808_ADC()4 K' l* I) |. }$ n2 M, `
{7 \( C& {( `* N: z
ST=0;. y& z v) F4 p9 d# k% D
ST=1;
" O" f: h7 r; ?6 [* [& z ST=0;
# @+ \) H* J. S2 ^1 H //OE=0;2 y9 g x4 m) S; d' `* F. p- s
while(EOC==0); //自动发送
! W" A$ m9 x* C1 c8 k' U OE=1;& q; w3 I0 H' p+ s: n
" k$ T) x _" }5 a X2 h2 D3 _2 R
}: b4 `/ o1 ?1 ]
*/
) h h' k! ?7 Q u$ G j$ H//***************************************************//
& i9 R' ?& [1 U* @7 S//函数名称:TLC549_ADC()
/ D: z3 c3 Q: J% U8 s b+ ^//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换4 S5 R9 @* ~, }6 q* V U% n
//**************************************************/// m3 ^: e* k3 D/ n
/** {4 [5 a& r( _. B }( D2 f
uchar TLC549_ADC(void)
) t5 z& j3 x9 s ?7 W{- k: S. b6 K8 v, N! ?" n
uchar n, tmp;2 k1 ?; l4 G- H3 V, a
G. ~ J( s/ [ I9 Y
CS = 1; //CS置高,片选无效
: _4 `) h8 x$ t7 G" t1 q" S; B' m CLK = 0;2 P7 c) S- u9 m7 S5 a+ X
! Q' U2 k( I; W4 f, _4 B( H CS = 0; //CS置低,片选有效,同时DO输出高位* \# B6 I8 b; n4 I8 c7 S4 e* J! E
_nop_();4 O3 d: H6 m( b6 @
_nop_(); //适当延迟时间1.4us Setup Time/ {# c) S# y8 t
6 O) v v. K/ X for(n = 0; n < 8; n++) //串行数据移位输入
8 ?0 k$ l E5 X. `, e: y { $ n* N( ?1 {* l+ ?4 @+ w
tmp <<= 1;
5 C" F1 K4 |6 z tmp |= DO;
' r4 G% D% Q" l# \& k/ { 7 | T/ m4 T6 L, u) u4 Y% X
CLK = 1; //0.4us1 B; H9 U9 \) w/ A, N4 \
_nop_(); //CLK transition time Max 0.1us1 E) ?1 I3 `' b' k
CLK = 0; //0.4us
0 G/ j. w' o3 ~ T: v+ b8 i/ P7 N }
" h+ | N) }: e/ B5 F6 a CS = 1; //CS置高,片选无效) j' a/ M2 m+ h: j& }4 T2 h( |* [
for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us' a; |$ H% |. n) | l
return (tmp);$ K* S) m G2 } t4 G" U5 v+ ^8 {
}
& y8 ]% s3 o; t: c, ^0 W*/2 _; U; x7 D1 D! {% T' [6 _- W D
//****************************************//
6 C) w _1 F) C) ?//函数功能:将模拟信号转换为数字信号
% U8 Y7 r% ], t! @! D//函数名称:TLC2543_ADC()
4 E$ L: i9 X9 e9 K% H8 |//输入参数:uchar CH_i
9 [3 ^4 s: g7 Q6 g( Y4 J3 }; @$ ^ R//输出参数:uint类型* n5 Q0 G1 o% H! Y/ k/ X$ {+ v0 `
//****************************************//# \4 d& l; }6 K' Q" m F
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值
5 R1 S9 U, Z( g5 u. O{
( j6 P5 u5 u, { y" T- r+ u) l* ~ unsigned int AD_Val = 0;* n4 F; |1 y6 v( z9 K" Z6 g
unsigned char i;
, ?' ?* x6 V5 z$ L( _0 Q- u0 m# q! K CS = 1; //一个转换周期开始$ ^4 b/ ~2 [) X; u, n( _
EOC = 0;6 K3 x( g* F8 I, w; S8 |; k6 e
CLK = 0; //为第一个脉冲做准备' h, _6 S% V3 p' i ^$ `3 f0 b
_nop_();0 G9 |4 S: T) |" `3 x ^
_nop_();
0 f, R5 z/ ^6 V CS = 0; //CS置0片选有效& x) w3 c8 x& [! ?0 p7 f0 s: T
EOC = 1; //EOC开始应设置为高电平+ s5 @( a9 J4 {% d& l$ B% _) F7 \
CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置5 C! @2 D+ ^9 u9 q% Q) N
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
3 h4 m$ O) V- w8 U7 Q# j for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果( g2 z- D _& F4 g- q
{: T: m! G* N( K, q: p
+ E: T; I( x& N- P
AD_Val>>=1; //将读取结果逐位右移(先输出的是低位) ! p# k) p: x. X. G# o* g9 f3 M) X
CLK=0;
8 z) a6 O0 Z. [+ r3 Q9 Y. E2 t _nop_();
; {( m$ T. c8 q& f7 T: e if((CH_i&0x80)==0x80) 0 {* K% S# H/ X* X6 J$ r
SDI=1;
8 h1 @$ y9 C/ v5 s else
& S1 Q1 f! \7 g7 |7 `6 I SDI=0;3 F) v5 y) m t+ n% I H
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
/ _ q: @$ R) {* T& @0 q CLK=1; 9 z7 P. W# g$ t7 V, j0 r4 Z
_nop_();
; i* K3 P, X! ^# M, z8 c if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位4 y2 G+ @! b# Y5 T/ c
{
+ ^ j/ Y" X% ]( b AD_Val|=0x800;
# p1 ?; g" u5 j! }2 {# i } C( p2 {3 H0 Y7 M+ o
else5 A# v* K$ c& W- E, M9 ?8 `( h+ l8 L+ _2 i
{
) `/ N3 s) q/ v: F7 ` AD_Val|=0x000; / s) e8 c G! N( g( ]
}
0 v0 |( H I. r& `1 O0 L" p# e }" D$ c# c$ l; Q+ s8 c" d
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高8 ^1 P9 t- M+ q) D9 E% ?5 I4 N
for(i=8;i<12;i++) //读取转换值的第8至第11位
3 @/ k5 q& ^+ d8 Z `2 G5 [ {
$ _2 x2 g+ @, J+ w; g AD_Val>>=1;3 o! L% G) s; r, E6 D0 E! w8 B3 M
CLK=0; ' m# F5 A; I. G: \0 Y* T
_nop_(); 3 K7 }# z5 L+ _$ h
CLK=1;
6 V8 G0 G5 a3 E8 S _nop_();
6 N# X5 W3 o- x1 m* P if(SDO==1) : o* Y( ?" O, y3 y6 n/ k: k" r4 ]
{# Q, s& T, _* k7 z
AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
1 ]% m5 p& K5 `( s }
: s: P `: [) n& W8 R else
# l. f" M- ]0 t3 Q {
8 @4 |6 |% M) {" l AD_Val|=0x000; //第12位写 ‘0’% i0 c0 s6 v/ h0 _% m
}
+ B5 m1 r$ m2 h4 [2 t& X3 W }
, ^" V2 h% {- u4 R; d8 ^- |% J( H CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,* K0 Y& ?# \! E- H
_nop_(); //给硬件一点转换时间
" r6 V7 c6 Y- Q' Y _nop_();: F! S W) p9 r4 ^
_nop_();
) ]+ `* A5 |+ V _nop_();
" ]7 p, D$ S) W( ?0 l1 Y _nop_();
* X, U' ~0 p3 v# [! a2 t% o _nop_();# z; r# ]' o* X" Z$ q$ k
CS=1; // 停止转换,高电平无效
" Q! ?2 [5 W1 K! X; O3 B EOC=0;
( n# l8 F8 \4 t1 c z return AD_Val;
) K! K* z0 R) |! Y4 _} 5 b9 a/ ~0 _: a' Z- J
% f5 S9 O# ^2 S; e
//****************************************//
3 X, R2 B6 s2 ~' j//函数名称 ata_Conversion()
. V7 c6 `3 ], r$ ?1 w//函数功能:电压换算
3 Q! Q" O; H8 v$ ^//*****************************************//
( L/ v( C$ o" N2 \) c$ uvoid Data_Conversion(void): U$ H. C! M% w. a3 b7 F
{
' r" Z ]. K2 z1 v0 ]/ ` uint ad_val;* n. A" V# {8 M' I
unsigned char o,p,k,l;
6 M- h0 K3 g3 p 7 H$ h: p* \* W r" ~& X
ad_val = TLC2543_ADC(4);1 m0 n7 m7 D$ H, X4 T+ ?. W; U; R
o=ad_val/1000; //取千位数字3 K+ o. E% s5 E1 c' H% P
p=(ad_val%1000)/100; //取百位数字
/ V; G ~& O: H& o k=(ad_val%100)/10; //取十位数字1 O u; u2 ` f: q8 S
l=ad_val%10; //取个位数字' G7 ^# B. D8 L7 U- ?% J
write_command(0x80+0x40);+ J6 Z7 }: E, F; y/ V; `
write_date(0X30+o);/ `+ ?* d; W& j3 w+ O8 C
write_date(0x30+p);
% c" n6 O* O/ ?+ W write_date(0x30+k);
6 e& R, K e! v, i write_date(0x30+l);
; g% e' u( \- l) z" _, J3 t" D0 d //delay_ms(1000);8 }6 z6 M; ^: U {3 H) i
if((X3==0)&&(X2==0)) //0-5V
4 j2 u3 b* ~( |2 h2 L {- V/ w2 H) q' G$ Z! x- X0 c
//ADD_A = 0;5 o; `6 g6 s# p" L" Y6 Y
//ADD_B = 1;# m3 F8 G$ d, N5 ?5 S! c+ y5 n
//ADD_C = 0;
a5 P7 ^4 s S Volt = 5.0 / 4096 * ad_val*1000; //(100-500)# a$ K3 A: x* Z- E5 `# R
LCD[0] = Volt/1000; //千位 n9 D. G4 H8 J0 c" D5 T" T0 ^3 R
" _5 T; |6 U8 {: q0 U
LCD[1] = Volt/100%10; //百位 I0 j8 j6 r2 E4 h6 @
LCD[2] = Volt/10%10; //十位
: S) J8 g( Q/ [) R9 I6 A X: A LCD[3] = '.'; //小数点
( q4 W2 `& r' D, y LCD[4] = Volt%10; //个位
, s5 {( f4 N% C LCD[5] = 'V'; //字符V + c$ M. A6 _: b6 u" s4 R+ A
q5 B* S. ^+ J \2 j
write_command(0x80+8);7 h: f; N; K$ Y* l Y
write_date(0x30+LCD[0]);. x/ ^; |9 y% Z
3 }) [" Q4 }& D3 Z. o write_date(0x30+LCD[1]);
; ~$ _( A0 V: L% g" W) f! j5 I write_date(0x30+LCD[2]);
8 i$ u" Z" c! u, V, @8 S write_date(LCD[3]);( b/ Y& |5 N! T1 Z' f
write_date(0x30+LCD[4]);- H: ]# ]5 b6 y# w# i2 v2 b
write_date(LCD[5]);& F( R; K; p5 v- O5 x) s
}7 ]- _( r5 U+ e8 }
if((X3==1)&&(X2==0)) //5-50V& V8 ~8 B/ A9 N) u, W
{. i) l' R6 K/ Q" B2 F2 X8 ^
//ADD_A = 1;
, j/ z& E1 e$ b3 a. o7 p7 Q //ADD_B = 0;
2 [4 M' ~& n3 B0 w+ t( k A5 B) f //ADD_C = 0;) p, l$ d! ]4 ^, c- n
Volt = 5.0/4096*ad_val*1000; //(50-500)3 U% M0 s% U/ N$ b+ U4 I# J
LCD[0] = Volt/1000; //千位
: i; }- N6 q8 N' I8 y , F0 R4 G, Z. I: M4 C |2 c- N
LCD[1] = Volt/100%10; //百位
/ \1 W. L) z1 d- W
. i# z; {. {# K) b3 n6 c) l LCD[2] = Volt/10%10; //十位2 Z, a# L3 S* G, [2 f
LCD[3] = '.'; //小数点
" h' q. ^- e) K: v# u/ L6 C LCD[4] = Volt%10; //个位
- ^7 Q7 Y. Z4 `$ d% s LCD[5] = 'V'; //字符V 6 Z$ B* s, X3 u$ p/ y3 F/ [
7 ]; W, t# i1 o write_command(0x80+8);# u; }2 c: H1 S* k
write_date(0x30+LCD[0]);
6 s/ _8 W* k; x1 A5 F& \6 ] 6 ?% ^- ]+ D2 O4 s9 r
write_date(0x30+LCD[1]);
. _/ D/ a, o! Z" d# w6 S: L3 z, Y( i
0 o! G1 D# _) R/ l write_date(0x30+LCD[2]);
4 L" l4 K9 Z3 ?$ B write_date(LCD[3]);
5 R2 Z) c' | O/ p write_date(0x30+LCD[4]);- U: y& s% x g! E0 p
write_date(LCD[5]);/ {4 l+ V* O2 O; {7 a5 ]2 X c; I
}
5 H0 u' s- i* k: Y if((X3==1)&&(X2==1)) //50V-500V: k" P% i1 |+ b
{9 t9 }2 ~4 c. C( X& w8 X
//ADD_A = 0;2 Q/ D+ `4 y) Z" r' }* H9 S9 }
//ADD_B = 0;
. q% E5 V: C! S/ E //ADD_C = 0;
$ X5 @, N" Q. ?4 e$ i% D Volt = 5.0/4096*ad_val*1000; //(500-5000)
+ s2 z8 E4 \+ ^! P LCD[0] = Volt/1000; //千位! m$ T. b6 s& D" O
2 z! W; C- x! f+ h LCD[1] = Volt/100%10; //百位
+ O' ~: S% Z6 H9 q. u2 x
6 |7 Y7 E+ L8 X) B LCD[2] = Volt/10%10; //十位0 t, D" i% V, a0 i1 b4 D7 P6 X/ L
LCD[3] = '.'; //小数点
( S* m/ C( t2 B) d# u LCD[4] = Volt%10; //个位; ]. z0 A- r# \: A4 }
LCD[5] = 'V'; //字符V 2 S% z. _& F C8 k5 F4 s3 j
: n1 d L1 l3 l7 q6 Z2 r write_command(0x80+8);5 H8 q8 Z2 v1 |* W) ]
write_date(0x30+LCD[0]);
: L6 L, Q+ t6 `6 U! q. Z/ b
1 Z: |$ A+ ]# B4 w7 q% N$ ~ Z write_date(0x30+LCD[1]);
( N. O+ r7 j" d* M6 u( Y+ H % W' e: }% J/ z' R- ~$ D+ ?
write_date(0x30+LCD[2]);, D1 p7 K; P4 D4 _
write_date(LCD[3]);
- s/ I: s" b. a; q q" L" {( Y write_date(0x30+LCD[4]);
, ~6 M8 t+ {6 L9 c0 w+ n write_date(LCD[5]);
5 N6 i# W0 ?( |7 r0 I }) O) j4 V' p, a6 J
}
% R" O g; }# v4 F" i! u \4 Z+ Y: B6 s5 d. L
void Volt_To_LCD1602(void)
& O: U+ n$ z" q* A{ . F) `4 H# j- b' i+ A
Data_Conversion(); //电压换算并放大1000倍
: P/ c% ]: p! ~/ h7 j- W3 T}
N9 `! N/ O* I8 T; x" J
$ _( t T4 W* r) j: t8 g) cint main()
L c' p# \0 _3 D{% J3 z0 A- o! Q0 V2 Q1 \5 L X( y
//uint m;
! s" y6 s# E! }1 o) N/ | LCD_init(); 1 P# Q4 U3 j: k9 G) t6 z
//ADC0808_Init();
0 x, J' u8 t# d7 b //ADC0808_ADC();
$ C& l5 C' j, u delay_ms(100);
0 [* Z- P' X. i) w write_command(0x01);
) |/ \% F3 N; W2 H' k \3 S L write_command(0x80);" A9 j7 I% |, k
string(0x80,"Voltage:");
7 W! a( W% l% X1 _ //delay_ms(2000);
1 t) b. M6 Q) y3 p, M+ I* a o! }; A" {
while(1)1 t% Z- {- o) H t3 m
{
: I5 a+ R8 R, ]- s# D7 }+ @; j( ?3 J, Z
delay_ms(50);
: J* ~, l& R) A% i Volt_To_LCD1602();
$ A. E+ t& {9 m+ o H //delay_ms(4000);. R8 [+ U3 t4 m& X7 ?7 Q" K& [- k' P
7 j7 k, C, _: B* a0 ]& Z4 f0 `3 u
}
5 T: d* o( {. G; c# S) v0 N0 F' F}9 t/ v; t, B- d% g
下载: + u4 @1 X6 A( T0 m
|