找回密码
 注册
关于网站域名变更的通知
查看: 1722|回复: 6
打印 上一主题 下一主题

基于51单片机的直流数字电压表(0-500V)自动切换量程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-31 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
基于51单片机的直流数字电压表(0-500V)自动切换量程, P9 j) p. y' }

' c! [" S1 s  G* J( V' C$ G4 @
0 u+ p, V* ?! \: q
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
, F2 x3 R% t1 P5 `电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。' E0 e4 `* v8 C- s' G9 y+ w2 F
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
" F1 x$ t! }4 S/ c& r& T% b
电路原理图
2 [) p8 @5 m2 Z, s
8 U" z4 u# O' d9 s

2 K% |5 V8 H: N5 K$ s1 m
# O) L; F1 L8 S9 p, Q1 T( O0 h7 A* B
; C8 R: k# W% W0 c1 {- c/ U+ C6 d; V( ^* K0 j4 n! o
#include<reg52.h>( Y  q7 ^( [7 S6 x1 k: j; r
#include<intrins.h>1 k) ]9 h0 i; D& B
#define uint unsigned int2 T" d( w# T$ h7 o) E
#define uchar unsigned char
  _6 X  @$ b- G; p6 A) |% {7 Nuint LCD[6];   //电压数据转换成LCD1602液晶字符显示& J- A7 F% W- {
uint Volt;/ j7 S& Y+ N% V1 N( \
//***********TLC549管脚配置*********//
; w. d/ ~. t, s4 m' S//sbit DO  = P1^0;        //时钟7 x: P" r% a  Y' x
//sbit CS  = P1^1;        //片选
& v! `3 W9 G" x7 I1 p//sbit CLK = P1^2;        //数据输出
% q4 f; j+ b  \4 q7 W//*********************************//. V- r6 F& A& e8 e
sbit RS = P2^0;                        //1602液晶数据/命令选择端
+ B- t$ @' `/ s; t8 U* X; Asbit RW = P2^1;                        //1602液晶读写端
- x2 ~0 \. L& _& H) F$ G: Isbit E  = P2^2;                        //1602液晶使能端
$ n( _7 @9 o% Ysbit X1 = P2^3;
5 ]3 b. {* C% M* \  ~) C0 K" Fsbit X2 = P2^4;
% T" T( C) _1 y; |sbit X3 = P2^5;  m" s% c  T# {- O& x) n
sbit CS=P1^2;        //片选引脚6 ~8 W5 [5 o* }$ `6 I
sbit CLK=P1^3;       //时钟脉冲引脚
& K2 r! z- M: I/ osbit SDO=P1^0;       //数据输出引脚0 p0 P# t+ l4 N' R" @# w
sbit SDI=P1^1;       //数据输入引脚1 @4 `5 r7 t5 [7 y" V8 f  e
sbit EOC=P1^4;                 //转换结束引脚( w: ^2 x! x3 T! w3 ~8 C4 C) Q
//*********ADC0809管脚配置************//
6 t; b4 N0 I( Q6 E//sbit ALE = P1^3;        //地址锁存允许信号% Y% z9 {/ |( N* ^2 [& q
//sbit CLK = P1^4;        //时钟脉冲输入端* |1 d) A& s- t/ u9 Z
//sbit ST = P1^5;                //A/D转换启动信号6 S" V! F8 t5 Z$ L8 E& c
//sbit EOC = P1^6;        //A/D转换结束信号
# c$ }$ i# D, I1 z//sbit OE = P1^7;                //数据输出允许信号1 C8 X, g1 T1 f+ \) ^6 T
//sbit ADD_A = P1^0;        //地址选择输入端
( p8 @9 m; `5 @; ]1 Y+ g: X//sbit ADD_B = P1^1;4 _7 h* @. n- l+ d& r1 z, s$ ~* t8 k
//sbit ADD_C = P1^2;  H3 m7 |' R8 ^/ W" [: c) |! K
//************************************//; Z, g" T6 I& t6 L; g- ?! \. k
// Function Prototypes
1 f9 v  B9 A2 dvoid check_busy(void);! z  h4 x+ M8 h) r
void write_command(uchar com);
. Q" F- Z, u' Gvoid write_date(uchar date);3 \- }1 H2 L: ?" o2 i) t
void LCD_init(void);' R6 N( P/ ^- o7 |3 J
void string(uchar ad ,uchar *s);
2 Z: B8 H: ^, S7 u; ^$ M//void lcd_test(void);
- z3 c; C* S0 u& M# u6 tvoid delay(uint);7 E3 i+ e3 e/ @5 f. F3 y; O
void Volt_To_LCD1602(void);  k5 A  }3 L; `3 x
void delay_ms(uint xms);$ H" E) T2 }! w" I
void Data_Conversion(void);3 `  \  E0 S" R- e+ E, U  A
//uchar TLC549_ADC(void);
$ ]% T7 O; P. k1 }* d! B/*******************************************
7 a8 [; z* b$ g3 L4 w9 J8 X6 p    LCD1602 driver mapped as IO peripheral
4 |/ e3 I8 p9 I- x7 v, x: S*******************************************/  0 Z3 M$ }# f$ \" b
// Delay$ M) _8 v0 ]7 H8 l+ U8 A
// Delay2 a9 m6 v) I5 f+ V/ M( W* {% S
void delay(uint j)! T7 R+ \% Z. i! }  ^
{ % ]$ w7 d4 s7 f  g+ t8 W+ q' y4 n
        uchar m = 60;
7 x$ @& ~! o! ]* J1 A  for(; j>0; j--)) v* w$ A" k* K8 B8 R
  {
! T! w) C9 M, O                while(--m);1 A2 [! }$ B5 T) G0 S/ d7 k
    m = 59;5 w2 B( X8 i6 m4 n1 ?
    while(--m);
% v) I  f* m! o" M( }    m = 60;
' T% P: c' j- [5 s, M; h# i  }
0 z3 h+ v& P  \( c; @- ~6 J/ H* X}
& b0 @5 U2 q) c9 k0 {
" Y/ @5 f; m8 _  j// Test the Busy bit6 ?9 D. R- A0 J/ x& {* w" C
void check_busy(void)# o! @) J$ v$ s5 n8 z
{
( j: g4 [& F& p        do
; d- f+ D4 E% [" N, |" D: j- J0 w  {
- u: b( o0 u2 [- w  n                P0 = 0xff;- M. J& R+ y" J4 ~0 U! [# p9 N; ], g
    E = 0;
0 U* M3 n& {  M, ]( T) l! ]    RS = 0; ) i& p. L' [  s; \* O/ \& q
    RW = 1;
- |- K1 F  P  V! P9 ~4 w7 Q    E = 1;2 l, ?; V+ A* O% [8 \0 c( p
    _nop_();0 Z: h( l) l+ l% X5 }
  } while(P0 & 0x80);
5 s4 l# I. M2 M. l. F  E = 0;
4 D# }" D$ m' p}
" f0 p5 a0 x9 y9 u9 M5 E  A. L+ e2 ?3 q& |; x0 y- |
// Write a command
2 e7 V+ q! }! v, Z( C( Ivoid write_command(uchar com)
7 t3 P& R4 R+ c{ / j! P. U/ ^& o9 a. i" j# _
        check_busy();  _7 ^) L- l4 R. w* N1 a( J
  E = 0;
- O) r* U% h1 f7 x  RS = 0;; }% e% ]+ x" Z+ z2 i. M
  RW = 0;  I- y% g) Z; W) c) G
  P0 = com;2 X( q3 W3 t% {, N" a& X: f
  E = 1;) a0 D4 |& l6 J6 Q
  _nop_();
9 `0 |  Y; \7 o  E = 0;# U1 ~/ B2 s% c. C% N; n
  delay(1);2 _+ W+ T" M; y- _' X! j8 Q& g
}
- B2 s+ H7 u" Y; D# }; k7 c" r$ U
- ^7 Y2 t% t: l! N3 O% u9 P0 h// Write Data
4 C  V8 G5 ?: T& p! lvoid write_date(uchar date)
; C  l9 D5 H" ]! L; V{
" [, f: o: O3 f& c, i. N        check_busy();+ y$ l& L& U8 r5 A0 O$ F0 l( c
  E = 0;
7 Q7 W( P+ D+ B# V  RS = 1;/ T2 O' C1 x) K& l( ?
  RW = 0;
! |: ~+ g/ L7 B0 [  P0 = date;, L5 @7 y3 F& `6 m1 l9 q- v2 e
  E = 1;
6 G8 F% A; ?# S3 Y7 \+ y9 H# }  _nop_();
* Q/ O- {% ~* f! G9 l. y  E = 0;
: v" i* c5 Z7 j6 k; L  delay(1);   
1 p) Y3 k% x$ M" v) f1 G& q9 `}- F9 z2 Z9 B0 u

9 r6 I. F7 `5 |" M3 v) y8 J; N/ D' h// Initialize LCD controller" {6 h8 l- L+ ~3 m" j
void LCD_init(void)
+ n4 U+ f3 n. k{ 9 Y+ i+ x  n2 l, r  }9 ?+ V
        write_command(0x38); // 8-bits, 2 lines, 7x5 dots0 U9 U3 i7 }( c  |( y$ Q9 ~/ g
  write_command(0x0C); // no cursor, no blink, enable display
3 ?" N" @& i' L8 ?! p1 K  write_command(0x06); // auto-increment on
3 y$ d5 _$ H; \' U& x  write_command(0x01); // clear screen
9 F9 J! M2 }; ]  delay(1);
. g/ h" E5 }- s( V. v; W}" R  V. O+ G% J/ b2 B6 o" n" ]( `
: S+ u5 O4 m! D. u, K1 M# ^3 U
// Display a string3 l6 k" [* V7 r
void string(uchar ad, uchar *s)
! _" ^" Q8 v2 Q$ @# U: k{
# t: r8 ?% y8 W  z! ^        write_command(ad);2 `6 P; S- b5 s+ _' b
  while(*s>0)
; E; t5 c( \% ]  {
1 A- R3 U( t: }7 q& T8 O                 write_date(*s++);- R$ [3 A% m# I2 Z& z' Y
     delay(100);
+ |3 O& L! l, L  }: c1 ^. T  j! Z
}
1 n7 g- A) V$ o# a& c& p" Q//****************************************************//
7 ?& e9 V9 U& J6 _* b//函数名:delay_ms(uint xms)# _) I0 c% M, ?% ^2 F2 K! l
//函数功能:ms级延时函数( s8 }6 M, i9 t. r# y; i& w' I
//***************************************************//
3 ]6 D/ f6 s  |8 _$ T  N) U" Y. Y  \6 g3 g& J  V+ J
void delay_ms(uint xms). Q/ \/ C' ]: p6 _4 n) N( _
{
. p7 i; I! h' w0 J        uint x,y;
/ a* l, R! D/ h  T# _# ]        for(x=xms;x>0;x--)
- ^8 q: Z1 Z- F' a" N- s8 k                for(y=110;y>0;y--);
) d! @5 E! a' {        % C/ g5 y8 z7 \( k! M( F
}! G2 t0 k. n: k7 b: l
/*$ f, i* y, X+ r. L8 w9 c' Z
void ADC0808_Init()
' t* z+ s7 |! t5 g; u{
1 l( F. A% V) M" ]$ ^( F4 x2 b  ST=0;
' x8 q" p/ s: N9 r  OE=0;. H. A2 A, Q: a, O- @3 ]8 b
}7 I* o* _3 `6 S6 M) @6 f' ]
*/  Y3 {. T9 ?. ?, U+ o- p' V1 K1 k
//***************************************************//
7 V. }9 V' J5 n/ ^0 P) z//函数名称:ADC0808_ADC()
4 W/ i! x3 q  b# v; g//函数功能:读取一次A/D转换的数据: K: {$ i- i3 R. G7 h$ a2 O2 U
//***************************************************//
" P  }/ R$ ^$ F7 L# Y2 z7 |/*
+ X# R( d9 [% b! xvoid ADC0808_ADC()
( Q; j# z" h# V4 K" |) `{
; T4 z8 x: ~  Z  ST=0;( e! E$ ~5 P) {/ z. G* L
  ST=1;
+ e" i0 ~2 ?! v) t) ?        ST=0;
  H. ?8 [. ], D" ~" ^  //OE=0;
5 W4 }# \5 w0 `5 V. _5 @  while(EOC==0);          //自动发送3 S) U) q' ^! Z" L% h& G2 S' ?
  OE=1;
# z6 ]! D( G  g. y9 h; o( }0 H9 M4 r; v- H
}
& J3 R1 z; c1 ~9 g# Q*// e" k; Y( m1 `0 g
//***************************************************//
5 }" O& F' i8 ^  w7 E+ e0 p. u+ g//函数名称:TLC549_ADC()
5 y4 X+ j5 }. Y0 z" T* h//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
( d# A  U0 [. N5 X; i//**************************************************//1 \1 B4 `7 v# m- d
/*
% e4 _& ^" ~5 Q' k0 K3 u' e( ]uchar TLC549_ADC(void)
# N) n2 V% S) I* P{
+ m* k0 L( P& T% q4 |' k3 z        uchar n, tmp;& R8 Q! b! J. S1 v, C% ^

! @% j* Z# u1 P/ L* p: o/ o        CS  = 1;                     //CS置高,片选无效  H; L# h. L* s+ P
        CLK = 0;
7 M0 w" m  G8 e/ X  `
' i" @# _$ A- \* Q        CS  = 0;                     //CS置低,片选有效,同时DO输出高位! T5 G+ m4 ?$ G- G. M
        _nop_();+ o) E/ o( `# a% `3 C5 c7 B
        _nop_();                     //适当延迟时间1.4us Setup Time
# \, l6 O- `* k1 ]2 ^
/ N- y5 Q. {; T: N; T( I+ @        for(n = 0; n < 8; n++) //串行数据移位输入& Y7 V* o; k- c% R7 V- _0 W
        { 4 n/ n8 g( Y/ M' Z
                tmp <<= 1;
% |. }5 F! x) H( u                tmp |=  DO;
4 m& q* W! B" p/ o4 X# x- ^8 j2 d  
4 S( ]" g7 d( v% p6 q8 `                CLK = 1;        //0.4us& E2 [# X- k( r0 @3 k
                _nop_();          //CLK transition time Max 0.1us
. p  k) _% Q# x: ?: R                CLK = 0;        //0.4us - }- N2 F1 ^6 x3 K2 U
        }
( t6 c+ f& \" h; c3 D% W' |        CS = 1;            //CS置高,片选无效7 v; q! T' Z7 p
        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us
' ]# V0 V  F. z6 A$ n3 `        return (tmp);
3 z% Y: R2 w) Y) \$ [, l}& _& T& y5 E9 z( l6 j' A
*/
  {( k! d9 q( b' O5 z2 a. k//****************************************//$ j3 S* K2 B  _1 u; q5 ]( V  B! o
//函数功能:将模拟信号转换为数字信号
% q9 K. F4 t/ E* x//函数名称:TLC2543_ADC()8 D" W0 w+ F) G/ w* [
//输入参数:uchar CH_i1 s3 ^5 s5 k: w8 ^
//输出参数:uint类型
2 y# C: o* [& q/ \2 m//****************************************//0 h  _0 ]' y# K5 j- D  r
unsigned int TLC2543_ADC(unsigned int CH_i)           //CH_i,通道值
2 u+ l* u* S9 G* d4 _$ h; S{
  L- I' j9 }+ i0 m5 M) S2 c& r        unsigned int AD_Val = 0;3 ]4 T% @+ _+ a2 y7 S
        unsigned char i;9 H' h6 v5 \% K& e! k
        CS = 1;                                                //一个转换周期开始9 F/ ^" ]3 j- r- F# R, w# S
        EOC = 0;7 [4 t7 m7 H( }
        CLK = 0;                                        //为第一个脉冲做准备& [; Q8 [. L) ?* L5 q
        _nop_();- R4 Z  H9 o  n% a4 \& F  e
        _nop_();
6 w3 c2 c  ~9 g6 |( J        CS = 0;                                                //CS置0片选有效
4 T, r1 m. g3 n! k        EOC = 1;                                        //EOC开始应设置为高电平, V. ^2 i  x; ]- z, Z$ A$ N
  CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置5 c1 M/ c+ x6 ?
  CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
0 y! _3 p1 _& L7 E/ `: k        for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
* e  _+ _- Y* C* s1 D. u        {
! B8 Q5 W: G" O% ?               
. K" l1 p4 C) u9 t" f! z* x          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)    ; l, F; }6 r. S& L, N
          CLK=0;1 D% X6 O  F# m4 R- @" S
          _nop_();9 h1 E( o, h+ T8 a: e& ?1 d
    if((CH_i&0x80)==0x80)        " F9 g8 T# y' }1 k3 }
            SDI=1;                9 N: L8 O. b$ E8 ~3 C5 a
          else
. A5 K9 x' w( W, @; M5 R# Y: n            SDI=0;' u7 e6 r9 s$ Q. q$ o) J, v
            CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543' j# l" \, T% h/ K
      CLK=1;        
6 A% U. \3 M: J1 h0 d( a      _nop_();
1 k! J! S$ M, i! @1 i0 E8 M; [          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
( s. f) G1 j6 G          {% O, G! [+ j1 W
            AD_Val|=0x800;         
, v. y3 @  E8 t- j( ?4 C' r          }
& s! p. L% _  K5 X" g( j: P          else% h) c, j6 P% P
          {. d5 N  E, `, J1 z0 P. I) v
            AD_Val|=0x000; % ^9 l3 a$ R% Y3 _
          }
5 _) P3 E7 B; c6 O5 U  H, Z$ i        }
  B' E8 P) ~; [5 w3 c4 }0 z/ F7 x  SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高. N& l# C& E4 e8 p5 ?0 y; {) B% e
  for(i=8;i<12;i++)          //读取转换值的第8至第11位
5 Y0 k8 V% @2 o  {) g; w9 K3 x- y! X- d
    AD_Val>>=1;
4 e. `. B" V' `' C+ d0 Q9 z7 j$ W: X          CLK=0;                       
( t' ?6 j: ^) g. O, l  c& |          _nop_(); # Z9 c4 y9 n" E: G
    CLK=1;      
/ L0 Y1 {* m0 C! C7 C& d9 v; W          _nop_();- V# S4 K2 @" _& R
          if(SDO==1)  
, d1 }8 u1 T' j" g/ B) o  W2 Z9 r          {
# K4 |$ I: y+ Q+ U3 X            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位- q0 H# z( W" v9 I' M) E2 I- @
          }! u5 T- j( Z: ?& r6 \
          else) q; H2 O' p2 h8 R0 [
          {
# v- w6 Z# M8 ?. c. B0 X            AD_Val|=0x000;         //第12位写 ‘0’
6 @7 V, W2 c9 V! j          }! j8 a* x+ I2 D8 F3 C! `
        } " ], a. q- t! n5 J, Z) ]
  CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
1 `0 r% W9 H4 T3 H3 q' K  J& n  _nop_();         //给硬件一点转换时间1 L; J5 B2 ?' A3 k$ y' d
  _nop_();3 ]1 _' x% @5 E; ~0 k$ C
  _nop_();
4 v0 Z( C; v2 d  _nop_();0 q2 _4 J  A* @0 ]
  _nop_();
- @! O) l1 r% N' K  s8 B  _nop_();
* F; I  R, {, d1 ?: J5 R2 R  CS=1;      // 停止转换,高电平无效9 p1 L# K- p7 |! m4 d
  EOC=0;  
0 k* e2 i, o  x  return AD_Val;$ r" J. `4 }* W9 z! `
}        
3 V" z+ s% A: M7 V. [: t2 O) a6 L
2 S* j/ A1 \; u( l2 P; ]/ e. X$ U//****************************************//  Q! \+ S& C9 n+ o0 d
//函数名称ata_Conversion()0 z7 }3 k/ ^1 p7 N
//函数功能:电压换算
6 Q5 e6 U7 C! w- Z* B) U4 x2 B7 W//*****************************************//! F; Y  B; {- @9 T: C# A7 U
void Data_Conversion(void)
$ z) ~$ n; i, [6 n+ T3 C) g8 T{
7 ^- t2 C# f4 Q: t9 f. ^        uint ad_val;
2 ^# m* y) D" G$ K) B/ S  unsigned char o,p,k,l;
& |/ j4 W, Z+ q7 v        
  r1 {; P2 Y4 S. U2 q" R7 a& R1 L        ad_val = TLC2543_ADC(4);2 [* ~0 B+ ]' x: a4 G
        o=ad_val/1000;                   //取千位数字0 \3 m, Y9 g: Y
        p=(ad_val%1000)/100;           //取百位数字
- \- L0 U6 }# `0 u* i        k=(ad_val%100)/10;               //取十位数字  v4 |9 p. ~- G2 x
        l=ad_val%10;                           //取个位数字
7 e$ b1 q, d8 P9 \2 |        write_command(0x80+0x40);4 g% p! m( w0 D. f$ c: q1 K- ?
        write_date(0X30+o);
# `- n  v& L* ^2 k$ ~/ Q$ O        write_date(0x30+p);
& v2 L$ ~9 Z7 E        write_date(0x30+k);* j2 j9 H3 g6 S$ L& Z# I4 x$ }
        write_date(0x30+l);
& v6 s% h, N! G6 [        //delay_ms(1000);3 C0 _! c0 f$ n* D' y+ I, ~
        if((X3==0)&&(X2==0))        //0-5V5 \0 V, G$ V! L% J
        {" O' U1 p4 c" k; q& O3 p4 k
                //ADD_A = 0;
/ a: ^2 A. I6 I& C4 O                //ADD_B = 1;+ B, X! ]5 l& o  |' ^6 b% _
                //ADD_C = 0;
* G6 L3 |4 M- t3 |. m                Volt          = 5.0 / 4096 * ad_val*1000;                //(100-500). ~. p& t; K5 U; Y' G
                LCD[0] = Volt/1000;         //千位
5 P: E" V# c# Q7 x+ ?; C                7 u' h" _! }* E: V- I3 ^0 o/ g: i
                LCD[1] = Volt/100%10;  //百位
5 T- w0 Q+ \* v% l8 |8 C                LCD[2] = Volt/10%10;    //十位, p( t+ \$ z3 s% ?6 P* s
                LCD[3] = '.';                                //小数点# X& W: r, V, ?4 N' @+ W" Y! ^/ R! v, A
                LCD[4] = Volt%10;           //个位" R7 |; I! K- Z; `- }
                LCD[5] = 'V';                              //字符V 4 T8 j4 G0 ~! V
                                                                                                                                % V4 p# m! _; V/ S
                write_command(0x80+8);$ s3 @) Y, {1 h
                write_date(0x30+LCD[0]);  v1 `* {( n8 J9 d3 _5 O3 ~
               
" r( H) G- p" x8 H0 c4 @6 K/ R* o* c                write_date(0x30+LCD[1]);
$ E- `0 m2 W2 @. D9 h  ]                write_date(0x30+LCD[2]);+ B; b3 O8 u! T5 d; o, k# P! {8 I
                write_date(LCD[3]);( a& T! F( D, q$ Q9 u$ B0 T
                write_date(0x30+LCD[4]);
' T; X' K9 u) N/ o4 }8 d                write_date(LCD[5]);
) C; y9 @& s4 \( ?7 }$ e  r! z        }, J7 }4 a- Y% i
        if((X3==1)&&(X2==0))        //5-50V0 f& j, i9 a+ p. x+ i+ K* D
        {2 d4 b- u' p  ]- }
                //ADD_A = 1;
# F8 k$ l. k" _/ o/ C' m5 C% B                //ADD_B = 0;
1 D) [. g' p  A* Q( y                //ADD_C = 0;
( F, P5 V4 E  Y9 _1 p) X% O                Volt = 5.0/4096*ad_val*1000;        //(50-500)1 O" T: t! I5 s# f; D
                LCD[0] = Volt/1000;         //千位1 j! @2 u- I5 @5 ^- ~- B2 k, [
               
( o: _) m* e4 t2 e2 V                LCD[1] = Volt/100%10;  //百位
  T: s6 g! {' n' w6 W               
. z5 e8 J  w; G6 X) t                LCD[2] = Volt/10%10;    //十位& u+ t; ?8 j% I: K' p* U
                LCD[3] = '.';                                //小数点2 g; f. h# N2 ~6 I
                LCD[4] = Volt%10;           //个位
( V* Q* a1 ~* i4 }3 w9 G                LCD[5] = 'V';                              //字符V
1 {1 m& Y) o+ V4 |. B                                                                                                                                
' x3 J; P' a+ V5 C- O                write_command(0x80+8);
- n, m9 P# ^8 c                write_date(0x30+LCD[0]);7 A; M$ Z5 C, m( D; g( W
               
7 I0 m! X3 M# i1 P+ h                write_date(0x30+LCD[1]);
4 j4 m# m% x+ b/ [' L               
) e" c2 z' u. ^* |+ r3 y                write_date(0x30+LCD[2]);
8 Y9 y1 Y. r1 @* B' q$ c$ c                write_date(LCD[3]);
6 F+ n3 h. B) V( I! k+ i                write_date(0x30+LCD[4]);
8 W3 x( _) w& `# y- u                write_date(LCD[5]);2 {0 ?8 t* ]% P# [/ @1 \6 k
        }
# V, z  B- ?% R# O8 n* a        if((X3==1)&&(X2==1))        //50V-500V+ }/ r6 I+ f  x2 F
        {( u3 {# C4 W- f+ B$ |4 f& T4 p7 K
                //ADD_A = 0;
& Y/ \% R. a1 T' T  Q/ X; L# i                //ADD_B = 0;; o# I: j, D% j6 ~4 e! O
                //ADD_C = 0;  Z' w0 A2 V; m- P& H
                Volt   = 5.0/4096*ad_val*1000;        //(500-5000)
8 N+ P, Y. l& b/ [; g, C( O+ B( \                LCD[0] = Volt/1000;         //千位6 j( D- q" m; k) o. y: f! X  U
               
- s- ?: j3 b) @/ g                LCD[1] = Volt/100%10;  //百位
* P* N5 d% Q9 v, ?$ d4 T                : V/ i/ w/ \5 O% d* c
                LCD[2] = Volt/10%10;    //十位
8 n  P7 `6 E9 t9 M                LCD[3] = '.';                                //小数点
. }, y8 B2 d2 W. v                LCD[4] = Volt%10;           //个位8 a9 V* ~& d7 z6 ]& F6 y8 R
                LCD[5] = 'V';                              //字符V ) N6 b. M3 _( D- O! d
                                                                                                                                ) A! }& o6 ^/ W
                write_command(0x80+8);+ O1 o* m' X5 w& X1 ?6 b4 h  j
                write_date(0x30+LCD[0]);. i* w4 v. a- D1 ?
               
4 o9 D& e, l' k6 Y! x/ N9 L                write_date(0x30+LCD[1]);& ]7 x, S5 [7 Y7 c3 h, \, j
               
  L3 [: X4 v; \+ r: P! E0 v0 U$ z                write_date(0x30+LCD[2]);
  V' ?7 S" N6 G, U2 z( T! A# h                write_date(LCD[3]);
" c/ y. _  q* l8 G, C  B& T4 [                write_date(0x30+LCD[4]);3 k- a; c2 [' t2 l' `. V
                write_date(LCD[5]);
6 l2 B6 t5 l1 M  S8 e- F5 H+ l/ v        }
8 A6 ~9 t* N2 Y' g$ ]0 C}  o& B% `) e6 O* ]! Q$ e
2 J1 G. T0 y( _" H
void Volt_To_LCD1602(void)
( ?5 U3 S2 U$ E% ^! E; M, v% `3 G{
# i# x$ A/ _$ @6 L        Data_Conversion();                     //电压换算并放大1000倍
% E5 K$ t8 t% @9 u' u}
) S" c! W" n, r5 z  Z        
% p, c0 V: f! I/ vint main()+ j' d! v6 o# p6 \
{
  c8 l* |& @5 ]/ F5 y: ]$ r        //uint m;$ A$ N5 X. X; t) t' X& s8 F8 [
        LCD_init();
4 V' a" k( g0 Z! R        //ADC0808_Init();
% g4 x7 R" w8 P8 E% D# f& r        //ADC0808_ADC();- F  n, H/ O4 a. c  v! S  C$ N2 q1 K
  delay_ms(100); 0 d  n( E; K* |2 t& z
  write_command(0x01);( O; u2 t# p/ P
        write_command(0x80);
! F4 f( \, G" ]& h  X' k2 ^        string(0x80,"Voltage:");
; }( W/ M* ~6 D4 E8 Z' s$ D& D2 u* ]        //delay_ms(2000);- v5 C2 h/ O9 l2 Z5 Q( n$ ?
) j1 P, `: y0 F  o. [8 E
        while(1)
$ n  y* t, a* P; K2 ]' _        {
" J8 }8 h# E8 a% I3 q* U: l, ]8 O6 V- I* ?% p6 U; |
                delay_ms(50);& p  F  y4 l) E9 R
                Volt_To_LCD1602();
8 d. T, Y" H, c( Z* Z                //delay_ms(4000);
; ]& d2 _7 B% q4 f: n               
6 ~2 a# [* @- r* E" ?# l3 H        }  |$ q1 P9 j! p2 Z# Z
}

+ Q! M2 m8 A( v) J+ d
下载:
游客,如果您要查看本帖隐藏内容请回复
- f" B8 h4 H+ b, i) p! E0 _# Q- h  [  E

该用户从未签到

2#
发表于 2019-1-31 16:02 | 只看该作者
看看楼主的代码

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。
, Y9 f) c% c/ Q2 z- E: E

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!$ j& m, f$ f0 A* j$ C5 M1 [

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666
' ?4 @# [; i! u( D! W5 c+ o

该用户从未签到

6#
发表于 2021-2-22 20:26 | 只看该作者
谢谢分享 学习学习
  • TA的每日心情
    奋斗
    2025-6-11 15:38
  • 签到天数: 43 天

    [LV.5]常住居民I

    7#
    发表于 2022-8-31 09:19 | 只看该作者
    学习一下,谢谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-31 19:17 , Processed in 0.156250 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表