一乐电子

一乐电子百科

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 772|回复: 12
收起左侧

[51单片机] 玩“隔壁论坛老王电子数码DIY”的“USB电流电压表”

[复制链接]
发表于 2019-8-2 11:15 | 显示全部楼层 |阅读模式

% T! R" W: w1 x3 d
   首先来看一下外观:% ?3 s+ k, Q3 ?7 O) I5 T

反面

反面
   

正面

正面
3 r  u" T7 ~5 P' V( K$ m- v

$ h+ ], i% q7 [6 p+ ~0 h

界面1

界面1
   

界面2

界面2

5 V3 ^# i$ |! ]0 g3 u/ G" G8 j4 p下面是店主老王的产品介绍:此USB电压电流表为我联合qq群--电子爱好者交流群的群友开发的第一款产品,产品软件经历三四个版本,最终选定群友jam的方案为最终版本,经过一系列调试能稳定运行最终才量产的。(特别鸣谢:固件所有权归群友jam,由于作者未开源,所以qq群只公布了pcb源文件;硬件组装生产为群友邱先生完成,排线跟其中一个usb接口焊接全由其手工完成;另外特别感谢一起参与开发的十余位群友!)最高电压15伏输入;usb数据位直通,支持手机快充协议;具备电压电流监测功能;充电容量统计功能;充电电流分段时间监测功能;菜单功能,各项参数可微调校准。9664串口点阵屏,12位adc采样,精度我也不知道咋算……反正挺高,达到了主流u表分辨率。反正我是实在编不下去了,需要的自个下单吧,单个最终生产成本达到五块钱多,功能是目前我用过最完善的,价格更不要说了,纯粹不是为了赚钱,屏多,想做个产品随便卖卖而已。。。最后衷心感谢每一位支持过我的朋友!谢谢你们一路支持!下一个产品预计会开发一款彩屏的,带快充诱导的U表,耐压要达到30几伏,支持各种快充诱导,必要还会加上一些其他测试功能,目前已经囤积了一款彩屏6000多片,待闲下来慢慢联合群友开发,尽请期待。最后提醒耐压最高15伏,不支持最新的qc3.0跟pd协议,如果诱导出高于20伏的充电电压将会损坏此u表。7 A8 Q, e: e8 h$ O
" C& ^2 u1 J! T& ~) q
    本人很幸运参加了这个产品QQ群,但是能力不足,没有完成所有的功能。因投入精力很多,故把以往工作在这里总结一下,留作纪念。
: Z7 _3 R* C9 M
 楼主| 发表于 2019-8-2 11:16 | 显示全部楼层
本帖最后由 pla155 于 2019-8-2 11:22 编辑 7 L6 m6 N6 s9 T- @6 [
% B* U* ]. R5 d( O- j
第一步,硬件分析# q5 ~+ p; z9 F2 L' f! }
主芯片        HC89F0411P @ 32MHz RC ,经过2分频,实际工作在16MHz
. Z$ E/ l/ b9 E2 r( R
; Z4 }2 t3 k( S6 w/ S& M% n$ x8 Q: |3 q显示屏        1.4寸9664液晶,IIC接口液晶屏,PCF8820主控: Y: y! ~3 l& o8 L

* V5 f0 [2 A- P3 v5 c电流采样      通过R100电阻采样电流. O( Q  K& E1 {$ J9 [( h

" c" ~; ^. R4 T* s/ E7 W% |电压采样      输入电压通过分压电阻衰减10倍% Y) Q/ ^! G+ @

  u4 l4 Z, H- V  }5 B放大电路      LM421(丝印A63A)对电流采样值放大 10 倍# N& ^" C" t) P$ u7 k
4 P& [+ {% j$ ?# W8 X1 X
电源电路      线性电源BM1117-3.3
$ h$ f' \, v! s; n  u  Z
! p) V8 Z) O* ^接口电路      一个用户定义按键
: w! t, Z7 R. V# n0 L7 d
  c& m" @) U! u4 n4 i& r; ^借用QQ好友的图,在这里表示感谢
+ v  ?- U1 j" h" \! R2 l; M9 o/ t. F) m8 h
原理图1.png 9 E, R- z8 ^) y+ ?- |( z" [

1 x  F: t# y; W' J 原理图2.png
: Y+ W/ ^) {1 a0 y  U
; B# D) ?1 G: m) i        电路说明
' D' V! U8 R- ~* K1 e1.        电源:经典1117-3.3 (U1),3.3V输出。) T# M# A+ K7 b: K7 \
2.        电流检测:R1,0.1欧分压电阻。" O% B  [- E. t; ~
3.        电流电路:R1的电流分压经U2,R4,R5组成的放大器10倍放大后送通道AD0(P0.0)进行数模转换。' q3 X+ g  ]; ^1 S  n
4.        电压电路:电压经R2,R2分压电路5倍衰减后送通道AD1(P0.1)进行数模转换。
: a" a3 y( q; m- R$ e                        相应的5V输入,会有1V输出到AD1。& [2 i* Q% A& g: t
5.        用户按键接在P0.2 , 调试中可把串口重映射到此脚。
$ D8 R2 \6 G* Z6.        P0.3,P0.4,P2.0管脚分别对应PCF8820显示屏的SDA,SCK,Rst。6 \* b- Y7 P! ~! w" D' J/ P) [9 x
7.        背光直接接的电源,不受控。
4 L: x! l- o8 E% l8.        一点建议:如果 SDA接在P0.0 ,KEY接在P0.1 ,AD采样接在P0.2 ,P0.3;# s( K. U4 ^. a% W( N- P  N3 |) T& V
        烧录线电压就不会影响AD转换了,而且方便复用串口做调试。( R/ V0 R- N) |" i

, G: n4 P: ]5 ?( b- x* c# ]       设计的思考。4 T5 F) p9 m+ A9 |& V3 M
1.    因为3.3V供电,所以只能用内部2V的基准。
( {! x0 j: J" C0 S4 N2.    电流用0.1欧采样,放大十倍,最大量程 2A6 ]& P4 h0 O2 T, h4 b* K1 f0 z
3.    电压分压系数1/5,最大量程 10V。
% H) y4 d# U8 v9 m4.    因为AD是12位采样深度,
: ]" p4 p3 u1 l* v             2A / 4096  ,每个分度 4.88mA ;
, l6 x: X) O% W2 D! J            10V / 4096 ,每个分度 2.44mV
# ^2 e) r3 p. o$ \& q8 S! k: x0 _- J! }+ B9 j) ]

, l: ^9 U4 d) F! c
 楼主| 发表于 2019-8-2 11:38 | 显示全部楼层
本帖最后由 pla155 于 2019-8-2 11:40 编辑 7 J$ S* r' K9 W
% F7 G; j% E3 a' D. R. y
     关于 主芯片 HC89F0411P   的资料可以到上海芯圣电子股份有限公司查看 。
7 ]: E8 q: E) ?: ~& B8脚的芯片,12K程序区,512RAM,5个定时器,2个高速串口,12位的AD转换应该是“老王”选择的理由之一。' M  a% m, ~7 U$ r5 V1 h- u
* ~  }; H, q3 j& j
4 V" c5 O; J/ s$ z, Y
HC89F0411P . PDF
0 z" q% B% k; N" A- ^: |! A& X
' f# g: F5 K* j6 I( Y6 w

$ m1 U  z* a. E' l* O7 u, P' [HC89F0411P  ISP烧写软件
- _4 b" ]" G0 h
* t, h/ u) _% t/ t7 y ISP.jpg
8 _- ?8 O, `! E' G5 C
5 W2 Z/ k  d- k( x3 B! T
! _4 L7 k1 E$ W6 h7 |使用USB串口链接相应的管脚即可。5 [0 g6 s+ ^& D& d+ J8 k* D( G& b+ M
特别注意的是,如果下载不成功(不能连接单片机),可能是放大器锁死串口管脚电平的原因。! y! c- v! K2 l* D1 Z; R- O
解决这个问题可以用断开地线(GND)后连接地线的方法给单片机供电,成功的几率比断开5V要高。
- E6 h  |) ^7 ~# c; n, A$ l  j  N& j' @: y

) H; K3 P6 J/ o7 \( T. y* N
) d$ p+ j9 ^+ Z$ D: ?/ ~1 f4 r. z 背面.jpg
4 I/ [1 k( q' {* W* U: H$ k4 F
 楼主| 发表于 2019-8-2 11:47 | 显示全部楼层
工作总结:5 G, o# s, X5 `

# U* Y% h5 a/ u6 W    程序完全用汇编写的,很难懂,也就不开源了。. A7 [5 j( K* m' d0 ?: ~
实现了基本要求,但是没有电压、电流校正的功能。故没有完成作业,很遗憾。
2 l, C$ x4 O% N
8 Y9 @; ]; L, k3 U' }! _, n Umeter-20190118.jpg
3 u4 C9 k0 S7 Z9 D$ z) n
* v# c% X* E/ I/ M2 E. X% P% r 小字体.rar (2.41 MB, 下载次数: 17)
 楼主| 发表于 2019-8-2 11:48 | 显示全部楼层
本帖最后由 pla155 于 2019-8-2 14:22 编辑 8 g7 c3 ]2 M( m' }! \6 _+ C

2 u" c) m5 _" H) H, }6 W2 T  电流采样分度5mA,对应5V功率为25mW,每秒可以累加的能量最小分度25mW秒/3600秒 = 0.000007Wh。+ h) N2 P3 y, R# e. H$ I: K! c
  实时功率累计值能显示的最小单位应保持小数点后3位。1 S6 K! y" W; p: S" D
  最大值参考最大功率10V*2A = 20W , 最大分度0.005556Wh ;10Wh 分度 0.002778Wh# n& k  P9 G0 M( n. Z) Z' J! N2 u6 g
  按照2天48小时计算,最大能量960Wh .7 U/ w. n1 V2 n' d5 ^( ^
  使用4字节进行计数,最大功率20W可以计时59小时。  0X100000000 / 0X4E20(20W)/3600(秒) = 59.65小时( Z" e( q9 {% Z9 j7 I( l% \
  兼顾最大值和最小分度可以显示,最后采用格式 XXX.XXXXXWh 比较稳妥。0 `  K0 l& h9 _

. C# s4 P/ g9 Y# M* a; q" K0 C- y) S
程序的思路分两部分,一部分是主程序,顺序执行;基本就是界面管理,按键事件管理,一些辅助运算。另一部分是写在定时器中断服务程序里的AD采样程序和部分数据处理程序。把AD写在中断程序里的好处是采样时间均匀分布,对能量做时间的积分更加准确(当然,这只是教条主义的准确,我有强迫症,不用搭理我)。因为数据采样和转换是这个程序的核心任务,就先说一下中断和AD。
使用T5定时器做系统定时器。系统时钟2分频,CPU工作在16MHz,原则上不用这么高频的,不节能。但考虑到不差钱,浪费不了多少电能,也就在高频下工作了,并且没有设计节能操作。暂时没有设计看门狗。
T5定时器预置定时7812.5微秒中断一次,每秒钟中断128次,分给AD通道电流和电压各64次转换。每次中断,读取AD结果,做累加后存放在一个3三字节变量中(SUM += ADCR),启动另一通道进行转换(ORL    ADCC0 , #11000011B)。
因为每次都是启动转换后的7.8毫秒读取ADCR结果,所以不用判断,不用等待。
为保证AD准确度,采用最慢的AD时钟。
每一次采样是一组12位有效值,每秒钟采样64次,相当于18Bit的结果,小于24Bit,不会溢出。
T5定时器每次中断还会给一个计数器加一(T5_tick++;) ,当 T5_tick^6置位,即表示程序运行了一秒,采样了64次,可以进行数值转换了。数值转换包括实时电流值,电压值,功率值,根据功率数值做能量的累计,判断电流非零进行时间累积。当然,在这些工作之前,应该有电流和电压校准值的补偿运算,目前还未实现。
 楼主| 发表于 2019-8-2 11:49 | 显示全部楼层
本帖最后由 pla155 于 2019-8-3 16:55 编辑
+ m$ `& N6 w9 x. [
+ P+ x* V9 k( |- P关于运算:单字节乘四字节乘法程序简单,由四次单字节乘法和三次加法完成。4 B* x5 N$ B9 w4 R
          SUM_ADC0 * 125 可以一次完成,SUM_ADC1 * 625分成两次,一次125,一次5,都不超过255限制。' \8 d5 r6 R% d* y& [% H. o
          乘4 是通过左移位2次实现,目的是通过简单的舍弃后2字节 完成/256/64的计算,而不会引入计算误差。
+ {/ g! ?: ^5 C9 g5 M0 P( x
  d8 [" Y7 i( H; W1 q' jSUM_ADC0 = (ADCRH,ADCRL) * 64
9 X9 Q1 T7 j1 M% ]6 f# D/ ?//  Current = SUM_ADC0 / 64 *(2000/4096)   = SUM_ADC0 * 125 / 256 / 640 U% g9 b  C5 B2 B# r; N
//     (MAX =         07 D0 00 00)                  = SUM_ADC0 * 125 * 4 /256/2564 \& Q$ T6 J# Z5 a1 p8 ~" h
//  舍弃后16位,07D0H =  2000mA" L- [7 X0 ^: S/ H! t. t! G! B

) y4 Z+ f/ c! j4 KSUM_ADC1 = (ADCRH,ADCRL) * 64
% i7 [- V3 A5 @- ^5 t6 k9 [* R0 b  c//  Voltage = SUM_ADC1 / 64 *(10000/4096) = SUM_ADC1 * 625 / 256 / 64
" \+ Z  R+ N1 v/ U//                                                           = SUM_ADC1 * 625 * 4 / 256 / 256
% S$ a3 |* W8 k; s//     (MAX = 27 10 00 00)                          = SUM_ADC1 * 5 * 125  * 4 / 256 / 256
- K/ _) W. G0 [, f6 g, P//  舍弃后16位,2710H = 10000mV% {, z2 d6 v5 k3 D$ d4 q

, h# J: [, A2 K, N1 n) ?) NPower = (Current * Voltage) + 0.5 ,保留2位小数+ j; O! X$ @8 d, f! ~; y9 i, \
8 C- j7 ?4 D% @, y$ Q. _6 I' X) E

& W$ p" A3 s3 O2 Y: t1 s7 w7 b0 z2 R
下面是AD采样的子函数文件,被T5定时器调用,完成AD采样和相关数值计算、转换功能。' `! E9 y( _+ E6 O, S+ I) D( ~

! t5 i  L! v) Q  J0 |NAME        FUN_ADC0 T1 _3 u- `& _
/*****************************************************************************/, q8 u7 t+ G3 L0 x
#include <.\01LCD\HC89F0411P.H>
& o2 T$ n$ Z" b, l8 M' E' t) t/*****************************************************************************/+ O5 @- w8 W% I# w( q. o9 R
EXTRN        BIT         (T5_tick_0)
3 @8 }3 l, q; L& `+ ?// - - - - - - - - - - - - - % `, x! t1 w# q6 z
EXTRN        DATA         (PCF8820_X,PCF8820_Y,PCF8820_Char)
2 {- _- s" m5 C' R// - - - - - - - - - - - - - 电流采样值求和结果,每秒64次,最大值 4096 * 64 =04 00 00H
+ y% W5 Q$ U  e3 u* sEXTRN        DATA         (SUM_ADC0_H,SUM_ADC0_M,SUM_ADC0_L)         - e- f& [& _1 Y+ x$ y
// - - - - - - - - - - - - - 电压采样每秒64次,累计高字节缓冲字
. Y; y  p4 y5 zEXTRN        DATA         (SUM_ADC1_H,SUM_ADC1_M,SUM_ADC1_L)                                
5 s2 l! e  f! N3 M+ Z' S// - - - - - - - - - - - - - 电压采样每秒64次,累计高字节缓冲字7 }1 A" S7 c5 K
EXTRN        DATA         (Capacity_T,Capacity_H,Capacity_M,Capacity_L)        5 A) d1 A. K! d; h- P" a, \4 Z
// - - - - - - - - - - - - - 充放电计时器
! @% y! K/ }6 ^# \# IEXTRN        DATA         (Time_Sec , Time_Min , Time_Hor , Time_Day)  a; ^- Q0 P' u) J7 f# ^/ ?1 J# g
// - - - - - - - - - - - - - , q9 F1 v3 e! {  e3 R9 s
EXTRN        DATA         (BUF0_T,BUF0_H,BUF0_M,BUF0_L)0 p2 W: j0 E5 E4 f; K  R
EXTRN        DATA         (BUF1_T,BUF1_H,BUF1_M,BUF1_L)
( l8 g8 w) L8 F, d( C// - - - - - - - - - - - - - 电流运算结果
5 b7 e7 x# ~* h% H! ]1 r$ @6 JEXTRN        DATA         (CurrentH,CurrentL)                                 
/ \2 T& O  b" V4 L: ?' I// - - - - - - - - - - - - - 电压运算结果+ d- z  j9 @1 t% ]
EXTRN        DATA         (VoltageH,VoltageL)                         $ X: y& o) A2 M! u6 w* [. h  C0 U
// - - - - - - - - - - - - - 功率运算结果
7 Z- h% x3 r4 q: eEXTRN        DATA         (PowerH,PowerL)                        
* `6 X  p5 i" u# ?// - - - - - - - - - - - - -         " }6 u4 M  s3 Q5 u2 @
EXTRN        DATA         (temp)
2 ?$ n5 X3 P1 J0 q// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -& O- q+ t+ n! Y
EXTRN        CODE         (LONG_RL1)
( k: K5 o# ]$ a# I. h& @# n+ uEXTRN        CODE         (LONG_MUL_BYTE,WORD_MUL_WORD)
, B5 K6 \/ y" R" _6 l7 V: G7 GEXTRN        CODE         (LONG_DIV_BYTE,WORD_DIV_BYTE)
; G3 r. p  Y* s4 V6 {EXTRN        CODE         (WORD_To_BCD,SUB_BUF0_1Byte)) L& H( b6 y: o2 C; Q5 t2 L
EXTRN        CODE         (SUB_WATCH_BUF)
9 k* U% R* z* v& s; B. K+ E" ?EXTRN        CODE         (PCF8820_Char8X16)
' x  d" H* }" ]; n/*****************************************************************************/* H+ K; S5 k4 g% w# L
?PR?Init_ADC?FUN_ADC                        SEGMENT CODE , e( q5 U( v  Y- }: E
?PR?Voltage_To_Ascii?FUN_ADC        SEGMENT CODE - P& \1 E* P$ H6 h4 x4 ~9 F
?PR?Current_To_Ascii?FUN_ADC        SEGMENT CODE
/ \; F/ @* k) _# x?PR?Power_To_Ascii?FUN_ADC                SEGMENT CODE 2 y9 o3 x, Y% p" I3 m
?PR?Capacity_To_LCD?FUN_ADC                SEGMENT CODE * E4 m- }- u7 v3 A- J( v
?PR?Time_To_LCD?FUN_ADC                        SEGMENT CODE 7 d9 R  V+ u; b4 a) C' w. @
// ------  下面这两个函数被 T5 中断调用 ---------------------------------------
- F8 `) K' d2 I/ K: z4 G?PR?AD_Sample?FUN_ADC                        SEGMENT CODE
0 d9 x, P0 ]+ _?PR?AD_Process?FUN_ADC                        SEGMENT CODE / q" d* [( @$ S9 f( L4 u
/*****************************************************************************/
% o) l' W8 t' q) d/ `                PUBLIC                Init_ADC
3 \1 r# k  i& l' t3 U+ K0 L                PUBLIC                Current_To_Ascii , Voltage_To_Ascii , Power_To_Ascii 5 D  C, i* {9 @
                PUBLIC                Capacity_To_LCD , Time_To_LCD
5 F3 |3 _' Q' Q: _% {9 v* d                PUBLIC      AD_Sample , AD_Process                 // 这两个函数被 T5 中断调用- Q3 b( B" ^* z
/******************************************************************************* g$ i8 I7 c; A# A2 K6 Z+ ~
  * @说明          ADC初始化; |! Q, F6 t7 u  h5 J
  *        @参数        无
5 S+ o5 x/ o7 [# j' w- c; [" D- ?. ^  * @返回值 无
! c* A9 b- S% q( k' S  [0 i  * @注                选择外部通道0,转换结果12位数据,高八位置于ADCRH寄存器,ADC时钟16分频4 N7 Y3 _, {6 Y5 w
******************************************************************************/) u( G1 X3 q8 R
RSEG        ?PR?Init_ADC?FUN_ADC
! D; m; ?7 K. D) t! M" YInit_ADC:
; d6 W0 ~$ Z" a/ ?8 G;------打开ADC转换电源,选择内部参考电压2伏。因为是3.3V供电' p1 |/ i$ w4 m. Y
; 位编号    7      6      5    4    3      2        1  0
- e: w: y1 @: ]+ X$ a( `; 位符号  ADCEN  ADCST  ADCIF  -  VREFO  VREFS  INREF_S[1:0]
" l8 E4 a+ L& B5 a                                MOV                ADCC0                , #0X043+ S% e' Q1 R5 S: t0 t0 P
;------转换结果12位数据,高八位置于ADCRH寄存器,ADC时钟32分频: l( o4 }7 ]1 }/ }8 B
; 位编号    7     6      5  4  3    2  1  0
5 [9 C0 t- g1 d7 w; 位符号  ADCL  ALIGN  ADCTS[2:0]  ADCS[2:0]. A+ E2 Z4 g$ X1 r& z: L; U
;% X/ y! ~0 n# g% h
;ADCL   ALIGN               ADCRH                               ADCRL, {) _2 d! ^+ l
;                                 7    6    5   4   3   2     1    0    7   6   5   4   3   2   1   0
9 A6 y, p7 l. I+ _( o;0           0                  D11  D10  D9  D8  D7   D6   D5   D4    /   /   /   /  D3  D2  D1  D0
, \& u8 r9 R) |7 H6 v* l4 [;0           1                  /     /    /   /  D11  D10  D9   D8   D7  D6  D5  D4  D3  D2  D1  D0 选这个方式+ Q' q8 j) F" P/ |+ p
;1          0                  D11  D10  D9  D8  D7   D6   D5   D4    /   /   /   /   /   /  D3  D2( B9 W! n+ i/ F) z5 O5 ?
;1          1                  /    /     /   /   /    /   D11  D10  D9  D8  D7  D6  D5  D4  D3  D2
2 t2 v/ [% l5 l9 l# g                                MOV                DPTR                , #ADCC2
/ y6 {1 T0 b5 O. z4 r                                MOV                A                        , #01111111B
1 G8 x- |: }* Q) c: \/ U                                MOVX        @DPTR                , A9 V5 C$ B3 h& U% ^
                                RET& t; n3 l6 p' e0 ^" {
/*****************************************************************************/  t" D+ w* @: V4 y  N% W, }
1 u7 S( i( F: f8 v2 k( ^' S
// ----------    由T5定时器中断程序调用。 -------------------------------------
' V! _/ y9 F! }- a, E' W
, J& G+ n$ u. {0 w# t// 由T5定时器中断程序调用,每一秒调用128次,交替对ADC0(电流),ADC1(电压)采样64次。; g8 L9 A  {/ E( h8 M
// AD结果是12位,数据右对齐。
& `. k1 [; r/ n// 累加结果存放在两个三字节整数中,最大值 0X04 00 00。
5 A* c$ ~1 s6 M% O8 r9 T* w5 D/*****************************************************************************/
% j4 d4 S3 E" j3 ^* Y* ]RSEG        ?PR?AD_Sample?FUN_ADC1 e! f: h) i& a) a
AD_Sample:                PUSH        ACC                // 两个通道轮流采样,每秒分别采样2次,通过8毫秒标志位判断
9 q, x  i5 o4 M( j, I                                PUSH        PSW7 g9 g. W& w" q1 [9 N
                                0 ]/ r# x5 v' X6 {2 p
                                JNB         T5_tick_0        , JP1_AD_Sample        // 转电压采样
4 F' A6 K- h0 ~% j9 v0 o                                MOV                A                        , SUM_ADC0_L( z& f. L* G$ P: a' x
                                ADD                A                        , ADCRL# I& p7 e! X+ ~
                                MOV                SUM_ADC0_L        , A
0 }7 d- g  @# @* K2 _                                MOV                A                        , SUM_ADC0_M
* v. X$ ^' m5 J5 A# f0 g                                ADDC        A                        , ADCRH
, `6 B2 j" @1 P                                MOV                SUM_ADC0_M        , A
: l2 r, x2 u9 `2 c# \4 Q                                CLR                A; ]1 W/ w$ ]" z+ {: q' y) s* S
                                ADDC        A                        , SUM_ADC0_H1 D" [' t9 O& o5 o1 L
                                MOV                SUM_ADC0_H        , A+ V, e/ ], y; S! r' N1 [
                                MOV                ADCC1           , #001H                        //选择下一次转换外部通道1 采样电压
' T. c& C. K, ^! ~4 M( g; h8 g' w) P                                JMP                EXIT_AD_Sample% {5 ^  H: `" K! M% I9 P' ~
JP1_AD_Sample:   0 I) m% L0 l, q2 V; q* E, u
                                MOV                A                        , SUM_ADC1_L
. o9 f: ?/ I2 S0 U# n                                ADD                A                        , ADCRL8 C# {! Y2 G5 d9 e$ t" L+ a; T4 ^0 C
                                MOV                SUM_ADC1_L        , A
5 b$ V( V; z4 a                                MOV                A                        , SUM_ADC1_M
3 V  L: W7 b/ S% D7 D                                ADDC        A                        , ADCRH
+ F( l; v+ s; m- l# ~8 Q* J9 H  Y                                MOV                SUM_ADC1_M        , A+ Y( J) n# {* r4 X
                                CLR                A
5 a. b7 L0 ]6 K                                ADDC        A                        , SUM_ADC1_H- w( L! P1 p7 \8 x
                                MOV                SUM_ADC1_H        , A+ {0 V/ g/ b/ a
                                MOV                ADCC1           , #000H                        //选择下一次转换外部通道0 采样电流5 w6 Z* ^. D. x9 j
EXIT_AD_Sample: // --------AD采样数据保存与启动下一轮转换--------$ M( O1 W: x$ _  ~& b  H5 b
                                ANL                ADCC0                , #11010011B        //清除标志位! |' d0 [" r/ K0 z7 T& E) E
                                ORL                ADCC0                , #11000011B        //启动ADC转换,每秒采样128次,每个通道64次
. V3 P* f/ K! [                                
2 a7 S. D/ L! k- R) U. X# R                                POP                PSW0 h5 f, \! `+ ]2 q
                                POP                ACC
& y& Q# B! {# \; t0 I- s                                RET
8 Z' F* h( c7 q: j7 K/*****************************************************************************/+ B  e$ m+ X9 p/ B. R$ B
// ----------    由T5定时器中断程序调用。 -------------------------------------
4 a; M) g$ @2 n) J" ~3 I/ {% B
  J. `( X& ^$ G// 由T5定时器中断程序调用,每一秒调用一次。
* j& c$ _) ?/ j, e// 把SUM_ADC中64次采样累加和进行校准,补偿一个校正数
8 q1 `( Q' M7 b6 B// 把校准后的SUM_ADC转换成相应量程的测量值,12BIT转化成1.999A , 9.999V 。
  b: ?2 C% n9 D4 M# A8 ?/*****************************************************************************/
0 v) `. q7 e5 ~) f$ x3 ~: SRSEG        ?PR?AD_Process?FUN_ADC" p, T7 N' D* j/ N* J" f
AD_Process:                PUSH        ACC
" G( w7 S# O8 G: Z3 s                                PUSH        B
4 p. F+ L  U$ n                                PUSH        000H& |/ i) Q0 \/ f8 w+ v
                                PUSH        PSW
" q7 j- q, ^! J8 C( d9 w/****************************************/
6 Q6 F1 O  V7 @  N1 i# ?' Z" E; k                                LCALL        Adjust_Current  r4 r! M; i0 S7 A! U0 w0 W
                                LCALL        Convert_Current* }. N- B* w9 z2 x( ~
                                LCALL        Adjust_Voltage
/ |+ K8 g; A3 z0 N- b9 Q                                LCALL        Convert_Voltage# f* D; d- y6 h; o% w, o$ A
                                LCALL        Convert_Power' u1 j" s( P8 F2 P
//                                LCALL        Convert_Capacity  X0 Y* o% W3 [( b+ ]. u! `. u% d
/****************************************/0 p$ H( Q5 n% {1 _! g! v, _! l
                                LCALL        SUB_CLR_SUM
; q4 f" A0 s# l* V: z                                1 j/ p9 j9 p* h2 [* c& W: X
                                POP                PSW
7 ^" \  \# a' C, P                                POP                000H
2 b6 D  i4 u3 b1 e8 {( z" {                                POP                B
, c! d8 p4 ?9 k4 O/ L+ T                                POP                ACC9 [+ s. i% ^! ?5 W/ L6 v
                                , M$ U  W4 j. C6 W
                                MOV                SBUF                , 0C2H//TL5+ m: z0 p# a0 k. w
                                
6 O- X, h) S; D2 [; W  ?                                RET
4 z; Y& H/ N1 Y9 @+ z/*****************************************************************************/! G$ i: _4 w: d) r$ `
Adjust_Current:! C, K9 Y8 c4 T
                                RET& g6 p2 J9 F" u6 G: x& U! A7 k1 N
/*****************************************************************************/
# H! G- k* o+ x& H" lAdjust_Voltage:
. v5 {2 k% \- x; A                                RET
# x. B! e' P: S+ m/*****************************************************************************// z. {7 ~, |* G/ `! l. W9 x3 R
Convert_Current:# F4 i* p5 K4 c$ e2 r& b
//  把存放在 SUM_ADC0 的三字节电流64次采样累加和做平均数,并转化成相应量程数值
7 u* u$ h9 U. C7 F# b2 }$ N//  Current = SUM_ADC0 / 64 *(2000/4096)   = SUM_ADC0 * 125 / 256 / 64
  i) M5 f# B# b; e5 j( \, I//        (MAX =         07 D0 00 00)                                   = SUM_ADC0 * 125 * 4 /256/256
1 H! {0 E+ n' i7 `//  舍弃后16位,07D0 =  2000mA1 J! e, }( w9 E8 H9 n# c/ f
//-------------------------------------
3 [! t9 c& |7 [9 R                                MOV                BUF0_H                , SUM_ADC0_H$ V# i9 I; F4 C3 ?+ F
                                MOV                BUF0_M                , SUM_ADC0_M1 C% W% Y: ~7 |6 W5 Q1 C' a
                                MOV                BUF0_L                , SUM_ADC0_L
1 U" x: V# }% N; M                                MOV                BUF1_L                , #125D6 {# K# `0 d) L7 I7 b* a7 X: A1 E% s+ B
                                LCALL        LONG_MUL_BYTE                        // SUM_ADC0 * 125
0 V; ]! s, a- J5 v) P& o2 `& g                                LCALL        LONG_RL1/ @; G+ n) c: g: c
                                LCALL        LONG_RL1                                // SUM_ADC0 * 125 * 4
* F- y2 d1 W0 [1 i- J                                MOV                CurrentH        , BUF0_T
8 H" b( |. T/ ]                                MOV                CurrentL        , BUF0_H        // SUM_ADC0 * 125 * 4 /256/256
! t# G+ G6 T5 U                                
4 w' P* E# G+ r0 y/ X& ^                                //     通过电流是否为零来计时。故写在这里
3 ~8 x8 E5 V& j" A                                MOV                A                        , CurrentH% H- m8 q* p( X4 @8 N
                                ADD                A                        , CurrentL* \( D7 ^6 x  ?
                                ADDC        A                        , #000H+ L5 x2 j* ~9 j- [7 g. N! Q* U
                                JZ                Exit_Convert_Current        // 电流为零,不做累计时间
0 I1 d7 \9 F  ?1 U7 O# F! h                                LCALL        Convert_Time
) U4 T# K5 S/ G/ X0 SExit_Convert_Current:                                9 F4 F2 A1 D" E1 D% |
                                RET
4 V- X' M2 I; b% {& t# A) I3 m//-------------------------------------
; A7 n6 `! G8 j, v% aConvert_Voltage:                                
& I8 ?+ _  B  o0 @5 D! |6 c: @6 W* L//  把存放在 SUM_ADC1 的三字节电压64次采样累加和做平均数,并转化成相应量程数值
9 b; E/ e+ n, J$ ?//  Voltage = SUM_ADC1 / 64 *(10000/4096) = SUM_ADC1 * 625 / 256 / 64
6 `" _; P. [+ s* r% }8 `5 W' r//                                                                              = SUM_ADC1 * 625 * 4 / 256 / 256
/ X% F$ q7 @6 r: H8 R' K//        (MAX = 27 10 00 00)                                      = SUM_ADC1 * 125 * 5 * 4 / 256 / 256( N% O/ `+ Q& H
//  舍弃后16位,2710 = 10000mV  L0 t7 y5 n$ E7 k+ o" x
//-------------------------------------
4 k6 Q. i- N' L                                MOV                BUF0_H                , SUM_ADC1_H
3 A" L5 Y5 V% T7 z2 `                                MOV                BUF0_M                , SUM_ADC1_M
9 e) z' ^* u- p" O                                MOV                BUF0_L                , SUM_ADC1_L
* ?4 z+ \. |5 b+ l6 ~( U5 |                                MOV                BUF1_L                , #5D                // 先乘以5 ,这个数比较小,不会导致BUF0_T的溢出
) m* R, E' d8 ^6 ?9 Y# m5 H& \                                LCALL        LONG_MUL_BYTE                        // SUM_ADC1 * 5
/ t4 B1 u9 H/ A0 i                                MOV                BUF1_L                , #125D
! \& ]! i( \- T7 ]                                LCALL        LONG_MUL_BYTE                        // SUM_ADC1 * 125 * 54 s. e  w( o9 |. b/ p
                                LCALL        LONG_RL1
( q7 B' h' q* ?7 N9 v6 a: Z                                LCALL        LONG_RL1                                // SUM_ADC1 * 125 * 5 * 4
. j* U9 [* M. t( W+ J/ o0 X7 G6 }) ]% b                                MOV                VoltageH        , BUF0_T
6 U2 C  C" _  d0 R                                MOV                VoltageL        , BUF0_H         // SUM_ADC1 * 125 * 5 * 4 / 256 / 2561 R, A' q! ]# G7 p% q+ c6 X% j! Q
                                RET. m- x: d! b  n
//-------------------------------------% A1 c6 N9 C. v8 u1 q- v* Z
Convert_Power:        
0 n* y4 W( ~+ ^" x$ E, v& O// -----------  BUF0 =         CurrentH*VoltageH , 结果放在BUF0(最大 20 000 000 ,01 31 2D 00H)3 W* Z: N/ w0 W7 V: @" }
//------转换到量程范围,20.00 W ,需要除10000(27 10H), 分两次操作,每次除100.
2 M$ M2 I2 ?7 P8 c8 g, r; y7 F+ |                                MOV                BUF0_L                , CurrentL* v4 p+ E" s! x( z8 M' b) Z
                                MOV                BUF0_H                , CurrentH
5 c. U, I% Q0 z& y' e- S                                MOV                BUF1_L                , VoltageL# F0 a, A9 C; {; d
                                MOV                BUF1_H                , VoltageH3 s/ H+ \2 g) {
                                LCALL        WORD_MUL_WORD                // BUF0 = (BUF0_H,BUF0_L)*(BUF1_H,BUF1_L)0 F( d8 ~3 r3 H7 l
                                //----- 除1000000,转化为相应的量程 ---------------------
9 X- p: Y/ U, f0 C; R3 s                                MOV                BUF1_L                , #100D9 Y% z& H. ]1 x: w; }4 m  [; @0 D3 b
                                LCALL        LONG_DIV_BYTE
; N" \, |' O6 _) w                                MOV                BUF1_L                , #10D                //  现在是 mW为单位3 B1 S% r; T" y/ a5 m! x
                                LCALL        LONG_DIV_BYTE
' P8 j4 D2 N4 l  W9 L. J6 f
( Q" Q9 Y$ n4 p// Convert_Capacity:  计算累计放电电量' Q" g5 h5 G  B' z! @
// -----------  Capacity += (PowerH,PowerL)- e+ X6 Y$ z' B
// -----------  MAX(PowerH,PowerL) = MAX_V*MAX_A = 10*2 = 20W = 2000D = 7 D0
) v7 U( C( E) {3 A2 O# U6 l* D// -----------  MAX(Capacity) = 7D0 * 86400秒 = A 4C B8 00
9 Q# \- m8 ~% {$ _$ K// -----------  4字节Capacity逻辑上可以计量最大功率(20W)不少于24天.
9 ^) W, a. ~, m3 H, |                                MOV                A                        , BUF0_L
- o/ M! ^$ f* N  z0 h" Q: L2 N                                ADD                A                        , Capacity_L! `* G% [* t/ z
                                MOV                Capacity_L        , A
9 F0 D! u$ p: t& {3 ]7 P- g, }6 W                                MOV                A                        , BUF0_M, q# O8 m$ O- x7 a" Z9 e( W
                                ADDC        A                        , Capacity_M9 N$ T" X/ b( s
                                MOV                Capacity_M        , A( s# R; \: y  I- S8 X7 O
                                CLR                A
. q" G% E" s9 R8 l2 W+ y                                ADDC        A                        , Capacity_H
6 ~% j7 ^( c3 Q3 ]                                MOV                Capacity_H        , A
& @  B$ p3 a' L2 s0 f( ?                                CLR                A
9 {" I8 O# ?! G& n. f( B                                ADDC        A                        , Capacity_T1 u0 T- J$ c! x+ S4 z; j' J& x8 Q
                                MOV                Capacity_T        , A
0 E; d! j. M4 X' r6 I$ |0 ]                                
; j  t9 E3 T& B0 j) v) y// 加上0.5各单位,也就是5 , 实现四舍五入. 9 o9 G% l2 w. a* w* t4 W  d9 E6 i& n
                                MOV                A                        , #005H        - b  C3 S# ^  d2 T9 j1 {2 K; {
                                ADD                A                        , BUF0_L9 t8 ~7 Q+ Z+ I2 y3 H0 q- D
                                MOV                BUF0_L                , A
8 X9 D! F3 Q' r" D                                CLR                A
% e) w" @; e! _; B1 i' J7 T: j                                ADDC        A                        , BUF0_M! n3 z7 U" T% t" E! a4 r4 A$ `" l* q
                                MOV                BUF0_M                , A0 b( B8 G: d' F/ v1 M
                                
; F, L& i) f+ }8 C  D( r9 g; l# G                                MOV                BUF1_L                , #10D        // 除这个10 ,只是为了显示方便% E* j( V8 p" |5 ~# q9 R' I* E
                                LCALL        LONG_DIV_BYTE                // POWER / 100 /100 >> xx.xx W
0 s! r/ \" R5 S                                MOV                PowerH                , BUF0_M4 }2 `" Y* }' M8 W( Q
                                MOV                PowerL                , BUF0_L2 j) e8 T' j) f. {) ^* e" |9 }
                                ' A* u4 ~0 T* L6 p" G9 L
                                RET8 _, j( g' P( W* D
//-------------------------------------
! `8 E- @, r( E  C; `6 KConvert_Time:
4 o$ @+ y% @  V: U- L6 X* E2 s                                INC                Time_Sec
' n* P3 {2 X9 J& j! x: s                                MOV                A                        , Time_Sec
" n4 v1 Q: \; o: _                                CJNE        A                         , #060D                , Exit_Convert_Time7 k+ D( ~6 u% w1 m; Z2 r; R% |( H, R4 a
                                MOV                Time_Sec        , #000H
- u1 r: J" d6 [  m+ r' x) F6 f  L                                INC                Time_Min ) z6 ?2 }, X$ ?" L+ m
                                MOV                A                        , Time_Min7 b1 F( b* j5 y9 L, r2 ?
                                CJNE        A                         , #060D                , Exit_Convert_Time
+ e. s6 R* j. L                                MOV                Time_Min        , #000H9 Z0 K3 H% w# P+ Z5 E
                                INC                Time_Hor 5 j2 m9 g' A! v! s- q/ \
                                MOV                A                        , Time_Hor
# [* B% ^) [( ^1 o; Q1 X                                CJNE        A                         , #024D                , Exit_Convert_Time
% a6 ~  F$ S" d, |# _& q& m' w                                MOV                Time_Min        , #000H' l- q" n, b/ Z# q7 n; q
                                INC                Time_Day        //         这个就不判断了,听天由命吧。# K; x# V! R( l" |: m
Exit_Convert_Time:               
% s5 x7 D* U3 C3 T* h                                RET
5 J" Z9 z1 ^2 K8 d- ~& V/*****************************************************************************/
  Q' \+ S- j8 b3 c: D; v// -----------  最后结果,以ASCII格式存在BUF0缓冲区,高位在BUF0_T 低位在BUF0_T8 Y7 l; \/ W3 p
// -----------  字符串不含小数点,所有字节都有效,‘0’不做消隐处理4 g0 t4 x5 `  k8 g2 C
//  Ascii  = BUF0_T,BUF0_H,BUF0_M,BUF0_L( W2 Y3 e. d# ]5 R3 j4 [
RSEG        ?PR?Current_To_Ascii?FUN_ADC5 _: k5 B  E8 H9 B
Current_To_Ascii:$ n4 Z3 q+ J# }3 c! O1 J# b! g- p
                                MOV                BUF0_T                , CurrentH
( u$ S# E4 X' {% @                                MOV                BUF0_H                , CurrentL* ^1 ~: D" f( |
                                LJMP        WORD_To_ASCII8 h) _8 Y# E) f
RSEG        ?PR?Voltage_To_Ascii?FUN_ADC
: g$ U" C; L& [8 W( J+ r. d1 X* rVoltage_To_Ascii:        
) F1 m& o  ?3 }8 }& n; h' m( \                                MOV                BUF0_T                , VoltageH6 u3 v7 d/ C  ^, G
                                MOV                BUF0_H                , VoltageL
, ^8 K) B4 l, ]# r& J                                LJMP        WORD_To_ASCII0 A+ n" W+ U- F! g
RSEG        ?PR?Power_To_Ascii?FUN_ADC+ T- Q& r3 O, S+ ~6 ?
Power_To_Ascii:
7 m- ?" V( Q8 W                                MOV                BUF0_T                , PowerH7 Y: A. Z( w' G7 v1 V3 }! Q: e( X/ v
                                MOV                BUF0_H                , PowerL
- e: _  ^9 D9 N. r  N                                LJMP        WORD_To_ASCII
9 f9 b( b2 @& y0 N# H# v// -----------  被除数在BUF0_T(msb),BUF0_H(lsb) , 除数在 BUF0_L
/ h2 F- J2 u3 ~1 _& W// -----------  因为AD转换后,电流值最大 1999(07CFH) , 电压值最大 9999(270FH)$ v$ f  R$ B* g& ]- x$ y
// -----------  先除一个100 ,得到的商和余数均是单字节值,再做转换可直接使用硬件指令# A  l7 h1 q+ J! V! S1 t0 a
// -----------  先除以100 ,之后是2个单字节除法。+ x' O0 h% L' c8 w( w; U
WORD_To_ASCII:        MOV                BUF0_L                , #100D. U  t9 F: m' w' k: k( Q4 N
                                LCALL        WORD_DIV_BYTE        // 除100后,结果,商在BUF0_H  余数在BUF0_L
( w) p8 t5 L* u: g# Y6 w                                LCALL        WORD_To_BCD8 I4 l7 [8 e0 i6 Z% G' E3 j
                                RET) p; C6 O2 t$ v& u
//-------------------------------------
# q- \7 B) ~: t, A* MRSEG        ?PR?Capacity_To_LCD?FUN_ADC
4 g+ S1 h- k3 Q+ ~8 R. f9 T/*电流采样分度5mA,对应5V功率为25mW,每秒可以累加的能量最小分度25mW秒/3600秒 = 0.007mWh。3 r  X: B9 D# U4 o% p
  实时功率累计值能显示mWh的最小单位应保持小数点后3位。( ^" P  k/ C; T. G0 r5 b
  最大值参考最大功率10V*2A = 20W ,按照2天48小时计算,最大能量960Wh .6 x; ?- V8 X" m: V+ p2 `
  使用4字节进行计数,最大功率20W可以计时59小时。% j2 {% {& ^- @
  0X100000000 / 0X4E20(20W)/3600(秒) = 59.65小时8 u% g: u0 M. k1 r( T! X6 Q
  最后采用格式 XXX.XXXXX Wh 比较稳妥。
7 Z4 x' e) m0 i' w               XXXXXX.XXmWh
9 d* D7 y; O( j: v; W' D4 \*/, p& _4 z+ u7 U" E
Capacity_To_LCD:6 d/ c% n$ Q* q8 R
                                MOV                PCF8820_Y        , #010D6 a  B2 T/ g: D; N
                                
4 \3 m2 j* _  Q; Y% P& A* P7 [                                MOV                BUF0_T                , Capacity_T: u1 ?0 I6 q& V7 X3 e
                                MOV                BUF0_H                , Capacity_H* |0 J! D) N. ?$ {8 g; P
                                MOV                BUF0_M                , Capacity_M- L5 Z( g- C4 ^& c& O
                                MOV                BUF0_L                , Capacity_L
" v# _' O7 m  ^                                MOV                BUF1_L                , #036D   U4 T7 x6 N4 v* m: _6 [. |
                                LCALL        LONG_DIV_BYTE
$ Z- M; E- |% z" _  N                                //  ---------------------
2 k* O  N- W) F. N  N: N                                //----  调整量程,应该除以3600,但是显示单位其实是mWh
  I* }4 s3 c( E2 q                                //----  又因为保留小数点后5位,故除以36
3 ^8 r9 k3 @! A: I* A2 R                                MOV                BUF1_L                , #010D
& g" I; Z( L0 b; h                                LCALL        LONG_DIV_BYTE
' g- i* n2 t6 _! s5 d6 Q                                MOV                A                        , BUF1_L
! s  s8 _& y/ ?0 m, s# Z                                ORL                A                        , #'0'
" R) ?7 J1 ?" ?7 Q                                MOV                PCF8820_char, A8 ?4 |) S$ F7 S- }. \( w
                                MOV                PCF8820_X        , #072D
" [8 \% O# |( p3 }0 g6 L3 l/ Y                                LCALL        PCF8820_Char8X16
; c- t, h' a- B: c- {$ a. D: T                                //  ---------------------
: c7 G9 w( A( q, d                                MOV                BUF1_L                , #010D
6 Z+ S8 v7 p# v# `; Q5 C" X) l' _                                LCALL        LONG_DIV_BYTE
0 D5 c$ p8 U) q  y( q                                MOV                A                        , BUF1_L( ]- E% H4 d1 o( F  g2 G
                                ORL                A                        , #'0'% R3 h% E, c8 L) {2 L
                                MOV                PCF8820_char, A7 Z3 O, m. [, J
                                MOV                PCF8820_X        , #064D3 y* p6 B. U& [  Z* \8 D6 ^
                                LCALL        PCF8820_Char8X16% j9 |9 @- Q1 n" {' n
                                //-------------------------------
3 M6 A2 |2 M' Q                                MOV                BUF1_L                , #010D
( v! r7 s3 k% d5 o6 I# p0 s                                LCALL        LONG_DIV_BYTE
' z+ l* K" O, z' X# M                                MOV                A                        , BUF1_L
0 F6 v# x& I, v5 m, o% m" F                                ORL                A                        , #'0'6 `8 |' k6 ^  ]
                                MOV                PCF8820_char, A# X2 C. n3 ^# z- C- q1 D
                                MOV                PCF8820_X        , #056D* i$ h9 F8 t/ C8 P; E
                                LCALL        PCF8820_Char8X16  Q* P* }. C; B
                                //-------------------------------; Z2 g: H+ [' x
                                MOV                BUF1_L                , #010D
' q0 R( t" c) j2 _4 |- ?                                LCALL        LONG_DIV_BYTE
. t+ p5 q8 q3 i                                MOV                A                        , BUF1_L
9 R8 _* {) N; r; F: G                                ORL                A                        , #'0'5 T) v7 ~/ |. L$ j; V
                                MOV                PCF8820_char, A
. Q: }- }" D5 G0 x6 v8 i( M                                MOV                PCF8820_X        , #048D
  W9 z) r6 t. \, h6 W4 N                                LCALL        PCF8820_Char8X16* u2 [& g# `7 \8 h& a% p
                                //-------------------------------
7 F+ v4 x5 q; R5 J& c                                MOV                BUF1_L                , #010D# r  b- D7 v: {; ^0 T  K6 o% @5 l
                                LCALL        LONG_DIV_BYTE
3 ~* D5 e" y; R! C+ q+ @3 g9 y1 f( ^. X1 @7 U                                MOV                A                        , BUF1_L7 S) `$ t+ o4 B# P: V! K2 m6 }
                                ORL                A                        , #'0'; Z; a* X  k1 N) O- m4 ?
                                MOV                PCF8820_char, A
- R9 P( m% x# G                                MOV                PCF8820_X        , #040D
% q5 ?4 r1 x, f2 d1 L5 l$ N4 U                                LCALL        PCF8820_Char8X16( R$ j9 g5 ^8 I! ~/ g+ R: n1 s6 \
                                //-------------------------------) S' z; F- [) r/ T, p
                                MOV                BUF1_L                , #010D
7 F- \% G9 @. P! t) k                                LCALL        LONG_DIV_BYTE% {/ `  B; k  Z, }+ |
                                MOV                A                        , BUF1_L. M' G# x' T: o" Z  Y5 @) U
                                ORL                A                        , #'0'
5 ~% K8 z" K3 b! G                                MOV                PCF8820_char, A
# k$ [* S# U# x" j8 v$ Y                                MOV                PCF8820_X        , #024D
$ S0 v$ G; u. U3 [# {, s                                LCALL        PCF8820_Char8X163 N& Y; c! g2 F, }3 ?# B
                                //-------------------------------/ a4 y+ @9 P" R* ?) l5 ]
                                MOV                BUF1_L                , #010D" m8 Q: j7 o' ]+ I* |
                                LCALL        LONG_DIV_BYTE1 p' }. `1 i, b0 T( C0 g! E2 E- q
                                MOV                A                        , BUF1_L( x5 Q- ~) g2 d4 W! V8 I
                                ORL                A                        , #'0'
4 Q0 C  R! }' _                                MOV                PCF8820_char, A
6 }5 b0 I% V$ t$ M& ?2 D  u4 Q$ x                                MOV                PCF8820_X        , #016D0 a% _( o) b0 j# R
                                LCALL        PCF8820_Char8X16
1 U7 l/ {: J4 X7 U$ J1 W7 v                                //-------------------------------
/ L; _. D' M  Y9 ]! ~  Z1 G                                MOV                BUF1_L                , #010D! t4 l3 r- \/ N3 I. }9 ?3 m" p3 y
                                LCALL        LONG_DIV_BYTE
! D0 G7 h) C  x! h                                MOV                A                        , BUF1_L2 j( o0 U  Z5 Y2 ^1 A! I
                                ORL                A                        , #'0'
! v" P4 J" g1 W) r                                MOV                PCF8820_char, A
1 D& D  o# g7 |, {  K8 u                                MOV                PCF8820_X        , #008D
6 ^; a. `8 t* b* [7 y9 @2 c4 [                                LCALL        PCF8820_Char8X16                        
% c# j0 g6 T5 T$ ]0 q" gEXIT_Cap_To_Asc:                                
+ |# a2 b& [! f, S  t! Z' P4 Q                                RET
9 c8 y5 m4 a* X9 e1 B% a//-------------------------------------
' X2 j! ~2 O* E4 C: ]- {: DRSEG        ?PR?Time_To_LCD?FUN_ADC
6 d2 c; W& M" U0 ITime_To_LCD:        MOV                PCF8820_Y        , #013D. O: D! B8 n) E1 }/ v; q# O

% B% G" w8 m' O: r. y* A% T. B; t                                MOV                A                        , Time_Day  n% M( f5 g! \2 r/ Y$ t( e; Y8 l
                                MOV                B                        , #010D) \+ F( p1 c2 n& H
                                DIV                AB
- N. a7 j# t# {" m                                ORL                A                        , #'0'* R$ E5 i, m( s5 [
                                MOV                PCF8820_char, A
$ m1 Z1 V: G/ J" c  W) O                                MOV                PCF8820_X        , #008D
  I( A- @" H+ F- @                                LCALL        PCF8820_Char8X16) p$ J. t7 ~; {4 y5 C
                                MOV                A                        , B/ O! q) o6 S2 C% E9 e+ |
                                ORL                A                        , #'0'' v6 |% a2 m1 E, c: P$ O
                                MOV                PCF8820_char, A
, ?/ d7 L7 T0 p7 s3 n: N/ P$ G" r//                                MOV                PCF8820_X        , #016D
) O1 P# e1 k8 E9 z0 N9 x                                LCALL        PCF8820_Char8X16
  o, h0 ^8 f! V                                
* {: l" t5 p# l/ I7 V; n/ R                                MOV                A                        , Time_Hor
" O8 ~$ w* r; @                                MOV                B                        , #010D4 y1 c! O! [  I
                                DIV                AB
0 P" R! B1 x; c5 C                                ORL                A                        , #'0'
% R: d. l: g5 s                                MOV                PCF8820_char, A4 r) g# s7 y! ]) \( B& X6 ~2 h4 K
                                MOV                PCF8820_X        , #032D
9 ]( S) k4 A5 x                                LCALL        PCF8820_Char8X16
6 z& V6 P1 S. G                                MOV                A                        , B( V  w; n( [6 [* @4 _/ b
                                ORL                A                        , #'0'3 t! |! B; R) S$ P- x% N% y
                                MOV                PCF8820_char, A8 H% x$ x: ~2 N/ ?7 b* U: Z
//                                MOV                PCF8820_X        , #016D) J7 g) c+ v0 f* n0 E# T1 k( l# g
                                LCALL        PCF8820_Char8X16
' W# d7 R1 X. f3 i; G/ H& q2 o                                
/ c' s  x* ~, N! w6 E, q                                MOV                A                        , Time_Min
0 N( t" g% q0 c: [& r8 b                                MOV                B                        , #010D% T+ v" I5 m+ T3 \
                                DIV                AB
' E8 \) w9 `. U& A& f7 [/ B& ?, H                                ORL                A                        , #'0'0 Z- o( c) o7 w5 ^2 q/ H) V  F2 b
                                MOV                PCF8820_char, A: {5 F0 f3 t! j9 s. j
                                MOV                PCF8820_X        , #056D
& b7 o3 ]. Q) i3 s. E; G$ ]                                LCALL        PCF8820_Char8X168 k$ }8 R5 i% g" q  z* N- s
                                MOV                A                        , B4 c* i! o8 f. w  k
                                ORL                A                        , #'0'1 C: t; ]% d& O7 n
                                MOV                PCF8820_char, A" l8 O! o8 E2 e' C1 z
//                                MOV                PCF8820_X        , #016D' s2 R' e# g0 D1 R7 g1 W$ N# W
                                LCALL        PCF8820_Char8X16
; x  x$ X8 [9 V  P- i. m                                : s: `8 y& T! C: l1 E5 M
                                MOV                A                        , Time_Sec
4 r" @; C3 P2 L5 v4 W; l                                MOV                B                        , #010D0 a8 J0 E& K/ \0 q3 w- Z
                                DIV                AB/ u; z  f6 J. Q7 e: s7 r
                                ORL                A                        , #'0'
% c; F; }0 [# j                                MOV                PCF8820_char, A! ]3 X8 G( N- C3 M: N
                                MOV                PCF8820_X        , #080D
' m6 w* y* i3 U7 z1 Q                                LCALL        PCF8820_Char8X16( }% z) |- m1 \5 o* L
                                MOV                A                        , B
1 T+ O, g: B; s: V% T0 b                                ORL                A                        , #'0'
6 g- ^3 I! O3 I. X) |; Q, R- v                                MOV                PCF8820_char, A
9 z' O) q: o& R6 p& L  [//                                MOV                PCF8820_X        , #016D
$ q, }4 h, e! c8 d% `                                LCALL        PCF8820_Char8X16" m1 T+ k8 m7 w, ^) p

6 x! n9 b* b1 x, n3 r% _                                RET+ J! h6 p2 K5 I- n1 ]( U9 f6 o$ j
/*****************************************************************************/
* k+ Y' Q" Y  ?8 B4 S" aSUB_CLR_SUM:        CLR                A3 w8 a4 r2 ]0 v& _; q, M/ d5 |: f
                                MOV                SUM_ADC0_H        , A
1 L1 U4 w2 e- p4 ]5 Q                                MOV                SUM_ADC0_M        , A
- N( ^5 P( w- ^% ^                                MOV                SUM_ADC0_L        , A& o& ]* h( l6 J+ l/ h* F2 q8 H
                                MOV                SUM_ADC1_H        , A
( z" W+ E6 b3 ^  ~7 H1 ?                                MOV                SUM_ADC1_M        , A* N! [/ F( B9 m0 R4 w3 s
                                MOV                SUM_ADC1_L        , A, S2 H6 j4 N5 r+ b# V6 W1 {
                                RET                                
: {: i; b9 S" ^& V/*****************************************************************************/
& e1 E, t, B8 {  b8 H                                END8 ~1 h* M: A- `

7 X' C* w; ^& ^2 f" R# ]' |5 H0 q% g* b1 o
C语言参数调用的寄存器分派规则,) {$ z  f$ n0 y( }( B6 q; r
可参照编写汇编的子函数,; l! J+ G$ o7 D
用来被C语言的主函数调用。
+ T! B, h% l) U" J, c
" h5 }7 w, W# T- T2 M3 ^. v& C5 J; //-------------------------------------, a2 f* g) x7 t3 I
?PR?_SUB1?SUB        SEGMENT CODE
* w( ~: T1 N* d" [, y# U- J$ R' T; //-------------------------------------
* ~7 ~3 r4 q/ d. m8 ?( _        PUBLIC        _SUB1' X' i$ U. a1 n* Q
; //-------------------------------------' l: A' b. C2 w- y# E
        RSEG  ?PR?_SUB1?SUB
; L0 Z4 f! Q7 @+ x% @. E_SUB1:
- ]/ M# A- s8 J; S. {* V5 E        USING        0
' p, [3 y! C7 F% P# X        RET          ( e; v9 p0 |% z7 G3 N
; END OF _SUB
4 O8 ]8 e  e8 A  S. ]1 o$ y, T( C
* A( K# ?8 z6 a8 K/ e6 t" V+ |' n8 f; //  ------低地址是高字节   低地址是高字节  低地址是高字节
2 |" ?; y9 O* P/ v2 I* x
- I$ [/ n" R5 R3 i; //-------------------------------------
8 t+ B$ _8 X+ \4 e  J7 i; void SUB(R7)
/ A9 q8 Y$ K; E  S8 ]; void SUB(R7 , R5)7 R9 w3 D( K; E) C7 v2 g( }
; void SUB(R7 , R5 , R3 )
: R+ @/ o+ a1 O% V2 B; //-------------------------------------, A" C$ {& v# {9 G, U
; void SUB(R6/R7)
: a6 E' x* N6 V! x; void SUB(R6/R7 , R4/R5 )1 X/ H1 i7 h# [% j  f2 K" q) C8 I* L6 G6 K
; void SUB(R6/R7 , R4/R5 , R2/R3 )
% t7 w% |! |- `# p* A" J+ C& q; //-------------------------------------
3 |6 b2 }* k5 D  _+ S; |* ~! S) P, D* m; void SUB(unsigned char i , unsigned char * cMATRIX)
2 o' A, P7 f# J! k) h! M9 w;---- Variable 'ptr' assigned to Register 'R1/R2/R3' ----, A  P& v7 f9 F( N8 l+ p1 _( L) B: n
;---- Variable 'i' assigned to Register 'R7' ----
* o) P& R. a- c. T        MOV          R3,#00H
1 K( }, C# _6 U2 O6 v0 C% u        MOV          R2,#HIGH (cMATRIX)3 s. H4 t+ l2 z' y5 \2 s* A! M
        MOV          R1,#LOW  (cMATRIX)) V' v3 a4 l$ ?( l
; //-------------------------------------
+ t' M2 e/ r( y: ?1 e1 M- y5 O% g; unsigned char SUBr2(unsigned char cCHAR1 , unsigned char cCHAR2 )+ b6 m6 X- g/ V! E
        MOV          R7,A
; [) b( w8 I" v, Q1 E7 C        RET         
, W/ G# b& |$ P2 t7 C, d2 X; //-------------------------------------$ X# k' L5 e; w4 _3 S" g$ N
; unsigned int SUBr5(unsigned int iINT1 , unsigned int iINT2 )
4 y/ Z  u. u1 y- Z! B3 ]        MOV          R6,iINT. V( X6 h! ]6 e# C2 J
        MOV          R7,iINT+01H
& [. y( a4 u  s        RET         
8 q2 D- t. S: ~* P! g- d  S3 M; N2 n; q  w- {
发表于 2019-8-2 13:17 | 显示全部楼层
看到老王的链接了,便宜,适合FDIY
1 x6 j& M; n8 s
9 Z7 f5 j" J; d1 ~多谢分享,顶起来
发表于 2019-8-2 13:19 | 显示全部楼层
不错,看了PDF,6个腿都能作为AD输入。内部连VCC和GND都各有一路ADC检测* d/ W' a0 u( f, s2 q6 s/ Z
6路PWM,芯片功能强大啊……2 J/ D1 W1 @5 ^: u" d7 T+ C
要是再多两个腿,就可以通过检测D+D-电压来大致判断充电协议了……
4 e: {% H  N- d" h看烧录的软件……和STC一样,可以串口下载?

点评

是的,串口烧录,和STC的相似。 这个CPU的确是功能强大,价格便宜,特别是12位的AD是个亮点,不管准度如何,精度是够高了,其它很少见12位的AD.  详情 回复 发表于 2019-8-2 14:20
 楼主| 发表于 2019-8-2 14:20 | 显示全部楼层
本帖最后由 pla155 于 2019-8-2 14:21 编辑
& n' G6 r/ p- ]6 t1 u
sdf15937 发表于 2019-8-2 13:19
7 R2 y4 K+ H" \/ [6 ~! J* y# \不错,看了PDF,6个腿都能作为AD输入。内部连VCC和GND都各有一路ADC检测: F( D5 b! ^. r- Y2 Q" j
6路PWM,芯片功能强大啊……/ q" A9 ?) _9 ^* K6 o) B
要 ...
. t) T! x& O  t0 o$ m& V- M, n9 g
是的,串口烧录,和STC的相似。
9 p7 W- K+ `0 d8 o这个CPU的确是功能强大,价格便宜,特别是12位的AD是个亮点,不管准度如何,精度是够高了,其它很少见12位的AD.( K9 n3 F$ L# @! n8 z
9 P; D( _  u# S+ n$ u
不过,圣芯的单片机里,只有这一款是出厂就带ISP烧录的,其他的型号需要自己烧。, v$ N5 e' Y' k) v2 e
发表于 2019-8-2 21:16 | 显示全部楼层
欢迎高手入群,不过那个群里太热闹,消息太多没法看,只能偶尔瞅几眼。$ ]6 z$ c$ J; F
汇编我建议还是能不用就不用,现在的编译器已经很完美了,C的效率和汇编差不了多少。5 X% ?- t3 {% m4 G4 K8 h; B3 ]
这个东西我没买,感觉用不上,而且可扩展性没有多少,主要是觉得单片机IO太少了' E# z( z, ~: f( L; C9 t
发表于 2019-8-3 07:53 | 显示全部楼层
性价比高
发表于 2019-8-3 11:53 | 显示全部楼层
怎么不用INA226,电流电压一起测了,16位adc,36 V、双向、超高精度、低压侧/高压侧,0.1% 增益误差(最大), 10 μV 失调(最大),I2C 接口

点评

价格啊,再怎么说人家也是要赚钱的啊~~~  详情 回复 发表于 2019-8-5 09:25
发表于 2019-8-5 09:25 | 显示全部楼层
HGQ21102 发表于 2019-8-3 11:53# t* \7 z1 R  S# L& ]/ |
怎么不用INA226,电流电压一起测了,16位adc,36 V、双向、超高精度、低压侧/高压侧,0.1% 增益误差(最大) ...

2 x3 K  g* d4 b+ ~  P9 t4 u0 l' g, D    价格啊,再怎么说人家也是要赚钱的啊~~~
2 U- z2 @. j# g0 J
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|一乐电子百科 ( 粤ICP备09076165号-1粤公网安备44522102000183号 )

GMT+8, 2019-8-20 09:16 , Processed in 0.044135 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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