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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于51单片机的直流数字电压表(0-500V)自动切换量程
9 m3 t! F# ?. B; s' X/ f( x
, c- L7 }; ?# E/ R& _

; n4 `7 x4 |, a6 w
实现功能:基于51单片机的0-500V自动切换量程数字电压表,测量精度<1%.' H! i/ I6 x4 V4 v$ i/ |
电路组成:100:1的电阻分压网络,TLC2543(12位)A/D转换芯片进行模拟信号采样,LM339电压比较器电路实现量程分档切换,51单片机进行数据处理,1602液晶显示电压及A/D转换数据值。6 p: f- {* q; n' q4 Q! g$ _
不足之处:电阻分压网络估计精度不是很高,上网查了下,99K,9K电阻误差一般1%左右,不像proteus一样一点误差都没有;还有个问题是,当在显示中测量100V以上的电压时,电压太大,对电路有危险,所以应当加保护电路,可我不知道怎样加最合适,希望网友能给点建议,最好是有曾经做过实物的建议。
8 K* e1 L8 e& g
电路原理图
6 O3 d3 Z4 z+ }% D8 y% u3 Z

* l8 n. d) \$ e. a) \' r' ^' f. e) v4 z+ K4 U4 [
* E1 s( H6 S7 x- `* a, @
) y5 t( {/ d- i" B) y. g" v

. X; J2 L0 ^) Z, a  ^8 P#include<reg52.h>
+ u# r7 T$ j! Q' I#include<intrins.h>3 R3 Y: X8 r3 |
#define uint unsigned int; }1 e+ H: `: r
#define uchar unsigned char
/ Y4 Q; v0 Y6 J$ uuint LCD[6];   //电压数据转换成LCD1602液晶字符显示* p, ]1 j9 @8 U$ i- f: s- k# C8 C1 w
uint Volt;7 j1 @) Y/ g8 N# B
//***********TLC549管脚配置*********//; o0 n: Z% @  v2 G0 `
//sbit DO  = P1^0;        //时钟5 e. c- @. W; e4 Z
//sbit CS  = P1^1;        //片选
0 E1 L2 e0 v$ e+ G& c, R//sbit CLK = P1^2;        //数据输出
3 ?) z0 c3 G! T, O/ N% L; i( a//*********************************//0 v* K7 P2 A/ S& y" C/ z
sbit RS = P2^0;                        //1602液晶数据/命令选择端. \" ]7 V3 w, v
sbit RW = P2^1;                        //1602液晶读写端/ y2 X, A  A- x1 Q3 P
sbit E  = P2^2;                        //1602液晶使能端3 ~' j8 v9 V1 b" S
sbit X1 = P2^3;+ ~: `, [% G3 i' x- z
sbit X2 = P2^4;
8 J" o3 r0 S& N3 Fsbit X3 = P2^5;
0 B  Y4 ]8 s. j9 _* t) S# n) wsbit CS=P1^2;        //片选引脚0 c1 i/ H: a5 e2 i8 [
sbit CLK=P1^3;       //时钟脉冲引脚8 p% O; A. Z- |' m+ f
sbit SDO=P1^0;       //数据输出引脚
' ~! r/ U6 T4 ~7 Y* Msbit SDI=P1^1;       //数据输入引脚# b; Z8 B; p1 Y; P  z' y
sbit EOC=P1^4;                 //转换结束引脚4 S9 \  ^& k3 ]- A
//*********ADC0809管脚配置************//
& H0 q* L! I2 e6 R' m8 z& j% w( K//sbit ALE = P1^3;        //地址锁存允许信号
" w* O. D' ?% r# ?& Z//sbit CLK = P1^4;        //时钟脉冲输入端' a) l- D. Y) J2 N1 ?# |
//sbit ST = P1^5;                //A/D转换启动信号" J" d) J3 y0 {: E" T, v: \
//sbit EOC = P1^6;        //A/D转换结束信号
; C5 ^7 B, u) C" B( I5 _: k( O//sbit OE = P1^7;                //数据输出允许信号
$ j" [# V4 V% Z8 G$ |) w! N//sbit ADD_A = P1^0;        //地址选择输入端
% j( x) ^9 \7 Y' G1 Y//sbit ADD_B = P1^1;+ a6 S2 V6 `  ]# K2 }
//sbit ADD_C = P1^2;
3 P( ]4 a* R; l! s- {9 ]! m2 V6 y//************************************//4 w+ x5 W3 c" |' `! b+ B9 }) Y
// Function Prototypes
. [; \8 w6 S% Z3 S4 \void check_busy(void);6 a( q) w& \% f- K; r' r
void write_command(uchar com);
* [% V' f7 @0 c# B1 Bvoid write_date(uchar date);9 P. B' s2 Y2 d# f# p) `+ y
void LCD_init(void);5 L9 `4 _7 {" M+ m6 B
void string(uchar ad ,uchar *s);
& ?' `3 b: {- H; F//void lcd_test(void);
" j* E! I4 S( s! \+ D* L0 uvoid delay(uint);2 }) f6 p) J4 j8 M
void Volt_To_LCD1602(void);- U& n( z2 B  t  c
void delay_ms(uint xms);
" G0 C, F4 m6 e: v4 Qvoid Data_Conversion(void);
8 s$ O' H6 M& o# h* T//uchar TLC549_ADC(void);
$ H# c& D$ K, F/*******************************************) w7 W) @$ J* o  j
    LCD1602 driver mapped as IO peripheral
) w" p' ~9 z. d1 o4 ]3 m- A: v*******************************************/  ' D5 g- ?4 [- r
// Delay4 }; U5 T* e& w' ]
// Delay
% w# k6 P8 A: q1 D/ C, b$ Lvoid delay(uint j)2 j4 a3 {# S- R/ [
{
" B4 D$ s) j3 S5 ?( S. o/ L7 t        uchar m = 60;% d( k9 q8 j" n4 ?8 n0 u7 s/ U" t
  for(; j>0; j--)
" r! o6 z+ }2 P  {
! ^4 _" [( @( U) [9 r  I                while(--m);
+ V- A3 P$ E8 o* W4 ]5 s8 X: t- z    m = 59;
# B! {# J6 v& y# D    while(--m);
3 _/ H* b, h$ i  h    m = 60;  ~+ L1 z# _; O# S4 v' p
  }% K0 I; u! c% H4 P  j% M; U
}
# t2 d2 w5 Q' h! r$ z$ j& Y. U5 Z
// Test the Busy bit
+ m& c3 f, C* C% F- c  \) _void check_busy(void). n' Z7 j& C" C- D- I; p
{ 6 c6 U0 Z: r# l
        do1 Y3 m  h/ t! i5 l
  { 1 R6 W$ N$ l' j5 X& A
                P0 = 0xff;. P* |6 Z: K" ^9 A
    E = 0;
) o* [* M1 o1 Y+ m8 K  ^    RS = 0;
+ i) b! g& ^: j  W5 R5 @0 `    RW = 1;! e/ Y9 v" ]# C; T. n
    E = 1;; A4 W) ]4 I, V  s: ?
    _nop_();& i/ f7 t+ k: y& Y/ ]2 G
  } while(P0 & 0x80);$ `" ^( A& k6 k8 h& D+ e" s
  E = 0;7 ?8 m- ^) k/ U5 ^) ?$ p
}# o! v& K% G& c* D; U! \2 y; s) M

9 q' _# t3 p* c+ e6 i0 K: V! t// Write a command
- L3 K( ]7 q* E  Ovoid write_command(uchar com), j9 Q7 }0 {7 z$ E. P; C
{
" C$ S' e% u& ]1 e1 c3 w% w        check_busy();
7 G- ]' Z+ |! Q4 C: t  E = 0;
9 F# @$ `! ?# @0 v  RS = 0;; b* t$ j! Z0 |& z. V" E! g
  RW = 0;, v) |0 ^% Q8 ~+ q! f. A/ \% L
  P0 = com;' D! \1 w: O4 f2 ^; X8 {7 b1 n7 T# z
  E = 1;
. ]* E2 H- A! ^) S, Z) z6 A  _nop_();
" `' I+ s" ]* B: l/ s  E = 0;0 P: g) b, g$ O' L& g
  delay(1);
$ g) w/ K+ l* q' ^}8 @& S6 Y% ]% [
) D+ v8 i3 y; B9 g# K
// Write Data- @8 k" a8 ?4 a: L
void write_date(uchar date)7 M7 z8 X5 n6 ?. R! f% b5 i: W8 c
{
1 P2 R% f" J+ s1 V, |7 g        check_busy();, y: T+ _+ s) e5 u0 v7 I5 o
  E = 0;7 L  i$ }$ ]2 s) O$ R
  RS = 1;
; r  o2 z( o& K" b4 f5 i7 V1 J, ]  RW = 0;
: d2 V4 ]! |! K1 Q  P0 = date;/ \8 m9 t% \* l% {- I! g
  E = 1;  _  `* C1 M' V8 T! B3 ^) N
  _nop_();- v8 s" ]( n6 o1 X# u
  E = 0;
& X8 b1 ?! u9 y2 w3 x  delay(1);   
2 s3 V* K' f5 }) W}: r; C% E- b! Q7 [  f

, W, }8 L% p1 F2 z! p0 Y. [// Initialize LCD controller7 u5 }+ i& V7 f, o# T6 l
void LCD_init(void)) R: K% p( }1 E9 M1 n+ L0 m$ V
{ 2 x, ^  h+ Z' C8 A( I& Q
        write_command(0x38); // 8-bits, 2 lines, 7x5 dots
4 S! b6 A$ m- h  L* t4 W+ Y- b  write_command(0x0C); // no cursor, no blink, enable display. V. B4 q6 z7 d& v$ T. {8 N
  write_command(0x06); // auto-increment on
3 E8 p$ O1 I+ J6 Y' m0 g7 N  write_command(0x01); // clear screen
: ~, T, n8 ?' y! M  delay(1);
5 g4 ^, c0 H4 z; _0 E( }}
( B4 t  V7 l* i; w- G8 N0 g% L2 b# H; Y$ J, _7 W
// Display a string
$ b4 I0 @+ V  v! Nvoid string(uchar ad, uchar *s)
$ b# J8 L9 O- x6 g{ - Y! ], E, W% V9 Y, _& r
        write_command(ad);3 e. n( i* a# d0 N! X9 i
  while(*s>0)& a2 `  A! q/ O
  {
$ i( |0 p, S4 I1 P6 {/ A* Y                 write_date(*s++);
5 A1 e, D+ c3 r9 c( O/ ?: Q2 G# S* V0 d     delay(100);
, _' U  u. x4 o6 g& d3 _+ v& ^8 ?3 R  }! I0 v! N0 T2 {5 [  o
}
4 e' u9 h$ N9 T9 r" A  r8 z' z//****************************************************//( l) W3 t+ q! M! k* p2 c
//函数名:delay_ms(uint xms)7 }# f3 n3 Y5 S& q  ~
//函数功能:ms级延时函数
' o: g9 w7 l. O//***************************************************//2 ~2 A  @" ?0 x# n# ^
' y! L1 ~" e% x2 A
void delay_ms(uint xms)
6 o& S9 H6 O0 R% _& h* S{
0 p. o1 `# p' n" g        uint x,y;
) ~9 }2 m& C4 C; M1 x/ A        for(x=xms;x>0;x--)
9 c! a2 y+ N( [! |( L' J  J                for(y=110;y>0;y--);6 {6 N* e# ~( u  }4 n
        
4 |  _* ]; ^4 K7 z$ k}
, \; Z! {4 s, H" E. t/*
. w) i' c3 T$ N: R# Gvoid ADC0808_Init()
* G1 ~- l/ ^4 p& n' ]{
4 i$ ~/ m/ y% G  }6 p- K  ST=0;- i" O- g7 }' x3 Q: G. p- [
  OE=0;, x) N3 q3 ?- _: R' \
}
' r3 v4 @: b6 D* L& x*/: D, v# t* B, Z% k
//***************************************************//! }0 i3 D1 W( `" R  N' Y
//函数名称:ADC0808_ADC()5 L& C$ ~/ E) z- V" g! Y# R9 e" G
//函数功能:读取一次A/D转换的数据
) @+ B" _1 g2 o3 Y' F0 r//***************************************************//2 V& {9 o# E  y& o+ \6 d
/*
; z+ O5 [3 y- L- v* \void ADC0808_ADC()9 Z( n5 r( u3 M9 v3 l: p
{
2 }4 h' j4 R, H, F5 l  ST=0;6 F+ k# J+ y  D& x& A
  ST=1;
. O: s! H6 _$ a8 D" V8 i3 j2 h        ST=0;
' a) g' P5 \+ O6 g, R0 y3 F5 q6 u  //OE=0;
6 ?2 a$ R! l  t$ `  while(EOC==0);          //自动发送
" X4 y. x: h3 I" \/ q4 g  OE=1;
" Z2 B+ d/ a+ |' E! v& @# g) {$ h* Z0 _% k4 S' ]
}
( F. o) X; ~& o* t! K*/
- `8 F; `& W5 x//***************************************************//
& V, P$ w2 A+ C2 W1 d. y5 k, v( A//函数名称:TLC549_ADC()& K7 p6 I4 K% z9 J4 y2 ^
//函数功能:读取上一次A/D转换的数据,启动下一次A/D转换
. z( L  N5 U7 v( W+ _; F% X+ t# A! Z: D//**************************************************//+ c4 W5 [- T: u; Q5 Q) _8 H
/*4 p- p0 H3 s4 D) m: P5 ]* Q# |
uchar TLC549_ADC(void)
/ p$ A; L4 o0 K  `4 }{# {% q% u" n, f4 Q8 `2 }
        uchar n, tmp;
' s+ ?" A; \3 g
; ]% _4 v% W  D6 \+ \        CS  = 1;                     //CS置高,片选无效
( Y9 R$ i4 J0 s/ S5 m+ V' o        CLK = 0;
5 `& {$ p3 W) P
8 {7 {  U, @" S        CS  = 0;                     //CS置低,片选有效,同时DO输出高位* ~1 a0 H; {- i, i6 n: B0 p
        _nop_();& f5 J2 j8 M7 [3 D
        _nop_();                     //适当延迟时间1.4us Setup Time
0 s# g3 r* R; P+ e1 a, ?  d- l3 P
! v% y; X4 Y6 U' A        for(n = 0; n < 8; n++) //串行数据移位输入+ m9 ~) m+ J, h4 X- s/ t# B
        {
( h# W* ]" a6 `# R                tmp <<= 1;4 R# U& `" U9 D/ ~1 O
                tmp |=  DO;
, e0 V3 c3 J/ p( |9 K* t' r  
. J8 J( d) [, t: x                CLK = 1;        //0.4us) U% \. i! T: s4 C0 W! S3 X4 t
                _nop_();          //CLK transition time Max 0.1us
7 J+ n% n2 H# ]                CLK = 0;        //0.4us
1 W4 J. N" C- u9 J        }
7 ~2 l" @# d- {. x( n6 |; T        CS = 1;            //CS置高,片选无效
7 v& k, _% U$ e2 d        for(n = 17; n != 0; n--) _nop_();  //Next Coversion需要延迟17us
8 p4 o7 i3 d" ^  H& i        return (tmp);7 ~3 E) Z  U( h+ U  u) Z( ?  X. G
}
: O% [( i" i9 X: h0 a% Q*/
1 R) \/ P9 k% P3 {//****************************************//
, ^9 x6 _4 O8 m! p& m/ W) P8 }: u//函数功能:将模拟信号转换为数字信号6 P3 q6 N0 E) e8 M! c  ?# O
//函数名称:TLC2543_ADC()+ D2 y! }: w; K, P
//输入参数:uchar CH_i& P7 v( g! [* j8 A/ {
//输出参数:uint类型
- s/ Y" `; x/ }2 t$ l7 X! h//****************************************//
: J# p3 B2 F% F3 B9 |+ |unsigned int TLC2543_ADC(unsigned int CH_i)           //CH_i,通道值
9 |; @  M' }4 ~5 n% w+ @{
, i  R( ~# o. |0 O/ e* U# o' B& ?        unsigned int AD_Val = 0;
% J+ N8 @7 `) ]- N        unsigned char i;' [3 S% m7 \: ~: B3 r0 A: F+ T( Y
        CS = 1;                                                //一个转换周期开始
( M% o( X- H+ i. {6 |, S) ?/ R        EOC = 0;' @- c: m6 S  k. m
        CLK = 0;                                        //为第一个脉冲做准备
) X3 Q1 Z& l# [! h4 B        _nop_();
% u7 l% i  [# g: x! b: }        _nop_();
  s1 k5 y6 G+ L3 `6 ?) L) r        CS = 0;                                                //CS置0片选有效, T( S+ z" ^, H: Z+ O6 b' v
        EOC = 1;                                        //EOC开始应设置为高电平- a1 X! @5 E/ R* |. s4 C7 {
  CH_i<<=4;  //将通道值(D7,D6,D5,D4)移入高四位,转换通道设置
7 ?( g6 @8 }, a8 R: J  CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,输出数据为12位,先输出低位' j8 F9 @$ @/ ~" A& B) L& }+ F
        for(i=0;i<8;i++)         //将A/D转换方式控制字写入TLC2543,并读取低8位转换结果
, i$ x8 G( N- R. T- `) d- N        {, d4 P7 j9 X- z! N
                ! d# f9 q4 h3 k: E& g5 T
          AD_Val>>=1;   //将读取结果逐位右移(先输出的是低位)    6 t# N# e5 U4 t7 ~) R0 j& H) w
          CLK=0;3 \9 L: o9 E% k$ b9 \
          _nop_();
$ }% J) O* ~; c, A1 }% S    if((CH_i&0x80)==0x80)        ! g* s7 a9 s6 a
            SDI=1;               
+ B) i. ]; S5 I7 S          else, v% {: M& g5 m  k4 U/ c
            SDI=0;8 v6 s) {5 v- E* f3 T$ @
            CH_i<<=1;        //在脉冲上升沿,从高位至低位依次将控制字写入TLC25432 g: {- n* e) ~
      CLK=1;        
& K1 |8 O: m7 t2 r' K0 J      _nop_();. {* H# U0 B- `7 F) l2 h. P/ l- q5 n7 R
          if(SDO==1)                    //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位' {' l4 a( |' |" M
          {! b" O8 o# D! }3 K: `/ a% D' |$ k$ s
            AD_Val|=0x800;         , \  m& I1 D" {) z
          }
0 u. \; o0 K0 h! N3 `. L          else$ ~8 R' W7 c2 c, {
          {3 b/ H( b" Q: Z+ `9 f
            AD_Val|=0x000;
( j1 f" P* c% L7 q( |# ?) V          }6 j  q' `% l8 C) w+ `
        }! _+ k, n) A- P" u1 ]3 a' k
  SDI=0;        //8个数据流输入后,SDI端必须保持在一个固定的电平上,指引EOC变高  O. s. |/ h* y: v" V7 m
  for(i=8;i<12;i++)          //读取转换值的第8至第11位
) p. H9 j; a. `, R  {
: S8 w+ B# y3 K    AD_Val>>=1;
: j' a3 Y4 M0 C+ ^" j: |# {& {" x          CLK=0;                       - X+ T% N1 E1 a
          _nop_();
1 Z5 a) ~4 \5 A    CLK=1;      
% _9 M: z$ K* C8 K8 R          _nop_();
( Y9 z' h  [& ^" w' \; N0 `          if(SDO==1)  - Q/ h0 H1 ]' _) x
          {" q- k2 k' A; U' r
            AD_Val|=0x800;        //在脉冲下降沿,TLC2543输出数据,写入AD_Val的第12位% b9 _' w  C7 t' L1 H! G+ ^
          }
, ^  Y+ n* m" {          else
) ]  e8 ?. i7 ^4 m          {4 W4 Q, F- ?9 o- T* t5 Z  P& F
            AD_Val|=0x000;         //第12位写 ‘0’
7 I' h/ K9 x) s" C$ e8 V          }
1 q+ c. ~7 [. H* a- A1 C        } . h: q! W8 W8 ^
  CLK=0;         //在第12个时钟下降沿来临时,EOC开始变低,开始对本次采样的模拟量进行A/D转换,
, ?3 {1 o) e* K% H8 M4 D  _nop_();         //给硬件一点转换时间
# W' \2 n8 y' h4 ?, F) k# k+ a6 F  _nop_();
0 r& B+ q! P4 i0 u2 w( b6 I  _nop_();) h$ P5 j! t* D0 V$ s, X( @
  _nop_();2 ~, B9 U$ V5 n8 j
  _nop_();
, ]  p( }" _  Y1 i; w  _nop_();' T; M4 ~8 K" |/ E4 |
  CS=1;      // 停止转换,高电平无效1 l+ h2 V/ e7 }, |5 |# P
  EOC=0;  
+ \- k, f. ?/ i, k  b  return AD_Val;
5 k( f  Z8 p! \# x2 C6 D( ^}        
" t+ w6 x3 f* k& O, t+ Q6 ?) \0 |) I" ?! F, \, u( _8 x" ?
//****************************************//" X& u3 \. L  P, E
//函数名称ata_Conversion()0 }3 v, r4 e' C( k% d; ^, J
//函数功能:电压换算" B- H) E; ?9 W4 u3 A2 b
//*****************************************//
0 V( c& g) T, R5 f) fvoid Data_Conversion(void)# E2 ~/ e6 l& `& K8 l2 G
{
" m- A8 O7 Q' m. B+ O1 l        uint ad_val;- x8 T# V6 Y0 o6 Q4 b
  unsigned char o,p,k,l;+ N: b2 A+ p4 Y
        
8 d$ |2 c$ r6 ?+ {) `        ad_val = TLC2543_ADC(4);
5 n+ u1 Z5 m& x8 r        o=ad_val/1000;                   //取千位数字
, I/ K! d0 t. u5 d; P" J/ u! p8 j* B        p=(ad_val%1000)/100;           //取百位数字
0 \# R* f1 Q+ W3 L  r        k=(ad_val%100)/10;               //取十位数字( ^- U2 m" U; P- \& n5 d0 S5 ]; e
        l=ad_val%10;                           //取个位数字
/ k1 h& W# I! D- G4 [) X2 [        write_command(0x80+0x40);5 \( F; i1 |3 i1 C$ W
        write_date(0X30+o);+ x4 f0 @% X& n; \0 R
        write_date(0x30+p);
8 ]3 Y2 ~- Q! r3 G% X# v' n4 {        write_date(0x30+k);" Z+ z7 t6 \. U, \0 y: Q9 j( o( e7 m0 d
        write_date(0x30+l);
* L: Q, ~9 x& B% j# f5 P5 I        //delay_ms(1000);4 e1 T5 x' I" B7 h( I/ q
        if((X3==0)&&(X2==0))        //0-5V
, u0 n+ R8 q1 C+ Z+ x        {
$ {  j. C% t9 M, S, I" v# o7 x5 B                //ADD_A = 0;
4 h  l) @7 ^( p) f" o9 Q                //ADD_B = 1;, i- i. n3 J: _" q) C' J% [
                //ADD_C = 0;( Z8 `, [2 _3 [6 s: G
                Volt          = 5.0 / 4096 * ad_val*1000;                //(100-500)! s# I; B( S+ C/ q* F, o% N
                LCD[0] = Volt/1000;         //千位
- W+ W2 x7 M7 m+ D; W  ^               
9 K' |( e; f. w7 E                LCD[1] = Volt/100%10;  //百位7 z/ y$ ?1 k' p! X
                LCD[2] = Volt/10%10;    //十位; F* G+ u& ?1 A" B
                LCD[3] = '.';                                //小数点
4 P2 W* ^4 g% N+ A                LCD[4] = Volt%10;           //个位
" Z# Y% K4 \" r& l                LCD[5] = 'V';                              //字符V : N7 `+ L) @/ h4 O& j
                                                                                                                                1 }) k, i. w* ~0 u' u
                write_command(0x80+8);# r+ \2 a/ m% P
                write_date(0x30+LCD[0]);
' ^2 N  x  U. g: A; q4 a               
4 _3 e. v: T8 F. b) ?9 Y                write_date(0x30+LCD[1]);
% l* P5 H$ j$ `; {                write_date(0x30+LCD[2]);1 ?9 _5 J6 X! L4 w
                write_date(LCD[3]);
, x7 m2 i% e" o' U/ [0 G; w6 q                write_date(0x30+LCD[4]);
! W) K: C- a. h7 ]" r; l7 Y/ w5 {                write_date(LCD[5]);
! Q* d+ I9 M: |, j' n) R        }
& k6 F, [3 _: @0 r        if((X3==1)&&(X2==0))        //5-50V8 ?* k) k, o& I8 E
        {4 [, z5 n8 L+ B7 I/ X1 L
                //ADD_A = 1;2 {: s0 E4 F: Q* L2 u, }
                //ADD_B = 0;
* z) K+ k% m8 O; y                //ADD_C = 0;
* \6 G& m8 y! D4 u                Volt = 5.0/4096*ad_val*1000;        //(50-500)
- l+ v3 `2 V$ \                LCD[0] = Volt/1000;         //千位4 G- N$ X! \" L0 e- s3 L0 r
                % t) Z0 I2 h  O2 r) D
                LCD[1] = Volt/100%10;  //百位
' c0 i( t+ M: S3 P                ( {0 Q- X# L' b3 n, d$ x/ s( D
                LCD[2] = Volt/10%10;    //十位
8 }6 k3 X8 c2 u9 J1 }6 @5 u) g5 b                LCD[3] = '.';                                //小数点
, k6 ]. y; f+ U9 O3 q: k3 d                LCD[4] = Volt%10;           //个位2 o/ D5 \9 g, m- j/ n2 l; K& b8 w
                LCD[5] = 'V';                              //字符V $ W3 Q0 _' I7 P8 V) Z! U
                                                                                                                                9 u" |, K3 R! n3 d
                write_command(0x80+8);
% z/ M$ A) q. o: N" r                write_date(0x30+LCD[0]);
; U# q  h- B7 u% V* e               
( p: g- h$ {5 V' g! _                write_date(0x30+LCD[1]);
/ V5 S( v  g- U3 w% M               
7 |) |8 a; ~9 r9 h$ K, ^8 Z                write_date(0x30+LCD[2]);4 w1 X1 n  B1 `% I- i% E
                write_date(LCD[3]);
" G+ u) v4 C! S5 q                write_date(0x30+LCD[4]);
3 x0 P9 g% h7 D# w5 ^; J* x                write_date(LCD[5]);
6 p! |2 Z, X+ ]8 F8 K; D" S        }
( i  K4 Z! @9 \8 `! n# D. W/ a+ t        if((X3==1)&&(X2==1))        //50V-500V
% v) n, b! z+ [: w; v# b        {
( E1 o/ H& L: ?& C                //ADD_A = 0;( p2 \& Q& @& H* \' v
                //ADD_B = 0;7 O  D5 g; z* \- s& s9 x4 f: W
                //ADD_C = 0;
+ z# r& q6 }$ X8 ?4 F8 Q                Volt   = 5.0/4096*ad_val*1000;        //(500-5000)
  ?  t6 C4 W3 b! j                LCD[0] = Volt/1000;         //千位
- p( T( \, b/ A3 d- X               
! |" z% F; F+ o  T/ z1 Z  P: ~  P                LCD[1] = Volt/100%10;  //百位
8 U+ u* c3 H- Z' {- s- A                ' ]5 l- A( \4 U) z! l" M
                LCD[2] = Volt/10%10;    //十位+ r% l6 A* a8 B% v7 N
                LCD[3] = '.';                                //小数点% r; g, L, k& Z0 O
                LCD[4] = Volt%10;           //个位3 i. S$ S" I. Y
                LCD[5] = 'V';                              //字符V
5 r/ J1 Q" V% F                                                                                                                                
3 Y$ |8 }1 o" l/ ]                write_command(0x80+8);" i: ^: q/ d# g, V4 S
                write_date(0x30+LCD[0]);9 l) ?; ], J! d1 u' I1 s
               
2 O6 y. Y# U6 j0 J6 j7 D( I                write_date(0x30+LCD[1]);
& @, R$ {6 \* j               
" s8 B5 s$ b( h: H                write_date(0x30+LCD[2]);
; Q9 e# o; h9 i                write_date(LCD[3]);( Y, b" q8 n$ l# C7 `+ u
                write_date(0x30+LCD[4]);
- Y  f* u9 R' X                write_date(LCD[5]);
8 s4 h7 z2 `1 O        }
1 w, w; V( W; k2 R" S! l+ ]}
' m+ B/ O' ^9 D8 l9 |6 t* M! S+ D) X+ G2 ~: y
void Volt_To_LCD1602(void)
& u# E  D$ @) u* A& Z  T{
) E- I. O% s  H! {8 r        Data_Conversion();                     //电压换算并放大1000倍
. I: p4 H4 O$ _" v  f( G}/ G1 P: H; ]- V' \1 P
        
8 Y* R8 V) S1 V, C  @0 @3 n4 c/ Yint main()  H8 C* {/ G+ j4 g6 ?- q7 i! F
{" M2 w- z$ K5 o9 A. r
        //uint m;7 Y& B; W! I: @4 S* M
        LCD_init(); 5 n' j, d/ G9 G$ S/ @! s. n0 ~- v: E
        //ADC0808_Init();+ A# c% ~- Z$ P0 w$ \) ^
        //ADC0808_ADC();9 E6 j6 _4 ^9 P$ i) b
  delay_ms(100);
/ s/ H- `4 z2 N& D  write_command(0x01);
' Q8 L' d$ T8 P/ R* |# q$ |        write_command(0x80);
. ^0 h% V$ p5 T4 B" u        string(0x80,"Voltage:");$ a$ R2 Z9 Z9 B& d: Y( J6 b
        //delay_ms(2000);2 F; a/ x+ d# X

/ B+ y3 V% m. m0 N4 C; m5 X$ y7 E        while(1)
9 k' E" R- J; _        {4 P4 p  _" G* V2 |

7 {/ [  ], l- z* Q6 N/ c                delay_ms(50);
7 K: ~2 o+ D* K  G                Volt_To_LCD1602();/ t0 @# B8 w" o
                //delay_ms(4000);
% G) N: d. T3 E$ K4 y1 e5 f) o( ]                ! o+ p4 e& Y* W/ a4 S6 H) M8 N
        }  R. W5 ~- k$ b; Y  M4 _( o
}

& c6 {# G8 h8 D1 b
下载:
游客,如果您要查看本帖隐藏内容请回复

4 v6 H: S0 T/ O/ c; b3 D: Z

该用户从未签到

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

该用户从未签到

3#
发表于 2019-11-10 16:32 | 只看该作者
谢谢楼主的代码。. p% F5 q# l+ L( s$ e) |0 F2 E/ p* u6 R

该用户从未签到

4#
发表于 2020-5-15 16:05 | 只看该作者
感谢楼主的代码分享!
* B3 a0 i% o! P  i2 S" y

该用户从未签到

5#
发表于 2020-12-14 14:07 | 只看该作者
66666666666666
) B1 v& Y5 ~3 U# c7 @9 j2 H

该用户从未签到

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-10-30 04:18 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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