EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程
, W" C$ O% n4 {1 G8 E0 {; i# i7 R1 d9 s3 [/ F1 S2 n
: G- @* [2 Q5 W1 q
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.0 f# J6 q9 E( D6 F' k
电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。
8 q1 M& I8 _. Q7 Z! V不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
+ m( O. u. ?* z9 V
电路原理图 ( Y! L6 j8 ]$ Y8 o
![]()
! B3 ^# K4 X; G9 t4 r- t& X![]()
6 f; b" k% s, P![]()
2 }0 S# F7 t ]4 x![]()
4 A" k; D Y; B! ?0 I
$ c! j; W) _; J; t#include<reg52.h>
! C9 d3 i% u' C0 d, D! R#include<intrins.h>
/ ?8 i+ B+ C# Z% |: ~: K#define uint unsigned int- r5 Q( N- W/ Q) o4 Y. B5 H, O
#define uchar unsigned char
1 a# |7 K( ~/ A* `- C8 y) X9 luint LCD[6]; //电压数据转换成LCD1602液晶字符显示% V! n% Y4 p+ c6 A, @3 w
uint Volt;) M4 M5 V) I8 [
//***********TLC549管脚配置*********//
5 J6 C& g1 S' ^: K4 y# c% G y//sbit DO = P1^0; //时钟
- x7 E0 r& P: Z/ f5 j7 O//sbit CS = P1^1; //片选
; U- _, j3 C* }! W& z! Y0 E( G//sbit CLK = P1^2; //数据输出
- [: D* b4 U: x$ q i; L//*********************************//% z. Z- |( _1 v* c4 S
sbit RS = P2^0; //1602液晶数据/命令选择端
% {/ x' q, @* O8 f5 C4 U, N3 tsbit RW = P2^1; //1602液晶读写端/ t% S4 H/ s5 y" t9 V
sbit E = P2^2; //1602液晶使能端( r4 i% L! m, g# E6 p9 ?2 W- A% K4 j
sbit X1 = P2^3;
; t1 J) [3 e) V) s: P" [: |% gsbit X2 = P2^4;# D" d" q( q! j& C
sbit X3 = P2^5;
1 b8 {+ d8 z. l1 A8 j4 ksbit CS=P1^2; //片选引脚
# P5 H a, T# b' S' |5 G$ Msbit CLK=P1^3; //时钟脉冲引脚
9 J# q+ Z1 i/ N4 M/ ?$ esbit SDO=P1^0; //数据输出引脚0 A" i+ F5 t5 y9 h# J
sbit SDI=P1^1; //数据输入引脚
- `! ~4 C4 y d( Wsbit EOC=P1^4; //转换结束引脚
; @ x+ @' G# i//*********ADC0809管脚配置************//
7 x% m0 K& w- |//sbit ALE = P1^3; //地址锁存允许信号* D) O ]+ l$ e: x6 z0 R# U8 Z; Q
//sbit CLK = P1^4; //时钟脉冲输入端- c& u& H. C4 A7 k; g2 `7 E, g
//sbit ST = P1^5; //A/D转换启动信号8 T! U" j# N6 H- O4 Q, j7 S
//sbit EOC = P1^6; //A/D转换结束信号
8 C7 R0 x! S! a//sbit OE = P1^7; //数据输出允许信号! f2 i+ Y( b. e1 e, N7 `
//sbit ADD_A = P1^0; //地址选择输入端/ d5 u, ~: V3 B* _) O* i
//sbit ADD_B = P1^1;% j- T# l9 W8 n
//sbit ADD_C = P1^2;
" v: {- K9 o$ W! z//************************************//
" t5 C3 ]% }/ c// Function Prototypes. B0 a0 c' I0 w" H$ t9 i' G0 n
void check_busy(void);3 a6 A7 V0 p% z' k8 |5 T$ X! S2 `
void write_command(uchar com);
& O9 g( o6 [. {; b- \- Yvoid write_date(uchar date);
5 J7 n$ t# R1 X0 ?( Vvoid LCD_init(void);5 Q; d$ k/ Z c) a( K$ p" H! _, b
void string(uchar ad ,uchar *s);/ t& \2 ]( L2 k& H+ v* R
//void lcd_test(void);+ `, L" Y- B) [
void delay(uint); D: y/ d5 k& u9 }
void Volt_To_LCD1602(void);+ @, j# e' L- J5 |1 H9 c) W/ l
void delay_ms(uint xms);
& q* k; V2 N) [$ I" T% B& }void Data_Conversion(void);! A* W* l( O( s# |! c
//uchar TLC549_ADC(void);
) K" m. l8 y- M3 t' k/*******************************************" C/ J; R, F. j9 H/ S% o& f% w
LCD1602 driver mapped as IO peripheral
" o& b. G, P8 D" k1 r*******************************************/
% ^9 G/ q6 i: `4 l7 \2 \1 D// Delay
) }9 d0 q. ^3 K% }2 U- _// Delay
) M5 _9 x' A2 Ovoid delay(uint j)
" Z+ d. \$ R) `+ ~. ?; P( J{
8 s/ d# P) N2 m% \% d" C uchar m = 60;0 B) |( H) _ E6 R7 S2 N. g
for(; j>0; j--)2 ~4 Q% c" h8 m4 r
{
. u, ?8 W' q: g; J! B5 v( \1 M$ c while(--m);$ y( [; I6 N, F9 _ L
m = 59;
# `3 z+ T+ d9 i- D( m0 S, F$ o5 d while(--m);
! w, ^ D" Y+ L6 q m = 60;
( w/ E/ y( ^* {3 J0 g/ ? }# R$ b2 F4 t; G2 n7 T4 s) R( Y
}8 }* h3 w5 }) j t
; }5 L0 i9 {5 O( p
// Test the Busy bit
0 C2 x' R2 Y9 s% Bvoid check_busy(void); y7 @' u% o7 o, l+ b, a
{
) D2 k x9 n! F o0 R do
( q/ W; v" r; s) k { # H$ O! H2 ?3 q! T
P0 = 0xff;) Q, |! [; a, K$ T
E = 0;
8 R7 c6 g/ w: \. B3 K l RS = 0; 7 F0 Y7 f$ }0 i( e! y# E) ~
RW = 1;
7 n ~( K) j# t3 p1 c8 b" _, v E = 1;
" x$ @8 ?' H- U2 r/ v% N _nop_();9 V' e5 p5 Q8 ?# u
} while(P0 & 0x80);
' P8 {, m" |7 }1 h8 T E = 0;
# ?: m8 z) r; y W/ R}
- G' J; F/ k$ T
; ~! N- N& v$ F9 ^6 R/ j: i' b2 \# g! s// Write a command
% Y) ~9 a6 k! D1 V! [3 X0 |5 V2 fvoid write_command(uchar com)
/ T( Y4 Y" \& M/ X9 _; s{ , v: Z1 e* n. Y. Z9 B
check_busy();! m) v# @" _: ~- D5 w
E = 0;. K- j' |8 c+ x+ `( f+ t0 X$ T6 M
RS = 0;5 W. M& d* ?1 c6 [& \
RW = 0;1 W6 g2 v& w0 @
P0 = com; l3 o1 ~) l5 y. U
E = 1;
4 |0 H" d$ t3 O* F- W# m7 Y _nop_();
$ e' Z* I' E1 N/ a E = 0;
/ }) Z% `, E- [& b delay(1);& h3 [' {1 ^, t6 U
}
0 r2 r; a9 n9 D; f C
2 ? r! o* Q5 u& [& `3 Z// Write Data- _" k& w) _+ x) n
void write_date(uchar date)' t2 J5 p" m; C. k& `- B# ?$ F9 R
{
1 k, A2 y, A- [. ` check_busy();, D1 g0 G2 T/ H; c
E = 0;
" M4 ]2 l9 c( c% e4 | RS = 1;0 _: L! B- h5 c7 _7 D; k
RW = 0;: q4 L# S" E" g% C
P0 = date;
- h f% b$ V% E" W. @; g, k$ b E = 1;
( d/ Q4 P( l1 }* [* g+ Y _nop_();
+ a6 Q9 [( E6 K9 u( K E = 0;3 a9 C4 H+ p, @; z0 T
delay(1);
- Y4 `/ p& e3 A) [4 q; A. Q}
( B& N1 `( ~0 L& Y) P8 I" N) y- t: N4 Q1 G. g
// Initialize LCD controller
% t$ Z# K2 r* [7 v$ \& S& J- Hvoid LCD_init(void)
4 w2 [/ i5 F* o: {{ " R6 Q0 o( V: J) d/ T1 l
write_command(0x38); // 8-bits, 2 lines, 7x5 dots+ i6 t; M. `: l. o0 X# H
write_command(0x0C); // no cursor, no blink, enable display
8 \" \9 g6 r5 Y write_command(0x06); // auto-increment on1 n1 _) c/ p, m% q+ I
write_command(0x01); // clear screen6 U! {/ a" v& w/ |5 _
delay(1);
; W) t* n1 E, [- S0 w+ d}
' K6 q' l u! a W7 x
2 H; D: g, s4 x6 B// Display a string
$ K" l8 a" _/ x0 H' \void string(uchar ad, uchar *s)
6 j3 d/ j: n. Z6 O( B) a7 ]{ / |. n3 A3 q n0 |
write_command(ad);
* U- R1 R! X& o" s9 } while(*s>0)( b( B6 L" }+ x3 t2 W! {5 I
{ $ d- g1 q3 `/ t4 C
write_date(*s++);% M/ N) C5 |: n
delay(100);
" s, v3 |. u+ b+ ^' P }
4 P( x0 K% I# i}- B3 m- K4 ~: x* ~! Q
//****************************************************//
# _) N' n- C* \. i5 c1 u//函数名:delay_ms(uint xms)
$ _3 ^3 G! _9 D% K) q2 I//函数功能:ms级延时函数
. F0 U8 E0 \0 v6 `; c5 f3 Q& W2 J//***************************************************//
! p! W3 h( O$ |# |' l
5 |, @6 W4 ^; evoid delay_ms(uint xms), x5 }" r4 o g3 j6 G
{
8 B- n+ [3 F6 u/ R( [3 t uint x,y;
9 i7 c' T, a' e3 i8 t, O for(x=xms;x>0;x--)) c: K) ^2 T3 g2 w. ?. z/ ?
for(y=110;y>0;y--);. F' D, `6 ?$ X( K5 F
; m/ k4 X" f, B9 B0 {- N}
U) F' r" p8 R' g9 h7 T/*
q5 s* h7 B: |# k7 a1 T& Evoid ADC0808_Init()
# |1 T2 _1 ?9 \: z8 v" [0 G{/ B0 L+ i$ ?8 ^0 x, `- Z+ `
ST=0;
5 d7 r( n Y3 B" }4 W$ H' i3 \ OE=0;; o1 ~: ^6 Y8 h- P& T ]& M% l) w7 ?$ X
}
6 w* R7 }5 c8 `, V0 @$ r*/; b( ^: C& D- Q: A
//***************************************************//
. _+ [' s$ ?& y+ ^1 c5 _4 }//函数名称:ADC0808_ADC()8 d" K. M: G2 F. N7 m: \: G6 w
//函数功能:读取一次A/D转换的数据
8 w2 C2 |1 [* h l5 }2 c//***************************************************//
) L: E2 g# w& j H2 i0 x7 C$ F/*9 [' @: |8 M8 V. F/ d9 M
void ADC0808_ADC()
7 j( F3 d; M2 Q# D{: \( g- `) p6 B* l' n
ST=0;& J$ U+ E1 h! r3 p% D0 O8 I
ST=1;
a$ _: a5 f( I8 P: l8 L! o ST=0;
# S) z' }0 y& b, ^ //OE=0;% ?4 c# i! ]! g+ `
while(EOC==0); //自动发送
! R3 ~: L7 i- D. s8 \2 {* v+ j OE=1;
( j; x0 O6 E# Q1 Z: f! P3 y/ t* w/ E/ p
# E0 [5 |: ~4 g% N% ~}9 n6 M2 z5 W8 j3 I7 E7 `4 m- X+ Z
*/
4 ^+ [) h. e2 m6 t6 L# d//***************************************************/// d+ u4 c9 ]/ T1 f: G5 |
//函数名称:TLC549_ADC()
; S% Z3 S7 x, h//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换0 w0 n* r1 p N) I1 ~
//**************************************************//* _8 p! j Z3 B0 q! \" ~6 E
/*
3 ?# B3 Q- q9 q- L. M6 l" Iuchar TLC549_ADC(void)5 h8 A. v9 ^# I1 A3 }2 }" {: g- y; j
{
8 ~$ P) ~; }# {. P) M uchar n, tmp;- p# \3 c }* n: u4 P
. g7 Q5 P. H: k4 W CS = 1; //CS置高,片选无效6 Z8 d* f& a8 h5 j
CLK = 0;
2 q) [, y$ L% y" |
. B9 E0 K0 j7 }- | CS = 0; //CS置低,片选有效,同时DO输出高位5 S# z% i1 U: C6 @4 N
_nop_();( s0 X/ J& J0 L" g
_nop_(); //适当延迟时间1.4us Setup Time; j* D+ r, C% H( m7 {
' p3 c7 @9 F( a0 _2 b' ~
for(n = 0; n < 8; n++) //串行数据移位输入
1 I/ F/ D! S0 K2 D1 l {
5 A( F9 v% f% J! A9 e tmp <<= 1;, s3 M+ u7 ?9 e% C- c
tmp |= DO;" H% A7 N, u* q
+ ^- X* @4 I- g6 D* B; ^0 [
CLK = 1; //0.4us6 i8 P: A! ], `
_nop_(); //CLK transition time Max 0.1us; i5 F! j7 G5 A8 S) V! {5 U
CLK = 0; //0.4us
7 d3 D6 y! f9 L1 W8 |2 h }
% A: {2 P5 A- q/ w/ y; R CS = 1; //CS置高,片选无效
& Q) ?' T9 H0 D& H" j for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us: C; `' L4 N. [1 B4 j
return (tmp);
/ E. I/ \7 X. r: E! N6 z( c}
- P& m' @. f; d6 q R: z*/
% x3 K1 m+ E( z- C% A9 L4 X//****************************************//
2 G6 ^" P* i. r//函数功能:将模拟信号转换为数字信号
& K- Q1 U$ `4 m* o$ r% z- I+ B- C, i' m//函数名称:TLC2543_ADC()- V0 p3 L M; f7 f
//输入参数:uchar CH_i
0 \; y* x. t) E0 _! G+ n$ W1 {//输出参数:uint类型
# U3 k, O0 V+ n0 I4 P//****************************************//& X* H4 k6 N. K1 U' d
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值
* b5 ~9 Y. G4 n& `6 O. i9 q/ s, w4 s{: ^5 a1 a! U, G! }& j* t
unsigned int AD_Val = 0;9 F7 m( V+ }* }0 [# Y7 f
unsigned char i;; s2 ~0 E) ^, S3 W7 Q( M
CS = 1; //一个转换周期开始
; n- {4 g! y/ Z3 Q# ?) M: z8 L2 k EOC = 0;
5 P2 B6 n/ j# N0 q% Y" `! p CLK = 0; //为第一个脉冲做准备+ H# f& ^- v K4 W; K* x
_nop_();
/ Z# L0 a' S5 B9 N: V _nop_();) X% r/ i' c5 `8 ?/ [5 j
CS = 0; //CS置0片选有效' C& ~6 R) f! i
EOC = 1; //EOC开始应设置为高电平
7 A3 _, j9 U" C CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置5 T: n6 E# i! c# M/ V& R' U! ?$ ?; U+ Y
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
* k- |- I2 R% `2 d for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果8 G1 B& V. ?8 G; u
{
; ?: v1 T# G9 Y, Z4 t
2 Z& D7 N. M6 _3 p0 U AD_Val>>=1; //将读取结果逐位右移(先输出的是低位) ( y, H! T: t4 x! y
CLK=0;
3 f9 t P: c+ ?; Y" B7 q9 C _nop_();0 M6 G: {6 h. {
if((CH_i&0x80)==0x80) / e+ x% ~% o9 u* U3 B7 ~& \
SDI=1; 9 y. P7 p' k, W Q0 i% R) m+ U
else
x; S6 [8 X" B8 R SDI=0;* ?5 A( P7 f9 T
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543% u5 S1 b0 V! j- B5 ^
CLK=1; $ \6 P7 G9 ~+ A/ `
_nop_();1 Y* k# D0 P0 H! s: a4 t
if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位% K P# e# j8 Q! r
{: Q* B; b2 \1 R) }5 M# T" g
AD_Val|=0x800;
2 v( X1 {2 \$ L8 } ]; j }, y- ?2 o+ C, F+ X1 r; Q& D* z
else4 a3 Z, h- @# r( a; _( E+ x4 `
{" s9 {6 |1 J* |3 F1 r& J7 }
AD_Val|=0x000; & B; _6 a o: W* ~! |4 y* T
}
% q; L, g- T* P& N! ` }$ W8 q; y. @6 k$ H0 H
SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高- C# D0 D/ y0 p( F* U) q
for(i=8;i<12;i++) //读取转换值的第8至第11位
7 {/ c0 b" y, J: u {" G$ Y% X8 ?5 A5 S' X/ v0 ?
AD_Val>>=1;- v( d! O G% O) ]# J7 v/ q/ k
CLK=0; # w; D l9 R2 f; H4 y* j0 u7 }$ A
_nop_();
8 @* b7 a5 S) {* z CLK=1; ( f) T# j9 M* T; ]* T4 F/ R2 f
_nop_();5 s; `8 }! a+ `2 Z: t9 q
if(SDO==1) ) q/ |9 ]* x' O x# w4 j: }# q
{4 M9 k$ W+ `8 o/ M; M4 \
AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位9 y |1 B, V/ d' ~; Q
}
( _, T7 r" |9 n else/ f ?% n% F* P; r% F9 u
{
g9 c0 q+ ]# p2 i AD_Val|=0x000; //第12位写 ‘0’
4 \- v% P. B0 J" z# j6 p }9 G) B! h6 @; W) v0 h% Q# ~( R) [
} ) @3 e6 L ^. \* r2 p! L+ s
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,: }9 g% }; @4 x" N
_nop_(); //给硬件一点转换时间
5 n( I5 B% R* k% ~( R; n* { _nop_();* u4 ]. z V3 ?$ h' I
_nop_();
, K9 K8 T) m% m3 x, h/ o& P _nop_();/ u: F& w% X. O# L! I- @
_nop_();
. s6 f r0 ^: c( B% l& I2 k _nop_();
4 R$ s2 d; r! ^8 i! o CS=1; // 停止转换,高电平无效/ [0 G; }. A }, W( h/ ?7 V
EOC=0;
8 t+ c* F2 l# d0 b return AD_Val;
- a# f+ Z7 I6 ~' Z) r: Q} 2 F- p4 T$ l z' J; a7 M5 X' M8 q
7 }" s7 A) `) z- ~2 L* f
//****************************************//* J$ r; l: R4 L9 S: Z1 M# `, G# `
//函数名称 ata_Conversion(), e/ u- K7 `( v! s1 o
//函数功能:电压换算
; N6 s1 T4 L; D5 ~//*****************************************//1 C" f' O( J4 c5 b" S" @
void Data_Conversion(void). F2 y& p4 k. V- K6 N/ g( T
{3 {9 r) ?( ~8 S# B; _
uint ad_val;8 _) f' j% @+ \$ B! Q7 U& }
unsigned char o,p,k,l;
$ X {8 E4 j0 N' [' r7 A % D- M: _' s+ y* G+ F4 k
ad_val = TLC2543_ADC(4);8 ]" L( z2 H! |/ o1 e' |( P; n
o=ad_val/1000; //取千位数字0 ]3 B: O1 B7 J9 W
p=(ad_val%1000)/100; //取百位数字
. r; L$ L- |& w9 n: e; N k=(ad_val%100)/10; //取十位数字
" z3 J' R/ G' _3 k( @3 ~; @ l=ad_val%10; //取个位数字7 E" }( J% t$ K$ c$ s
write_command(0x80+0x40);6 k$ Z$ c1 Z @4 `2 z" c- T
write_date(0X30+o);3 r3 |% z8 v: |- i( E; p4 S
write_date(0x30+p);
$ j2 N, N' J) J- l. ~& X write_date(0x30+k);
1 c ?7 M8 [- w8 p; @4 Y write_date(0x30+l);
) {) l E! T! S! |0 @3 F3 m //delay_ms(1000);+ ^. A8 I! \" q8 T- t& m
if((X3==0)&&(X2==0)) //0-5V
6 U0 o+ S; L+ N1 ?5 L% X {
; |% |' p3 q; V) J; R //ADD_A = 0;- m% o0 r4 _" j
//ADD_B = 1;! A9 M( k: l% \3 d( r& d
//ADD_C = 0; X6 l. A. O0 n! o" \( ]
Volt = 5.0 / 4096 * ad_val*1000; //(100-500)5 C0 m1 g: s9 O: ?) A8 q# c' }
LCD[0] = Volt/1000; //千位2 s1 y4 o+ t* n. {3 b
2 \3 D% {( ]% v( |- L: s w LCD[1] = Volt/100%10; //百位 o7 H& G( i6 c# c
LCD[2] = Volt/10%10; //十位
& a" U1 E1 B5 v3 j4 y) y! O LCD[3] = '.'; //小数点/ b( b1 g2 m) b0 K# M. m0 J, y1 i
LCD[4] = Volt%10; //个位
% i3 C4 X5 |& A" t f LCD[5] = 'V'; //字符V
! T; |* d& \; M: L8 Z
, O( \4 B( m, H write_command(0x80+8);
+ f4 j* Q/ h" r8 a write_date(0x30+LCD[0]);
9 f0 s D1 o- d" g8 }' u & H, T) {. r' p% G
write_date(0x30+LCD[1]);
0 N. @) {* U# ~" e6 n! q0 A- d v write_date(0x30+LCD[2]);( h3 l$ j- ]6 Y7 z
write_date(LCD[3]);$ i" G3 Z4 A% C" P& `2 s
write_date(0x30+LCD[4]);% v" {2 f0 t [5 V" t
write_date(LCD[5]);
9 Y/ J2 X0 t! J. b }6 `6 G. m& n" O6 i u; n# U
if((X3==1)&&(X2==0)) //5-50V
( ]7 ^* B: {5 U8 O( K9 Q! V {
" D$ R: z5 c7 U* T# O" t5 Z; t9 ? //ADD_A = 1;: N6 R0 F3 O' g2 l' a% y
//ADD_B = 0;
. X* z4 b$ e8 i; g0 |6 d' t //ADD_C = 0;; t" w/ b( F! ^3 j: m
Volt = 5.0/4096*ad_val*1000; //(50-500)
" K# R+ m4 M4 S% X% z LCD[0] = Volt/1000; //千位& w! r3 @: _ {% B+ U
' [ ?, {* y, e( ^# j2 S LCD[1] = Volt/100%10; //百位
1 ~) y% E4 s: w# O+ V, i
; ~5 p/ n/ s* ?8 [, S5 l LCD[2] = Volt/10%10; //十位
5 N: p8 Q& d! ? R LCD[3] = '.'; //小数点
+ T. a3 @. E9 X" ^) S LCD[4] = Volt%10; //个位1 w1 Y o, [( M* p* H5 }( e% `% n
LCD[5] = 'V'; //字符V 8 {0 a9 p0 }+ f% }* V' W
$ G' G2 e) d& i' o3 \6 I write_command(0x80+8);1 V4 X$ ]1 u1 P% x
write_date(0x30+LCD[0]);
. ?0 n2 p8 w6 L( O
" ]6 \: N# y% |% {/ V: n write_date(0x30+LCD[1]);
6 Y$ b+ C9 J5 b# ]: h+ `$ I& S. g+ L* h 4 a" D3 h& t5 c) N- p
write_date(0x30+LCD[2]);+ C# |7 j, F0 K0 j5 O% {
write_date(LCD[3]);
. l$ j. r/ J2 \( ~# R write_date(0x30+LCD[4]);
/ g) p4 n; _( i! ^2 x* e6 `9 |8 C write_date(LCD[5]);
/ [1 {; b) t3 c0 F- E; R r, j, _: N }
$ {! Z7 l8 q' U if((X3==1)&&(X2==1)) //50V-500V4 M# |! J" P: f7 `
{$ S$ u7 C) ?% Q# z) [% G
//ADD_A = 0;8 V& z( |+ {* v3 ?8 @ w+ n1 l4 g8 g
//ADD_B = 0;
, S4 }6 H$ n9 Y) E. H //ADD_C = 0;% E+ G2 a, ^) |/ w, N- B& |
Volt = 5.0/4096*ad_val*1000; //(500-5000), k$ e m$ i8 }0 [
LCD[0] = Volt/1000; //千位
' \6 E$ t; d3 }+ l- g ! T, i: a( D" Y" H, Y* t
LCD[1] = Volt/100%10; //百位
+ c6 M7 W3 b# q. s. d2 s2 ]) q " l6 T4 ~# ?8 O% ?5 j. W6 K
LCD[2] = Volt/10%10; //十位* i# E' c! ?$ M" J0 r) `
LCD[3] = '.'; //小数点
/ c. C9 `' Z; u+ v" Y3 g LCD[4] = Volt%10; //个位
& J* _; {' m- E9 Q: k( T LCD[5] = 'V'; //字符V
0 x0 Y% I! c O8 Z. g" t- g 9 b" t# b4 J) P5 G1 Y8 [6 V. _
write_command(0x80+8);
- |* ?. i5 @. s4 M write_date(0x30+LCD[0]);' O6 b. W( s6 E$ m' g! w' P) L
1 X3 M3 B% D. n- j. N. K write_date(0x30+LCD[1]);
6 S1 W: p9 h4 R7 K K9 Q
5 p% x; I* m0 J7 ?( U! x% e/ ` write_date(0x30+LCD[2]);: K5 C2 c- R$ M1 Z C3 y
write_date(LCD[3]);
1 i0 p% ^* r5 |- o9 ? write_date(0x30+LCD[4]);
" n/ m o; {/ y' X6 F write_date(LCD[5]);- f; ~& W ~* F# [8 W
}- h6 [5 @; u" l. r0 H n
}
+ M: x5 v( S5 T0 H: C
% z/ }% ^* p# J0 W/ l, z3 dvoid Volt_To_LCD1602(void)$ A% }( [# h0 K0 h5 V& ?4 P% f
{ $ M/ m6 l# v$ a+ V/ j* v
Data_Conversion(); //电压换算并放大1000倍
" k# C1 H: \2 o$ F+ x- g7 L! o) Z}/ b" U/ Q1 O Z1 W3 M7 r
5 q; Z8 F' M# b( O) zint main()
# d1 A; _6 u# A6 c. @0 s1 p{
. I6 y6 |8 `5 q //uint m;
! i& b7 N% T% [+ y9 | LCD_init();
- W6 R# T, \* d: R3 j4 Y1 e/ Q //ADC0808_Init();" K! k# X' n$ ]) _$ G5 R, ^
//ADC0808_ADC();& R, {0 ]8 [) C& A$ Q& Z2 ~
delay_ms(100); 9 J7 n! F* y) J2 \7 A
write_command(0x01);' g' U7 k, g$ G# E8 p1 T
write_command(0x80);: ?( i" w( z8 s4 w
string(0x80,"Voltage:");+ u' s: g' q9 _6 N
//delay_ms(2000);
; g0 a* P0 u" x0 ?" m
8 e9 e6 O% u4 F) ]7 B& c* a while(1)" A4 X% v) ^9 Z
{
% N- y4 g8 F2 I. T: B8 D# z
& u6 g/ r+ `: w# d delay_ms(50); z4 A3 N, `: F$ |
Volt_To_LCD1602();
4 ~1 s7 w, x0 Z& C9 {: {+ v$ B //delay_ms(4000);3 D0 n* m( p S9 [+ _
: T- N& C+ u4 f; R& o
}1 c J a2 X/ R6 n( G2 w* _- u
}
" h3 M( H3 O/ _ Z6 k
下载:
+ K0 ?, w5 [( N% [1 z4 j |