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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的直流数字电压表(0-500V)自动切换量程$ m+ B# Y& r/ [0 e

7 @* P' g3 I0 t( A' W. i" r

% h1 c# [: z, [
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.
6 Y  s# D& b/ U3 J' c, W+ m" ]0 ~电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。9 j# Q0 p+ u  N7 {( z! w! A
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
/ K3 I: ~4 X, q* Z1 s
电路原理图
6 e. L+ [9 Y- M* R: a
2 K; E, o+ D) {" J. C
; A9 `% U8 o( t
+ o6 f( z: j# K' L( S
) ]4 T; F: M& h. \* {5 y# g4 @' `7 O

! C" n# J, S# k  c' o6 c+ `! T9 o! h#include<reg52.h>7 P7 }0 L# ~& L  @
#include<intrins.h>
: e& b3 S$ c4 y! k; r: t. [#define uint unsigned int5 C! p! F; a, S; O0 d
#define uchar unsigned char5 q. ]. x8 P  u2 N0 z
uint LCD[6];   //电压数据转换成LCD1602液晶字符显示! X$ a( f5 m5 v. ]# }& t8 [
uint Volt;: o; `& @$ q6 a- M
//***********TLC549管脚配置*********//1 g4 H4 O( P) p$ @7 [. A* h
//sbit DO  = P1^0;        //时钟, x2 X, v; {% w6 f
//sbit CS  = P1^1;        //片选
$ o* H0 v; i5 D, {  S" r/ |//sbit CLK = P1^2;        //数据输出* P* J; X1 x- R4 B
//*********************************//$ G& `/ }) ?5 v
sbit RS = P2^0;                        //1602液晶数据/命令选择端0 Y& C5 m. Z- u1 l2 P* L
sbit RW = P2^1;                        //1602液晶读写端  R  q- M" X5 B: u
sbit E  = P2^2;                        //1602液晶使能端/ j' J1 u" U' A6 L: R+ H
sbit X1 = P2^3;) F. V* ~/ Z/ X# O& C$ s6 o
sbit X2 = P2^4;/ ^; z; ?2 h4 j. U; g" n
sbit X3 = P2^5;
5 F% |1 E8 `, {) qsbit CS=P1^2;        //片选引脚
: t4 z" y$ t# l0 q5 [1 h) ]- w$ nsbit CLK=P1^3;       //时钟脉冲引脚/ m7 Z  m( s" M: j. g1 F0 g+ z
sbit SDO=P1^0;       //数据输出引脚' b, [- w+ z. Y3 T) c
sbit SDI=P1^1;       //数据输入引脚
* b) ]2 s# M3 d6 V  P- L, |sbit EOC=P1^4;                 //转换结束引脚* K1 k7 e5 G8 z$ q: \, K
//*********ADC0809管脚配置************//
- U3 M2 h+ n0 Y! s//sbit ALE = P1^3;        //地址锁存允许信号2 j' Q5 P' A6 Q! x* p
//sbit CLK = P1^4;        //时钟脉冲输入端0 e5 e( A: J9 [0 N& W
//sbit ST = P1^5;                //A/D转换启动信号5 B2 [' L5 O6 ?3 z
//sbit EOC = P1^6;        //A/D转换结束信号
7 h' l. t8 ~: n: @# D" I//sbit OE = P1^7;                //数据输出允许信号- f. F# V3 Z8 @( C' V
//sbit ADD_A = P1^0;        //地址选择输入端& L% l$ t3 E8 T# K' y
//sbit ADD_B = P1^1;( I, f8 e* L3 k
//sbit ADD_C = P1^2;% z& t$ Z  b3 [. E7 N
//************************************//
9 U$ P( _2 @* Q# f  Q& [0 K1 n// Function Prototypes% l* D  X' e. U9 M. o6 I! D4 Q
void check_busy(void);
0 d. }1 l/ j( A- Vvoid write_command(uchar com);
3 g) U! K8 F* O, |3 S/ P/ L) |void write_date(uchar date);
1 |. a+ W! M: ~9 I+ Jvoid LCD_init(void);
& R/ k3 A8 A0 \( m* P3 pvoid string(uchar ad ,uchar *s);
$ C/ t& @" s6 {0 `+ Y: y//void lcd_test(void);5 Y, B) r' p; ~8 R0 S4 v- f* c! @3 ]
void delay(uint);: R" s' {" {1 u
void Volt_To_LCD1602(void);
4 i2 _& p( Z: c2 B; d  m0 Svoid delay_ms(uint xms);
. a  G1 N0 ]% J1 J7 c6 avoid Data_Conversion(void);
9 G# R4 l/ V3 K! Q) K- T//uchar TLC549_ADC(void);0 J$ Q$ J9 k5 z( \- D% P4 T6 S
/*******************************************
; S2 E: u" I' T2 H# b/ Z% ^; E    LCD1602 driver mapped as IO peripheral
: f1 {* G5 M) _1 g- x  G*******************************************/  ! S9 g% z3 F* K. _& o1 ?5 s  p
// Delay
/ g8 A. ]7 c7 y9 w3 X// Delay! o6 H: i0 q( s  E8 G  z# Q  r& E
void delay(uint j)
; g! _$ y& ]/ R+ y# ]{ + x' R4 ]4 B* z/ Q( X" O6 @
        uchar m = 60;
1 K+ Q" [1 v) S  for(; j>0; j--)
3 k$ v$ u( P  }! n8 ~. Q- F  { 0 m/ C0 O3 U2 \2 W8 H, i3 U8 o1 O
                while(--m);
* d4 Z* i4 h' X) j    m = 59;5 p( U! C% z$ T$ A! ]' @: m
    while(--m);
/ U; E( V. m6 ~1 M: c# B( f    m = 60;! B8 ^6 M8 Z* h5 O6 \$ [- M2 m: C
  }' L4 n9 K$ X* s
}
* H! A# O- ?+ v! H& v8 F5 k) w# A3 B* j( L
// Test the Busy bit
( e+ y) {9 R- J* G, g2 rvoid check_busy(void)
3 u+ I; U- v" M7 `{ 3 ?1 V5 S+ ]; m
        do5 M" ^$ L$ H& L. ?7 x# T' F
  { * P- ~) i, B$ z, ]" K
                P0 = 0xff;2 \2 }6 v9 J( Q2 g
    E = 0;
4 A( c, l" [; {; e    RS = 0; 4 F: t* B  w% W  Z
    RW = 1;; w; {) {; o- h5 j
    E = 1;% w7 a8 J- a+ k4 h: \
    _nop_();1 {% U3 R! S0 C5 f" [8 h+ _
  } while(P0 & 0x80);
5 y/ d% q* u4 C% P; ]. Y( z* R* l; n  E = 0;
0 }: i+ g, U4 I1 m}
4 w8 i# w& F+ L1 {3 A- q$ ?% r/ r" @# _# N& X  H& B4 @
// Write a command; C/ G! x: H( P7 w
void write_command(uchar com)
8 z) ^; g$ o6 ]9 J( N{ : Z7 `" l" e3 K; D
        check_busy();
) ?/ G: G+ G: Z. g  E = 0;
  C6 B, c4 ?& D0 O% D  RS = 0;3 E& K6 O2 |$ {- T3 z& N8 T7 d
  RW = 0;
- ^( a# f( [( l1 U) i9 f1 r4 r  P0 = com;
! v5 p* i9 C. s$ y  E = 1;( ?4 q2 l: t: Y/ T- V$ Y
  _nop_();
0 c. N# v$ e: k' X  E = 0;: l. ]2 U! F$ e5 j% q  Y
  delay(1);( G' T( Y$ M' |4 I) C4 N
}8 _+ e# H+ {+ N$ N+ C

3 I4 b% k$ F6 t) R8 Y: T6 f// Write Data
7 v% e( [; R/ S; Q+ nvoid write_date(uchar date)
: m" j5 T$ }( A  M) h5 B2 G{ 8 D7 B7 P+ T9 K: [( n
        check_busy();4 Y  L1 e  {+ d# Y" }
  E = 0;) Q* D5 q& |: O" Y( [$ {, _
  RS = 1;; V5 s" B5 H: y7 ?
  RW = 0;8 C0 H  [8 G" [9 N& N, u
  P0 = date;
  l9 s" Z5 h% p* T$ C& Z+ V  E = 1;
1 W" Q, n7 v! c  _nop_();- v) d; r0 D+ u# |  h0 T3 Y4 i
  E = 0;
9 H3 J. U1 x8 t2 }: W" _5 W  delay(1);   $ _5 g3 s" N: C! ~" r: d$ f
}" C0 m$ X+ o- ~6 l+ p6 W
; l- V; [3 w% `
// Initialize LCD controller- h, d& C; N3 e* i6 v1 H
void LCD_init(void)# M9 Z* n# V& W$ C5 t5 R* d$ F
{
1 b9 x# x$ T2 ]0 q        write_command(0x38); // 8-bits, 2 lines, 7x5 dots2 p# ^. _: z) [
  write_command(0x0C); // no cursor, no blink, enable display
- F# V5 t5 ^* Q( [1 G0 e  write_command(0x06); // auto-increment on
1 s+ ]$ m; ^0 W9 I( N  write_command(0x01); // clear screen
9 k) k0 d8 F* x5 Q! m  delay(1);
" M7 P1 l0 Q# ?}/ f8 T# {; H4 ^/ J' }

" S: d6 i+ B* u2 Y) _// Display a string+ K( B  p. i* H8 [( Y
void string(uchar ad, uchar *s)
3 O% s2 {& w: B{ - [, D! l/ t2 ~9 ?1 u
        write_command(ad);# n! j$ A. `" J
  while(*s>0)& `* K7 M# a9 S1 ^6 t9 Y
  {
7 N! w) F. S6 ^* z                 write_date(*s++);# d3 k% h4 K1 o4 c( D/ r
     delay(100);
4 b; ]4 W. D% [0 \9 e  }
9 x' Q0 i* }, e0 S9 Z5 ^. m}1 K  g. |7 Y" Q5 ~* k* j
//****************************************************//
7 o& J, }& e1 K5 c. k* o. N//函数名:delay_ms(uint xms)( ~4 D; g. ~3 D
//函数功能:ms级延时函数
: _/ x# A$ C) h7 P9 E//***************************************************//$ z+ O  Q! Z' f% \7 R
+ P* I6 Y4 Y: V- l/ f4 n8 \
void delay_ms(uint xms)
' G0 ]8 v2 B7 r" G{
+ ]0 H0 T5 K( N( z: J  O" K4 e0 R        uint x,y;
" N  Y/ x  B% s! w' B# n- e        for(x=xms;x>0;x--)
: {/ u2 v# r1 l- W/ C                for(y=110;y>0;y--);
7 `# ]1 d- a1 T9 Y$ v$ ]) }& P        ! Z) W2 n- i8 k! V2 `. w" F0 Q
}
( p% S5 z9 j" C/*
2 }7 k& F! ]' x/ ?; e' t1 ?void ADC0808_Init()
& t4 O6 S" q  s{
' P' G" |6 o1 W1 M4 A1 ~  ST=0;0 B, y" h2 D* e. K5 c9 B2 {( z# J# B
  OE=0;
; N( I7 M. R+ R  d5 Q}' g6 B* r, p  \) D! q
*/  @, Q5 ^4 x+ V, r5 ^+ n2 r
//***************************************************//$ B! ^4 Y  K; l; R- Z7 P
//函数名称:ADC0808_ADC()' Z, P0 b/ b6 T' ?. m* N6 S: W
//函数功能:读取一次A/D转换的数据
! m1 {; Z+ A5 _# A: ]1 Q//***************************************************//
, t! _2 `7 U- y. G/ x: k/*, z& C0 D+ g/ L5 w
void ADC0808_ADC()
1 R( J1 X% t1 z, @" A% a  p{' G+ ^% P+ D; V; B
  ST=0;
* I  _( w' z! e# E; S  D  i  ST=1;6 s5 S) M' |7 S  P% }
        ST=0;! V4 l6 {3 R9 Y
  //OE=0;8 G2 _6 k# ]( y" U
  while(EOC==0);          //自动发送
1 E5 u( J0 g. R( ?% M, U8 O. u  OE=1;( A/ ?* e0 v, Z4 a

& N; ?' B) v6 c4 G( U+ p}5 j8 M1 e( T/ L5 o$ e/ O! S
*/
+ j& y" L" L$ P* x& P//***************************************************//
. v& j; `& b, d  ]0 [# Y+ U, [) J+ {//函数名称:TLC549_ADC()8 ~! h3 T$ x: s! B, _% L
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
, u) n; l9 [8 u2 ]( [//**************************************************//
: w2 d& g/ G2 B5 Y/*7 k' L  e! A. E3 O( \% E
uchar TLC549_ADC(void)
+ c  j8 j. K7 e! }{
; o% P3 Y: b! p        uchar n, tmp;
1 H: p- R5 ]# d4 ^' U6 a
* t" @- U1 A" I0 h" \& O" B. D3 D" [        CS  = 1;                     //CS置高,片选无效! ]+ u3 k# m$ R
        CLK = 0;
" ~: ?; n8 V% Z2 `/ M7 A6 ]4 e' M3 \  s1 x
        CS  = 0;                     //CS置低,片选有效,同时DO输出高位! c& e% a# q' K2 {
        _nop_();
! B' n. ~0 O4 }, n$ z        _nop_();                     //适当延迟时间1.4us Setup Time
1 P: w8 G" y2 U& i1 Z( Q9 u) I8 E# b) [: K0 b; Z2 R0 Z
        for(n = 0; n < 8; n++) //串行数据移位输入$ F) f5 p" f9 X0 e- p
        {
' u3 V+ M, j: E7 Y0 r                tmp <<= 1;
6 I: _) G3 e) a                tmp |=  DO;/ E! n, \6 A3 A8 e( [
  
6 }" ?* {9 L8 \0 M                CLK = 1;        //0.4us
- y6 D( f' |4 O0 F+ i0 f                _nop_();          //CLK transition time Max 0.1us
5 ?8 z# }* \  ?% R0 q' X4 [0 J6 v+ E                CLK = 0;        //0.4us 8 h, i) k7 }9 W- T0 ~8 R7 k
        }
; M# k* z7 S- B5 L! j* b. |6 {) v        CS = 1;            //CS置高,片选无效& N; @! r; e% }% u
        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us
8 C6 s% p1 Y% h  ?, C; G& A        return (tmp);
' N- ^1 h* t+ {}9 t* I3 i* D( N! q- w3 I
*/% T7 ]) ]4 r3 ~- T/ ^
//****************************************/// y* A" |+ r' o
//函数功能:将模拟信号转换为数字信号( C* K& z- |: A/ {$ l* d" G8 y
//函数名称:TLC2543_ADC(): D7 L  }9 m; p" c- k% U1 A
//输入参数:uchar CH_i
  s/ e+ q. _* b2 r9 t+ M6 E//输出参数:uint类型
4 X( a8 j4 K. p1 U//****************************************//( V1 f8 ?4 H+ @& |" D' C
unsigned int TLC2543_ADC(unsigned int CH_i)           //CH_i,通道值
2 X) q; A6 w* `8 a{
' _# j+ R' z* F1 f8 P- u& @6 F        unsigned int AD_Val = 0;
5 u; o& x) K; U: d  W        unsigned char i;' j6 U( ~6 K( W+ A
        CS = 1;                                                //一个转换周期开始$ S/ V- Y. W4 d2 D5 D
        EOC = 0;
: v( F: ^* W) a0 H# [        CLK = 0;                                        //为第一个脉冲做准备
# p8 {% e  w, Z* J4 q        _nop_();
4 d& F$ m0 }: x( p4 o/ Q        _nop_();
9 [$ c: d" e5 i$ S' [        CS = 0;                                                //CS置0片选有效
7 a4 B4 J+ @0 m2 s4 J  F8 N* t        EOC = 1;                                        //EOC开始应设置为高电平
1 m6 H7 n& ?" U: c( J% \: J* ]4 G# A  CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
9 f6 r% x1 p- W8 u# U) S) G  CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位
) N7 k' h1 X$ D) y        for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果& Z& Z/ Y  F2 F' d7 F# y/ {
        {
; E% l* t0 V$ \2 G4 U: M                ; y" L4 ~0 O) n' `: d7 P' z& q
          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)    2 x# o$ K" q6 f& r* U) R
          CLK=0;5 D+ l# ?4 c+ a5 l. L! e
          _nop_();
) N) c8 f3 n: u) t    if((CH_i&0x80)==0x80)        
/ p# T  v4 K( x7 v7 [            SDI=1;                  ~8 Q) n# x$ e0 j! b
          else: M3 R4 P9 y/ B% i% B: j
            SDI=0;
: u2 b* {+ H# j2 w            CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543# }) G1 w2 g1 O' j
      CLK=1;        
, y/ N! i6 U1 {1 N7 y* [: l      _nop_();: T. u( n' S: A* u# f1 T
          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位  m" N& i+ {. e( ?( U: r
          {
" x# N) ]( |) m' H) D& Y            AD_Val|=0x800;         " u! e; d# [3 f! }* T: u3 Z
          }) W, a2 B. ~: U
          else
, V3 B) T/ Q" ?- z; W! g* p          {
+ s! G1 c: ?" T6 A6 X6 V            AD_Val|=0x000;
$ \6 o1 O/ Z  L5 e( C! R! D/ u          }' \* H1 {3 G! h% V& Q
        }
) N5 H2 m5 ], `$ m  SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高3 [; P4 s* l$ M  ~
  for(i=8;i<12;i++)          //读取转换值的第8至第11位, t% T( \7 {2 C! Q0 l( h9 M
  {( |5 K/ G  f7 g& c) h" }
    AD_Val>>=1;3 f4 J/ J& |4 k6 o8 o; w! ?, K7 s
          CLK=0;                       9 T+ m1 r6 K% \! t+ H
          _nop_();
8 e; }( v* k: Z; f& ?5 u" ~    CLK=1;      & b  H( f, d# e
          _nop_();0 C1 D7 _3 O# V) W( D( `# F
          if(SDO==1)  
' g  z) q" N' }) b* U0 E          {
* [& d" N0 I% j9 y, S$ q            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位( x% }' h8 L$ _7 t2 `6 D, s
          }
( T- P1 R0 D0 O1 `% D/ E          else, y/ t6 t* v) ]9 {+ z# s
          {: g0 j( a  N+ O) F* p. Z  S
            AD_Val|=0x000;         //第12位写 ‘0’3 K0 e+ }; I- \& c: B; d! U
          }
3 y( p! P5 _, s1 n/ ?        }
8 A: b* K, s6 s& q. B' o/ |  CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
8 K4 B0 U8 |. c9 B2 }& Y7 r  A  _nop_();         //给硬件一点转换时间( W* m# ~& K. _# H$ `/ F
  _nop_();
# |* x) P% h% \' K; y  _nop_();) U8 i5 K: |6 g) x! ?+ j, z, }
  _nop_();
) U) o- T4 O/ s- \* B9 ]  _nop_();% F: m! ?$ f! L8 F- `  m  k& m! W
  _nop_();
( [1 y' N8 P) r) Y3 w' h2 u) o+ g  _  CS=1;      // 停止转换,高电平无效
: d7 v; S9 ~, h1 c- l' a  EOC=0;  
- h, X" j% F# r1 v, I" \* R  return AD_Val;
& _9 E9 r0 R, w2 @% _4 q}        # O9 s$ x6 x, Z
& x3 Q/ h9 `! d, t5 g% I+ R
//****************************************//% a# l# h5 k: h' v
//函数名称ata_Conversion()5 X; [( {) j, n5 Z; F
//函数功能:电压换算9 `' T8 N- i  p9 J& [' ?
//*****************************************//; M* J9 J" m4 T; W
void Data_Conversion(void)' {0 l, ?+ ~( C) ]* B
{: ~/ R' [1 j, v6 D. s/ ?
        uint ad_val;
" W. y6 z: e" W& r! B8 }  unsigned char o,p,k,l;
! |' C, v+ A  U8 N6 g        ! T" q' s5 `( l" S
        ad_val = TLC2543_ADC(4);
6 G) b$ V# e8 l4 |$ g        o=ad_val/1000;                   //取千位数字
; L! H5 Q! e4 U" U2 ^  H& l        p=(ad_val%1000)/100;           //取百位数字% P# K8 V0 R% ?0 Y8 P+ ^* g
        k=(ad_val%100)/10;               //取十位数字3 \  Y( T5 Q* r/ e9 Z  y
        l=ad_val%10;                           //取个位数字
, L6 }* W( g9 c0 j* j        write_command(0x80+0x40);
1 ]/ |" @+ l* j* m: y& D        write_date(0X30+o);
- G3 _3 B; l. w% U9 H        write_date(0x30+p);
8 H* G. j) E5 p5 v        write_date(0x30+k);6 y, ^6 u* Z( ]; @8 V8 a
        write_date(0x30+l);  g5 C0 P5 N; p' q: Z! u
        //delay_ms(1000);
3 F5 e9 f, \' z; _- f        if((X3==0)&&(X2==0))        //0-5V9 ]  A! X# \6 j9 Q
        {% K$ d/ i. b- f2 J$ P' d) a
                //ADD_A = 0;
$ o9 |6 _; S2 H4 H                //ADD_B = 1;8 M9 x. W* X! w$ H
                //ADD_C = 0;
9 T5 O3 M8 K- H* A                Volt          = 5.0 / 4096 * ad_val*1000;                //(100-500)
  q% r( G) d* o4 m; }, c; C                LCD[0] = Volt/1000;         //千位$ G$ U; j1 B4 ?( G  s9 X
               
# k& M9 ~: C7 S. Y5 x                LCD[1] = Volt/100%10;  //百位
) A  j* A9 {( e) J5 z                LCD[2] = Volt/10%10;    //十位" X: B8 y- v7 x0 X! o0 |3 e, ]
                LCD[3] = '.';                                //小数点( a# P" x" n; S1 g: K/ G, Q
                LCD[4] = Volt%10;           //个位
: F9 n. D/ d# @" `: o' _                LCD[5] = 'V';                              //字符V
) r% @: r- m+ |6 T                                                                                                                                ! \7 p  r$ G( C" g- ^
                write_command(0x80+8);: w6 [/ X& \. ?
                write_date(0x30+LCD[0]);/ P& e" W! ?& l) `
               
/ G" m  i/ ~3 u                write_date(0x30+LCD[1]);8 d' G, s& E0 a$ x7 F$ z
                write_date(0x30+LCD[2]);
7 M' |5 R$ {& \% M1 }( x& h                write_date(LCD[3]);3 q6 ]: w- b. |3 T: E7 m, O) P
                write_date(0x30+LCD[4]);2 U* M: B& u" A+ u
                write_date(LCD[5]);7 O' P" ?. i; m- U% m% A
        }6 N& s0 I; S+ y  `
        if((X3==1)&&(X2==0))        //5-50V
9 w. M; y; i4 S! q7 E* K        {' c9 I; X# e' t: X
                //ADD_A = 1;9 Z+ e) y, V3 |& I; I
                //ADD_B = 0;0 z1 x) t* y. f$ L" [5 b4 |! Z, N6 k2 a
                //ADD_C = 0;. a5 h' X6 Q4 @8 ]4 }
                Volt = 5.0/4096*ad_val*1000;        //(50-500)' l6 t  a& k, U9 |  |# J. y/ M
                LCD[0] = Volt/1000;         //千位
4 i% a- ]; p- [! Q; Q                # O2 R# U* A9 {8 U0 s
                LCD[1] = Volt/100%10;  //百位; x9 b/ W) ~& F/ t
                & ^+ I* w2 ^# {
                LCD[2] = Volt/10%10;    //十位. ^5 l! b. {2 U9 [) T* f
                LCD[3] = '.';                                //小数点
  o$ g) E) h* {- H- E! m                LCD[4] = Volt%10;           //个位
' F: j9 _, P; ~9 R) ~% p                LCD[5] = 'V';                              //字符V ( F" \) Q* ^$ _" c; g
                                                                                                                                / P# ^5 |# ^, G% [. y+ Q+ k
                write_command(0x80+8);
7 Y$ k" d7 T! r' S                write_date(0x30+LCD[0]);
+ R" Q  X, ^/ z6 m7 B3 E5 Z' a               
' C. K& N* }6 l: b1 V- s                write_date(0x30+LCD[1]);6 T  z+ y5 H3 L! A, s4 N
                - @9 B+ P* X! i, U' @7 }) Y
                write_date(0x30+LCD[2]);, h# Z7 w" k% _3 i) o: K
                write_date(LCD[3]);
7 ]7 {( L' T% C& X                write_date(0x30+LCD[4]);
9 k. J: T1 }6 q                write_date(LCD[5]);
- _* L& Z8 ?1 b9 Y        }
9 B" r* ~# k5 ?! \  I5 O        if((X3==1)&&(X2==1))        //50V-500V
! S3 s2 D/ g: f        {+ l) [; \9 v9 l4 c) L8 A6 x7 X# }3 F
                //ADD_A = 0;$ U5 Q/ |" j: J( N
                //ADD_B = 0;# h' f) w+ ]$ c) g
                //ADD_C = 0;
7 [1 Y% r* t' J8 B% H  a7 Z2 Y, X                Volt   = 5.0/4096*ad_val*1000;        //(500-5000)  Y. Z0 s5 z2 U; g8 c; a, n$ E
                LCD[0] = Volt/1000;         //千位3 j7 v/ A: k& e, ?
                ' C& Q  t% k+ ^
                LCD[1] = Volt/100%10;  //百位
' ^3 D7 G$ r2 }; `5 @               
2 J+ F+ i$ X$ ~& t4 T0 M* g6 m                LCD[2] = Volt/10%10;    //十位
' I8 K1 \3 W1 Q* u                LCD[3] = '.';                                //小数点& y5 i; V9 f4 k% U
                LCD[4] = Volt%10;           //个位
2 s' C9 j2 A; t# e  x* M& H2 p1 I                LCD[5] = 'V';                              //字符V
; w0 `  Z* G1 O- P- ?7 X) a                                                                                                                                $ D0 q8 b+ `6 d/ G6 f4 y- ^  @+ L3 N! h
                write_command(0x80+8);
% d6 R5 g+ U: A# n7 Q1 A0 c- k                write_date(0x30+LCD[0]);
: ~/ A; e/ t  [2 }2 w( @! \* [, \4 w               
) \& }: \+ [( V! R# y                write_date(0x30+LCD[1]);; }0 X" U' y" m% C" d( l
                5 `+ L+ E9 Y: w% m; q9 v; }
                write_date(0x30+LCD[2]);- q7 R: @8 w  S7 O! C
                write_date(LCD[3]);5 R% S% e3 b% u, i' S6 }: L
                write_date(0x30+LCD[4]);
+ x3 }) J* h+ M- O5 k" c8 q0 m+ L+ O                write_date(LCD[5]);
5 w5 {4 }7 b1 T5 z6 N9 F# S' z, H        }$ g& O( A0 Q: S8 f* t. v. V- K3 h+ h
}
( v3 a( I( f9 b  n
; b' T$ x, _( Dvoid Volt_To_LCD1602(void)
2 _2 v) J0 _+ @: j6 ^$ |# T/ M{
2 p) S" E1 y, [/ O: B! {        Data_Conversion();                     //电压换算并放大1000倍' Y; O+ a- e" E4 d- o. ^. C+ n: U
}; Q8 N: q& H: e. p8 ?9 T
        8 m; a/ o/ A# G; \
int main()
; I6 K+ T5 b# ^2 e3 y{
; D( l( d3 ^, L5 j" _0 t; G, D        //uint m;* y! W1 |# g% H, y2 b. Y
        LCD_init();
2 [0 A* |, D; e- Y        //ADC0808_Init();
5 k8 ]: G. e8 F- U2 D4 \* R! F        //ADC0808_ADC();5 L$ o/ }9 b6 {# S& r- @
  delay_ms(100); 8 A) I1 S/ r& C* _2 E
  write_command(0x01);" P4 J7 P! x6 O3 \$ j
        write_command(0x80);3 n' B% j2 M/ y, Z7 z# j
        string(0x80,"Voltage:");
( o  {# L0 U! @. M/ _        //delay_ms(2000);& c% }7 t' y5 p" p9 l
7 P9 y. Z$ M( ^2 a1 l
        while(1)
3 L8 }! n$ h) k6 n. Q) h        {/ g  o' D4 s' q0 k2 ], u

8 Y, e4 s9 J, q2 ^8 y; g  b+ M/ A                delay_ms(50);
& _' O  r9 F: Z                Volt_To_LCD1602();
2 |; {/ S  e: g2 a5 {  r                //delay_ms(4000);9 K6 W5 E: s7 Y6 v, v" E: z
                * `5 Y4 c1 m# Z/ c* @5 A
        }
6 n& ^/ _; L6 q}

3 f' F" Q. \% x& |" X' O
下载:
游客,如果您要查看本帖隐藏内容请回复

& f6 j$ W: F0 r" d. ^+ L

该用户从未签到

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

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。/ v& R; E; ]4 l/ N

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!
: x8 S' [+ ^- w7 A3 A

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666! r) [3 q" R. a  L; t1 Z4 H" s$ D! [

该用户从未签到

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-11-29 18:01 , Processed in 0.203125 second(s), 27 queries , Gzip On.

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

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

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