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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的直流数字电压表(0-500V)自动切换量程
2 C5 s. d5 t8 a2 f+ c: ^1 L* w: r8 \/ d7 K" d$ n

3 t$ W, N! `9 f: x0 a$ U% W
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.& j9 B3 l- j& w7 i3 L. t
电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。  ~4 U& S4 d' F8 v3 G; m; s" U) ?
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。

( j/ ?- D& Y: V1 G" H! y
电路原理图
6 a, G) }9 P$ w; K4 ^  f0 O
2 R0 H7 z( _- o+ `/ `
+ t8 L4 r( z) _& l4 L
. E' b1 L8 u2 f( i" @$ ]2 L

% b% A9 k% }- p5 @8 `  g0 Z' Y: q0 f; C* g+ Y( X( P
#include<reg52.h>
" \0 q/ I' |: m" f8 W1 v#include<intrins.h>$ y3 J* W9 I0 }( s
#define uint unsigned int5 P1 g/ [+ p: a" \4 n
#define uchar unsigned char
5 z. ?8 j7 `& F6 [uint LCD[6];   //电压数据转换成LCD1602液晶字符显示
/ E* D' m5 K- g* j9 ]- Zuint Volt;/ u  ~8 n* e6 p9 r, H0 h
//***********TLC549管脚配置*********//% J8 J8 x* \& I% X
//sbit DO  = P1^0;        //时钟; I4 Q% o4 r- L4 a
//sbit CS  = P1^1;        //片选
( H5 f1 @3 J0 u) V) E& {  j//sbit CLK = P1^2;        //数据输出+ R6 E9 {" b8 `" V
//*********************************//
5 l4 p% y) g, b2 Tsbit RS = P2^0;                        //1602液晶数据/命令选择端
! j# C: s" l; W! e& G- z. xsbit RW = P2^1;                        //1602液晶读写端; F1 H- t" r3 G/ @  q( m
sbit E  = P2^2;                        //1602液晶使能端' |8 n! |) r# Q% w+ b8 I! A/ Y
sbit X1 = P2^3;" i1 A+ l0 D  ^4 L
sbit X2 = P2^4;
' }; `, A1 o; V* M) d7 L- h* d: qsbit X3 = P2^5;
0 _! o: d5 x  bsbit CS=P1^2;        //片选引脚) |" q( f. Y5 w
sbit CLK=P1^3;       //时钟脉冲引脚/ n  E7 O& l0 C, J7 t1 B
sbit SDO=P1^0;       //数据输出引脚
+ c3 t2 B% m" Q$ [. Gsbit SDI=P1^1;       //数据输入引脚
" o) P2 Y7 E) H0 A8 m- tsbit EOC=P1^4;                 //转换结束引脚$ M/ S1 g4 y8 T8 W& z+ A
//*********ADC0809管脚配置************/// g' W0 ?( Q) \# F  M
//sbit ALE = P1^3;        //地址锁存允许信号6 r* a4 B, ]9 x$ W8 e
//sbit CLK = P1^4;        //时钟脉冲输入端
% G6 L( J1 J/ U8 M: x1 M//sbit ST = P1^5;                //A/D转换启动信号
5 h+ `. @* i/ s: l//sbit EOC = P1^6;        //A/D转换结束信号$ c$ r* M. X& A
//sbit OE = P1^7;                //数据输出允许信号* o' ?( Q, k4 [% E( d1 C
//sbit ADD_A = P1^0;        //地址选择输入端: n/ i7 d8 t5 v8 t1 }
//sbit ADD_B = P1^1;
* t- D9 q; f1 k5 k- n& x//sbit ADD_C = P1^2;
* q' U( o, ]! f//************************************//
" X9 z+ W: Y5 {+ f2 W. v// Function Prototypes
& b2 L, r; i+ q. S2 s3 X8 D8 v: M; evoid check_busy(void);  u6 B' W2 m( P( {8 }) U
void write_command(uchar com);
9 q$ r2 V. A2 v; Mvoid write_date(uchar date);8 R" _2 ?1 q, E) k; r7 p; J* {& z, N9 N
void LCD_init(void);' o5 M- S! I4 Y: ]
void string(uchar ad ,uchar *s);
6 n/ F2 N0 b. q8 T2 l//void lcd_test(void);8 n8 n8 B* z" }+ S  [
void delay(uint);
/ q% g: N! ?" A7 Y8 f' ^3 Svoid Volt_To_LCD1602(void);) `9 Q! P* R! x9 Z6 K6 h. @1 P
void delay_ms(uint xms);, Q) Y+ ^$ h# j
void Data_Conversion(void);
6 H) Q: _4 {1 v: A! W8 V* Q. P//uchar TLC549_ADC(void);
5 ^, ^8 C) G" p; Z. Y' P; R/******************************************** ^" E5 |% R) A1 l! t2 t9 k* G" w* x
    LCD1602 driver mapped as IO peripheral6 Q) p* F3 n. ]: j
*******************************************/  / |, `7 T( d2 u
// Delay
) E4 }$ G9 J% U$ v3 V% O; N9 A// Delay
# M. ?( h# W8 e! [! @void delay(uint j)
! W! u8 m/ c- o7 Q" x* ^( k{ ; \& f( Z4 U% S4 n0 [
        uchar m = 60;
4 e" m) u) ]( c  v+ G9 P6 T  for(; j>0; j--)4 f; U0 \4 G' u8 U
  { ( A4 e+ P- ]4 _5 @7 x7 _+ V5 q+ {/ U1 t
                while(--m);- q3 u9 Z& ~4 X: h
    m = 59;+ l( ]+ Z3 H  ]2 \
    while(--m);/ y. K0 z' H$ H* p- V. V+ U( Z
    m = 60;( \' G& P: P* v3 L+ l7 p0 ?, S
  }& f2 o7 J2 h: H, z  s3 W! B! ~
}3 i. \) f3 @0 S. t- p+ _

+ P& L, v; H( R1 u: r4 n- |// Test the Busy bit
( G% C( ~9 ?. N* S' Zvoid check_busy(void)  k$ H) m/ f8 Z/ l2 J
{ 0 i1 l: C1 u( E0 o. X! v6 h/ {
        do4 L- `! k5 }/ t6 M  V
  {
2 F& `/ d& c) F2 M% L( ~                P0 = 0xff;
4 x$ I& h" O+ P& v" l" M  I' Z    E = 0;
; E3 D) f2 p  z    RS = 0; ! \3 k- v, f: L% f) u. u
    RW = 1;
! R- R. }; j& J4 E    E = 1;# Y, k( G9 b& A" J5 H4 q0 }, X1 U: N
    _nop_();
* F& |( t) j1 x7 y6 Y1 w  } while(P0 & 0x80);' V7 W. U" T1 U, i# n- ?7 {
  E = 0;
* N# K0 X. C0 T* c6 z}- w) p. q  h0 _0 d* M
% U3 ^* K1 v, N, m
// Write a command5 L/ s8 o% @% v" b
void write_command(uchar com): w& j9 r: {; ~9 j' N
{
. ?5 \1 F6 k! c: ^$ @/ X# j        check_busy();
+ s* x% g  T- w  E = 0;9 P% v: V/ H: W
  RS = 0;# }& W. x+ L4 K, p! |; E- f& n
  RW = 0;
+ M& K5 g+ u& Y9 z) F9 e' V6 {  P0 = com;
9 {& S9 v! l3 f) h  E = 1;
- Q5 E8 k" P. E9 C& [  _nop_();. j5 `3 m& J7 A) U% N* t
  E = 0;( C( S1 M) L: {7 P, r1 c+ i$ a5 K
  delay(1);" _* r/ d7 n& M
}
  g; t, _* i+ b' X7 ?* u4 f7 p7 [9 n* M2 ]+ T1 ^6 ], f
// Write Data- @4 O! Q$ u. L" J( D
void write_date(uchar date)
- `3 S+ L- N0 s" p{ ( D6 i8 x0 w0 A' f0 _0 q
        check_busy();
& t4 y8 g; ]9 N' [2 B  E = 0;
6 q7 ]* i5 Y& s7 Y% r  RS = 1;% {; }/ S$ O' @6 j  ~0 g! n3 O
  RW = 0;1 U0 L' e& A+ I1 F0 P) v
  P0 = date;- A/ ], A7 D: d' ^
  E = 1;2 H( n0 i& O9 @8 h: r6 J- x' Z
  _nop_();
( G0 x+ y8 B- v6 M  E = 0;- X  M3 C) g) `
  delay(1);   
, l9 f/ S$ h  M& {}. l$ w$ Q) \9 g9 |7 T% I

5 A9 k! ~: C& M( u% `$ W' u// Initialize LCD controller" H" l# f7 |2 P3 j. g. E2 t
void LCD_init(void)- a6 Z* v# l, e7 I. d
{ & e- Y5 A% }/ ]/ [7 K& S6 k
        write_command(0x38); // 8-bits, 2 lines, 7x5 dots
. L& o5 O3 B' U* C9 j8 U  z$ S" l  write_command(0x0C); // no cursor, no blink, enable display* ~6 H" [1 e4 G0 z
  write_command(0x06); // auto-increment on
9 w  D1 A/ r9 r% E% S: `5 w  write_command(0x01); // clear screen
) J' {; {0 W. E  delay(1);( }9 j0 O3 S0 e7 I- @
}3 _! z5 y. K  I: |: ?

$ N- C( T; h+ s1 [3 B7 y2 e8 J// Display a string
; O7 F) [, M, V5 hvoid string(uchar ad, uchar *s)
/ W0 b# _/ Q+ o/ w2 `{
: x4 z1 g% r+ G7 k        write_command(ad);7 Q$ ]/ C! `3 ?+ M7 ^
  while(*s>0)7 X9 j: n3 \( `
  { & ]3 H6 G  x7 Q) y4 f1 P
                 write_date(*s++);
* P* q2 W" g$ C5 l' n     delay(100);' N2 u# B& R8 U7 B0 Y+ A0 I
  }* q6 k4 s1 @( \9 M% R4 L% r7 s
}
* d4 n3 j& _  o' n! F//****************************************************//
  E% l5 c% K4 b' c9 f1 T//函数名:delay_ms(uint xms)
& A7 J! p/ f0 Z% I3 T//函数功能:ms级延时函数# c7 i7 t. }9 m7 P0 e& d
//***************************************************//! i& q. }% v8 F0 k" P5 a( E

4 b( s& D6 z. g3 ivoid delay_ms(uint xms)# L; e) j) a4 P3 T
{
8 H  p+ }! _' Z6 P6 P( s' x        uint x,y;% C9 u( m, a) y2 I* M
        for(x=xms;x>0;x--)
* s7 B9 j$ `- v( R. e! R" A                for(y=110;y>0;y--);
! u+ b0 B) g7 I; a- \, d        6 ^- q; ?& T: e8 C4 ?
}
8 p+ A; S: y6 g6 K% \0 `1 K4 {/*
0 `0 Y$ M, L+ o8 xvoid ADC0808_Init()
+ m. L/ @$ s6 P5 Q4 g) ]{
# K% t9 ~" J; K% g+ ?  ST=0;
9 F% H9 u/ r1 ?! T( R  OE=0;
4 a, |6 M# r) y8 G1 O}
" r; Z1 D) d1 K*/
+ W% d! K" c% j# g6 x//***************************************************//' ]* q" z/ @' X- I' k8 l* z
//函数名称:ADC0808_ADC()- M$ f, d3 O4 C7 G
//函数功能:读取一次A/D转换的数据
0 `6 o5 V: `2 d) k6 m//***************************************************//
; H; N  c5 U. Q. N" |/*
9 c3 b2 \$ t* z4 ]5 L% V9 i/ G8 qvoid ADC0808_ADC(): N. x: z3 s1 t7 T' i4 F# v  K
{
* @4 O3 r& B1 i1 ~0 q7 t  ST=0;
( s* `& T0 t1 a  E2 ^7 {  ST=1;; y  k0 P9 r' }; v. V3 {# q/ W9 N
        ST=0;
1 u% m; [' c! I% s, [  //OE=0;% [: d0 |9 S+ S' W
  while(EOC==0);          //自动发送& h8 M2 C# M$ _
  OE=1;2 e8 |  z8 K% t+ i: X/ j3 O5 e
; F. x7 f3 X3 f
}/ `$ t* p9 l. a- j0 f
*/& \" z. E2 V4 L+ t. V
//***************************************************//1 W" e$ D5 F6 h9 z( \7 H: v
//函数名称:TLC549_ADC()
  q+ n* q: e) n//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换+ p% y; S2 x& P0 i1 @. O1 m
//**************************************************//
" b. |; a0 m1 J* X3 t% Q/*2 Q; H: r; `  j  }. c
uchar TLC549_ADC(void)) q6 ?; E/ \% \
{
1 S4 D: x- @  u" J        uchar n, tmp;- x0 B) r& ]$ `# e* A
$ N* K! y: C" k4 d) y
        CS  = 1;                     //CS置高,片选无效: Q* E" }. c9 Z
        CLK = 0;1 x$ f/ X, e) ]; z2 }6 a. ?
( V- O" p$ z# L$ k  u
        CS  = 0;                     //CS置低,片选有效,同时DO输出高位
% ^8 I. }$ O, i- N6 X        _nop_();
2 y" ?9 L$ y3 s. Z8 [$ h& [        _nop_();                     //适当延迟时间1.4us Setup Time
+ x4 {0 j+ ?* N! ~) p1 \
; l5 R( y& T0 m: J        for(n = 0; n < 8; n++) //串行数据移位输入
. t+ r% ?% x7 i+ r. g: @        {
6 N7 Z4 p3 O0 l3 |; n# N& x                tmp <<= 1;3 C/ w3 m3 @9 \+ D: Z
                tmp |=  DO;
$ M- K+ B( N6 j6 x  / R3 t7 {* Q% R8 ?" l
                CLK = 1;        //0.4us) v6 M3 t/ T; E2 \4 N
                _nop_();          //CLK transition time Max 0.1us
1 e* m% ^- X0 l1 ~                CLK = 0;        //0.4us
. c' N: {. i. i; ?( F% Y  R: l        }
1 O' S7 w5 I4 A7 d        CS = 1;            //CS置高,片选无效8 D; N- i$ }$ l
        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us
* p& C5 n# |' u( u5 x        return (tmp);8 a1 x% D8 p) ?6 T
}$ \) d3 y* S% Q+ o8 f
*/1 V9 P( l% P7 j! N
//****************************************//  ^) H, J( `& E6 L1 M  u
//函数功能:将模拟信号转换为数字信号
1 @8 D% z7 i. E//函数名称:TLC2543_ADC()3 Z  R& ~8 [$ h* n
//输入参数:uchar CH_i8 {9 ~7 b" {6 ?5 M4 u2 _- k5 V
//输出参数:uint类型
& X* G8 r1 j$ W//****************************************//( R/ O  L7 @- j% [
unsigned int TLC2543_ADC(unsigned int CH_i)           //CH_i,通道值* P3 }" v, i2 A. Z5 f
{
) N# t* K  x7 Q/ T        unsigned int AD_Val = 0;
/ ~# h$ L3 S% K        unsigned char i;
) ?8 d+ Z3 \% U3 ^8 T        CS = 1;                                                //一个转换周期开始4 a# {0 M& U# t" E# X9 C
        EOC = 0;
( N, |7 }, |( j+ D; e+ \4 E        CLK = 0;                                        //为第一个脉冲做准备
& ?( e" V0 ?- q3 Q( H        _nop_();6 U9 \- h6 B- k+ D$ ]
        _nop_();. v' D8 ]* W  f9 ^
        CS = 0;                                                //CS置0片选有效
( L8 Q: c" k  Y* m        EOC = 1;                                        //EOC开始应设置为高电平9 `* ]( t* k9 w2 F2 Z9 ^' V
  CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置* M# ~* K% G8 f) s$ L
  CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位. S: n! |3 |. }6 r5 M) x: [/ |
        for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果$ T" B. V- c0 R
        {
. z2 v+ h" x# p) v3 _                1 u8 M2 I! k3 o% [, w
          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)   
9 e1 n" Y. r7 o          CLK=0;, P5 ?+ @+ z/ k* {
          _nop_();: e2 a3 a6 n% g/ R; j- M
    if((CH_i&0x80)==0x80)        - m  z5 J, m5 N6 @3 z' k+ F" c! }
            SDI=1;                - d* d/ w5 x/ d. B/ C
          else6 N( w* r) f1 K) a; w' f; s
            SDI=0;
7 ^% H' s% [# ~% i0 D2 M            CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC2543
1 ~: R9 E7 ^9 i3 F4 c8 @& K      CLK=1;        
0 i0 g. V7 b8 O  U( O      _nop_();
  G, e9 R! E! X& C          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位% H) K* Z; x7 ^
          {
1 w  `: y% ^0 W5 \" C            AD_Val|=0x800;         
6 [2 u: j6 T1 ]5 Z# Z- ?          }
- ?$ O$ {* z8 c9 f! c          else; o# o8 n& U8 @7 w
          {
* _4 f# j/ W- o- J* p! c            AD_Val|=0x000; - J0 P9 e: s8 G0 K# G
          }* j( r/ j( \4 n
        }0 R" Y6 n7 C3 G1 T; t4 a+ J
  SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高/ |  W- K- C7 D# M7 [4 u7 \' Y
  for(i=8;i<12;i++)          //读取转换值的第8至第11位
5 j- ^* b* T4 T. N5 P* O6 u' W3 N  {2 i# C+ |* f; l
    AD_Val>>=1;6 M) a7 \' e4 d/ z: Q# j0 z* o
          CLK=0;                       3 A4 _* y* a2 H+ `* X! E
          _nop_(); 4 W6 ^/ v) m* C. s6 a' c
    CLK=1;      
2 z1 p  U9 b, S# e1 M6 u          _nop_();4 s2 z6 k3 y) n2 L
          if(SDO==1)  6 n- A# a# A1 I; U+ i
          {
, p! k  ^* m6 `: R+ A            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位
' ^, n3 \$ o/ f" @- n: v( U          }
2 N+ q7 T0 Y* U- ?( \) X/ p          else7 ]0 Z; |0 \6 }3 R7 Z9 q9 |
          {- T7 l( E% T# I: R0 V
            AD_Val|=0x000;         //第12位写 ‘0’
7 n: G" L* {5 [, N$ E) V          }
6 j4 C$ V% M1 }3 ?+ o% L: r/ B" n7 J6 r5 `        }
9 D7 _: w( ?- O+ g' G9 _& _  CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换," G+ Q9 w8 B# ]5 E' I0 w$ U. H( ^9 C
  _nop_();         //给硬件一点转换时间
6 b! q- k# S8 y- R  _nop_();: W, a& I; P: k8 J& B
  _nop_();1 k  F8 j- }3 m+ \
  _nop_();2 Z+ d; R0 W* X: V( }) Z
  _nop_();
0 {  B4 v5 d* S( S/ P  _nop_();1 H1 J8 s' L- ~8 ]8 b7 N
  CS=1;      // 停止转换,高电平无效2 {# I! c) H! \+ @  L7 o% Y5 L
  EOC=0;  2 R! K6 ?# _  j" N$ q
  return AD_Val;( L) A! Z3 ?2 l
}        
) O2 p* k4 }% J2 D# x5 ~8 T. y2 ^/ W: }+ a7 b- O/ L
//****************************************//
* j% y, _* S) n9 v' t. f4 ~/ {; q//函数名称ata_Conversion()& t7 P1 J8 i; G( [9 v2 t
//函数功能:电压换算0 @9 |' z4 A) U* q+ R' I
//*****************************************//
4 Q, ]0 E1 o0 L4 \' _( ?void Data_Conversion(void)! w; X" [$ C3 Y6 m3 b5 r! o
{0 K$ _. h: }! v8 \, \& l- m
        uint ad_val;- [$ u5 u4 k# G
  unsigned char o,p,k,l;1 p$ B6 W& Q, ^! l7 K
        * L$ P. E4 }" o, s# F  G: n* j9 I) Z0 k' Z
        ad_val = TLC2543_ADC(4);& l3 g( d& |( h2 Y+ r& |4 ^
        o=ad_val/1000;                   //取千位数字
( o. Y4 x9 M7 I4 W        p=(ad_val%1000)/100;           //取百位数字0 ~2 y; E/ ^- ~6 p
        k=(ad_val%100)/10;               //取十位数字
" M; W- ]' J2 j4 }( v        l=ad_val%10;                           //取个位数字& v) ]7 |0 N% M7 @9 a$ B* Q
        write_command(0x80+0x40);! m8 g9 |! M# ~/ Q" ~! C
        write_date(0X30+o);
; W& N1 f( M0 \% N' \        write_date(0x30+p);
. v/ o. ^- o0 }9 L9 q        write_date(0x30+k);3 u3 u4 x8 K) V( X
        write_date(0x30+l);
& Q& r: l5 |) i/ P8 @4 v        //delay_ms(1000);/ r) Y* d: G% |
        if((X3==0)&&(X2==0))        //0-5V
0 M: \1 j& \- k. E        {7 e5 [; H" R# ?6 p. ~* u( h7 k9 d
                //ADD_A = 0;
8 k) Y2 A1 I- M                //ADD_B = 1;7 T  l3 W8 K, U/ G, m" y. M5 L. d4 T' C
                //ADD_C = 0;1 I% Z1 e9 H9 ?  y/ J
                Volt          = 5.0 / 4096 * ad_val*1000;                //(100-500)) K) B$ U: c$ N$ n
                LCD[0] = Volt/1000;         //千位
& e  D5 E' o) M$ V8 U" R2 c                6 I, @/ v# m; d. j: W  t* d9 d6 n
                LCD[1] = Volt/100%10;  //百位
( B" d/ K+ `& W5 X/ X0 H$ I                LCD[2] = Volt/10%10;    //十位
. N9 }3 |4 L1 g$ n                LCD[3] = '.';                                //小数点  f7 O: U5 I; L( N
                LCD[4] = Volt%10;           //个位1 x4 K, p% G( g# L; V  l
                LCD[5] = 'V';                              //字符V
7 `: c- t! B( i/ \( b) w' f* n                                                                                                                                2 s& f0 x2 p- U$ Y* N/ ^/ j
                write_command(0x80+8);. x3 O7 g$ t8 ]
                write_date(0x30+LCD[0]);
  k$ K$ v$ U; G  ?1 f7 s, B               
& n6 Q: w: Q; u( i9 V                write_date(0x30+LCD[1]);
$ g) \# N2 G+ x4 i3 d0 O1 j                write_date(0x30+LCD[2]);/ n. o5 K& C# q
                write_date(LCD[3]);
* C9 S3 z7 @, t1 r  d                write_date(0x30+LCD[4]);
) `1 A. H$ |5 |/ a; [1 ]/ h! o                write_date(LCD[5]);; I2 K0 }' V& e, W6 K6 d( S
        }! l- M2 L1 |) o4 D8 n
        if((X3==1)&&(X2==0))        //5-50V
. W. U% @9 [+ H2 W7 ?        {
+ l- P0 w: u' m$ e) ?                //ADD_A = 1;
4 u- ^# C% d, u* f" Z                //ADD_B = 0;  o/ A0 i/ K6 F( ~" _
                //ADD_C = 0;
: A+ |- F) @+ S, R- t                Volt = 5.0/4096*ad_val*1000;        //(50-500)7 s% b: B4 M: a* ?& r) h9 _
                LCD[0] = Volt/1000;         //千位4 C  f7 @& Z  g: J/ Q) @
                * I2 d4 V7 c, w0 f' ?+ r
                LCD[1] = Volt/100%10;  //百位. D( `8 L; u1 l$ Z6 P: a: G
                % N$ O) V* Z. q) L1 Q! c& n* H( {; N
                LCD[2] = Volt/10%10;    //十位
/ X, S' [2 s- h5 f3 B& w                LCD[3] = '.';                                //小数点& E$ }% m% l) W) B
                LCD[4] = Volt%10;           //个位
$ k4 v3 U9 A( J0 F0 }: X                LCD[5] = 'V';                              //字符V
& N- F6 A8 H% C8 w                                                                                                                                
% u- u# b! ^) R1 X! l1 X                write_command(0x80+8);; K% Z/ y3 X; o9 h0 c  }
                write_date(0x30+LCD[0]);
' v# X6 n5 K& U5 E+ p& h" J" F7 ]                * ~7 i7 g, U' d
                write_date(0x30+LCD[1]);& I2 u8 q0 q2 b; P
                6 Q& R; Y2 `6 s" [0 m
                write_date(0x30+LCD[2]);
8 J0 o5 j, ]/ R- W; G! J; h                write_date(LCD[3]);
) q. {, \; C) j! {3 s                write_date(0x30+LCD[4]);4 n+ ]7 w2 c! `0 F
                write_date(LCD[5]);
1 O7 T( m' u6 w. g" c. B) }0 Z1 P        }: f6 g& C0 V9 h1 V
        if((X3==1)&&(X2==1))        //50V-500V. B+ y: j- Y' j- v+ x  A$ I5 {
        {
2 H/ s8 }4 z0 r9 g. @9 h                //ADD_A = 0;# y- h0 W! V: i1 k) s4 X
                //ADD_B = 0;/ R9 d0 ^; _3 b/ G" E
                //ADD_C = 0;
3 j  H! p" P8 [, g% K8 C6 F; ]1 b                Volt   = 5.0/4096*ad_val*1000;        //(500-5000)) o# Q1 z' y6 j3 \1 s1 j
                LCD[0] = Volt/1000;         //千位  o. ]+ A- A. p
               
% W1 L, `; V4 g  J                LCD[1] = Volt/100%10;  //百位4 F& n6 L5 L& o6 R2 m
               
1 Z( x! C, ?& M+ o# ~. N# E                LCD[2] = Volt/10%10;    //十位5 Q. L4 O+ P2 d( X& l/ |
                LCD[3] = '.';                                //小数点9 q) S* ~$ q  [
                LCD[4] = Volt%10;           //个位
' O. _/ z% k, _3 L6 v                LCD[5] = 'V';                              //字符V ) G6 z# n$ r$ ~! _- B0 N5 c
                                                                                                                                
  P& \- U' g6 I1 P+ n; R                write_command(0x80+8);6 m7 ~3 m' K9 e) J2 S
                write_date(0x30+LCD[0]);4 _0 ]8 U4 g9 L" t9 G0 H
                - O' H4 Q$ u& u. z7 B
                write_date(0x30+LCD[1]);. V: W8 z+ b: v, M" l/ |9 A
               
/ D9 b9 c9 S$ G- v2 M" W                write_date(0x30+LCD[2]);) P2 C4 R7 \( `6 E& E% Z) ?
                write_date(LCD[3]);4 X! J$ \# k; }* }: [
                write_date(0x30+LCD[4]);8 r( }' {5 {, U$ l3 r# M! |+ c' o
                write_date(LCD[5]);
- E: U' g' [0 u4 `8 s        }
. D  q. D5 R3 \/ d}
# C6 w: k' ]/ [$ N* n' P" @1 t# _0 a- _
void Volt_To_LCD1602(void)+ a# B7 z7 L  f% s7 e/ s% \, @
{ % e$ a& W- p# G5 `* J' h# A
        Data_Conversion();                     //电压换算并放大1000倍8 K6 @; E3 M7 C. b9 ?
}
8 y- ~- S* ~7 r4 |        / B3 i3 {. v6 A
int main()( T' H5 H7 W7 S. P* T0 m
{
4 x0 w' N( t8 U4 C: P. c( E* L        //uint m;$ i( k" Z$ A' I
        LCD_init();
) L- r  E. ^# A  s5 e        //ADC0808_Init();4 J; R1 B3 N. o7 z* t3 v% L
        //ADC0808_ADC();
/ l$ O, Y+ \+ e( `  delay_ms(100);
, j' H  q) W4 I6 u2 T% g  write_command(0x01);3 }4 x5 Z/ C9 S2 H
        write_command(0x80);7 ~( i8 U9 g, z; a" V1 M
        string(0x80,"Voltage:");
8 }! }% g' Q4 O6 f        //delay_ms(2000);
" W; e7 O  H' }1 a$ ^# \' y  e. |& X  [. u, t. @; p
        while(1)
8 O+ c# f% G+ f0 a+ @" @3 \4 w        {9 H: B7 O( ?/ C6 J
! q( s$ V8 N8 `1 _7 W  K& K: j
                delay_ms(50);
; U# ^6 X. D4 t& u% L- U/ V                Volt_To_LCD1602();
9 u+ ^; n1 G: ^& z7 _                //delay_ms(4000);
, H$ x+ C8 U+ @: r7 h2 J               
; _  c5 x6 Q6 X* A* B( }1 Z; X        }
  ^9 F1 U3 h7 ^+ D2 ?4 `}
: H6 H  T; x' S8 |1 u
下载:
游客,如果您要查看本帖隐藏内容请回复
6 o. z! }0 Q8 H8 ~

该用户从未签到

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

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。
, H0 d7 L; b# A; d; u8 r

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!5 z; x7 s. i5 k8 m% X+ `

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666
1 b- _/ B! m+ V  H8 S& Z/ m

该用户从未签到

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-18 15:45 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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