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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的直流数字电压表(0-500V)自动切换量程; S0 c6 Z  d& P

: `5 o1 p0 U7 ~( s5 B$ c

; ]# D6 A3 A9 W% C. O
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
+ @' r6 I0 s0 {$ M; J电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。4 z. V+ x1 ]% [* O/ L0 `
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。

: T+ O% C; N! C+ ~9 ]5 \2 R
电路原理图
6 |% X) A+ N" ?7 a+ Q8 h

1 c8 {% ^0 E8 O0 X8 }/ v% Z1 c8 \' r+ r+ [1 i5 F

# W" o  I! f% j0 {0 P1 O. i- ~" R- m. c3 g. t
2 a  a( t1 q% M" ]; _7 \. w) s
#include<reg52.h>
& h5 u0 ]* h1 ^#include<intrins.h>
  c8 U1 b+ I4 g#define uint unsigned int; K2 _( p4 p$ `6 F
#define uchar unsigned char$ p; g4 s( R4 ], S, J3 Q
uint LCD[6];   //电压数据转换成LCD1602液晶字符显示2 }5 v/ C% f6 p; n6 S. Z
uint Volt;9 C7 h! l) r# _/ E* p+ P( G
//***********TLC549管脚配置*********//
7 H/ y6 l8 T# K, _: X//sbit DO  = P1^0;        //时钟$ s. t( u. e6 D4 o8 Z/ g1 Y6 h$ M1 i
//sbit CS  = P1^1;        //片选
9 Q7 ~5 q2 o9 L& N8 v) c; C//sbit CLK = P1^2;        //数据输出& {, |6 @# N1 I7 v: Q
//*********************************//1 `4 H+ s/ c& T8 `/ C, f0 S
sbit RS = P2^0;                        //1602液晶数据/命令选择端
9 n. N7 z2 r- w9 U0 asbit RW = P2^1;                        //1602液晶读写端
- f5 l3 N7 D, c+ m- U+ I) a# @sbit E  = P2^2;                        //1602液晶使能端
6 N; |' H" E& A, f' R! K3 Y* d' Lsbit X1 = P2^3;
" A' x& F5 B/ w$ Jsbit X2 = P2^4;6 S- R) f- ]6 C, u' @: @' Z  k/ K
sbit X3 = P2^5;
: W$ S$ K  F0 }# E( T- _sbit CS=P1^2;        //片选引脚
+ g! D) ?- i+ q1 {5 x3 Asbit CLK=P1^3;       //时钟脉冲引脚' f" B7 }  K. S' I. u+ w
sbit SDO=P1^0;       //数据输出引脚
, G3 u, e) V0 p# R$ k& M; Csbit SDI=P1^1;       //数据输入引脚+ y1 S3 n) c9 q4 r. c
sbit EOC=P1^4;                 //转换结束引脚+ ~3 N+ O9 I7 n
//*********ADC0809管脚配置************//
/ o9 |; S0 `! B( ^# u5 c//sbit ALE = P1^3;        //地址锁存允许信号9 M# n4 ?+ p& V- P: _8 t
//sbit CLK = P1^4;        //时钟脉冲输入端- {. i. }* N: D3 E9 O. C! Y. h+ v
//sbit ST = P1^5;                //A/D转换启动信号, \( y% E. u0 u0 R
//sbit EOC = P1^6;        //A/D转换结束信号: c! f" Z. M. q$ `. B2 Y
//sbit OE = P1^7;                //数据输出允许信号2 d% m5 D7 E, f6 z
//sbit ADD_A = P1^0;        //地址选择输入端6 P7 s( l0 m2 j. \; D
//sbit ADD_B = P1^1;( Z, S8 `: I* ~
//sbit ADD_C = P1^2;
0 `7 d; L( o" ~$ Y) L+ q, }//************************************//
. y# r4 S. H) w7 y// Function Prototypes
$ r4 E0 u9 A+ h) o( S; u2 @0 Avoid check_busy(void);; Y9 }/ C$ L7 Q" m# r
void write_command(uchar com);
8 a& z7 @  C& q3 Mvoid write_date(uchar date);: Z0 P& h& c2 e
void LCD_init(void);
/ u4 |/ O2 k, ]1 T2 h! Jvoid string(uchar ad ,uchar *s);6 r" K/ ?% i& Q' V
//void lcd_test(void);
% i( G7 a1 R# Lvoid delay(uint);
7 v/ U4 N1 i; v& b% fvoid Volt_To_LCD1602(void);) C) \2 w8 Z, |% K
void delay_ms(uint xms);: L* K/ z  R2 m" x
void Data_Conversion(void);
; q1 _: u0 U: O1 c//uchar TLC549_ADC(void);# M" {0 L7 X& D: i: u5 R
/*******************************************1 ^" O7 b, ~- J# ^: P
    LCD1602 driver mapped as IO peripheral
* g& d6 C- M* b7 k3 ~1 ^*******************************************/  ! M0 J5 Y, n; Q( q
// Delay
/ H0 F  w; a, A' w3 Z! H% W// Delay
  A. E6 H. I8 ]void delay(uint j)
& x. A5 U, l% z{ / z. y2 @. x& d" O  ~5 |, p
        uchar m = 60;+ ]' o2 \6 g9 g" \% q  r
  for(; j>0; j--)2 a4 b. m" ^5 T3 b/ @! V  I; \
  {
% o, T7 S6 u! e4 m: q                while(--m);. M& z/ X5 L- t1 J! v, R* X, j
    m = 59;) g6 f1 z2 U8 Z  g# i. T
    while(--m);0 x" [. ?. J+ U7 E; g( `8 @
    m = 60;( C% M7 x9 Y* ~6 w' G
  }  A- g+ Q4 `, ~& g5 w: _+ D+ w& }
}' x, X0 i! u- ^* m5 I9 C
  s% d) @0 c0 h' q9 H
// Test the Busy bit
2 T* d. ^5 ^: s# Yvoid check_busy(void). S8 j; R) i* e6 g, N+ g
{ ' Y! D( Z- B# K8 ~& \
        do. K7 j* `0 P5 B+ N& t0 B: X' g
  { ; g+ C  N7 [3 o) {
                P0 = 0xff;
' t/ p& k! \; O. _' U    E = 0;
2 {5 \- P, ~8 d9 M4 ~) n    RS = 0; 5 V& ^0 l; \) z. f3 c2 K
    RW = 1;0 O. `  h+ @0 W
    E = 1;# a: j$ ]( Y, A  \
    _nop_();, {; `( W# R# `+ k( m7 l5 w
  } while(P0 & 0x80);% `& r8 \' ]$ u: p
  E = 0;% X) J5 R9 z' C  H5 K
}
" E# R2 n4 ~3 R% z4 t/ c  @2 r- z
2 B' E9 A% n, ?2 l) a& e// Write a command
( K, g5 d$ @( W* X; L, Tvoid write_command(uchar com)1 p- o: [' q- l& |& @" `
{   o' L! j" D; d* X2 t+ F0 \
        check_busy();* J* W, [8 n. |. P1 i' m
  E = 0;1 Y2 h% H6 s$ a. f7 f
  RS = 0;" N8 d0 l& ]0 u
  RW = 0;
" W, X' l* z( G$ b- v5 Q) H  P0 = com;
9 b( h% K% {/ Y8 \3 |5 Y1 t8 p" N  E = 1;1 q9 w+ z$ i" J! a* o% X! [! L
  _nop_();
+ W  H: V% l5 Q6 W. [  E = 0;
! k$ e$ M. t9 \# W  delay(1);6 ]( f  r$ V2 D' l
}
; C% ]# n& R0 r8 q) o+ }; v! X; T" q  W" R0 _% p- F# O
// Write Data
. P9 Z$ R* T' Y' H3 kvoid write_date(uchar date)
  \3 Y5 `# W7 \" B$ F# _' g6 m9 l{
$ M& p+ c7 E$ O* Q1 k& {  `        check_busy();
' H3 ?5 M, ^1 i) E. e2 I% a  E = 0;. E5 l& D. p4 G) R$ i- K$ A
  RS = 1;
" c+ d) I6 I. l" }2 S2 A  RW = 0;
" |0 G; c( }3 E/ Z# V9 ]& d  P0 = date;2 ^, c8 Y3 z5 V
  E = 1;: ]% I4 v2 n4 u6 S5 z
  _nop_();
8 O3 {' A) |1 P4 U9 J6 `* ~  E = 0;- @# A. |8 G! @, J% y' s
  delay(1);   & r3 ~* a6 ], D% H3 O% D' p6 I4 y8 j2 h
}3 S" g# F7 A  ~. h" Y9 `# ]$ v# `
# X; G0 d8 O9 p, {1 h- e
// Initialize LCD controller2 K1 \$ V) J. q( v: ?6 d* I. H
void LCD_init(void)
2 T$ A9 G( g! R6 L! `/ [8 g+ f{ 2 d. E8 g: P3 V- ~7 h/ P
        write_command(0x38); // 8-bits, 2 lines, 7x5 dots
0 H6 c" A1 I" i4 s6 l3 d  write_command(0x0C); // no cursor, no blink, enable display# e% B/ o, u. I/ c
  write_command(0x06); // auto-increment on
3 p- x1 n3 Y5 s- x8 t* K1 P  write_command(0x01); // clear screen( M+ U" E. `5 e
  delay(1);
( _( R* @% x! o; e4 P3 U% j1 }}
! w1 W% A- d& A! \1 K
3 H% I: \1 H/ M7 x// Display a string
4 d9 O. m4 E9 x" Uvoid string(uchar ad, uchar *s)
9 d) ^9 A! V3 J# L% H6 g{
& w% B. J) [/ b        write_command(ad);+ l! i* q! E/ b* Y7 m' `. F
  while(*s>0)+ G: f3 M# F- v) \5 N5 F. O
  {
! D0 c. C4 B' ~                 write_date(*s++);4 j0 ?9 ]" S0 o, i" P2 G  s2 E, \
     delay(100);$ k6 F; N: X  r2 Z4 p
  }# m) \: j& J4 X* s
}3 a6 G! [5 |- o/ h# V2 [
//****************************************************//
- l, A. M$ Y) x, A# {//函数名:delay_ms(uint xms)
! m2 q3 p5 Q2 y# N8 A//函数功能:ms级延时函数
# Y/ e% p' O7 U" g# R//***************************************************//, e+ W6 l: S; y# R7 k( p

" _2 A! l' m8 j" a2 Jvoid delay_ms(uint xms)! h8 b& J$ Z9 j& h1 f! m) H. Y
{6 r  k; Y) j* P6 w( A
        uint x,y;
' w* _  n& i' G5 I2 R        for(x=xms;x>0;x--)
+ W/ `6 N6 v+ F4 p3 o+ g$ S" j                for(y=110;y>0;y--);
; G  E- ^; i  O7 X2 f4 ]        ) j. u; x9 F# \5 [
}
2 [# J' q. b  g9 m! r* d/*" E/ n) ?. }2 h# d4 j
void ADC0808_Init()
8 s: a. B( u1 Z1 \0 V{4 Y* C# `" \) u  |# O4 U4 B
  ST=0;
* O2 W3 `5 J2 z7 g  OE=0;
; r1 b6 e- o) k" o% h# u$ C}* b$ F7 r3 Q- H3 F1 h
*/
2 Q2 d5 C- S$ v' M" ~7 E! {//***************************************************//& q7 u5 V+ G0 W' a/ g# C7 ~# _7 ]  }
//函数名称:ADC0808_ADC()5 h; O* d; V5 k/ R" q& D4 q
//函数功能:读取一次A/D转换的数据' t0 t1 s3 X! d, O+ |- \
//***************************************************//
+ ?6 c% B6 O3 }/*
; C, |; x) ?" N  X! k% Cvoid ADC0808_ADC()/ J4 l0 U5 ~3 U( J5 b% u$ U
{: a. @# `* s. s
  ST=0;
- X- L5 M5 H5 O) g+ I* s, T  ST=1;  i+ B* ~! e, u+ c
        ST=0;6 U$ `, }' t) T& f1 u1 N$ V
  //OE=0;
7 t- M, i( b* P$ `  while(EOC==0);          //自动发送
8 E4 m: F. ~* W/ I3 \  OE=1;; a  x  j( Z: R- W# G6 z# l% `; ?

3 R9 _6 m3 K. j2 _}. i9 u: h8 n+ c$ B3 O. i) l
*/
" F2 S+ w9 ^* ?//***************************************************//
" Y& n& c  @+ A  K0 e9 T//函数名称:TLC549_ADC()% R$ q3 a" d8 [* ^* p, p6 B0 a! @
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换3 n! u4 F7 r2 s9 Y( c
//**************************************************//8 W, E/ i: ^4 a# V- t/ J
/*" X- r' E; A; D, M
uchar TLC549_ADC(void)
4 o- m3 L' L6 U6 o# D/ W5 [) Q{
: a# K6 n3 d- ^        uchar n, tmp;6 ?" }# l( Y  q; z% Y
; V' {/ Y+ }3 Z6 @/ V4 T2 [& X
        CS  = 1;                     //CS置高,片选无效
# m  o: l) \" S- c) X! i) @3 z: ?! c        CLK = 0;
2 K2 P; {( h- e4 [0 N1 w7 I) x) t" h' Q$ V6 y2 s! w
        CS  = 0;                     //CS置低,片选有效,同时DO输出高位
! ~/ A1 k4 I2 f: n  C# u. e        _nop_();
" \, R5 z6 I" k. H        _nop_();                     //适当延迟时间1.4us Setup Time
0 U" N: h3 M8 ?) e
7 C+ z) G: V3 D        for(n = 0; n < 8; n++) //串行数据移位输入
' N9 w4 \( k2 `0 R) E4 O' m* Q        {
+ w4 ?; V8 f, B8 e                tmp <<= 1;
" D6 N, b" m# W% ^1 D! M( y9 b                tmp |=  DO;
# B1 ?* V; Q/ q# S( z# @  - u# R8 d! ?5 @' X1 k7 E, ?
                CLK = 1;        //0.4us/ S8 {$ x( M" X4 c; J
                _nop_();          //CLK transition time Max 0.1us* x2 L! V3 f  }- Y, J* I0 e
                CLK = 0;        //0.4us
% I: j$ ^1 I9 R% i        }) a3 j9 e" }% O  d3 h' m. h3 q
        CS = 1;            //CS置高,片选无效
) ~/ |- O" ]) V- Y1 w4 |; D6 c* g        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us: f+ A# P' l( a
        return (tmp);
3 W8 x( Z1 [% ]% \* \}
8 K' X4 d, z& [0 s7 a*/" {2 k9 o2 Y' U. {" a$ t4 \
//****************************************//
& y9 f* ]/ N; b& c  J//函数功能:将模拟信号转换为数字信号
! Y: k" t. N) I4 Q+ ^/ d//函数名称:TLC2543_ADC()
' P) g$ f& ?) U- T' a+ r//输入参数:uchar CH_i4 k$ d( [/ d( H, k% Q3 \/ r
//输出参数:uint类型+ x2 ?- u- \! p" P
//****************************************//
' i: L7 K* @: l$ D' _unsigned int TLC2543_ADC(unsigned int CH_i)           //CH_i,通道值5 z, w2 e, ]0 s- y3 ]" Q
{
6 s6 o9 |# w% k: t7 k. j/ }        unsigned int AD_Val = 0;
1 e" h5 b# B) p! x2 m        unsigned char i;
7 D6 c$ @7 `* K/ s2 P; L        CS = 1;                                                //一个转换周期开始3 E- ?( _+ L) Y9 s! \
        EOC = 0;
2 }4 S- d: ?& Q' H( U# q        CLK = 0;                                        //为第一个脉冲做准备
, `" Q0 n# E( r% |, e! ]! S        _nop_();8 A; G7 r$ W$ q- o3 K! b
        _nop_();& p, t  i% D1 C4 F1 b  X2 `- x  {
        CS = 0;                                                //CS置0片选有效" ]; j1 ]' }; m( l- B
        EOC = 1;                                        //EOC开始应设置为高电平
: M! r/ B) X7 T+ a/ D  CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置( X9 j9 l+ C% \
  CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位5 h! L2 t$ y) l
        for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果2 V( u5 ]/ \6 Y3 E4 @6 g
        {) y9 I9 W: _# A# V- f
                2 Q2 n5 i7 T8 E/ T) `; Y/ X3 O
          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)   
8 ?) R3 i* k; I3 `          CLK=0;
+ q/ a( L0 m# w- q3 ]( h          _nop_();
& K6 z% R! n$ R$ P0 R! v! u    if((CH_i&0x80)==0x80)        1 O$ c" T2 y! u; k4 \4 s& s
            SDI=1;               
2 ?$ c' ~- B/ Y" d          else
% I4 j/ `, t' Z" p# K            SDI=0;% l+ M+ ]) _5 E1 Y6 a
            CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543  x) I  N& m2 T: @8 s
      CLK=1;        
" o8 T: N, o: B      _nop_();
' a$ B5 a% X* t, q: C. @          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
  A9 }3 j9 ]2 k1 T          {' D  m2 G$ S6 E- `- a8 `
            AD_Val|=0x800;         0 `* H# _, g7 T8 J; v& C
          }+ l$ i" w' }5 D$ q
          else
# X! ^5 B3 ]2 ~( c5 w          {
. b" E0 T+ k- t            AD_Val|=0x000; - Q# B6 @$ W4 C9 a, t9 P# G! M  K+ f
          }+ g  k# u/ E" _8 ~. F: e0 t/ H3 n$ L
        }& F; B/ V+ a7 @1 _
  SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高% T# @+ R2 M8 X
  for(i=8;i<12;i++)          //读取转换值的第8至第11位- ]  n% X& w- o: o+ n: f
  {) {7 h4 ]8 o( r, \
    AD_Val>>=1;
5 Y1 R9 E1 [- z0 l2 }0 R          CLK=0;                       
7 q, h  O1 l0 w7 H; H9 t1 Z2 p- w! T          _nop_();
0 W2 x" [" x" W# J/ s! L    CLK=1;      
3 @& N) G7 ~7 o' e7 w0 M& l  s5 P          _nop_();
' ?. W  D; f4 M# w          if(SDO==1)  ; O8 b/ m7 e# C$ }% ]% X. f
          {
  u* x8 \0 p0 P+ y* j            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位! t# D$ A! J9 {! ^  \# ^
          }. t# e+ X. V+ v  p' f
          else7 y8 ]% f" ~) U3 _- T9 v# Y0 g
          {
: k$ b; T% O& ?            AD_Val|=0x000;         //第12位写 ‘0’
, r  W$ [) {( i: P; M, X* I          }
2 ^1 i, {- ~7 P) B% l        } % v  j6 `/ i6 O0 ]; A
  CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
4 I3 ~2 U$ [7 ?- L  _nop_();         //给硬件一点转换时间
0 V. v3 C! Z* j! ?  _nop_();3 ]8 P( g, h7 a( ^5 R* j' n4 @  r: F
  _nop_();
. q" d! Z; R0 k% |! J  _nop_();3 N  [, L" R9 x8 ^! ?
  _nop_();3 b2 g- F* [$ v% C/ q4 o7 T  k
  _nop_();
& u" }( X; ?$ j7 N* ?8 q  CS=1;      // 停止转换,高电平无效
$ m7 T% A) V4 D. t1 E% x  EOC=0;  
/ O7 i& f3 s# [. J  return AD_Val;
$ Q4 L( ~0 k; d6 M& \9 A}        
( f+ Z2 b5 J8 d0 L" m4 I5 \
  Q7 y0 Y; [' f9 V" N//****************************************//
7 w  F* B* n+ k; E0 @3 f5 A//函数名称ata_Conversion()
( N/ @- \4 i* B# @4 @//函数功能:电压换算- P3 B9 {  Y) }# y9 q; c% z' ~# ]4 E
//*****************************************//
1 ]! g' p, H; Y( F& D9 A: O! Nvoid Data_Conversion(void)4 K% J- Y1 v& v; ]( V( s$ j% }
{
  o  W+ n4 x' e+ w9 C        uint ad_val;0 S' u9 r8 Z, W+ Y; K3 K7 Z8 ?# Y
  unsigned char o,p,k,l;
: h4 J! N( ]; f7 i) G  p        
8 @8 N: M; b/ a# h! E        ad_val = TLC2543_ADC(4);
0 X) P3 a9 O$ e4 I        o=ad_val/1000;                   //取千位数字7 s+ Z+ K- [+ v- C" U
        p=(ad_val%1000)/100;           //取百位数字
$ }; q9 f( e  _8 ]- e1 X        k=(ad_val%100)/10;               //取十位数字3 `' F- {1 v% [/ G; D+ T1 o
        l=ad_val%10;                           //取个位数字, l! o% m1 D% u7 c
        write_command(0x80+0x40);6 K" f, M1 u6 X$ c2 k- k8 c
        write_date(0X30+o);
9 F: _7 j, M8 L  U& U, [9 @/ Y        write_date(0x30+p);
0 g8 D  ~( O2 h+ B4 Y7 o        write_date(0x30+k);
- w  g& H5 l2 ]+ `  m  i        write_date(0x30+l);
/ J; V* {5 Y# {" r        //delay_ms(1000);
9 Q8 H/ Q/ H# r4 V% |  }) z        if((X3==0)&&(X2==0))        //0-5V
1 ~$ H+ S# E+ z6 v) L        {
/ m) K. v3 B! Y                //ADD_A = 0;
- ?0 G0 i- C- H! a( [" K                //ADD_B = 1;; [3 I$ {9 `& v8 ]# C
                //ADD_C = 0;& M* z; ~9 E* H  m' i6 T  F8 h$ l) Z
                Volt          = 5.0 / 4096 * ad_val*1000;                //(100-500)
$ n, X; C) c4 }# Z; ]                LCD[0] = Volt/1000;         //千位
+ l1 _5 J0 G/ g& ^8 h1 t               
4 w1 J) p$ z% G- U6 W$ c! O                LCD[1] = Volt/100%10;  //百位
! q! G# B) [! f3 ]5 B                LCD[2] = Volt/10%10;    //十位
' ^1 q$ t' L) y1 p5 x% o; L                LCD[3] = '.';                                //小数点
" X: G6 ^2 \( d                LCD[4] = Volt%10;           //个位3 m( M) C8 Y& U( z$ |& l" {* Y* _9 j2 s
                LCD[5] = 'V';                              //字符V # X$ e  y  t# L& Y" e) B- J
                                                                                                                                
# O3 G1 ]5 k1 C6 n                write_command(0x80+8);4 H; I- Z+ O1 P5 w3 P
                write_date(0x30+LCD[0]);! ~8 j6 y. U- x  {: R2 p
               
+ I6 ?* d" _. d# B                write_date(0x30+LCD[1]);
  z: E3 X/ [. g8 o$ W                write_date(0x30+LCD[2]);
+ ^& O9 \; c4 Q- k: F                write_date(LCD[3]);
& y$ {  M% v; n! S                write_date(0x30+LCD[4]);
+ z+ r$ w4 O9 C2 H) l# Z6 V0 }                write_date(LCD[5]);
; \5 Y) u. g/ D2 ~" v) K        }
- L  g' f* [' N- E" n        if((X3==1)&&(X2==0))        //5-50V
0 `+ l1 F. K: u. i        {
6 i1 {, {' c# X  m! z; D% }                //ADD_A = 1;: }6 P! l; _8 j- b3 U! W
                //ADD_B = 0;4 w, a2 R$ z; s
                //ADD_C = 0;7 q% m" X9 O! A; [2 _* p8 e% o
                Volt = 5.0/4096*ad_val*1000;        //(50-500)7 R/ [  J0 E& Y  F' d6 ?  b
                LCD[0] = Volt/1000;         //千位
& k' x3 ?# c9 y* X               
) x) P4 S% F8 S6 E6 d+ G                LCD[1] = Volt/100%10;  //百位' b8 P2 G& ^* F( Y& C4 r+ \
               
0 I* ~1 \, i) Y                LCD[2] = Volt/10%10;    //十位
  z. P9 B3 {4 b- ^% r$ ]# Z6 v. h                LCD[3] = '.';                                //小数点$ s( U2 l1 f9 [" I- T: \
                LCD[4] = Volt%10;           //个位
" n* n' N9 m3 G- V0 K                LCD[5] = 'V';                              //字符V $ y2 G: Z8 Z0 b% p! @1 W. f/ h
                                                                                                                                * ^; M, D6 E% E& m- P, o* j
                write_command(0x80+8);
* j" t& o8 g& N: V! @                write_date(0x30+LCD[0]);
1 b# W% _/ X& }! }& i2 @# v' x2 I               
8 {# z# a/ l) G  _7 c( ?) T6 O: ~# z                write_date(0x30+LCD[1]);( Y1 x9 ]* ?7 Z; M8 O
                8 Q, M6 j% r6 k" m$ R1 L" K. \0 H
                write_date(0x30+LCD[2]);' x( l/ T3 I" B0 h
                write_date(LCD[3]);
8 b6 h+ \' @* {9 r- |; B' `                write_date(0x30+LCD[4]);$ R2 l) E  ?4 O+ P) e4 k+ H
                write_date(LCD[5]);4 _) u5 P. W% m+ w! C7 ^
        }
6 Z5 h$ M5 X. M- u        if((X3==1)&&(X2==1))        //50V-500V9 `; `  h$ y+ E: j+ Q0 b
        {
0 V$ I# {' _% P* G- N* r                //ADD_A = 0;6 Q% S; ^5 N3 i/ p4 _( a
                //ADD_B = 0;
( p8 @( Q0 A- h, @6 A                //ADD_C = 0;
2 p) |$ I4 G3 A; E. g                Volt   = 5.0/4096*ad_val*1000;        //(500-5000)- P  f2 R) k; y" t$ e+ n. G
                LCD[0] = Volt/1000;         //千位
! O# C4 L3 j+ t) u+ e0 Y               
( }- m4 U4 G4 B  d                LCD[1] = Volt/100%10;  //百位
( g. M# N( @! p& h" v9 d                8 b* @/ m( u) C& g5 ?, x+ o
                LCD[2] = Volt/10%10;    //十位% v' u5 T; o& A2 T( }5 [5 k0 H, N
                LCD[3] = '.';                                //小数点& U. V0 p6 O3 l5 V2 X. d, O
                LCD[4] = Volt%10;           //个位
1 d# _% |* j, t5 y; C1 K, ?4 ?4 u, a                LCD[5] = 'V';                              //字符V
' P8 t8 P9 e0 F* ]7 c8 T                                                                                                                                * q3 `/ s0 }& A4 `$ q& W- _
                write_command(0x80+8);; D/ @: i4 K4 f3 `
                write_date(0x30+LCD[0]);! y4 @6 a! s  Z# ~& y- `! W2 F
               
: s9 u# n8 F7 k& B. F                write_date(0x30+LCD[1]);* z2 t+ j5 [6 g5 |+ `, Z
                ( p" p  _8 _+ n5 @; a% U
                write_date(0x30+LCD[2]);
$ h% L' Q& J* x4 y, Y; n                write_date(LCD[3]);
% `4 w. W# M/ ^6 P( Z# k) |% m" {  j                write_date(0x30+LCD[4]);" h1 u; F& A1 F" l
                write_date(LCD[5]);* l& ^4 Q: k7 I( g7 u
        }
) R7 @  X2 T! |}
# C1 `% J" }6 n) O, q1 Z
2 ?7 t7 O$ p% e0 A% ]; ~void Volt_To_LCD1602(void)
- J3 h* U1 f! P! E( X{
: f" R1 \8 X! \" C: a        Data_Conversion();                     //电压换算并放大1000倍* m. Y+ }, |! i
}
% g. \: D. e, O+ _4 i% M1 t        4 T& c# I& q/ J. S
int main()
& o7 z3 s! ^8 w, B% K{) [2 ~4 }/ b$ A
        //uint m;; H# o$ t3 |3 m* L* A1 G
        LCD_init();
# I" d$ f9 e4 Z- Y# A* s        //ADC0808_Init();/ b, y3 g( s- o/ \" r; ~- }% T
        //ADC0808_ADC();
% o  A! C5 Z! P) q- f; T  delay_ms(100); 0 }/ ~8 T) g8 p7 l
  write_command(0x01);, h  q# w* a( _7 j7 p# I
        write_command(0x80);+ n8 U" H1 f, N
        string(0x80,"Voltage:");/ P$ K/ M; F* Z6 ~8 K; \
        //delay_ms(2000);* u% }6 h& I' ^, B/ x6 I& ~

* H- r( }" \1 h% F3 ~# v        while(1)7 [- L, O) b$ i4 u9 ^4 o4 u) d
        {
+ ~/ l, ~6 e$ e4 x. _$ b
! @- J* t4 D- q# w                delay_ms(50);
; P0 d; w, R/ L                Volt_To_LCD1602();
- K6 _) l: @. z- @+ Y                //delay_ms(4000);0 ]2 F$ ?/ u0 Y5 e
               
/ S6 V5 z7 O# l- w4 X& t        }/ e, ^, L7 p. B0 w
}

* ]; W. F% T0 |- b
下载:
游客,如果您要查看本帖隐藏内容请回复
' i! b# K9 P" n5 v. n& l% n

该用户从未签到

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

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。3 y6 i3 E; J, D3 c& k9 h4 r$ \

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!
% Y- l( p5 Y0 m7 Q, m" R

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666" x" d3 y% I+ _" @& {6 Q

该用户从未签到

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-8-16 08:04 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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