找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13353|回复: 9
打印 上一主题 下一主题
收起左侧

我制作的电动车充电保护器 含单片机源码与电路原理图

  [复制链接]
跳转到指定楼层
楼主
下面是此电瓶车充电保护器作品的外观图:

这是一个电瓶车充电器的附加装置,不对充电器做任何变动,而是将充电器插在该保护器上连成一体代替原充电器进行电瓶车的充电。
功能:1、充电达到设定的电压,自动断电停充,防过充。
      2、满十小时自动停充电,电瓶有故障充不到设定电压,经十小时也停充。
      3、能根据气温设定充电电压档次,能记忆设定的档次,无须每次设定。
      4、用二进制数循环显示电压的十位个位小数位值。
用法:将充电器插在该保护器上连成一体,代替原充电器进行电瓶车的充电。插上220V交流后在15秒内左右慢摇保护器,使内置水银开关接通又断开(按键作用),温度档次依次增加,共分1~8档,对应环境温度是5℃-40℃。水银开关断开15秒后进入充电程序,水银开关不再起作用。
       充足电的断充电指示可从原充电器指示灯看出,不另加指示灯。
读电压:显示过程是--四灯全亮(提示开始)、灭、十位、灭、个位、灭、小数一位、灭,循环不断。用四位二进制数表示0到9,读出数不难,记得四灯分别代表8、4、2、1,将亮灯的数相加就是了。0也显示为灭,可从时间上判别出来。
例:54.9显示为
       ○○○○  开始
  ●○●○  5
       ●○●●  4
       ○●●○  9
为省事没用数码管,自己用的东西,简单实用为好。四个发光管也合用一个限流电阻,单片机复位用的电容电阻也省了,晶振也省了。

工作原理:用手机充电器拆来的电路板为装置提供5V电源。单片机AD转换测电压,每15秒进行一次。测得的电压与设定的终止电压比较,达到了就给继电器模块送一信号,收到信号继电器就断开充电器电源。单片机同时计时,满十时也发出停充电信号,满十天自动重启单片机进行充电管理(暑假长时间人不在家也没问题了)。
    为避免单片机工作电压变动对电压测量的影响,用TL431提供一个基准电压,P1.1对其进行AD转换。电瓶电压1/15分压后用P1.0进行AD转换,然后用下式算出电瓶电压。
         十五分之一电瓶电压:基准电压=电瓶AD值:基准电压的AD值
实测TL431稳压后是2.524伏,程序中采用的具体算法是:
      电瓶电压伏特数=(电瓶AD值×37+电瓶AD值×86÷100)÷基准电压AD值   
被除数是两个8位,除数是一个8位,我是用循环做减法的办法来求商。具体见源码。
      分压电阻的调整,借助万用表反复细心调精密可调电阻,使阻值之比为14:1。
材料:单片机STC12C5204AD  继电器模块,手机充电器,交流插座等。

电路原理图:


接线示意图:


制作过程:


单片机编程源码如下:
  1.                                                                  ;1/15取样,单片机工作电压约5V,能测电压达75V。
  2. ;改成最多充电10小时。十天后重启。
  3. ;使用EEPROM保存温度档。                                                                                                                                                                                                ;2016年7月6日修改:
  4. ;使用汞开关设定温度档,使用EEPROM保存温度档。
  5. ;开机16秒内(大约)按键设定温度档数,若不按键,则默认上次的档数。有1,2,3,4,5,6,7,8共八档。
  6. ;设温度档后接通220V
  7. ;从温度5度起为第1档,10度为第2档,15度为第3档,……35度为第7档,40度为第8 档,0档同第8档。停下不按键约15秒自动进入下一环节。

  8. ;显示电瓶伏特数,按四灯亮、黑、十位、黑、个位、黑、小数位、黑,循环显示。四灯亮和黑是半秒,数字是1秒
  9. ;20H.0设置温度档[WENDU]子程序控制位,初值赋1,在等待按键的子程序[xunhuan]中清0.仅在开机初用一次。
  10. ;20H.2 显示控制位.走时置1,显示后清0,使得半秒进行一次显示。
  11. ;20H.3 秒标志
  12. ;21H.0
  13. ;21H.2 [Tuoliu]程序控制位,使程序只运行一次。
  14. ;21H.3
  15. ;21H.4是电瓶正常标志,初值赋1(正常),检测到电瓶充满或不正常将其清0,清0后要重启才能置1.
  16. ;21H.6充电10小时标志,初值为1,充电达10小时将其清0.清0后要重启才能置1.
  17. ;22H.0 走时用的20ms标志,在中断置1,走时中清0。
  18. ;22H.3 时标志
  19. ;22H.5 每15秒运行一次的标志位,走时置1.
  20. ;22H.7
  21. ;用检测到的电压AD值与设定的终止电压AD值进行比较,确定电瓶满或不正常(电压太低或无电瓶)关断220V供电。
  22. ;开机接通220V,电瓶充满(或不正常)关断,充电10小时关断,十天后单片机重启。

  23. ;P1.0--A/D转换
  24. ;P1.1--A/D转换测TL431电压
  25. ;P1.2--键,每按一次温度档数加1,在0--8之中循环,停下不按键约15秒自动进入下一环节。
  26. ;P1.7,P1.6,P1.5,P1.4接LED做温度档显示,点亮分别表示8,4,2,1,二进制数。
  27. ;P3.2--通过光耦控制220V通断 0-通  1-断
  28. ;***************

  29. ;***
  30. U_zhongzhixiao  EQU 5EH  ;终止电压小数寄存器
  31. U_zhongzhizheng EQU 5FH  ;终止电压整数寄存器
  32. JSHQ_WEI EQU 65H        ;显示第几位计数器
  33. XUN_JSHQ EQU 67H        ;循环次数
  34. wendudang  EQU  68H     ;温度档数
  35. v_ZH   EQU 5DH         ;电瓶伏特整数寄存器
  36. V_XAO  EQU 5CH         ;电瓶伏特小数寄存器
  37. TL431_AD   EQU  5BH     ;TL431的AD值
  38. TL431_AD1  EQU  5AH     ;TL431的AD值(第一次)
  39. jiace_adzhi1 EQU 58H    ;第一次检测到的AD值
  40. ;xiu_adzhi  EQU  6CH     ;(修)终止电压AD值
  41. Jiace_ADzhi EQU 59H     ;检测AD值  检测到的AD值
  42. JSHQ_15   EQU  6EH      ;15秒计数器
  43. JSHQ_20mS  EQU  70H     ;20mS计数器  计20mS的个数
  44. JSHQ_S     EQU  71H     ;半秒计数器
  45. JSHQ_M     EQU  72H     ;分计数器
  46. JSHQ_H     EQU  73H     ;时计数器
  47. ;60H,61H,62H,63H,64H 用在显缓中
  48. beichushugao  equ  75h     ;被除数高位
  49. beichushudi  EQU  76H    ;被除数低位
  50. chushu     EQU  77H     ;除数
  51. zhengshang  EQU 78H     ;整数商
  52. XIAOSHUSHANG  EQU 79H    ;小数商
  53. YUSHU      EQU  7AH     ;余数
  54. LSSHU     EQU  7BH     ;临时存
  55. DISHU  EQU 7CH         ;低数 第二次的被除数的低位
  56. GAOSHU  EQU 7DH        ;高数 第二次的被除数的高位

  57. ADC_CONTR EQU 0BCH     ;ADC控制寄存器
  58. ADC_RES   EQU 0BDH     ;A/D转换结果寄存器
  59. P1ASF  EQU 09DH       ;p1口模拟功能控制寄存器
  60. WDT_CONTR EQU 0C1H    ;看门狗
  61. ;AUXR DATA 8EH         ;选择1T与12T的寄存器

  62. IAP_CONTR EQU 0C7H      ;下载/复位控制器

  63. jian  EQU  p1.2         ;鍵
  64. kong  EQU  p3.2         ;控 220V   0-通  1-断
  65. p1m1  equ  91h
  66. p1m0  equ  92h
  67. ;EEPROM有关的寄存器
  68. dat       equ     0C2H               
  69. drh       equ     0C3H               
  70. drl       equ     0C4H                  
  71. cmd       equ     0C5H               
  72. trig      equ     0C6H               
  73. contr     equ     0C7H
  74. ;****************

  75.         ORG   0000H
  76.         AJMP  START
  77.         ORG          000BH
  78.         LJMP  TIME_0
  79. ;        ORG   001BH

  80.         ORG   0030H
  81. START:
  82. ;其它初始化写在此     
  83.    MOV P1M1,#00000011B
  84.    MOV P1M0,#00000000B    ;P1.0 P1.1两个高阻输入做AD     
  85.    MOV P1,#00001111B
  86.     setb kong          ;断220V交流 设温度档后接通

  87.         MOV 22H,#00100000B    ;检测标志 1-检 0-不检 每15秒检测AD一次和处理显缓一次的标志位,走时置1,处理显缓后清0
  88.         MOV 21H,#01010000B   ;21h.4 电瓶 1-能充  0-不能充电(含无、充满)  
  89.                                ;21H.6  初值1,充电10小时清0 。

  90. ;*用计数器0  初步设置定时中断    20MS中断  20毫秒@10.911MHz
  91.     MOV SP,#80H                     ;设置堆栈区域
  92. ;           ANL AUXR,#7FH                ;定时器时钟12T模式  默认是12T模式 省略本句
  93.         MOV        TMOD,#00010001B         ;定时器0定时器1都是 16位
  94.         MOV        TL0,#0F7H
  95.         MOV        TH0,#0B8H               

  96.         SETB EA
  97.         SETB        ET0
  98.         SETB        TR0              ;开放中断
  99.         
  100.         setb 20h.0          ;控制设置温度档程序的循环用
  101. ;*****************
  102. ;设置温度档   从EEPROM中读出保存值,一段时间内不按键,则使用该档值;如按键则改之,停下不动,过会儿保存并启用。
  103.      LCALL  DOUEEPROM    ;读EEPROM中的保存值
  104. WENDU:
  105.      jnb 20H.0,WENDUret       ;0-跳

  106.      LCALL  doujian       ;读键和健值处理
  107.      LCALL  XIANSHI       ;显示
  108.      LCALL  xunhuan       ;循环 次数
  109.      AJMP WENDU
  110. WENDUret:
  111.      LCALL clear_write     ;先擦除EEPROM再写EEPROM保存温度档,然后关闭EEPROM
  112.      nop
  113. ;********************
  114. ;设AD档  据wendudang中数字,设定终止电压
  115. ADdang:
  116.      MOV A,wendudang
  117.      cjne a,#1,ADdang1
  118.      MOV U_zhongzhizheng,57
  119.      mov U_zhongzhixiao,1      ;对应是57.11V   5度以下
  120.         JMP ADdangRET     
  121. ADdang1:
  122.      cjne a,#2,ADdang2
  123.      MOV U_zhongzhizheng,56
  124.      mov U_zhongzhixiao,6        ;对应是56.64V   10度以下
  125.         JMP ADdangRET
  126. ADdang2:
  127.      cjne a,#3,ADdang3
  128.      MOV U_zhongzhizheng,56
  129.      mov U_zhongzhixiao,1        ;对应是56.16V   15度以下
  130.         JMP ADdangRET        
  131. ADdang3:
  132.      cjne a,#4,ADdang4
  133.      MOV U_zhongzhizheng,55
  134.      mov U_zhongzhixiao,6        ;对应是55.68V   20度以下
  135.         JMP ADdangRET        
  136. ADdang4:
  137.      cjne a,#5,ADdang5
  138.      MOV U_zhongzhizheng,55
  139.      mov U_zhongzhixiao,2        ;对应是55.20V   25度以下
  140.         JMP ADdangRET        
  141. ADdang5:
  142.      cjne a,#6,ADdang6
  143.      MOV U_zhongzhizheng,54
  144.      mov U_zhongzhixiao,7         ;对应是54.72V   30度以下
  145.         JMP ADdangRET
  146. ADdang6:
  147.      cjne a,#7,ADdang7
  148.      MOV U_zhongzhizheng,54
  149.      mov U_zhongzhixiao,2         ;对应是54.24V   35度以下
  150.         JMP ADdangRET
  151. ADdang7:
  152.      cjne a,#8,ADdang8
  153.      MOV U_zhongzhizheng,53
  154.      mov U_zhongzhixiao,7          ;对应是53.76V   40度以下
  155.         JMP ADdangRET
  156. ADdang8:             ;剩下的就是 a=0了    同a=8 档           
  157.      MOV U_zhongzhizheng,53
  158.      mov U_zhongzhixiao,7          ;对应是53.76V   40度以下

  159. ADdangRET:
  160.      clr kong     ;接通220V
  161.         nop
  162.         NOP
  163.     ;进入主程序之前不能有RET,否则运行到此止。
  164. ;*****************
  165. ;主程序
  166. ZhuPRO:
  167.      LCALL PRO_ZOUSHI         ;走时   统计20mS的个数,计时,设立半秒标志、分标志、时标志 检测标志
  168.      LCALL  KAIJISHISHU   ;开机时数   开机10小时停充电,开机240小时重新启动单片机。
  169. jnb 22h.5,zhu_a
  170.         clr 22h.5             ;每15秒一次的标志位,走时置1,在此清0
  171.      lcall  jiaceTL431       ;检测TL431做基准电压的AD值
  172.       LCALL  jiacesheding   ;检测(电瓶)设定      测出电瓶AD
  173.      LCALL  JISUAN         ;计算 电瓶电压伏特数=(电瓶AD值×37+电瓶AD值×0.5)÷基准电压AD值 求出伏特整数和小数
  174.      LCALL  probijiao    ;比较     电瓶电压与基准电压做比较 标记是否充满电
  175.      lcall XIANhuan           ;显缓 存放好要显示的十位、个位、小数位
  176. zhu_a:
  177.      LCALL  xiu_V      ;显示电瓶电压
  178.      
  179.      lcall  PROKongZhi     ;控制      充满断电 十小时断电
  180.      mov WDT_CONTR,#00111110B      ;喂狗
  181.      jmp  ZhuPRO

  182. ;*************************** WENDU 温度 设温度档 *********************************
  183. ;DOUEEPROM    ;读EEPROM中0000H处的保存值
  184. DOUEEPROM:
  185.                     mov     contr,#84h ;设定操作时间
  186.                     mov     cmd,#01h   ;设定读操作
  187.                     mov     drl,#00h     ;设定存储单元地址低四位
  188.                     mov     drh,#00h    ;设定存储单元地址高四位 这里设0000h,也可选用其他单元
  189.                     mov     trig,#5Ah  ;准备触发
  190.                     mov     trig,#0A5h  ;触发
  191.                     nop
  192.                     mov     wendudang,dat         ;读数据写到RAM指定处
  193. ;                    mov     wendudang,A        ;读数据写到RAM指定处

  194. DOUEEPROMret:
  195.         ret
  196. ;*************
  197. ;doujian       ;读键
  198. doujian:
  199.          setb jian
  200.          nop
  201.          nop
  202.          lcall DELAY         
  203.          JB jian,doujianret          ;未按下(p1.2),  1-跳
  204.          lcall DELAY                ;延时
  205.          JB jian,doujianret
  206.          inc wendudang               ;温度档加1
  207.          mov XUN_JSHQ,#0            ;循环计数清0
  208.          mov a,#9
  209.          cjne a,wendudang,doujian_1  ; 分0,1,2,3,4,5,6,7,8九档,最高8档
  210.          mov wendudang,#0

  211. doujian_1:
  212.          nop
  213.          jb jian,doujian_1       ;1-跳 等待释放键
  214.          lcall DELAY
  215.          lcall DELAY
  216. doujianret:
  217.    ret

  218. ;****************
  219. ;XIANSHI    ;显示
  220. XIANSHI:
  221.         mov a,wendudang
  222.         cpl a          ;取反
  223.         swap a         ;高低四位交换
  224.         ANL A,#11110000B   ;获高四位
  225.         mov R0,a

  226.         mov a,p1
  227.         anl a,#00001111B   ;获低四位
  228.         orl a,R0           ;整合高低八位
  229.         mov p1,a           ;驱动LED
  230. XIANSHIret:
  231.     ret
  232. ;****************   
  233. ;xunhuan       ;循环 次数
  234. xunhuan:
  235.       lcall DELAY      ;延时
  236.       INC XUN_JSHQ     ;循环计数加1
  237.       mov a,XUN_JSHQ
  238.       cjne a,#200,xunhuanret
  239.       mov XUN_JSHQ,#0
  240.       clr 20h.0         ;停止按键后循环200次约??秒,结束设温度档程序

  241. xunhuanret:
  242.      RET
  243. ;******************
  244. ;延时 0.04秒
  245.     DELAY:
  246.             MOV     R7,#250
  247.     D1:     MOV     R6,#250
  248.                     DJNZ    R6,$
  249.                     DJNZ    R7,D1
  250.             RET
  251. ;*****************
  252. ;先擦除再写入,然后关闭
  253. clear_write:
  254.               mov    contr,#84h  ;设定操作时间
  255.               mov    cmd,#03h    ;设定擦除操作
  256.               mov    drl,#00h    ;设定存储单元地址低四位
  257.               mov    drh,#00h    ;设定存储单元地址高四位 这里设0000h

  258.               mov    trig,#5AH   ;准备触发      
  259.               mov    trig,#0A5h   ;触发
  260.               nop
  261.               nop
  262. ;---------写-------------------
  263. write:
  264.                    mov     contr,#84h   ;设定操作时间
  265.                    mov     cmd,#02h     ;设定写操作
  266.                    mov     drl,#00h     ;设定存储单元地址低四位
  267.                    mov     drh,#00h     ;设定存储单元地址高四位 这里设0000h
  268. ;      MOV A,wendudang
  269.                    mov     dat,wendudang         ;wendudang中为准备写入的数据
  270.                    mov     trig,#5AH    ;准备触发
  271.                    mov     trig,#0A5H   ;触发
  272.                    nop
  273.                    nop
  274. ;=========关闭EEPROM====================
  275. off:  
  276.           mov     contr,#0     ;禁止操作
  277.           mov     cmd,#0   ;去除操作命令
  278.           mov     trig,#0   ;防止命令误触发
  279.           mov    drl,#0         ;指向非EEPROM区
  280.           mov    drh,#80H        ;指向非EEPROM区
  281.            ret
  282.    
  283. ;*********************************** 充电有关的计时 ******************************



  284. ;****************
  285. ;走时   统计20mS的个数,计时,设立半秒标志、分标志、时标志
  286. PRO_ZOUSHI:
  287.      JNB 22H.0,PROARET     ;20mS标志位
  288.      INC JSHQ_20MS
  289.      CLR 22H.0   
  290.      mov A,#25             ;25个20mS为半秒
  291.      CJNE A,JSHQ_20mS,PROARET
  292.      MOV JSHQ_20mS,#0
  293.      inc jshq_S
  294.      setb 20h.2         ;控制显示的半秒标志
  295. PROA_1:
  296.   MOV A,#30
  297.   CJNE A,JSHQ_S,PROARET
  298.        MOV JSHQ_S,#0
  299.   SETB 22H.5   ;15秒检测一次
  300.   INC JSHQ_15
  301.   MOV A,#4
  302.   CJNE A,JSHQ_15,PROARET
  303.      MOV JSHQ_15,#0
  304.      INC JSHQ_M
  305.      MOV A,#60             ;60分为1小时
  306.      CJNE A,JSHQ_M,PROARET
  307.      MOV JSHQ_M,#0
  308.      setb 22h.3       ;时标志

  309. PROARET:
  310.      RET

  311. ;********************
  312. ;开机时数   开机10小时停充电,开机240小时重新启动单片机。
  313. KAIJISHISHU:
  314.     JNB 22H.3,KAIJISHISHURET
  315.     clr 22h.3
  316.     INC JSHQ_H
  317.     MOV A,#10         ;最多充电10小时
  318.     CJNE A,JSHQ_H,KAIJISHISHU_1
  319.     CLR 21H.6        ;初值1,充电10小时清0。
  320.     setb kong          ;断220V交流
  321.     JMP KAIJISHISHURET
  322. KAIJISHISHU_1:
  323.     mov a,#240         ;十天重启
  324.     cjne a,jshq_h,KAIJISHISHURET
  325.     MOV IAP_CONTR,#00100000B  ;热重启
  326. KAIJISHISHURET:
  327.      RET
  328. ;*******************
  329. ;检测设定    每15秒进行一次     两次测电压相同 确定占空比  温度检测没使用
  330. jiacesheding:
  331. ;          MOV P1,#11111111B           ;关显示 再延时 防止电压波动对AD转换的影响
  332. ;          LCALL DELAY                 ;延时0.4秒
  333. dianya:
  334.       lcall PRO_ad   ;AD转换测电瓶电压
  335.       MOV jiace_adzhi1,jiace_adzhi
  336.       mov jiace_adzhi,#0
  337.       lcall PRO_ad  ;AD转换测电瓶电压  
  338. BiJiao:                 ;比较两次测电压结果 同-进入下一步 不同-重测
  339.       mov a,jiace_adzhi1
  340.       cjne a,jiace_adzhi,dianya
  341.       
  342. jiaceshedingret:
  343.      ret

  344. ;********************
  345. ;AD转换测电瓶电压
  346. PRO_ad:
  347.       MOV P1ASF,#0000001B   ;P1.0做AD检测
  348.      MOV ADC_RES,#0                ;转换结果寄存器清零
  349.      MOV ADC_CONTR,#11100000B  
  350.      nop
  351.      nop
  352.      nop
  353.      nop
  354.      mov a,#11101000b
  355.      MOV ADC_CONTR,A            ;开始A/D转换
  356.       NOP                        ;在质询之前一定等候
  357.       NOP
  358.       NOP
  359.       NOP
  360. WAIT:      
  361.     MOV        A,ADC_CONTR        ;等候完成的标志
  362.     JNB        ACC.4,WAIT        ;转换完成标志位 不是1就转           
  363.     MOV        ADC_CONTR,#01100000B                ;关转换 清标志位  
  364.    
  365.     MOV jiace_adzhi,ADC_RES       ;读出AD值保存

  366. PRO_adRET:
  367.       RET

  368. ;********************
  369. jiaceTL431:
  370. ;          MOV P1,#11111111B           ;关显示 再延时 防止电压波动对AD转换的影响
  371. ;          LCALL DELAY                 ;延时0.4秒
  372. dianyaTL:
  373.       lcall prTL431_ad   ;AD转换测TL431的AD
  374.       MOV TL431_AD1,TL431_AD
  375.       mov TL431_AD,#0
  376.       lcall prTL431_ad  ;AD转换测TL431的AD
  377. BiJiaoTL:                 ;比较两次测电压结果 同-进入下一步 不同-重测
  378.       mov a,TL431_AD1
  379.       cjne a,TL431_AD,dianyaTL

  380. jiaceTL431ret:
  381.      ret
  382. ;******************
  383. ;AD转换测TL431
  384. prTL431_ad:
  385.       MOV P1ASF,#0000010B   ;P1.1做AD检测
  386.      MOV ADC_RES,#0                ;转换结果寄存器清零
  387.      MOV ADC_CONTR,#11100001B  
  388.      nop
  389.      nop
  390.      nop
  391.      nop
  392.      mov a,#11101001b
  393.      MOV ADC_CONTR,A            ;开始A/D转换
  394.       NOP                        ;在质询之前一定等候
  395.       NOP
  396.       NOP
  397.       NOP
  398. TL431WAIT:      
  399.     MOV        A,ADC_CONTR        ;等候完成的标志
  400.     JNB        ACC.4,TL431WAIT        ;转换完成标志位 不是1就转           
  401.     MOV        ADC_CONTR,#11100001B                ;关转换 清标志位  
  402.    
  403.     MOV TL431_AD,ADC_RES       ;读出AD值保存

  404. TL431_adRET:
  405.       RET

  406. ;*******************
  407. ;比较 ;通过电瓶电压整数与终止电压整数比较,电瓶电压小数与终止电压小数比较,确定并标记电瓶有无充满.
  408. probijiao:
  409.       clr c
  410.       mov a,v_ZH   ;电瓶电压整数
  411.       CJNE A,U_zhongzhizheng,bijiao_1     ;电瓶电压整数与终止电压整数比较
  412.       MOV A,V_XAO
  413.       CJNE A,U_zhongzhixiao,bijiao_1     ;电瓶电压小数与终止电压小数比较
  414.       
  415. bijiao_0:      
  416.        clr 21h.4     ;电瓶正常标志位  1--正常  0--充满(或不能充电)   
  417.        JMP bijiao_ret
  418. bijiao_1:
  419.       JC bijiao_0  ;超过终止电压 C=1
  420.       
  421. bijiao_ret:
  422.       ret      
  423.       
  424. ;******************
  425. ; ;控制充断电
  426. PROKongZhi:
  427.       jb 21h.4,pro_a     ;电瓶正常标志 1-正常 0-不正常 无电瓶 或充满
  428.       setb kong      ;通过光耦控制220V通断 0-通  1-断
  429. pro_a:
  430.       JB 21H.6,PROKongZhiRET                     
  431.       setb kong      ;通过光耦控制220V通断 0-通  1-断      
  432. PROKongZhiRET:
  433.       RET
  434. ;****************
  435. ;显缓
  436. XIANhuan:
  437.        MOV A,v_ZH    ;电瓶伏特整数
  438.        MOV B,#10
  439.        DIV AB
  440.        MOV 61H,B            ;个位
  441.        MOV 60H,A            ;十位
  442.        MOV 62H,V_XAO        ;小数
  443.       
  444.        MOV 63H,#0          ;黑屏的数字
  445.        mov 64h,#00001111B   ;四灯全亮

  446. XIANhuan_ret:
  447.        ret

  448. ;***************  
  449. ; xiu_V 显伏特数 十、个位、小数位分别显示,每位显示2秒,黑屏1秒,三位显示完黑屏3秒。
  450. xiu_V:
  451.        JNB 20H.2,XianZ   ;每秒运行一次
  452.        CLR 20H.2

  453.       INC JSHQ_WEI
  454.        MOV A,#11
  455.        CJNE A,JSHQ_WEI,xiu_V_1
  456.        MOV JSHQ_WEI,#0      
  457.         mov R1,60H           ;显十位
  458.         LCALL PROXIAN
  459.       JMP xiu_VRET
  460. xiu_V_1:  
  461.         MOV A,#1            ;显示十位
  462.        CJNE A,JSHQ_WEI,xiu_V_2
  463.        nop                  ;保持原显示就行了
  464.         ;mov R1,60H
  465.         ;LCALL PROXIAN
  466. XianZ:  jmp  xiu_VRET           ;中间跳板
  467. xiu_V_2:  
  468.         MOV A,#2     ;黑屏
  469.        CJNE A,JSHQ_WEI,xiu_V_3      
  470.         mov R1,63H
  471.         LCALL PROXIAN
  472.       JMP xiu_VRET        
  473. xiu_V_3:  
  474.         MOV A,#3     ;显示个位
  475.        CJNE A,JSHQ_WEI,xiu_V_4     
  476.         mov R1,61H
  477.         LCALL PROXIAN
  478.       JMP xiu_VRET        
  479. xiu_V_4:  
  480.         MOV A,#4     ;显示个位
  481.        CJNE A,JSHQ_WEI,xiu_V_5     
  482.         nop                  ;保持原显示就行了
  483.         ;mov R1,61H
  484.         ;LCALL PROXIAN
  485.       JMP xiu_VRET        
  486. xiu_V_5:  
  487.         MOV A,#5     ;黑屏
  488.        CJNE A,JSHQ_WEI,xiu_V_6      
  489.         mov R1,63H
  490.         LCALL PROXIAN
  491.       JMP xiu_VRET        
  492. xiu_V_6:  
  493.         MOV A,#6    ;显示小数位
  494.        CJNE A,JSHQ_WEI,xiu_V_7     
  495.         mov R1,62H
  496.         LCALL PROXIAN
  497.       JMP xiu_VRET        
  498. xiu_V_7:  
  499.         MOV A,#7     ;显示小数位
  500.        CJNE A,JSHQ_WEI,xiu_V_8     
  501.         nop                  ;保持原显示就行了
  502.         ;mov R1,62H
  503.         ;LCALL PROXIAN
  504.       JMP xiu_VRET        
  505. xiu_V_8:  
  506.         MOV A,#8     ;黑屏
  507.        CJNE A,JSHQ_WEI,xiu_V_9      
  508.         mov R1,63H
  509.         LCALL PROXIAN
  510.       JMP xiu_VRET        
  511. xiu_V_9:  
  512.         MOV A,#9     ;四灯全亮
  513.        CJNE A,JSHQ_WEI,xiu_V_10     
  514.         mov R1,64H
  515.         LCALL PROXIAN
  516.        JMP xiu_VRET      
  517. xiu_V_10:
  518.        nop                   ;保持原显示就行了
  519.         ;mov R1,63H     ;黑屏
  520.         ;LCALL PROXIAN

  521. xiu_VRET:
  522.        RET
  523. ;***************

  524. ;显示     
  525. PROXIAN:
  526.         MOV A,R1
  527.         cpl a          ;取反
  528.         swap a         ;高低四位交换
  529.         ANL A,#11110000B   ;获高四位
  530.         mov R0,a

  531.         mov a,p1
  532.         anl a,#00001111B   ;获低四位
  533.         orl a,R0           ;整合高低八位
  534.         mov p1,a           ;驱动LED     
  535.         RET
  536. ;*******************************
  537. ;计算 jì suàn   电瓶电压伏特数=(电瓶AD值×37+电瓶AD值×0.86)÷基准电压AD值   TL431稳压后是2.524伏
  538. ;求出伏特整数和一位小数
  539. JISUAN:
  540.       MOV v_ZH,#0        ;存伏特整数 先清0
  541.       mov V_XAO,#0       ;伏特小数 先清0   
  542.       mov r2,#0
  543.       mov r3,#0
  544. ;电瓶AD值×37      
  545.       MOV A,Jiace_ADzhi  ;电瓶AD值
  546.       MOV B,#37
  547.       MUL AB
  548.       MOV R2,A          ;37倍的积的低8位 存R2
  549.       MOV R3,B          ;37倍的积的高8位 存R3
  550. ;电瓶AD值×86     
  551.       MOV A,Jiace_ADzhi
  552.       mov b,#86        ;
  553.       MUL AB           ;86倍的积高位在B低位在A 高位在B
  554. ;除以100
  555.       MOV beichushugao,B     ;被除数高位
  556.       MOV beichushudi,A      ;被除数低位
  557.       MOV chushu,#100        ;除数
  558.       mov zhengshang,#0      ;整数商
  559.       mov XIAOSHUSHANG,#0    ;小数商
  560.       mov YUSHU,#0           ;余数
  561.       
  562.   LCALL PROCHU
  563.       ;电瓶AD值×0.86的整数部分已经在zhengshang
  564. ;电瓶AD值×37与电瓶AD值×0.86两积之和
  565.       mov a,zhengshang
  566.       ADD A,R2                 
  567.       MOV R2,A
  568.       JNC  JISUAN_1     ;0-跳
  569.       INC R3
  570.       clr c            ;以上完成了(电瓶AD值×37+电瓶AD值×0.86)  值的高位在R3,低位在R2
  571. JISUAN_1:            
  572. ;下面用减法代除法做[÷基准电压AD值]部分
  573.       MOV beichushugao,R3     ;被除数高位
  574.       MOV beichushudi,R2     ;被除数低位
  575.       MOV chushu,TL431_AD        ;除数
  576.       mov zhengshang,#0
  577.       mov XIAOSHUSHANG,#0
  578.       mov YUSHU,#0      
  579.       
  580. LCALL PROCHU
  581.       MOV v_ZH,zhengshang     ;伏特整数
  582.       MOV V_XAO,XIAOSHUSHANG  ;伏特小数  
  583. RET
  584. ;*********************
  585. ;除法 被除数有高8位低8位,除数只有8位,商有8位整数1位小数
  586. ;beichushugao     ;被除数高位
  587. ;beichushudi      ;被除数低位
  588. ;chushu        ;除数
  589. ;zhengshang  EQU 78H     ;整数商
  590. ;XIAOSHUSHANG  EQU 79H    ;小数商
  591. ;YUSHU      EQU  7AH     ;余数
  592. ;LSSHU     EQU  7BH     ;临时存
  593. ; DISHU   低位 第二次的被除数低位
  594. ;GAOSHU   高位 第二次的被除数高位
  595. PROCHU:
  596.       MOV A,#0
  597.       CJNE A,beichushugao,PROCHU_0   ;高位不是0 跳
  598.       MOV A,beichushudi
  599.       jmp PROCHU_A        ;跳到高位是0,求低位的商
  600. PROCHU_0:              ;求高位不是0部分的商
  601.       MOV A,beichushudi
  602. PROCHU_01:      
  603.       SUBB A,chushu
  604.       INC zhengshang
  605.       JNC PROCHU_01      
  606.       DJNZ beichushugao,PROCHU_01
  607. PROCHU_A:            ;高位是0,求低位的商
  608.     ;  MOV  LSSHU,A    ;备份
  609.       SUBB A,chushu
  610.       INC zhengshang
  611.       JNC PROCHU_A     ;c=0 循环再减
  612.       CLR C            ;有借位,表示多减了一次
  613.    ;   DEC zhengshang   ;恢复
  614.    ;   MOV A,LSSHU      ;恢复
  615.      ;*************求小数**********
  616.       MOV B,#10        ;求小数,先将被除数乘10
  617.       MUL AB
  618.       MOV GAOSHU,B       ;高位
  619.       MOV DISHU,A      ;低位
  620. PROCHU_B:
  621.       MOV A,#0
  622.       CJNE A,GAOSHU,PROCHU_B0
  623.       MOV A,DISHU
  624.       JMP PROCHU_C   ;跳到高位是0 求低位商
  625. PROCHU_B0:
  626.       MOV A,DISHU
  627. PROCHU_B01:
  628.       SUBB A,chushu
  629.       INC XIAOSHUSHANG
  630.       JNC PROCHU_B01      
  631.       DJNZ GAOSHU,PROCHU_B01
  632. PROCHU_C:    ;高位是0 求低位商           
  633.       MOV  LSSHU,A
  634.       SUBB A,chushu
  635.       INC XIAOSHUSHANG
  636.       JNC PROCHU_C     ;c=0 循环再减
  637.       CLR C            ;有借位,表示多减了一次
  638. ;      DEC XIAOSHUSHANG   ;恢复   实测显示数据偏小所以删此句
  639.       MOV A,LSSHU      ;恢复
  640.       MOV YUSHU,A    ;余数
  641. ret
  642. ;****************      
  643.       
  644. ;**********************************************************************
  645. TIME_0:   ;20毫秒@10.911MHz
  646.         PUSH        ACC
  647.         PUSH        PSW
  648.         MOV        TL0,#0F7H        
  649.         MOV        TH0,#0B8H
  650.         SETB 22H.0          ;20mS标志  专供走时用
  651.         POP        PSW
  652.         POP        ACC
  653.         RETI
  654. ;************************
  655. pppuuu:
  656. nop
  657. nop
  658. nop
  659. nop
  660. nop
  661. nop
  662. nop
  663. nop
  664.   nop
  665. nop
  666. nop
  667. nop
  668.   nop
  669. nop
  670. nop
  671. nop
  672.   nop
  673. nop
  674. nop
  675. nop
  676.   nop
  677. nop
  678. nop
  679. nop
  680.   nop
  681. nop
  682. nop
  683. nop
  684.   nop
  685. nop
  686. nop
  687. nop
  688.   nop
  689. nop
  690. nop
  691. nop
  692.   nop
  693. nop
  694. nop
  695. nop
  696.   nop
  697. nop
  698. nop
  699. nop
  700.   nop
  701. nop
  702. nop
  703. nop
  704.   nop
  705. nop
  706. nop
  707. nop
  708. lcall START
  709. nop
  710. nop
  711. nop

  712. ……………………

  713. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
源码和hex.rar (8.02 KB, 下载次数: 40)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:286600 发表于 2018-3-3 10:34 | 只看该作者
若配个脉冲电源对电瓶充电,这是个很好的配件。普通充电器用的是开关电源无脉冲。老式变压器整流不滤波是脉冲,但要注意变压器输出电压不要太高了,据我的经验48V电瓶不要超过46伏,45V比较合适,46×1.41已经超过普通充电器转灯前的电压了。(有的说法是变压器次级输出电压要比电瓶标称值高1到2V,我不认可。)
      普通充电器转灯后电压是55.6V左右,冬天不用此保护也可。夏天环境温度高,电瓶充到55.6V就过充了。此保护器第8档,充到53.7V就停充电,可有效地进行保护。
     铅电瓶有负温度系数,冬天充电终止电压高些,夏天低些。
回复

使用道具 举报

板凳
ID:265635 发表于 2018-3-3 15:12 | 只看该作者
全汇编,赞一下!
回复

使用道具 举报

地板
ID:286600 发表于 2018-3-8 10:39 | 只看该作者
少有人关注本贴。
1、看来群里人真富,都开汽车没人骑电动车了。
2、用汇编的人也越来越少了。
回复

使用道具 举报

5#
ID:162136 发表于 2018-3-21 16:04 | 只看该作者
看到全是汇编,我赞一个。
回复

使用道具 举报

6#
ID:295097 发表于 2018-3-21 16:26 | 只看该作者
什么时候才能变成你这么厉害

回复

使用道具 举报

7#
ID:91721 发表于 2019-6-25 11:57 | 只看该作者
全汇编,赞一下!
回复

使用道具 举报

8#
ID:165363 发表于 2019-6-26 09:43 | 只看该作者
汇编的啊,有点难看懂。
回复

使用道具 举报

9#
ID:159857 发表于 2020-5-14 21:49 | 只看该作者

全汇编,赞一下!楼主厉害!
回复

使用道具 举报

10#
ID:733231 发表于 2020-5-18 19:53 | 只看该作者


全汇编,赞一下!楼主厉害!向你学习~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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