EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于51单片机的直流数字电压表(0-500V)自动切换量程
M! n9 V1 l- K7 ~% v+ s! L0 A2 [. `2 s- D0 ^5 t$ _# v
9 w$ t, T2 M9 o
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
4 k) r5 Y1 V# M4 ~( |. d$ h电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。
/ U R* b' J6 L不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
: x/ P6 x, V1 m
电路原理图 ![]()
2 c# z; D0 Z2 G+ N3 I: R![]()
g, u* G, W' g+ F2 `- R : `; A: n$ [( {' q( ~7 s
6 _' K0 A* j1 }$ b6 m
![]()
, ~* [4 M& X' P. {, V) y% _+ k. E9 X. e* C4 m
#include<reg52.h>
/ h' s! k# t; L: d& w#include<intrins.h>& N- v. _0 R$ i0 D6 T9 J) X/ R
#define uint unsigned int
* y* V7 j- J$ s1 ^% t; V#define uchar unsigned char/ A1 y5 E) b9 y, C. F
uint LCD[6]; //电压数据转换成LCD1602液晶字符显示" ?, z4 @+ W( @( {6 ^) \
uint Volt;
) O1 p- b/ p" \; R \) J8 i& z//***********TLC549管脚配置*********//$ Z; @" |6 _- W y3 D# G
//sbit DO = P1^0; //时钟9 Y% H8 N3 h) f( U; {% A- G
//sbit CS = P1^1; //片选9 K( n& B- h) b( }# H
//sbit CLK = P1^2; //数据输出
8 p% l% ? H) U7 i( r//*********************************//
1 o1 Y" u3 g, D$ Y! n# P: csbit RS = P2^0; //1602液晶数据/命令选择端
0 Q% y+ o; `) x) ~. Bsbit RW = P2^1; //1602液晶读写端* l) A2 C7 Q1 z" @9 X# C" T
sbit E = P2^2; //1602液晶使能端6 Y6 \& i ?7 B* Z
sbit X1 = P2^3;# H1 |" R( R0 Q+ u, J
sbit X2 = P2^4;# [* ^0 h9 n7 Q! F) F/ ^5 ?
sbit X3 = P2^5;
# |! a+ k5 r" ^sbit CS=P1^2; //片选引脚
; Q+ [; s. q8 M8 o6 Gsbit CLK=P1^3; //时钟脉冲引脚4 W2 p( T* C& {1 j
sbit SDO=P1^0; //数据输出引脚3 w" |4 f+ o: h; U: b
sbit SDI=P1^1; //数据输入引脚
5 M( B4 G5 x- p5 Y! a" b3 w# e- B8 Vsbit EOC=P1^4; //转换结束引脚7 L4 e5 v x9 ?2 n8 p7 f8 P0 i8 p! e
//*********ADC0809管脚配置************//' c, ^( I8 ^" ?
//sbit ALE = P1^3; //地址锁存允许信号# T/ {$ X* F# s- z+ d+ d
//sbit CLK = P1^4; //时钟脉冲输入端
* K" f, h( l3 l, \//sbit ST = P1^5; //A/D转换启动信号
3 d/ I% Z8 G0 }8 g) i1 @//sbit EOC = P1^6; //A/D转换结束信号
2 ^( N3 ]0 h9 T) T. ^//sbit OE = P1^7; //数据输出允许信号& R9 v+ C# y* c: S% {- {
//sbit ADD_A = P1^0; //地址选择输入端* X: X9 h4 i# Y
//sbit ADD_B = P1^1;
0 `+ }# G3 V3 a' f. m1 F, R//sbit ADD_C = P1^2;
/ Y+ J2 M+ o+ s* c//************************************//% H" {; P6 S# w( b) ] n
// Function Prototypes
9 e, Y7 d: S9 vvoid check_busy(void);
; j* A0 s3 ?9 k( y& l4 K2 a- Uvoid write_command(uchar com);6 ^9 {& h& b7 M8 w) Q: f
void write_date(uchar date);
- X" n6 k h$ Q. n ?void LCD_init(void);6 h4 w. A4 u3 m) y: x) I
void string(uchar ad ,uchar *s);
5 m, c9 n1 W" G; w//void lcd_test(void);6 [3 Z9 K5 d, ^9 E# O1 `2 v
void delay(uint);
9 V0 x4 k$ o. O: e" L! t0 s/ T. l- {void Volt_To_LCD1602(void);; b0 G& g: y1 k: Z# {$ I% D2 S
void delay_ms(uint xms);7 G; T! m! \4 b: h# V, `0 \4 j$ W7 Q
void Data_Conversion(void);
5 L/ }% M* Q7 s Q( V! U, {3 p//uchar TLC549_ADC(void);
8 e9 a5 y1 O8 K# \* y/*******************************************) j/ l7 ?/ q4 _
LCD1602 driver mapped as IO peripheral- S5 s0 v1 I) S+ a$ k5 f( P! @
*******************************************/ / {! M; }+ Z. e! M
// Delay
; K$ R/ _7 _# {8 ^// Delay) R; I; g+ M5 j( w: M: F# F
void delay(uint j)) X* ^+ [! B ?9 y2 D9 M" @# a7 { t
{ : p1 ~1 k: o y
uchar m = 60;9 N3 c& l+ t6 R4 k1 \
for(; j>0; j--)
6 q- ~5 d3 \" g3 y { 4 X6 X9 h8 i2 g3 K# T
while(--m);
; n. O6 M# h$ r8 k1 D9 | m = 59;7 C4 H$ c' w( p1 Q$ n4 `. ~
while(--m);7 p9 [: w7 z3 `5 v; P5 V
m = 60;2 N* H+ o9 \/ N. [/ ~
}' z9 ?( y3 m! z9 r$ U! g
}. y1 k% q: T# B- Y7 W
C1 S/ x5 v6 d( R// Test the Busy bit1 }1 Y- E }% G( D
void check_busy(void)
0 t1 ^, a( P% [$ f{ + B$ J% o( i6 }& `; l2 d2 t4 f! n
do
" }9 }0 g6 ?. A! p* { {
% I' N! N& d% C/ g4 e9 v$ x P0 = 0xff;2 D0 r* g1 y# m9 m A0 ?$ x
E = 0;, j) `, ^6 y; _$ O0 o3 }4 V7 L4 T
RS = 0; " u1 }7 a& Q/ A
RW = 1;
3 e9 C4 f/ E6 Q0 O E = 1;
5 v+ `+ e9 m2 D9 { G' ` _nop_();5 c7 C' p) W1 R( l; c' t
} while(P0 & 0x80);
7 b) F2 `3 u! K. Z U0 T E = 0;) K" ]; z7 l0 A2 c/ q. I$ G7 _7 H, K
}
F$ l3 _0 L" y6 @9 Y. ^
9 Y' E3 T% a+ t/ P* a% F7 y// Write a command h' a5 U. R% [, ~+ o Q1 {7 F
void write_command(uchar com)
" c4 [( j# D. \/ @# Y+ k{ " C( F ^+ d, r: D1 M4 ~# `
check_busy();
7 w7 _% _7 f" c: U# @0 Q E = 0;
. y$ I7 B4 _' _9 Y" u( X RS = 0;
: u7 q5 t! e" H( A* |, E4 V5 C) C+ k RW = 0;& }7 ?0 G9 D/ }# ~
P0 = com;7 T# W+ y) Y' b" k
E = 1;& _3 s( B) `* R' }* `' y
_nop_();8 m+ s' ~3 v4 v) d; t
E = 0;
1 v4 }8 W& x9 X; _5 I7 w( L# ~* ? delay(1);( C' B" g6 t' `" j+ D2 Q$ a& Y5 f
}
6 W$ }3 e c/ v0 w
" ?3 x, E- [# f6 R' i7 R0 {// Write Data
1 o7 A9 f1 l' H: o5 lvoid write_date(uchar date)8 C9 z [1 T1 o0 u
{
% o# M5 m ?' D4 v: x& F- N* D check_busy();
# I U, T+ m+ t' u7 [% d5 Z/ J& s4 Q E = 0;
, _/ d; u" v- p2 x RS = 1;
/ x/ K/ `) K! O! F RW = 0;
4 j9 o: Y" c4 V& h: p- a7 G P0 = date;
& r$ ^0 Z- K- L) y2 @, w E = 1;% y7 `7 R0 h, B$ o {
_nop_();7 g: H S5 t4 ]& r8 c' N
E = 0;; t+ w+ N8 B B3 d( N' r) B
delay(1);
$ X1 H' A9 G9 F& Z! h. f}) k( Y& `2 |! X9 _; h6 S
- b9 a. S. ]! O# c/ t2 ~0 g; h// Initialize LCD controller& D9 F _* K% C& a2 S
void LCD_init(void)9 w* T! |- {3 T- I0 j1 Y
{ 0 f* i# \/ w% `
write_command(0x38); // 8-bits, 2 lines, 7x5 dots, ~; @ n0 \0 s( a
write_command(0x0C); // no cursor, no blink, enable display* d1 b& j0 K0 o3 {. u* x8 o
write_command(0x06); // auto-increment on. n) y- `0 ^1 U: E2 h% H
write_command(0x01); // clear screen8 U3 q( `0 D, o7 _
delay(1);4 F/ b( W! ~. F5 Z
}1 b# F( g4 p' }/ u( S
( d& e& ^# A; [8 O. @
// Display a string; H) Y8 p+ F0 T! Z
void string(uchar ad, uchar *s)
8 x f0 e/ @ h2 W* t( U/ X# ?{
$ {% e: t7 X) @* ] ^ write_command(ad);
& H. q* l3 H9 V: M1 r while(*s>0)+ T& I6 G$ B/ [* X
{
2 k" g. y; Q& h y1 W write_date(*s++);+ v; H3 t* L1 j( a& D8 C5 r
delay(100);! }" J. `+ W# A- q3 W) j/ `# x
}; h1 f. X$ u8 ^( {$ M4 a
}
4 S2 H# C0 T: s//****************************************************//
8 Z( b/ \% d# Z' x9 G: z& Q//函数名:delay_ms(uint xms)2 d- T% H* M2 \' \( e' x L- \: s# A- C
//函数功能:ms级延时函数. f3 ^: i: [1 x" N& S3 k/ ?
//***************************************************//
: {3 z4 i, r4 A$ e! n/ c& C0 B0 a5 D" |* O
void delay_ms(uint xms)7 g+ {( K7 |7 j2 w' e5 \: m
{5 p, I7 z9 f2 Q7 w( k
uint x,y;: r* D# b, D4 S$ M
for(x=xms;x>0;x--)
1 O) M y2 M3 h! c; Y for(y=110;y>0;y--);0 ~4 l8 _2 I' T& w: e! A) [: D
/ S8 V, E1 }& [
}: s. H8 ^, r8 F8 }: x- U8 \9 R
/** p+ [! p$ h. |& u5 l
void ADC0808_Init()
6 L8 f: H0 S7 Q* _0 Y* Q# @0 n% ^. k9 V{
0 r- X/ [ ]& ]/ |# M% r9 u7 s: ^ ST=0;' u7 H9 Z, x5 I, L# D: _' `
OE=0;% P4 O1 h4 n4 O6 \8 k& F! \
}
7 @7 @8 @# [ s; o3 D5 C1 m*/. v$ O: v1 C p$ w- x2 M" a
//***************************************************//# Y6 x9 Y% l+ d. R, y
//函数名称:ADC0808_ADC()
# D( z9 ^' @" r2 Z. ^//函数功能:读取一次A/D转换的数据
' e, V% r) q3 ~//***************************************************//
- n1 [' N( q% t+ X/*
* R7 F4 z5 A9 Nvoid ADC0808_ADC() {0 L* ?8 |- [; b
{6 G3 p2 D: K' @
ST=0;
1 k8 p( R3 P( b% ? C) a ST=1;
Q+ H* i+ I0 n; Q3 a7 m/ o ST=0;
2 ~5 I$ d; E4 U, u* [! B //OE=0;/ H% v3 Q/ s# Y6 Y1 y
while(EOC==0); //自动发送' n) ^: y5 u1 i( a, ~" ^
OE=1;% k8 ~, ]% I/ B$ N) [( [7 p# R
* I; a: K8 H! v+ F
}. z% c# Z- F0 _- w$ f4 Z
*/
& ]0 m: \$ N- V c' M//***************************************************//3 i' Q* [. I5 Y7 A" D
//函数名称:TLC549_ADC()
' M- v& y9 `- E( V/ C" X0 B//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换; m5 q5 |8 X0 i6 }# \; ^- C
//**************************************************//
/ `% D% W% I0 |7 f6 x( G- w/*
" Y$ t2 l0 k$ C t* ^2 W1 p$ auchar TLC549_ADC(void)) z' Z' I2 i+ E" j Y
{( e* B" X# |' ?5 N) z# l
uchar n, tmp;
: [" |, j2 m' r6 u( \0 O
2 D0 @2 H. N; O2 ], v CS = 1; //CS置高,片选无效
' x: u: r0 H; C! L { CLK = 0;
% H1 `+ Q. j2 A' W3 D6 X( O( b3 O) b: R6 B0 l) D
CS = 0; //CS置低,片选有效,同时DO输出高位
1 q0 p$ Z! m8 B5 I _nop_();
' @$ Y$ m8 |. Y) v Q* _2 A _nop_(); //适当延迟时间1.4us Setup Time
# @ H- f( v, d. Y/ R
* i% k4 ]5 S$ n2 Q' u* f for(n = 0; n < 8; n++) //串行数据移位输入
9 u- }/ Q) B! U; q7 q3 D ~ {
+ K6 B9 J" x9 R( w. M+ g9 I tmp <<= 1;
9 H' d+ P% |. ~4 [8 w tmp |= DO;
$ Q6 D4 k% o. f3 B/ @
. ^" A/ w, l- ?6 z6 [* |: b. R9 h CLK = 1; //0.4us+ Q& ~+ }3 S0 ]- C: Q# T8 @6 @
_nop_(); //CLK transition time Max 0.1us6 _4 m* e2 g3 x
CLK = 0; //0.4us 2 j m' F0 H S" f& ?9 X
}
' h9 y9 z+ @' U% g, {. c CS = 1; //CS置高,片选无效
X E& X: i1 Z* Z7 B for(n = 17; n != 0; n--) _nop_(); //Next Coversion需要延迟17us
. H' T' {. W) z& e return (tmp);! d; G; e: y& T L2 k$ s2 c
}0 p% q$ u$ Y* l9 {5 ?$ h1 O
*/
- w7 d* u/ ]& R. {, k//****************************************//
9 l4 d: H: w& e! K//函数功能:将模拟信号转换为数字信号5 @+ ] h, I5 d5 w
//函数名称:TLC2543_ADC()
, _7 ~! m/ }' O) |4 O//输入参数:uchar CH_i! E: L- F' h& R: O
//输出参数:uint类型
& J* F% i0 H; T b+ n- n//****************************************//' T& V% E. q7 U; G. V8 p
unsigned int TLC2543_ADC(unsigned int CH_i) //CH_i,通道值
8 `4 E9 O7 S1 T( j) O. f{# }: d* ?" j. s7 }
unsigned int AD_Val = 0;
# P& u# a% ]7 j, S* r& h% s2 ` unsigned char i;
* ~7 n% X, P! y: }, s) }5 Y4 k e. W1 M8 y CS = 1; //一个转换周期开始, n! U; P: |: S8 i: A% B/ s. n* f
EOC = 0;2 v8 A; _- g8 U1 U; ^* U# Z7 L
CLK = 0; //为第一个脉冲做准备
7 h. [3 }5 v* R( X7 [$ r6 W- m; V7 w3 b _nop_();
; a4 b/ \$ ]% T _nop_();
+ \- O6 E% O" F9 W; ] CS = 0; //CS置0片选有效5 P" r, h/ D+ j9 s7 ]
EOC = 1; //EOC开始应设置为高电平+ Y( p n2 J7 L/ j
CH_i<<=4; //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
# c; J8 f7 P2 L- c CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位) B# N! C n# H$ l8 k9 @5 K3 u
for(i=0;i<8;i++) //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果, D: k" @! m" ~: O! f
{
" `) {1 \. _! v- I. N6 ]; p. k
% o' E, t9 E: r9 ^ AD_Val>>=1; //将读取结果逐位右移(先输出的是低位)
7 d4 n; H3 t: y5 m; a9 `' t' l CLK=0;
8 D( m7 w/ N5 a) u _nop_();; O4 G) x0 b0 {( h
if((CH_i&0x80)==0x80) ' [. _( ]/ }& U0 i
SDI=1;
* f! ^ G% a6 z else
& l9 O C' h9 [5 [! G' ~ SDI=0;8 y$ f6 G1 V! `
CH_i<<=1; //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543 P1 ?& U8 g8 z) H1 X
CLK=1; 3 k5 Z3 }) Q/ u1 k3 r
_nop_();
- ]; ?) V7 v2 U4 Y2 C if(SDO==1) //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
0 T1 k4 m2 X* U1 S {; M2 |+ x1 ?. M
AD_Val|=0x800;
2 y4 ~, X3 ~. l1 n }
* X! O6 F" p( n9 J; D6 g ?7 K) p else1 O0 b4 V/ j( j/ C+ x
{
. g! K' T- Z( {1 _ AD_Val|=0x000;
: Y- ~. ]2 U/ |% g1 q }
9 T' Z4 ^ h& t1 ?* O/ L }
: n$ J( I- m( y" X$ x SDI=0; //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高- h+ A: Z2 y* O, H% G& r
for(i=8;i<12;i++) //读取转换值的第8至第11位
( Q% h) _3 y. c5 t( R {
0 C0 ]0 t9 l, E, P AD_Val>>=1;( A& N8 P `* I$ K( D7 T: s1 v' Q
CLK=0; $ W% w( \$ g% e4 U* _) l/ s
_nop_();
4 u' q; j" F) C+ T5 }- J1 O6 v* M CLK=1; ' T6 I( [0 Z7 W, y
_nop_();
+ V- s# S Q# [! c6 S' N: ?- V if(SDO==1) 7 L. G6 G0 m% i9 l% t$ q
{1 d" [9 B8 [( ?% F9 ?
AD_Val|=0x800; //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
! K% q% Y/ b; ?) R: a8 L: S, o }
5 u+ }6 \/ m8 V# \6 h- A else& s. ^/ T/ E# ]0 j8 O* C
{
- s) E" L; @3 J8 G4 e AD_Val|=0x000; //第12位写 ‘0’
2 g4 b& z- ?" K0 i }9 X: J- \+ H7 z. M) i+ M$ S- l
} - W. Q+ h3 J! B7 O' V, e
CLK=0; //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,# W% C' J1 g; ]" y, X, ]8 c
_nop_(); //给硬件一点转换时间
3 S3 B% c* q, J0 L; r9 j& B _nop_();+ C( ^0 J1 U+ K
_nop_();+ W7 w: }6 k' T
_nop_();
+ N2 `& y& o4 f( p9 \/ D6 u _nop_();
) w4 A a8 A8 ^ [7 W# b; n _nop_();
; j% c4 ?( Y; H( _ CS=1; // 停止转换,高电平无效8 d5 m1 {6 K% t. D; u
EOC=0; 8 _' M0 F5 V/ y8 W1 Z
return AD_Val;
( d, W8 K" ~8 r/ u: d}
& ]7 |, Q+ s2 P$ Z
$ d. E+ f% T8 [! M//****************************************//- j8 x0 r% q) a
//函数名称 ata_Conversion()( H" G8 l+ ~5 O/ P% I6 h
//函数功能:电压换算9 W8 y3 n& @( U9 h5 |
//*****************************************//. @7 U. U+ u+ A3 P5 |) c
void Data_Conversion(void)3 {0 W- K& n; u7 `
{! J5 y/ H, G0 ~9 K) A
uint ad_val;
0 b4 U9 [& ]4 ^+ |; y6 w( L unsigned char o,p,k,l;
8 K" o5 l. j) U7 L
1 j" s' A* P& ?" D# S3 N5 {3 \ ad_val = TLC2543_ADC(4);
4 m* I4 C8 p; h! ^ o=ad_val/1000; //取千位数字
" k' C+ r6 n+ P( L& G p=(ad_val%1000)/100; //取百位数字
4 n" Q. s& d. T$ m k=(ad_val%100)/10; //取十位数字! d) ^4 v: u& }* `5 ]9 G; X$ }; e
l=ad_val%10; //取个位数字3 K& ?0 x |4 S
write_command(0x80+0x40);
/ n+ j( m6 B- @8 ?6 A: K3 f write_date(0X30+o);
) A& C' t# g; G% }2 y4 E6 ~5 a write_date(0x30+p);& g9 [; K! \0 A, W" j7 n1 R8 C& Q
write_date(0x30+k);* l! O6 Q5 p, A
write_date(0x30+l);% S* ` s+ D% K& @7 {) h
//delay_ms(1000);
p2 p" E- i, |8 h5 D; U' [& g if((X3==0)&&(X2==0)) //0-5V& f( a% u, I5 d" c: @+ _' \' Z- P' t
{
- w, A R! g, r/ } //ADD_A = 0;" g" ]4 t3 f m) n. ~" H4 n
//ADD_B = 1;; n, @- M: Q8 h ]
//ADD_C = 0;
* j T/ A9 {: h* @1 z; i; R1 |/ g G Volt = 5.0 / 4096 * ad_val*1000; //(100-500)
! U9 N6 u$ O0 m1 v' s0 ^4 A LCD[0] = Volt/1000; //千位; ^# m6 \, C: }2 T+ O
0 _% x2 T0 x* ~" c; e& W4 q
LCD[1] = Volt/100%10; //百位
, ^9 ]' R. G3 T7 |2 \6 y LCD[2] = Volt/10%10; //十位
) J& e" H# B( `9 M2 Z8 V8 _7 ^, l LCD[3] = '.'; //小数点) S/ z. O! [* j% m
LCD[4] = Volt%10; //个位
/ a: i: Z- c5 @6 M6 n2 [ LCD[5] = 'V'; //字符V
7 E; a. b. v# B2 S 1 b/ n7 s* j0 o T! f+ o3 P; a3 F
write_command(0x80+8);7 ~' I& w+ ?5 V' F$ M) T4 o! F$ \
write_date(0x30+LCD[0]);8 d; X+ i: C+ ?9 J
* K) f) I4 ^) B6 g% | write_date(0x30+LCD[1]);1 E( j/ D' v$ j7 P8 h
write_date(0x30+LCD[2]);. m; M2 k9 x! Y9 q
write_date(LCD[3]);' ^2 o/ H2 |6 P
write_date(0x30+LCD[4]);
; W b$ Q5 W1 e' z0 W/ `/ l$ x write_date(LCD[5]);
q: D4 Y3 V* I! K }4 Y X1 r! n( w- u) p G
if((X3==1)&&(X2==0)) //5-50V
$ n7 \ d) K. j: I7 ? {+ j6 @1 } \/ V
//ADD_A = 1;
6 r" h$ v0 w* L. E5 A //ADD_B = 0;
' D' Z" e$ G E, Z: C4 q8 \/ l //ADD_C = 0;' q5 z7 n) o4 V1 |2 A2 e
Volt = 5.0/4096*ad_val*1000; //(50-500)2 S. ^ n) B6 K; Q
LCD[0] = Volt/1000; //千位* _; _% r# M; u) q8 E8 n
) c& z( v6 Q+ A0 L" j+ d" ~ LCD[1] = Volt/100%10; //百位
; k& u: u. Q% ^! d! {* F3 p 1 }$ G, T; e/ F% g
LCD[2] = Volt/10%10; //十位
5 m5 }+ T6 ~! T9 s LCD[3] = '.'; //小数点
" z4 }' u0 M* c' q LCD[4] = Volt%10; //个位- w0 Q. g) u2 `3 ?2 v, c& A
LCD[5] = 'V'; //字符V
4 V$ {, ^! C4 y) V# u
/ U$ W7 P# q, y" t write_command(0x80+8);+ U/ S6 y8 M7 Q) |( F L! d0 R) j( a8 l
write_date(0x30+LCD[0]);
1 _5 {" S3 ]9 _+ v7 |* o& c$ f2 P0 T
) r# Z/ |: q) C1 `" B0 M2 t write_date(0x30+LCD[1]);
7 X7 f2 I$ s l, R, W- t, g9 y # [' E A' H! m3 a
write_date(0x30+LCD[2]);: s+ s; R: x* [0 A* z: ^
write_date(LCD[3]);
( l- M5 l: G4 @. @6 J$ K2 U write_date(0x30+LCD[4]);
3 ?9 g" w% `- `/ t! z write_date(LCD[5]);: g0 Z7 M) @$ s; n2 n
}
2 b v, Z2 o) O, ?+ A8 ~- ` if((X3==1)&&(X2==1)) //50V-500V
) \/ J' M0 ?7 M$ _. C8 n {$ a/ J2 m8 l( H% m! [. Z [% Y
//ADD_A = 0;" y: ?4 _8 } ]: i
//ADD_B = 0;
7 s# |4 Z; A6 h3 | [$ B //ADD_C = 0;4 {+ e# o$ z8 ?, ]$ C
Volt = 5.0/4096*ad_val*1000; //(500-5000)
3 d( V- m2 e7 j/ A: m/ w LCD[0] = Volt/1000; //千位- {- F$ i7 b2 e. @( C9 {( W
/ _9 {6 @- ?# K6 T) c$ z; D6 S$ c) C& d$ p* d LCD[1] = Volt/100%10; //百位8 f, Q1 a0 ?' d# `
: H4 P- {0 Z4 N. }2 H/ S LCD[2] = Volt/10%10; //十位
% C- k7 b; d5 x& P LCD[3] = '.'; //小数点+ M- ^* T6 F4 c& q, m! j- E
LCD[4] = Volt%10; //个位5 U- N6 W4 S1 a; b3 W" E* }% R& |/ u! S
LCD[5] = 'V'; //字符V 2 [( R/ U8 _8 q% K/ G
3 y3 [! h2 t9 e1 \
write_command(0x80+8);# p C4 v4 x" X4 @2 G" E3 m
write_date(0x30+LCD[0]);8 l6 v1 V' ?* h. D
8 C$ A& Q, S. M; Z3 j5 r write_date(0x30+LCD[1]);
- s3 E) _. Y& T9 q9 Z, D * V& t/ A3 F6 ~$ h0 T1 f
write_date(0x30+LCD[2]);
2 I9 f6 s" S2 o; ?. f0 |7 C3 l write_date(LCD[3]);
8 ?, Q. \, b/ e# U$ Z$ C6 \6 M5 z write_date(0x30+LCD[4]);. q4 G1 x5 E9 B+ J v$ L
write_date(LCD[5]);
: _7 q" k( t4 h' [* } }0 H! u2 w( n. G u! P K
}+ ]! U4 n$ o- d2 k5 V: X0 D4 H
$ m: K* w( z Y$ C5 Jvoid Volt_To_LCD1602(void)
1 v. o% @: P# j6 i. I{ ; i! ]; `* [5 X5 B1 N5 i
Data_Conversion(); //电压换算并放大1000倍1 e& n8 Y! j- _
}% S+ ]$ m# o k" b$ z6 ?
1 u* i8 [. F7 Q( v
int main()
1 z* P, h# M* e& p{# y/ [5 w+ y% f" w! O; w
//uint m;" R8 H- ?4 c2 U. R' i: r/ L
LCD_init(); / E0 C- R* Q, a- O/ @
//ADC0808_Init();# `$ e- Y4 b' h, V4 Q/ {' y
//ADC0808_ADC();& B3 P% _7 g r9 j" P
delay_ms(100); # g- w3 F3 Y9 Y2 S5 C8 ~/ F
write_command(0x01);6 c, S/ z# y; q. J6 g f, v% q
write_command(0x80);& b. U' C0 k' c; P# V$ a
string(0x80,"Voltage:");2 y2 R$ a* n! z8 r+ v. X
//delay_ms(2000);
& j1 U: g \0 j. E3 s* O
* V3 e I+ a" }: E while(1)
, C. Q; g% s4 E$ J9 o# p0 H& q {
+ Y/ j; @! k2 M5 H! F$ U: K
6 C$ y6 l& D2 |- E delay_ms(50);
$ z6 j+ u& }8 Z7 O! g* x Volt_To_LCD1602();
|% ]6 `5 c% R. |' C. Z& {1 T //delay_ms(4000);
) _2 @- C4 j+ p1 b. m : r( K; A& Z9 F N9 t
}
3 O3 V8 J1 L8 _1 j}
4 ]" F( o) Q. a# V
下载:
- q, }- u" J! G |