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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。( d* W% D/ b$ B& W

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!: z4 m+ z4 P* g* k* Q+ h

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666, e5 ^2 N* k7 n# [' J. D& j: s% j0 F

该用户从未签到

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-24 20:21 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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