找回密码
 立即注册

QQ登录

只需一步,快速开始

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

果汁机的单片机源程序与PCB设计资料

[复制链接]
跳转到指定楼层
楼主
水果机硬件与软件,共享
Altium Designer画的果汁机电路原理图和PCB图如下:(51hei附件中可下载工程文件)


芯海单片机源程序如下:
  1. ;********************************************************************************************
  2. ;#######################################################################################
  3. ;【文件名】     LT-Y47.asm:主体程序文件 *** 18.01.09 ***
  4. ;#######################################################################################
  5. ;codeoption:FB01        checksum:B26E
  6. ;#######################################################################################
  7. ;---------- all rights reserved , Chipsea technology 2018 -------------
  8. ;======================================================================
  9. ; 【说明】:
  10. ;****************************************************
  11. ; prj desp.        : 幻想果汁机
  12. ; target chip        : CSU8RP3215
  13. ; crystal        : 16MHZ
  14. ; author        : dream
  15. ; date                : 2018.01.09
  16. ;
  17. ;****************************************************

  18. ;****************************************************
  19. ;【型号定义】:

  20. ;****************************************************
  21. ;****************************************************
  22. ;【编译选项】:
  23. ;_DEBUG_                equ        1

  24. ;****************************************************
  25. ;【OPTION选项】:
  26. ;
  27. ;****************************************************
  28. ;【修改记录】:
  29. ;
  30. ;****************************************************
  31. ;【目标母体选择】:
  32.         include        "CSU8RP3215.inc"
  33.         
  34. ;【引用文件】:
  35.         include        "LT_Y47.h"

  36. ;**********************************************************************
  37. ;**********************************************************************
  38.         org        000h
  39.         nop
  40.         nop
  41.         nop
  42.         goto        start

  43.         org        004h
  44.         goto        intService

  45. ;******************************************************************************
  46. ;        org        010h
  47. ;******************************************************************************
  48. start:
  49.         bcf        gie
  50.         call        fnAllDefaultSet
  51. main:
  52.         clrwdt
  53.         call        fnTaskMgr
  54.         call        fnKeyFunc
  55.         call        fnDispFunc
  56.         call        fnBatFunc
  57.         call        fnEnterSleep
  58.         goto        main

  59. ;******************************************************************************
  60. ;【说明】:        按键扫描程序        
  61. ;【输入】:        无
  62. ;【输出】:        fLongKey
  63. ;******************************************************************************
  64. fnTaskMgr:
  65.         btfss        fBase2ms
  66.         goto        lbTaskMgrExit
  67.         
  68.         bcf        fBase2ms
  69.         bcf        led1_o
  70.         btfsc        ledBuf,0
  71.         bsf        led1_o
  72.         
  73.         bcf        led2_o
  74.         btfsc        ledBuf,1
  75.         bsf        led2_o
  76.         
  77.         bcf        led3_o
  78.         btfsc        ledBuf,2
  79.         bsf        led3_o

  80.         bcf        led4_o
  81.         btfsc        ledBuf,3
  82.         bsf        led4_o
  83.         
  84.         btfsc        fHaveUsb
  85.         goto        lbChkUsbInfo
  86.         
  87.         btfss        hall_i
  88.         goto        lbBottleLock
  89. lbBottleNotLock:
  90.         clrf        cHaveLock
  91.         btfss        fKGLock
  92.         goto        lbChkUsbInfo
  93.         incf        cNoLock,F
  94.         movfw        cNoLock
  95.         sublw        29                        ;30*2ms=60ms
  96.         btfsc        c
  97.         goto        lbChkKey
  98.         bcf        fKGLock
  99.         btfsc        fRunOn
  100.         call        lbChangeToOff
  101.         bcf        fBuzOn
  102.         bcf        buz_o
  103.         bsf        fEnWaitDly
  104.         clrf        tWaitDly
  105.         clrf        ledBuf
  106.         goto        lbChkUsbInfo
  107. lbBottleLock:
  108.         clrf        cNoLock
  109.         btfsc        fKGLock
  110.         goto        lbChkUsbInfo
  111.         incf        cHaveLock,F
  112.         movfw        cHaveLock
  113.         sublw        29                        ;30*2ms=60ms
  114.         btfsc        c
  115.         goto        lbChkUsbInfo
  116.         bsf        fKGLock
  117.         btfsc        fHaveUsb
  118.         goto        lbChkUsbInfo
  119.         bsf        fFstLock                        ;
  120.         clrf        tWaitDlyAssi                        ;延时1秒后关闭指示灯
  121.         clrf        tWaitDly                        ;
  122.         bsf        fBuzOn
  123. lbChkUsbInfo:
  124.         btfss        usb_i
  125.         goto        lbNoUsbInJug
  126. lbUsbInJug:
  127.         clrf        cUsbOut
  128.         btfsc        fHaveUsb
  129.         goto        lbTaskMgrExit
  130.         incf        cUsbExist,F
  131.         movfw        cUsbExist
  132.         sublw        19                                ;20*2ms=40ms
  133.         btfsc        c
  134.         goto        lbTaskMgrExit
  135.         bsf        fHaveUsb
  136.         bcf        fBat1ChgFull
  137.         bcf        fBat2ChgFull
  138.         bcf        fRunOn
  139.         bcf        motor_o
  140.         bcf        fBatLow
  141.         bcf        fEnWaitDly
  142.         clrf        cVolOffset
  143.         bcf        fMaskAlarm
  144.         bcf        fWorkedDly
  145.         bcf        fNeedCoolDown
  146.         clrf        cNormalWork
  147.         movlw        high(CHG_CUR_1000MA)
  148.         movwf        aimCurH
  149.         movlw        low(CHG_CUR_1000MA)
  150.         movwf        aimCurL
  151.         goto        lbTaskMgrExit
  152. lbNoUsbInJug:
  153.         clrf        cUsbExist
  154.         btfss        fHaveUsb
  155.         goto        lbChkKey
  156.         incf        cUsbOut,F
  157.         movfw        cUsbOut
  158.         sublw        19                                ;20*2ms=40ms
  159.         btfsc        c
  160.         goto        lbChkKey
  161.         bcf        fHaveUsb
  162.         clrf        ledBuf
  163.         clrf        cVolOffset
  164.         bcf        fEnWaitDly
  165.         bcf        pwm2out
  166.         bcf        pwm_o
  167. lbChkKey:        
  168.         btfsc        fEnAlarmDly
  169.         goto        lbTaskMgrExit                        ;过载保护期间禁止按键
  170.         
  171.         movfw        p_key
  172.         andlw        MASK_KEY_BIT
  173.         xorlw        MASK_KEY_BIT
  174.         movwf        var1
  175.         btfsc        z
  176.         goto        lbNoKeyPush                ;没有按键按下
  177.         
  178.         clrf        tKeyRel
  179.         xorwf        lastKey,W
  180.         btfss        z
  181.         goto        lbNewKeyPush                ;有新按键按下
  182.         
  183.         btfsc        fKeyPush
  184.         goto        lbLongKeyPushCnt
  185.         
  186.         incf        tKeyPush,F
  187.         movfw        tKeyPush
  188.         sublw        30                        ;31*2ms=62ms
  189.         btfsc        c
  190.         goto        lbTaskMgrExit
  191.         movfw        lastKey
  192.         movwf        keyName
  193.         bsf        fKeyOk
  194.         bsf        fKeyPush
  195.         bcf        fKeyRel
  196. lbTaskMgrExit:
  197.         return
  198.         
  199. lbNewKeyPush:
  200.         movfw        var1
  201.         movwf        lastKey
  202.         bcf        fKeyPush
  203.         clrf        tKeyPush
  204.         goto        lbTaskMgrExit
  205. lbLongKeyPushCnt:
  206.         goto        lbTaskMgrExit

  207. lbNoKeyPush:
  208.         clrf        tKeyPush
  209.         bcf        fKeyEr
  210.         btfsc        fKeyRel
  211.         goto        lbTaskMgrExit
  212.         incf        tKeyRel,F
  213.         movfw        tKeyRel
  214.         sublw        23                        ;24*2ms=48ms
  215.         btfsc        c
  216.         goto        lbTaskMgrExit
  217.         
  218.         bsf        fKeyRel
  219.         bcf        fKeyPush
  220.         goto        lbTaskMgrExit

  221. ;******************************************************************************
  222. ;【说明】:        按键功能
  223. ;******************************************************************************
  224. fnKeyFunc:
  225.         btfss        fRstRun
  226.         btfss        fKeyOk
  227.         goto        lbKeyFuncExit
  228.         
  229.         bcf        fKeyOk
  230.         movfw        keyName
  231.         xorlw        CONS_ON_KEY
  232.         btfsc        z
  233.         goto        lbOnKeyPr        
  234.         bsf        fKeyEr
  235. lbKeyFuncExit:
  236.          return

  237. lbOnKeyPr:
  238.         btfsc        fHaveUsb
  239.         goto        lbKeyFuncExit

  240.         btfss        fKGLock                                ;KG开关没有锁紧时,禁止运转
  241.         goto        lbAlarmSet
  242.         
  243.         btfsc        fNeedCoolDown                        ;10分钟散热期间,禁止开启
  244.         goto        lbSetCoolDownDly

  245.         btfsc        fRunOn
  246.         goto        lbChangeToOff        
  247.         
  248.         bsf        fRunOn
  249.         bsf        fEnWaitDly                        ;马达开启后等待300ms寻找最大值
  250.         clrf        tWaitDly                        ;
  251.         clrf        cEmptyMotor
  252.         clrf        tRunSec
  253.         clrf        tRunMSec
  254.         clrf        tMotorDly
  255.         clrf        motorMaxCurH
  256.         clrf        motorMaxCurL
  257.         clrf        cVolOffset
  258.         bcf        fEmptyMotor
  259.         bsf        motor_o                                ;开启马达
  260.         bsf        fWorkGood
  261.         clrf        tWaterFlow
  262.         movlw        1
  263.         movwf        ledBuf
  264.         bsf        fEnDisp
  265.         goto        lbKeyFuncExit

  266. lbChangeToOff:
  267.         bcf        fRunOn
  268.         bcf        motor_o
  269.         clrf        tWaitDly
  270.         clrf        tWaitDlyAssi
  271.         clrf        tRunMSec
  272.         clrf        cVolOffset
  273.         bcf        fWorkGood
  274.         bsf        fEnDisp
  275.         goto        lbKeyFuncExit

  276. lbAlarmSet:
  277.         bsf        fEnWaitDly
  278.         clrf        tWaitDly
  279.         goto        lbKeyFuncExit
  280.         
  281. lbSetCoolDownDly:
  282.         bsf        fMaskAlarm                        ;开启马达需要散热报警指示
  283.         clrf        tMaskSec
  284.         clrf        cMaskFlash
  285.         bcf        fEnDisp
  286.         goto        lbKeyFuncExit

  287. ;******************************************************************************
  288. ;【说明】:        显示处理程序
  289. ;******************************************************************************
  290. fnDispFunc:
  291.         btfss        fDisp2ms
  292.         goto        lbDispFuncExit
  293.         
  294.         bcf        fDisp2ms
  295.         btfss        fHaveUsb
  296.         goto        lbDischargeDisp

  297. lbChargeDisp:
  298.         incf        tFlashTime,F
  299.         movfw        tFlashTime
  300.         sublw        249                                ;250*2ms=500ms
  301.         btfsc        c
  302.         goto        $+4
  303.         clrf        tFlashTime
  304.         movlw        0x04                ;fEnFlash
  305.         xorwf        sysFlag2,F
  306.         
  307.         movfw        volume
  308.         addpcw
  309.         goto        lbDispChgVol0
  310.         goto        lbDispChgVol25
  311.         goto        lbDispChgVol50
  312.         goto        lbDispChgVol75
  313.         goto        lbDispChgVol100

  314. lbDispChgVol0:                                        ;0%时,第一个灯闪烁
  315.         movlw        0
  316.         btfss        fEnFlash
  317.         movlw        1
  318.         movwf        ledBuf
  319.         goto        lbDispFuncExit

  320. lbDispChgVol25:                                        ;25%时,25%常亮,50闪烁
  321.         movlw        01b
  322.         btfss        fEnFlash
  323.         movlw        11b
  324.         movwf        ledBuf
  325.         goto        lbDispFuncExit

  326. lbDispChgVol50:                                        ;50%时,25%和50%常亮,75%闪烁
  327.         movlw        011b
  328.         btfss        fEnFlash
  329.         movlw        111b
  330.         movwf        ledBuf
  331.         goto        lbDispFuncExit

  332. lbDispChgVol75:                                        ;75%时,25%、50%和75%常亮,100%闪烁
  333.         movlw        0111b
  334.         btfss        fBat1ChgFull
  335.         btfss        fEnFlash
  336.         movlw        1111b
  337.         movwf        ledBuf
  338.         goto        lbDispFuncExit
  339. lbDispChgVol100:                                ;100%时,充饱全亮
  340.         movlw        1111b
  341.         movwf        ledBuf
  342.         goto        lbDispFuncExit

  343. lbDischargeDisp:
  344.         btfss        fKGLock
  345.         goto        lbChkAlarmDly                        ;没有锁紧,报警显示
  346.         btfsc        fFstLock
  347.         goto        lbFirstLockDisp                        ;首次检测到锁紧显示
  348.         
  349.         btfsc        fMaskAlarm
  350.         goto        lbChkMaskDly                        ;需要散热报警指示显示
  351.         
  352.         btfss        fEnDisp
  353.         goto        lbDispFuncExit
  354.         btfss        fWorkGood
  355.         goto        lbDispCurVolume                        ;显示当前电量
  356.         
  357.         incf        tWaterFlow,F
  358.         movfw        tWaterFlow
  359.         sublw        149                                ;150*2ms=300ms
  360.         btfsc        c
  361.         goto        lbDispFuncExit
  362.         clrf        tWaterFlow
  363.         bcf        c
  364.         rlf        ledBuf,F                        ;跑马左移显示
  365.         movlw        1
  366.         btfsc        ledBuf,4
  367.         movwf        ledBuf
  368.         goto        lbDispFuncExit
  369.         
  370. lbDispCurVolume:
  371.         movfw        volume
  372.         addpcw
  373.         goto        lbDispDisVol0
  374.         goto        lbDispDisVol25
  375.         goto        lbDispDisVol50
  376.         goto        lbDispDisVol75
  377.         goto        lbDispDisVol100

  378. lbDispDisVol100:
  379.         movlw        1111b
  380.         movwf        ledBuf
  381.         goto        lbDispDisVol25+2
  382. lbDispDisVol75:
  383.         movlw        0111b
  384.         movwf        ledBuf
  385.         goto        lbDispDisVol25+2
  386. lbDispDisVol50:
  387.         movlw        0011b
  388.         movwf        ledBuf
  389.         goto        lbDispDisVol25+2
  390. lbDispDisVol25:
  391.         movlw        0001b
  392.         movwf        ledBuf
  393.         
  394.         incf        tWaitDly,F
  395.         movfw        tWaitDly
  396.         sublw        249                                ;250*2ms=500ms
  397.         btfsc        c
  398.         goto        lbDispFuncExit
  399.         clrf        tWaitDly
  400.         incf        tWaitDlyAssi,F
  401.         movfw        tWaitDlyAssi
  402.         sublw        9                                ;10*0.5s=5s
  403.         btfsc        c
  404.         goto        lbDispFuncExit
  405.         clrf        ledBuf
  406.         bcf        fEnDisp
  407.         goto        lbDispFuncExit

  408. lbDispDisVol0:
  409.         incf        tAlarmFlash,F
  410.         movfw        tAlarmFlash
  411.         sublw        49                                ;50*2ms=100ms
  412.         btfsc        c
  413.         goto        lbDispFuncExit
  414.         clrf        tAlarmFlash
  415.         movlw        0x08                        ;fAlarmFlash
  416.         xorwf        sysFlag2,F
  417.         
  418.         movlw        1111b
  419.         btfss        fAlarmFlash
  420.         movlw        0000b
  421.         movwf        ledBuf
  422.         
  423.         incf        tWaitDly,F
  424.         movfw        tWaitDly
  425.         sublw        9
  426.         btfsc        c
  427.         goto        lbDispFuncExit
  428.         clrf        ledBuf                                ;关闭显示
  429.         bcf        fEnDisp
  430.         goto        lbDispFuncExit

  431. lbFirstLockDisp:
  432.         movlw        0x0f
  433.         movwf        ledBuf
  434.         incf        tWaitDly,F
  435.         movfw        tWaitDly
  436.         sublw        249                                ;250*2ms=500ms
  437.         btfsc        c
  438.         goto        lbDispFuncExit
  439.         clrf        tWaitDly
  440.         incf        tWaitDlyAssi,F
  441.         movfw        tWaitDlyAssi
  442.         sublw        1                                ;0.5s*2=1s
  443.         btfsc        c
  444.         goto        lbDispFuncExit
  445.         bcf        fFstLock
  446.         clrf        ledBuf                                ;初次锁紧满1秒,关闭显示
  447.         bcf        fBuzOn
  448.         bcf        buz_o
  449.         goto        lbDispFuncExit

  450. lbChkMaskDly:
  451.         incf        tMaskSec,F
  452.         movfw        tMaskSec
  453.         sublw        49                                ;50*2ms=100ms
  454.         btfsc        c
  455.         goto        lbDispFuncExit
  456.         
  457.         clrf        tMaskSec
  458.         movlw        0x0f
  459.         xorwf        ledBuf,F
  460.         movlw        0x01                        ;fBuzOn
  461.         xorwf        buzFlag,F
  462.         incf        cMaskFlash,F
  463.         movfw        cMaskFlash
  464.         sublw        9                                ;10次
  465.         btfsc        c
  466.         goto        lbDispFuncExit
  467.         bcf        fMaskAlarm
  468.         clrf        ledBuf
  469.         bcf        fBuzOn
  470.         goto        lbDispFuncExit

  471. lbChkAlarmDly:
  472.         btfss        fEnWaitDly
  473.         goto        lbDispFuncExit
  474.         movlw        0xff
  475.         movwf        ledBuf
  476.         incf        tWaitDly,F
  477.         movfw        tWaitDly
  478.         sublw        249                                ;250*2ms=500ms
  479.         btfsc        c
  480.         goto        lbDispFuncExit
  481.         bcf        fEnWaitDly
  482.         clrf        ledBuf                                ;关闭显示        
  483. lbDispFuncExit:
  484.         return

  485. ;==============================================================================
  486. fnReadAnalog:
  487.         movfw        channelNum
  488.         addpcw
  489.         goto        lbJudgeMotorCur
  490.         goto        lbJudgeBatVol1
  491.         goto        lbJudgeBatVol2
  492.         goto        lbJudgeUsbDc

  493. lbJudgeMotorCur:
  494.         call        fnSelectMotorCurrent
  495.         goto        lbStartReadAd
  496. lbJudgeBatVol1:
  497.         call        fnSelectBatVoltage1
  498.         goto        lbStartReadAd
  499. lbJudgeBatVol2:
  500.         call        fnSelectBatVoltage2
  501.         goto        lbStartReadAd
  502. lbJudgeUsbDc:
  503.         call        fnSelectUSBDc
  504. lbStartReadAd:
  505.         movlw        20                        ;
  506.         movwf        var1                        ;
  507.         decfsz        var1,F                    ;切换通道delay
  508.         goto        $-1                           ;

  509.         call        fnReadADC
  510.         
  511.         ;取和
  512.         movfw        var2
  513.         addwf        averageL,F
  514.         movfw        var1
  515.         addwfc        averageH,F
  516.         
  517.         ;更新最小值
  518.         movfw        var2
  519.         subwf        tempMinL,W
  520.         movfw        var1
  521.         subwfc        tempMinH,W
  522.         btfss        c
  523.         goto        $+5
  524.         movfw        var1
  525.         movwf        tempMinH
  526.         movfw        var2
  527.         movwf        tempMinL
  528.         
  529.         ;更新最大值
  530.         movfw        var2
  531.         subwf        tempMaxL,W
  532.         movfw        var1
  533.         subwfc        tempMaxH,W
  534.         btfsc        c
  535.         goto        $+5
  536.         movfw        var1
  537.         movwf        tempMaxH
  538.         movfw        var2
  539.         movwf        tempMaxL
  540.         
  541.         decfsz        cAdcCnt,F
  542.         goto        lbCurrentJudgeExit
  543.         
  544.         ;减去最大值、最小值
  545.         movfw        tempMaxL
  546.         subwf        averageL,F
  547.         movfw        tempMaxH
  548.         subwfc        averageH,F
  549.         
  550.         movfw        tempMinL
  551.         subwf        averageL,F
  552.         movfw        tempMinH
  553.         subwfc        averageH,F
  554.         
  555.         movfw        channelNum
  556.         addpcw
  557.         goto        lbSaveMotorCur
  558.         goto        lbSaveBatVol1
  559.         goto        lbSaveBatVol2
  560.         goto        lbSaveUsbDc

  561. lbSaveMotorCur:
  562.         movfw        averageH
  563.         movwf        motorCurH
  564.         movfw        averageL
  565.         movwf        motorCurL
  566.         goto        lbGotoNextChannel
  567.         
  568. lbSaveBatVol1:
  569.         movfw        averageH
  570.         movwf        totVolH
  571.         movfw        averageL
  572.         movwf        totVolL
  573.         goto        lbGotoNextChannel

  574. lbSaveBatVol2:
  575.         movfw        averageH
  576.         movwf        batVol2H
  577.         movfw        averageL
  578.         movwf        batVol2L
  579.         
  580.         subwf        totVolL,W
  581.         movwf        batVol1L
  582.         movfw        batVol2H
  583.         subwfc        totVolH,W
  584.         movwf        batVol1H
  585.         btfsc        c
  586.         goto        lbGotoNextChannel
  587.         movfw        totVolH
  588.         movwf        batVol1H
  589.         movfw        totVolL
  590.         movwf        batVol1L
  591.         goto        lbGotoNextChannel

  592. lbSaveUsbDc:
  593.         movfw        averageH
  594.         movwf        usbVolH
  595.         movfw        averageL
  596.         movwf        usbVolL
  597.         
  598. ;        movlw        low(USB_3000MV)
  599. ;        subwf        usbVolL,W
  600. ;        movlw        high(USB_3000MV)
  601. ;        subwfc        usbVolH,W
  602. ;        btfss        c
  603. ;        goto        lbNoUsbInJug
  604. ;lbUsbInJug:
  605. ;        clrf        cUsbOut
  606. ;        btfsc        fHaveUsb
  607. ;        goto        lbGotoNextChannel
  608. ;        incf        cUsbExist,F
  609. ;        movfw        cUsbExist
  610. ;        sublw        19                                ;20*2ms=40ms
  611. ;        btfsc        c
  612. ;        goto        lbGotoNextChannel
  613. ;        bsf        fHaveUsb
  614. ;        bcf        fBat1ChgFull
  615. ;        bcf        fBat2ChgFull
  616. ;        bcf        fRunOn
  617. ;        bcf        motor_o
  618. ;        bcf        fBatLow
  619. ;        bcf        fEnWaitDly
  620. ;        clrf        cVolOffset
  621. ;        bcf        fMaskAlarm
  622. ;        bcf        fWorkedDly
  623. ;        bcf        fNeedCoolDown
  624. ;        clrf        cNormalWork
  625. ;        movlw        high(CHG_CUR_1000MA)
  626. ;        movwf        aimCurH
  627. ;        movlw        low(CHG_CUR_1000MA)
  628. ;        movwf        aimCurL
  629. ;        goto        lbGotoNextChannel
  630. ;lbNoUsbInJug:
  631. ;        clrf        cUsbExist
  632. ;        btfss        fHaveUsb
  633. ;        goto        lbChkKey
  634. ;        incf        cUsbOut,F
  635. ;        movfw        cUsbOut
  636. ;        sublw        19                                ;20*2ms=40ms
  637. ;        btfsc        c
  638. ;        goto        lbGotoNextChannel
  639. ;        bcf        fHaveUsb
  640. ;        clrf        ledBuf
  641. ;        clrf        cVolOffset
  642. ;        bcf        fEnWaitDly
  643. ;        bcf        pwm2out
  644. ;        bcf        pwm_o
  645. lbGotoNextChannel:
  646.         call        fnInitSamp
  647.         incf        channelNum,F
  648.         movfw        channelNum
  649.         sublw        3
  650.         btfsc        c
  651.         goto        lbCurrentJudgeExit
  652.         clrf        channelNum
  653.         bcf        fRstRun
  654. ifdef _DEBUG_
  655. ;{
  656.         btfss        fBase1s
  657.         goto        lbCurrentJudgeExit
  658.         bcf        fBase1s
  659.         movlw        0x55
  660.         movwf        data0
  661.         movfw        motorCurL
  662.         movwf        data1
  663.         movfw        motorCurH
  664.         movwf        data2
  665.         movfw        batVol1L
  666.         movwf        data3
  667.         movfw        batVol1H
  668.         movwf        data4
  669.         movfw        batVol2L
  670.         movwf        data5
  671.         movfw        batVol2H
  672.         movwf        data6
  673.         movlw        7
  674.         movwf        txdNum
  675.         bsf        fEnTxd
  676. ;}
  677. endif
  678. lbCurrentJudgeExit:
  679.         return

  680. ;----------------------------------------------------------
  681. fnInitSamp:
  682.         movlw        3
  683.         movwf        cAdcCnt
  684.         clrf        averageH
  685.         clrf        averageL
  686.         clrf        tempMaxH
  687.         clrf        tempMaxL
  688.         movlw        0xff
  689.         movwf        tempMinH
  690.         movwf        tempMinL
  691.         return

  692. ;=================================================================
  693. fnReadADC:
  694.         bsf        srads                        ;开启AD转换
  695.         btfsc        srads
  696.         goto        $-1
  697.         
  698.         movfw        sradl
  699.         movwf        var2
  700.         movfw        sradh
  701.         andlw        0x0f
  702.         movwf        var1
  703.         
  704.         bsf        offex                        ;翻转输入信号
  705.         bsf        srads
  706.         btfsc        srads
  707.         goto        $-1
  708.         
  709.         movfw        sradl
  710.         addwf        var2,F
  711.         movfw        sradh
  712.         andlw        0x0f
  713.         addwfc        var1,F
  714.         
  715.         bcf        c
  716.         rrf        var1,F                        ;得到两次输入信号的平均值
  717.         rrf        var2,F                        ;
  718.         return

  719. ;******************************************************************************
  720. ;【说明】:        电池充放电管理程序
  721. ;******************************************************************************
  722. fnBatFunc:
  723.         btfss        fBat2ms
  724.         goto        lbBatFuncExit
  725.         
  726.         bcf        fBat2ms
  727.         btfss        fHaveUsb
  728.         goto        lbSystemDischarge
  729. lbSystemCharge:
  730.         call        fnReadAnalog                        ;模拟信号读取
  731.         call        fnChgVolDet                        ;充电电量检测
  732.         call        fnBatChgFullJug                        ;充饱检测
  733.         call        fnChgVolControl                        ;充电电压控制
  734.         goto        lbBatFuncExit

  735. lbSystemDischarge:
  736.         call        fnReadAnalog                        ;模拟信号读取
  737.         call        fnDisVolDet                        ;放电电量检测
  738.         call        fnMotorCtrl                        ;马达控制
  739.         call        fnOverLoadCtrl
  740.         call        fnWaitCoolDown
  741. lbBatFuncExit:
  742.         return

  743. ;==============================================================================
  744. ;充饱检测
  745. fnBatChgFullJug:        
  746.         movlw        low(BAT_VOL_4200MV)
  747.         subwf        batVol1L,W
  748.         movlw        high(BAT_VOL_4200MV)
  749.         subwfc        batVol1H,W
  750.         btfss        c
  751.         clrf        cBat1FullCnt
  752.         
  753.         incf        cBat1FullCnt,F
  754.         incf        cBat1Cycle,F
  755.         movfw        cBat1Cycle
  756.         sublw        249                                ;250*2ms=500ms
  757.         btfsc        c
  758.         goto        lbChkBat2ChgFull
  759.         clrf        cBat1Cycle
  760.         
  761.         movfw        cBat1FullCnt
  762.         clrf        cBat1FullCnt
  763.         sublw        249*60/100
  764.         btfss        c
  765.         bsf        fBat1ChgFull

  766. lbChkBat2ChgFull:
  767.         movlw        low(BAT_VOL_4200MV)
  768.         subwf        batVol2L,W
  769.         movlw        high(BAT_VOL_4200MV)
  770.         subwfc        batVol2H,W
  771.         btfss        c
  772.         clrf        cBat2FullCnt
  773.         
  774.         incf        cBat2FullCnt,F
  775.         incf        cBat2Cycle,F
  776.         movfw        cBat2Cycle
  777.         sublw        249                                ;250*2ms=500ms
  778.         btfsc        c
  779.         goto        lbBatChgFullJugExit
  780.         clrf        cBat2Cycle
  781.         
  782.         movfw        cBat2FullCnt
  783.         clrf        cBat2FullCnt
  784.         sublw        249*60/100
  785.         btfss        c
  786.         bsf        fBat2ChgFull
  787. lbBatChgFullJugExit:
  788.         return

  789. ;==============================================================================
  790. ;充电电压控制
  791. fnChgVolControl:
  792. ;        movlw        low(BAT_VOL_4200MV)
  793. ;        subwf        batVol1L,W
  794. ;        movlw        high(BAT_VOL_4200MV)
  795. ;        subwfc        batVol1H,W
  796. ;        btfsc        c
  797. ;        goto        lbBatChgFull
  798. ;        
  799. ;        movlw        low(BAT_VOL_4200MV)
  800. ;        subwf        batVol2L,W
  801. ;        movlw        high(BAT_VOL_4200MV)
  802. ;        subwfc        batVol2H,W
  803. ;        btfsc        c
  804. ;        goto        lbBatChgFull
  805.         
  806.         call        fnSelectMotorCurrent
  807.         movlw        20
  808.         movwf        var1                        ;
  809.         decfsz        var1,F                    ;切换通道delay
  810.         goto        $-1                           ;

  811.         call        fnReadADC
  812.         movfw        var2
  813.         movwf        chgCurL
  814.         movfw        var1
  815.         movwf        chgCurH
  816.         call        fnReadADC
  817.         movfw        var2
  818.         addwf        chgCurL,F
  819.         movfw        var1
  820.         addwfc        chgCurH,F
  821.         call        fnReadADC
  822.         movfw        var2
  823.         addwf        chgCurL,F
  824.         movfw        var1
  825.         addwfc        chgCurH,F
  826.         call        fnReadADC
  827.         movfw        var2
  828.         addwf        chgCurL,F
  829.         movfw        var1
  830.         addwfc        chgCurH,F
  831.         bcf        c
  832.         rrf        chgCurH,F
  833.         rrf        chgCurL,F
  834.         bcf        c
  835.         rrf        chgCurH,F
  836.         rrf        chgCurL,F
  837.         
  838.         movfw        batVol1H
  839.         movwf        var1
  840.         movfw        batVol1L
  841.         movwf        var2
  842.         
  843.         movfw        batVol1L
  844.         subwf        batVol2L,W
  845.         movfw        batVol1H
  846.         subwfc        batVol2H,W
  847.         btfss        c
  848.         goto        $+5
  849.         movfw        batVol2H
  850.         movwf        var1
  851.         movfw        batVol2L
  852.         movwf        var2

  853.         movlw        low(USB_4600MV)
  854.         subwf        usbVolL,W
  855.         movlw        high(USB_4600MV)
  856.         subwfc        usbVolH,W
  857.         btfss        c
  858.         goto        lbPwmDec
  859.         
  860.         movfw        aimCurL
  861.         subwf        chgCurL,W
  862.         movfw        aimCurH
  863.         subwfc        chgCurH,W
  864.         btfsc        c
  865.         goto        lbPwmDec                        ;实际电流大了,PWM--
  866.         
  867.         movlw        low(BAT_VOL_4200MV)
  868.         subwf        var2,W
  869.         movlw        high(BAT_VOL_4200MV)
  870.         subwfc        var1,W
  871.         btfsc        c
  872.         goto        lbPwmDec

  873. lbPwmInc:
  874.         movfw        pwmBuf
  875.         xorlw        0xff
  876.         btfss        z
  877.         incf        pwmBuf,F
  878.         goto        lbUpdateChargeCur
  879. lbPwmDec:
  880.         movfw        pwmBuf
  881.         xorlw        0x0
  882.         btfss        z
  883.         decf        pwmBuf,F
  884. lbUpdateChargeCur:
  885.         movfw        pwmBuf
  886.         movwf        tm2r
  887.         bsf        pwm2out
  888.         return

  889. lbBatChgFull:
  890.         clrf        pwmBuf
  891.         clrf        tm2r
  892.         bcf        pwm2out
  893.         bcf        pwm_o
  894.         return
  895.         
  896. ;******************************************************************************
  897. ;【说明】:        睡眠进入程序
  898. ;【输入】:        无
  899. ;【输出】:        无
  900. ;******************************************************************************
  901. fnEnterSleep:
  902.         btfss        fRunOn
  903.         btfsc        fHaveUsb
  904.         goto        lbEnterSleepExit
  905.         
  906.         btfsc        fBatLow
  907.         goto        lbBatLowAlarm
  908.         
  909.         btfsc        fEnAlarmDly
  910.         goto        lbEnterSleepExit
  911.         
  912.         btfss        fWorkedDly
  913.         btfsc        fNeedCoolDown
  914.         goto        lbEnterSleepExit
  915.         
  916.         movfw        ledBuf
  917.         xorlw        0
  918.         btfss        z
  919.         goto        lbEnterSleepExit

  920.         btfss        fKeyPush
  921.         btfss        fSleep10ms
  922.         goto        lbEnterSleepExit
  923.         
  924.         bcf        fSleep10ms
  925.         incfsz        tWaitSleep,F
  926.         goto        lbEnterSleepExit        
  927. lbGotoSleepNow:
  928.         clrwdt
  929.         bcf        fBuzOn
  930.         bcf        led1_o
  931.         bcf        led2_o
  932.         bcf        led3_o
  933.         bcf        led4_o
  934.         bcf        buz_o
  935.         bsf        pwr_o
  936.         bcf        sraden
  937.         clrf        sradcon0
  938.         clrf        sradcon1
  939.         clrf        sradcon2
  940.         bcf        pt3con,0        
  941.         bcf        wdten
  942.         movlw        0x13                                        ;使能按键和充电唤醒睡眠
  943. ;        btfsc        fBatLow
  944. ;        movlw        0x03                                        ;电池低时,禁止按键唤醒,只可以充电唤醒
  945.         movwf        pt1con
  946.         movlw        0x08
  947.         movwf        pt1con1                                        ;使能PT3.1状态改变时唤醒睡眠
  948.         bsf        e0ie
  949.         bsf        e1ie                                        ;使能外部中断1
  950.         clrf        intf
  951.         sleep
  952.         nop
  953.         nop
  954.         nop
  955.         bcf        e0ie
  956.         bcf        e1ie
  957.         clrf        pt1con                                        ;关闭PT1.3/PT3.0口中断唤醒功能
  958.         clrf        pt1con1                                        ;关闭PT3.1口中断唤醒功能
  959.         bsf        wdten
  960.         bcf        fBatLow
  961.         movlw        00110000b                                ;ADC输入信号获取时间:2个ADC时钟,采样时间:CPUCLK
  962.         movwf        sradcon0
  963.         movlw        00000000b                                ;参考电压:VDD
  964.         movwf        sradcon1
  965.         clrf        sradl
  966.         clrf        sradh
  967.         clrf        sroftl
  968.         clrf        srofth
  969.         bsf        sraden                                        ;使能ADC
  970.         call        fnInitSamp
  971.         bsf        pwr_o
  972. lbEnterSleepExit:
  973.         return

  974. lbBatLowAlarm:
  975.         clrf        var1
  976.         clrf        var2
  977.         bcf        led1_o
  978.         bcf        led2_o
  979.         bcf        led3_o
  980.         bcf        led4_o

  981. lbAlarmFlash:
  982.         clrwdt
  983.         btfss        fBase2ms
  984.         goto        $-2
  985.         bcf        fBase2ms
  986.         incf        var1,F
  987.         movfw        var1
  988.         sublw        49                                        ;50*2ms=100ms
  989.         btfsc        c
  990.         goto        lbAlarmFlash
  991.         clrf        var1
  992.         movlw        0x80                        ;led1_o
  993.         xorwf        pt1,F
  994.         incf        var2,F
  995.         movfw        var2
  996.         sublw        9
  997.         btfsc        c
  998.         goto        lbAlarmFlash
  999.         goto        lbGotoSleepNow
  1000.         
  1001. ;******************************************************************************
  1002. ;【说明】:        充电电量检测
  1003. ;【输入】:        无
  1004. ;【输出】:        无
  1005. ;******************************************************************************
  1006. fnChgVolDet:        
  1007.         movlw        high(tblChgVolLevel)
  1008.         movwf        eadrh
  1009.         movfw        volume
  1010.         addlw        low(tblChgVolLevel)
  1011.         movwf        eadrl
  1012.         btfsc        c
  1013.         incf        eadrh,F
  1014.         movp
  1015.         subwf        totVolL,W
  1016.         movfw        edath
  1017.         subwfc        totVolH,W
  1018.         btfss        c
  1019.         clrf        cVolOffset
  1020.         
  1021.         incfsz        cVolOffset,F
  1022.         goto        lbChgVolDetExit
  1023.         movfw        volume
  1024.         xorlw        BAT_VOLUME_100
  1025.         btfss        z
  1026.         incf        volume,F
  1027. lbChgVolDetExit:
  1028.         return
  1029.         
  1030. ;******************************************************************************
  1031. ;【说明】:        放电电量检测
  1032. ;【输入】:        无
  1033. ;【输出】:        无
  1034. ;******************************************************************************
  1035. fnDisVolDet:
  1036.         btfsc        fRunOn
  1037.         goto        lbChkBatteryLow
  1038.         
  1039.         movlw        high(tblDisVolLevel)
  1040.         movwf        eadrh
  1041.         movfw        volume
  1042.         addlw        low(tblDisVolLevel)
  1043.         movwf        eadrl
  1044.         btfsc        c
  1045.         incf        eadrh,F
  1046.         movp
  1047.         subwf        totVolL,W
  1048.         movfw        edath
  1049.         subwfc        totVolH,W
  1050.         btfsc        c
  1051.         clrf        cVolOffset
  1052.         
  1053.         incfsz        cVolOffset,F
  1054.         goto        lbDisVolDetExit
  1055.         movfw        volume
  1056.         xorlw        0
  1057.         btfss        z
  1058.         decf        volume,F
  1059.         movfw        volume
  1060.         xorlw        0
  1061.         btfsc        z
  1062.         bsf        fBatLow
  1063. lbDisVolDetExit:
  1064.         return

  1065. lbChkBatteryLow:
  1066.         movlw        low(TOT_VOL_5500MV)
  1067.         subwf        totVolL,W
  1068.         movlw        high(TOT_VOL_5500MV)
  1069.         subwfc        totVolH,W
  1070.         btfsc        c
  1071.         clrf        cVolOffset
  1072.         
  1073.         incfsz        cVolOffset,F
  1074.         goto        lbDisVolDetExit
  1075.         bsf        fBatLow
  1076.         clrf        volume
  1077.         call        lbChangeToOff                        ;电池低电,关机报警
  1078.         goto        lbDisVolDetExit

  1079. ;==================================
  1080. fnSelectMotorCurrent:
  1081.         movlw        0x82                                ;内部1.4V
  1082.         movwf        sradcon1
  1083.         movlw        CH_MOTOR_CUR
  1084.         movwf        sradcon2
  1085.         movlw        00100000b
  1086.         movwf        pt3con                ;pt3.5为AD口
  1087.         return

  1088. fnSelectBatVoltage1:
  1089.         movlw        0x80
  1090.         movwf        sradcon1
  1091.         movlw        CH_BAT_VOL1
  1092.         movwf        sradcon2
  1093.         movlw        00010000b
  1094.         movwf        pt3con                ;pt3.4为AD口
  1095.         return

  1096. fnSelectBatVoltage2:
  1097.         movlw        0x80
  1098.         movwf        sradcon1
  1099.         movlw        CH_BAT_VOL2
  1100.         movwf        sradcon2
  1101.         movlw        01000000b
  1102.         movwf        pt3con                ;pt3.6为AD口
  1103.         return

  1104. fnSelectUSBDc:
  1105.         movlw        0x80
  1106.         movwf        sradcon1
  1107.         movlw        CH_USB_DC
  1108.         movwf        sradcon2
  1109.         movlw        00000001b
  1110.         movwf        pt3con                ;pt3.0为AD口
  1111.         return

  1112. ;******************************************************************************
  1113. ;【说明】:        马达控制
  1114. ;【输入】:        无
  1115. ;【输出】:        无
  1116. ;******************************************************************************
  1117. fnMotorCtrl:
  1118.         btfss        fRunOn
  1119.         goto        lbMotorCtrlExit

  1120. ;        1、马达启动时,在刚启动300ms之内寻找最大值,300ms之后比较电流值和最大值,如果电流值比最大值小10MV以上,认为
  1121. ;        马达工作正常,否则认为堵转;
  1122. ;        2、在马达正常工作中,寻找最大值,如果最大值比正常值大于10MV以上时,认为发生堵转。
  1123.         movlw        low(EMPTY_MIN_CUR)
  1124.         movwf        var2
  1125.         movlw        high(EMPTY_MIN_CUR)
  1126.         movwf        var1
  1127.         btfss        fEmptyMotor
  1128.         goto        $+5
  1129.         movlw        low(EMPTY_MAX_CUR)
  1130.         movwf        var2
  1131.         movlw        high(EMPTY_MAX_CUR)
  1132.         movwf        var1
  1133.         
  1134.         movfw        var2
  1135.         subwf        motorCurL,W
  1136.         movfw        var1
  1137.         subwfc        motorCurH,W
  1138.         btfss        c
  1139.         incf        cEmptyMotor,F
  1140.         
  1141.         incf        cMotorPeriod,F
  1142.         movfw        cMotorPeriod
  1143.         sublw        99                                ;100*2ms=200ms
  1144.         btfsc        c
  1145.         goto        lbChkBlockCur
  1146.         
  1147.         clrf        cMotorPeriod
  1148.         movfw        cEmptyMotor
  1149.         sublw        70                                ;100*70%=70
  1150.         btfss        c
  1151.         bsf        fEmptyMotor                        ;>70%时,认为空载
  1152.         
  1153.         movfw        cEmptyMotor
  1154.         sublw        30                                ;100*30%=30
  1155.         btfsc        c
  1156.         bcf        fEmptyMotor                        ;<30%时,认为正常负载
  1157.         
  1158.         clrf        cEmptyMotor
  1159.         btfss        fEmptyMotor
  1160.         clrf        tMotorDly                        ;没有空载时,清计数器
  1161. lbChkBlockCur:
  1162.         btfsc        fEmptyMotor
  1163.         goto        lbMotorRunDly                        ;空载延时控制
  1164.         btfss        fEnWaitDly
  1165.         goto        lbNormalRunChk

  1166.         ;马达启动时,堵转监测
  1167.         movfw        motorCurL
  1168.         subwf        motorMaxCurL,W
  1169.         movfw        motorCurH
  1170.         subwfc        motorMaxCurH,W
  1171.         btfsc        c
  1172.         goto        $+5
  1173.         movfw        motorCurH
  1174.         movwf        motorMaxCurH
  1175.         movfw        motorCurL
  1176.         movwf        motorMaxCurL
  1177.         
  1178.         incfsz        tWaitDly,F                        ;256*2ms=512ms
  1179.         goto        lbMotorRunDly
  1180.         
  1181.         bcf        fEnWaitDly
  1182.         movlw        2;5;10;40;87                        ;13mV
  1183.         addwf        motorCurL,F
  1184.         movlw        0
  1185.         addwfc        motorCurH,F
  1186.         movfw        motorCurL
  1187.         subwf        motorMaxCurL,W
  1188.         movfw        motorCurH
  1189.         subwfc        motorMaxCurH,W
  1190.         btfss        c
  1191.         goto        lbMotorCurTooBig                ;最大值-当前值 < 13mV时,认为堵转
  1192.         movlw        0xff
  1193.         movwf        motorMinCurH
  1194.         movwf        motorMinCurL
  1195.         goto        lbMotorRunDly

  1196. lbMotorCurRisingHigh:
  1197.         bsf        fEnWaitDly
  1198.         clrf        tWaitDly
  1199.         movfw        motorCurH
  1200.         movwf        motorMaxCurH
  1201.         movfw        motorCurL
  1202.         movwf        motorMaxCurL
  1203.         goto        lbMotorRunDly
  1204.         
  1205. lbNormalRunChk:                ;正常运转时,堵转监测
  1206.         movfw        motorCurL
  1207.         subwf        motorMinCurL,W
  1208.         movfw        motorCurH
  1209.         subwfc        motorMinCurH,W
  1210.         btfss        c
  1211.         goto        $+5
  1212.         movfw        motorCurH
  1213.         movwf        motorMinCurH
  1214.         movfw        motorCurL
  1215.         movwf        motorMinCurL

  1216.         movlw        160                                ;55mV
  1217.         addwf        motorMinCurL,F
  1218.         movlw        0
  1219.         addwfc        motorMinCurH,F
  1220.         movfw        motorCurL
  1221.         subwf        motorMinCurL,W
  1222.         movfw        motorCurH
  1223.         subwfc        motorMinCurH,W
  1224.         btfss        c
  1225.         goto        lbMotorCurRisingHigh        ;lbMotorCurTooBig                ;当前值-最小值 > 55mV以上时,认为堵转
  1226.         movlw        160
  1227.         subwf        motorMinCurL,F
  1228.         movlw        0
  1229.         subwfc        motorMinCurH,F
  1230.         
  1231.         movlw        low(BLOCK_CURRENT)
  1232.         subwf        motorCurL,W
  1233.         movlw        high(BLOCK_CURRENT)
  1234.         subwfc        motorCurH,W
  1235.         btfsc        c
  1236.         goto        lbMotorCurTooBig                ;当前值太大,认为堵转

  1237. lbMotorRunDly:
  1238.         incf        tRunMSec,F
  1239.         movfw        tRunMSec
  1240.         sublw        249                                ;250*2ms=500ms
  1241.         btfsc        c
  1242.         goto        lbMotorCtrlExit
  1243.         
  1244.         clrf        tRunMSec
  1245.         incf        tMotorDly,F
  1246.         movfw        tMotorDly
  1247.         sublw        10                                ;10*0.5s=5s
  1248.         btfss        c
  1249.         goto        lbCloseMotor
  1250.         incf        tRunSec,F
  1251.         movfw        tRunSec
  1252.         sublw        59                                ;60*0.5s=30s
  1253.         btfsc        c
  1254.         goto        lbMotorCtrlExit

  1255.         ;开启一分钟延时,如果一分钟之内再次开启,则累加次数,
  1256.         ;连续工作5次后,需等待10分钟才能重新启动
  1257.         bsf        fWorkedDly
  1258.         clrf        tWorkedDlySec
  1259.         clrf        tWorkedDlyMsec
  1260.         
  1261.         incf        cNormalWork,F
  1262.         movfw        cNormalWork
  1263.         sublw        4                                ;5次
  1264.         btfsc        c
  1265.         goto        lbCloseMotor
  1266.         bsf        fNeedCoolDown
  1267.         clrf        tCoolMin
  1268.         clrf        tCoolSec
  1269.         clrf        tCoolMsec
  1270. lbCloseMotor:
  1271.         call        lbChangeToOff
  1272. lbMotorCtrlExit:
  1273.         return

  1274. lbMotorCurTooBig:
  1275.         call        lbChangeToOff
  1276.         bsf        fEnAlarmDly
  1277.         clrf        tAlarmDly                        ;三秒内不能按键
  1278.         clrf        tWaitDly
  1279.         bsf        fBuzOn
  1280.         movlw        5
  1281.         movwf        cBuzTime                        ;响三次
  1282.         clrf        tBuzTime
  1283.         goto        lbMotorCtrlExit

  1284. ;********************************************************************
  1285. fnOverLoadCtrl:
  1286.         btfss        fEnAlarmDly
  1287.         goto        lbOverLoadCtrlExit
  1288.         
  1289.         movfw        cBuzTime
  1290.         xorlw        0
  1291.         btfsc        z
  1292.         goto        lbOverLoadDlyCnt
  1293.         
  1294.         incf        tBuzTime,F
  1295.         movfw        tBuzTime
  1296.         sublw        61                                ;62*2ms=124ms
  1297.         btfsc        c
  1298.         goto        lbOverLoadDlyCnt
  1299.         
  1300.         clrf        tBuzTime
  1301.         movlw        1                ;fBuzOn
  1302.         xorwf        buzFlag,F
  1303.         btfss        fBuzOn
  1304.         bcf        buz_o                                ;暂停期间,输出低电平
  1305.         decfsz        cBuzTime,F
  1306.         goto        lbOverLoadDlyCnt
  1307.         bcf        fBuzOn
  1308.         bcf        buz_o
  1309. lbOverLoadDlyCnt:
  1310.         incf        tWaitDly,F
  1311.         movfw        tWaitDly
  1312.         sublw        249                                ;250*2ms=500ms
  1313.         btfsc        c
  1314.         goto        lbOverLoadCtrlExit
  1315.         
  1316.         clrf        tWaitDly
  1317.         incf        tAlarmDly,F
  1318.         movfw        tAlarmDly
  1319.         sublw        5                                ;6*0.5s=3s
  1320.         btfsc        c
  1321.         goto        lbOverLoadCtrlExit
  1322.         bcf        fEnAlarmDly
  1323. lbOverLoadCtrlExit:
  1324.         return

  1325. ;********************************************************************
  1326. fnWaitCoolDown:
  1327.         btfss        fWorkedDly
  1328.         goto        lbChkCoolDownDly
  1329.         
  1330.         incf        tWorkedDlyMsec,F
  1331.         movfw        tWorkedDlyMsec
  1332.         sublw        249                                ;250*2ms=500ms
  1333.         btfsc        c
  1334.         goto        lbChkCoolDownDly
  1335.         
  1336.         clrf        tWorkedDlyMsec
  1337.         incf        tWorkedDlySec,F
  1338.         movfw        tWorkedDlySec
  1339.         sublw        119                                ;120*0.5s=60s
  1340.         btfsc        c
  1341.         goto        lbChkCoolDownDly
  1342.         
  1343.         clrf        tWorkedDlySec
  1344.         bcf        fWorkedDly                        ;满1分钟,重新累加次数
  1345.         clrf        cNormalWork                        ;清除累加次数

  1346. lbChkCoolDownDly:
  1347.         btfss        fNeedCoolDown
  1348.         goto        lbWaitCoolDownExit
  1349.         
  1350.         incf        tCoolMsec,F
  1351.         movfw        tCoolMsec
  1352.         sublw        249                                ;250*2ms=500ms
  1353.         btfsc        c
  1354.         goto        lbWaitCoolDownExit
  1355.         
  1356.         clrf        tCoolMsec
  1357.         incf        tCoolSec,F
  1358.         movfw        tCoolSec
  1359.         sublw        119                                ;120*0.5s=60s
  1360.         btfsc        c
  1361.         goto        lbWaitCoolDownExit
  1362.         
  1363.         clrf        tCoolSec
  1364.         incf        tCoolMin,F
  1365.         movfw        tCoolMin
  1366.         sublw        9                                ;10*1min=10min
  1367.         btfsc        c
  1368.         goto        lbWaitCoolDownExit
  1369.         bcf        fNeedCoolDown
  1370.         clrf        cNormalWork
  1371. lbWaitCoolDownExit:
  1372.         return

  1373. ;********************************************************************
  1374. ;【说明】:        初始化
  1375. ;********************************************************************
  1376. ;程序开始
  1377. fnAllDefaultSet:

  1378. ;====================================================================
  1379. ;MCK寄存器说明:建议按位操作,默认值为1010uuu0
  1380. ;bit7:CST:        1=外部晶振关闭
  1381. ;                0=外部晶振打开
  1382. ;bit6:CST_IN:        1=内部晶振关闭
  1383. ;                0=内部晶振打开
  1384. ;bit5:CST_WDT:        1=内部WDT晶振关闭
  1385. ;                0=内部WDT晶振打开
  1386. ;bit4:EO_SLP :        1=如果选择的是外部低速晶振,在sleep模式下不关闭外部晶振、
  1387. ;                0=sleep模式下关闭外部晶振
  1388. ;bit0:CLK_SEL:        1=外部晶振系统时钟
  1389. ;                0=内部晶振系统时钟
  1390. ;====================================================================
  1391.         bcf        cst_in
  1392.         bsf        cst
  1393.         bcf        cst_wdt
  1394.         bcf        eo_slp
  1395.         bcf        clksel
  1396.         
  1397. ;====================================================================
  1398. ;INTF中断标志寄存器,硬件置位,软件清零
  1399. ;bit7:        未定义
  1400. ;bit6:        TM2IF        1=12-Bit定时/计数器2发生定时中断
  1401. ;                0=12-Bit定时/计数器2未发生定时中断
  1402. ;bit5:        未定义
  1403. ;bit4:        TM0IF        1=8-Bit定时器0发生定时中断
  1404. ;                0=8-Bit定时器0未发生定时中断
  1405. ;bit3:        SRADIF        1=AD发生中断
  1406. ;                0=AD未发生中断
  1407. ;bit2:        未定义
  1408. ;bit1:        E1IF        1=外部中断1发生中断
  1409. ;                0=外部中断1未发生中断
  1410. ;bit0:        E0IF        1=外部中断0发生中断
  1411. ;                0=外部中断0未发生中断
  1412. ;====================================================================
  1413.         clrf        intf                ;清除中断标志

  1414. ;====================================================================
  1415. ;INTF2中断标志寄存器,硬件置位,软件清零
  1416. ;bit7:        未定义
  1417. ;bit6:        未定义
  1418. ;bit5:        TM4IF        1=12-Bit定时/计数器4发生定时中断
  1419. ;                0=12-Bit定时/计数器4未发生定时中断
  1420. ;bit4:        TM3IF        1=12-Bit定时/计数器3发生定时中断
  1421. ;                0=12-Bit定时/计数器3未发生定时中断
  1422. ;====================================================================
  1423.         clrf        intf2
  1424.         
  1425. ;====================================================================
  1426. ;INTF3中断标志寄存器,硬件置位,软件清零
  1427. ;bit7:        CMPIF        1=比较器发生中断
  1428. ;                0=比较器未发生中断
  1429. ;bit6~bit2:        未定义
  1430. ;bit1:        URTIF        1=串口通讯发生发送中断
  1431. ;                0=串口通讯未发生发送中断
  1432. ;bit0:        URRIF        1=串口通讯发生接收中断
  1433. ;                0=串口通讯未发生接收中断
  1434. ;====================================================================
  1435.         clrf        intf3

  1436. ;====================================================================
  1437. ;INTE中断使能寄存器:
  1438. ;bit7:        GIE        1=使能所有非屏蔽中断
  1439. ;                0=不使能所有中断
  1440. ;bit6:        TM2IE        1=使能12-Bit定时/计数器2中断
  1441. ;                0=禁能12-Bit定时/计数器2中断
  1442. ;bit5:        未定义
  1443. ;bit4:        TM0IE        1=使能8-Bit定时器0中断
  1444. ;                0=禁能8-Bit定时器0中断
  1445. ;bit3:        SRADIE        1=使能AD中断
  1446. ;                0=禁能AD中断
  1447. ;bit2:        未定义
  1448. ;bit1:        E1IE        1=使能外部中断1
  1449. ;                0=禁能外部中断1
  1450. ;bit0:        E0IE        1=使能外部中断0
  1451. ;                0=禁能外部中断0
  1452. ;====================================================================
  1453.         clrf        inte

  1454. ;====================================================================
  1455. ;INTE2中断使能寄存器:
  1456. ;bit7:        未定义
  1457. ;bit6:        未定义
  1458. ;bit5:        TM4IE        1=使能12-Bit定时/计数器4中断
  1459. ;                0=禁能12-Bit定时/计数器4中断
  1460. ;bit4:        TM3IE        1=使能12-Bit定时/计数器3中断
  1461. ;                0=禁能12-Bit定时/计数器3中断
  1462. ;bit3~bit0:        未定义
  1463. ;====================================================================
  1464.         clrf        inte2

  1465. ;====================================================================
  1466. ;INTE3中断使能寄存器:
  1467. ;bit7:        CMPIE        1=使能比较器中断
  1468. ;                0=禁能比较器中断
  1469. ;bit6~bit2:        未定义
  1470. ;bit1:        URTIE        1=使能UART的发送中断
  1471. ;                0=禁能UART的发送中断
  1472. ;bit0:        URRIE        1=使能UART的接收中断
  1473. ;                0=禁能UART的接收中断
  1474. ;====================================================================
  1475.         clrf        inte3

  1476. ;====================================================================
  1477. ;PT1CON:外部中断1、0中断触发沿设定
  1478. ;bit7:        PT11OD        1=使能PT1.1漏极开路
  1479. ;                0=禁能PT1.1漏极开路
  1480. ;bit6:        PT1W3        1=使能PT1.5外部中断1
  1481. ;                0=禁能PT1.5外部中断1
  1482. ;bit5:        PT1W2        1=使能PT1.4外部中断1
  1483. ;                0=禁能PT1.4外部中断1
  1484. ;bit4:        PT1W1        1=使能PT1.3外部中断1
  1485. ;                0=禁能PT1.3外部中断1
  1486. ;bit3:        PT1W0        1=使能PT1.1外部中断1
  1487. ;                0=禁能PT1.1外部中断1
  1488. ;bit2:        E1M        1=外部中断1为下降沿触发
  1489. ;                0=外部中断1为状态改变时触发
  1490. ;bit1~0:E0M        11=外部中断0为状态改变时触发
  1491. ;                10=外部中断0为状态改变时触发
  1492. ;                01=外部中断0为上升沿触发
  1493. ;                00=外部中断0为下降沿触发
  1494. ;====================================================================
  1495. ;本例程没有使用该功能,若用户使用,请自行添加

  1496. ;====================================================================
  1497. ;PT1CON1:外部中断1设定
  1498. ;bit7~bit4:        未定义
  1499. ;bit3:        PT1W23        1=使能PT3.1外部中断1
  1500. ;                0=禁能PT3.1外部中断1
  1501. ;bit2:        PT1W22        1=使能PT1.7外部中断1
  1502. ;                0=禁能PT1.7外部中断1
  1503. ;bit1:        PT1W21        1=使能PT1.6外部中断1
  1504. ;                0=禁能PT1.6外部中断1
  1505. ;bit0:        PT1W20        1=使能PT1.2外部中断1
  1506. ;                0=禁能PT1.2外部中断1
  1507. ;====================================================================
  1508. ;本例程没有使用该功能,若用户使用,请自行添加

  1509. ;====================================================================
  1510. ;-----------SRADCON0-----------:
  1511. ;bit7/bit6:        未定义
  1512. ;bit5/bit4:        SRADACKS[1:0]ADC输入信号获取时间
  1513. ;                00=16个ADC时钟        01=8个ADC时钟        10=4个ADC时钟        11=2个ADC时钟
  1514. ;bit3/bit2:        未定义
  1515. ;bit1/bit0:        SRADCKS[1:0]ADC时钟
  1516. ;                00=CPUCLK        01=CPUCLK/2        10=CPUCLK/4        11=CPUCLK/8
  1517. ;-----------SRADCON1-----------:
  1518. ;bit7:        SRADEN        :ADC使能位                1=使能                        0=禁止
  1519. ;bit6:        SRADS        :ADC启动位/状态控制位        1=开始,转换过程中        0=停止,转换结束
  1520. ;bit5:        OFTEN        :转换结果选择控制位        1=存放在SROFT寄存器        0=存放在SRAD寄存器
  1521. ;bit4:        CALIF        :矫正控制位(OFTEN为0时有效)        1=使能矫正        0=禁止矫正
  1522. ;bit3:        ENOV        :使能比较器溢出模式(CALIF为1时有效)        1=使能        0=禁止
  1523. ;bit2:        OFFEX        :OFFSET交换        1=比较器两端信号交换        0=不交换(正端为信号,负端为参考电压)
  1524. ;bit1/bit0:VREFS[1:0]ADC参考电源选择,不同参考电源切换,建议延迟10us再做AD转换
  1525. ;                00=VDD
  1526. ;                01=PT3.0外部参考电源输入
  1527. ;                10=内部参考电压
  1528. ;                11=内部参考电压,PT3.0可外接电容做为内置参考电压滤波使用,以提高精度
  1529. ;-----------SRADCON2-----------:
  1530. ;bit7~bit4:        CHS[3:0]ADC输入通道选择位
  1531. ;                0000=AIN0        0001=AIN1        0010=AIN2        0011=AIN3
  1532. ;                0100=AIN4        0101=AIN5        0110=AIN6        0111=AIN7
  1533. ;                1000=AIN8        1001=内部1/8VDD        1010=内部参考电压
  1534. ;bit3/bit2:        未定义
  1535. ;bit1/bit0:        REF_SEL[1:0]        VREFS[1:0]配置为10或11,则可通过REF_SEL[1:0]选择如下
  1536. ;                参考电压,若VREFS[1:0]不是配置为10或11,以下位无效
  1537. ;                00=1.4V                01=2.0V                10=3.0V                11=4.0V
  1538. ;-----------SRADH/SRADL--------:
  1539. ;SRADH:        SRAD[11:8]ADC数据高4位,只可读
  1540. ;SRADL:        SRAD[7:0]ADC数据低8位,只可读
  1541. ;-----------SROFTH/SROFTL------:
  1542. ;SROFTH:SROFT[11:8]矫正值数据的高4位
  1543. ;SROFTL:SROFT[7:0]矫正值数据的低8位
  1544. ;-----------METCH--------------:
  1545. ;bit5:        REFOEN:        内部参考电压从PT3.0输出使能位,输出REF_SEL[1:0]选择的内部参考电压
  1546. ;                0=禁止内部参考电压输出
  1547. ;                1=使能内部参考电压输出
  1548. ;bit4:        REFIN:        外部参考电压输入端口选择
  1549. ;                0=选择PT3.0作为参考电压输入
  1550. ;                1=选择PT3.2作为参考电压输入
  1551. ;bit3:        METCH[3]:0=禁止ERC时钟输出
  1552. ;                 1=使能ERC时钟通过PT1.5口输出
  1553. ;bit2:        METCH[2]:0=使能寄存器TRIM_EX的值来微调ERC频率
  1554. ;                 1=禁止ERC频率微调控制
  1555. ;bit0:        P13OD:        PT1.3开漏输出使能
  1556. ;                 0=做为输入口        1=开漏输出
  1557. ;====================================================================
  1558.         movlw        00110000b                        ;ADC输入信号获取时间:2个ADC时钟,采样时间:CPUCLK
  1559.         movwf        sradcon0
  1560.         movlw        00000000b                        ;参考电压:VDD
  1561.         movwf        sradcon1
  1562.         movlw        01000000b                        ;AIN4
  1563.         movwf        sradcon2
  1564.         clrf        sradl
  1565.         clrf        sradh
  1566.         clrf        sroftl
  1567.         clrf        srofth
  1568.         bsf        sraden                                ;使能ADC

  1569. ;====================================================================
  1570. ;SYSCFG0:输入逻辑电平电压配置
  1571. ;bit7:VTHSEL  --------------------------------------------------
  1572. ;            |  |符号|     参数     |最小值 |典型值|最大值 |单位|
  1573. ;            |--+----+--------------+-------+------+-------+----|
  1574. ;            |  |    |数字输入高电平|0.75Vdd|      |       | V  |
  1575. ;            |  |VIH1|--------------+-------+------+-------+----|
  1576. ;            |  |    |复位输入高电平|0.8Vdd |      |       | V  |
  1577. ;            | 0|----+--------------+-------+------+-------+----|
  1578. ;            |  |    |数字输入低电平|       |      |0.3Vdd | V  |
  1579. ;            |  |VIL1|--------------+-------+------+-------+----|
  1580. ;            |  |    |复位输入低电平|       |      |0.2Vdd | V  |
  1581. ;            |--+----+--------------+-------+------+-------+----|
  1582. ;            |  |    |数字输入高电平|0.5Vdd |      |       | V  |
  1583. ;            |  |VIH2|--------------+-------+------+-------+----|
  1584. ;            |  |    |复位输入高电平|0.5Vdd |      |       | V  |
  1585. ;            | 1|-------------------+-------+------+-------+----|
  1586. ;            |  |    |数字输入低电平|       |      |0.2Vdd | V  |
  1587. ;            |  |VIL2|--------------+-------+------+-------+----|
  1588. ;            |  |    |复位输入低电平|       |      |0.1Vdd | V  |
  1589. ;             --------------------------------------------------
  1590. ;bit5~4:VTHP30-----------------------------------------------
  1591. ;            |  |符号| 参数     |最小值 |典型值 |最大值 |单位|
  1592. ;            |--+----+----------+-------+-------+-------+----|
  1593. ;            |  |VIH1|输入高电平|0.75Vdd|       |       | V  |
  1594. ;            |00|----+----------+-------+-------+-------+----|
  1595. ;            |  |VIL1|输入低电平|       |       |0.3Vdd | V  |
  1596. ;            |--+----+----------+-------+-------+-------+----|
  1597. ;            |  |VIH |输入高电平|       |  0.7  |       | V  |
  1598. ;            |01|----+----------+-------+-------+-------+----|
  1599. ;  PT3.0     |  |VIL |输入低电平|       |  0.7  |       | V  |
  1600. ;            |--+----+----------+-------+-------+-------+----|
  1601. ;            |  |VIH |输入高电平|       |Vdd-0.7|       | V  |
  1602. ;            |10|----+----------+-------+-------+-------+----|
  1603. ;            |  |VIL |输入低电平|       |Vdd-0.7|       | V  |
  1604. ;            |--+----+----------+-------+-------+-------+----|
  1605. ;            |  |VIH2|输入高电平|0.5Vdd |       |       | V  |
  1606. ;            |11|----+----------+-------+-------+-------+----|
  1607. ;            |  |VIL2|输入低电平|       |       |0.2Vdd | V  |
  1608. ;             -----------------------------------------------
  1609. ;bit3:P30REFEN        0=关闭内部基准
  1610. ;                1=打开内部基准
  1611. ;====================================================================

  1612. ;====================================================================
  1613. ;定时器0配置,相关寄存器为:INTF/INTE/TM0CON/TM0IN/TM0CNT
  1614. ;TM0CON:
  1615. ;bit7(T0EN):0=禁止定时器0;        1=使能定时器0
  1616. ;bit6~4(T0RATE2:0):定时器0时钟分频选择
  1617. ;        000=CKT0        001=CKT0/2        010=CKT0/4        011=CKT0/8
  1618. ;        100=CKT0/16        101=CKT0/32        110=CKT0/64        111=CKT0/128
  1619. ;bit3:未定义
  1620. ;bit2:(T0RSTB):定时器0复位        0=使能定时器0复位        1=禁止定时器0复位
  1621. ;bit1~0(T0SEL[1:0]):时钟源选择        00=CPUCLK
  1622. ;                                01=MCK
  1623. ;                                10=外部32768Hz晶振时钟
  1624. ;                                11=内部32768 WDT时钟
  1625. ;TM0IN:定时器0溢出值
  1626. ;TM0CNT:定时器0计数寄存器
  1627. ;====================================================================
  1628. ifdef _DEBUG_
  1629. ;{
  1630.         movlw        0x20
  1631.         movwf        tm0con
  1632.         movlw        103                                ;9600bps
  1633.         movwf        tm0in
  1634. ;}
  1635. else
  1636. ;{
  1637.         movlw        SYS_BAS_CLK
  1638.         movwf        tm0con
  1639.         movlw        SYS_BAS_CNT
  1640.         movwf        tm0in
  1641. ;}
  1642. endif
  1643.         bcf        t0rstb
  1644.         bsf        t0en
  1645.         bsf        tm0ie

  1646. ;====================================================================
  1647. ;定时/计数器2配置,相关寄存器为:INTF/INTE/TM2CON/TM2IN/TM2CNT/TM2R
  1648. ;/TM2INH/TM2CNTH/TM2RH/TMCON/TMCON2
  1649. ;TM2CON:
  1650. ;;bit7(T2EN):0=禁止定时器2;        1=使能定时器2
  1651. ;bit6~4(T2RATE2:0):定时器2时钟分频选择
  1652. ;        000=CKT2        001=CKT2/2        010=CKT2/4        011=CKT2/8
  1653. ;        100=CKT2/16        101=CKT2/32        110=CKT2/64        111=CKT2/128
  1654. ;bit3:T2CKS
  1655. ;        1=PT3.0做为时钟源        0=CKT2的分频时钟做为时钟源
  1656. ;bit2:(T2RSTB):定时器2复位        0=使能定时器2复位        1=禁止定时器2复位
  1657. ;bit1:T2OUT        PT1.4口输出控制        PWM2PO        PWM2OUT        T2OUT        
  1658. ;bit0:PWM2OUT                        0        0        0        IO输出
  1659. ;                                0        0        1        蜂鸣器输出
  1660. ;                                0        1        0        PWM2输出
  1661. ;                                0        1        1        PWM2输出
  1662. ;                                1        x        x        IO输出
  1663. ;TM2IN:        定时器2溢出值
  1664. ;TM2CNT:定时器2计数寄存器
  1665. ;TM2R:        定时/计数器2的PWM高电平占空比控制寄存器
  1666. ;TM2INH:定时/计数器2溢出值高4位
  1667. ;TM2CNTH:定时/计数器2计数寄存器高4位
  1668. ;TM2RH        :定时/计数器2的PWM高电平占空比控制寄存器高4位
  1669. ;====================================================================
  1670.         bcf        t2sel1                                ;MCK做为时钟源
  1671.         bsf        t2sel0                                ;
  1672.         movlw        0x00                                ;1:1,关闭PWM2输出
  1673.         movwf        tm2con
  1674.         movlw        127
  1675.         movwf        tm2in                                ;125kHZ
  1676.         clrf        tm2inh
  1677.         clrf        tm2r
  1678.         clrf        tm2rh
  1679.         bcf        t2rstb
  1680.         bcf        pwm2po                                ;使能PT1.4口做为TM2的输出
  1681.         bsf        t2en

  1682. ;====================================================================
  1683. ;定时/计数器3配置,相关寄存器为:INTF2/INTE2/TM3CON/TM3IN/TM3CNT/TM3R
  1684. ;/TM3INH/TM3CNTH/TM3RH/TMCON/TM3CON2/TMCON2
  1685. ;TM3CON:
  1686. ;;bit7(T3EN):0=禁止定时器3;        1=使能定时器3
  1687. ;bit6~4(T3RATE2:0):定时器3时钟分频选择
  1688. ;        000=CKT3        001=CKT3/2        010=CKT3/4        011=CKT3/8
  1689. ;        100=CKT3/16        101=CKT3/32        110=CKT3/64        111=CKT3/128
  1690. ;bit3:T3CKS
  1691. ;        1=PT3.1做为时钟源        0=CKT3的分频时钟做为时钟源
  1692. ;bit2:(T3RSTB):定时器3复位        0=使能定时器3复位        1=禁止定时器3复位
  1693. ;bit1:T3OUT        PT1.5口输出控制        PWM3PO        PWM3OUT        T3OUT        
  1694. ;bit0:PWM3OUT                        0        0        0        IO输出
  1695. ;                                0        0        1        蜂鸣器输出
  1696. ;                                0        1        0        PWM3输出
  1697. ;                                0        1        1        PWM3输出
  1698. ;                                1        x        x        IO输出
  1699. ;TM3IN:        定时器3溢出值
  1700. ;TM3CNT:定时器3计数寄存器
  1701. ;TM3R:        定时/计数器3的PWM高电平占空比控制寄存器
  1702. ;TM3INH:定时/计数器3溢出值高4位
  1703. ;TM3CNTH:定时/计数器3计数寄存器高4位
  1704. ;TM3RH        :定时/计数器3的PWM高电平占空比控制寄存器高4位
  1705. ;====================================================================

  1706. ;====================================================================
  1707. ;定时/计数器4配置,相关寄存器为:INTF2/INTE/TM4CON/TM4IN/TM4CNT/TM4R
  1708. ;/TM4INH/TM4CNTH/TM4RH/TMCON/TMCON2
  1709. ;TM4CON:
  1710. ;;bit7(T4EN):0=禁止定时器4;        1=使能定时器4
  1711. ;bit6~4(T4RATE2:0):定时器4时钟分频选择
  1712. ;        000=CKT4        001=CKT4/2        010=CKT4/4        011=CKT4/8
  1713. ;        100=CKT4/16        101=CKT4/32        110=CKT4/64        111=CKT4/128
  1714. ;bit3:T4CKS
  1715. ;        1=PT1.4做为时钟源        0=CKT4的分频时钟做为时钟源
  1716. ;bit2:(T4RSTB):定时器4复位        0=使能定时器4复位        1=禁止定时器4复位
  1717. ;bit1:T4OUT        PT1.6口输出控制        PWM4PO        PWM4OUT        T4OUT        
  1718. ;bit0:PWM4OUT                        0        0        0        IO输出
  1719. ;                                0        0        1        蜂鸣器输出
  1720. ;                                0        1        0        PWM4输出
  1721. ;                                0        1        1        PWM4输出
  1722. ;                                1        x        x        IO输出
  1723. ;TM4IN:        定时器4溢出值
  1724. ;TM4CNT:定时器4计数寄存器
  1725. ;TM4R:        定时/计数器4的PWM高电平占空比控制寄存器
  1726. ;TM4INH:定时/计数器4溢出值高4位
  1727. ;TM4CNTH:定时/计数器4计数寄存器高4位
  1728. ;TM4RH        :定时/计数器4的PWM高电平占空比控制寄存器高4位
  1729. ;====================================================================
  1730.         
  1731. ;====================================================================
  1732.         bsf        tm0ie
  1733.         bsf        gie
  1734.         
  1735.         btfsc        to
  1736.         goto        lbAllDefaultSetEnd                ;看门狗复位时不初始化RAM
  1737. lbClrRam:
  1738.         ;--------清除RAM----------
  1739.         movlw        0x80
  1740.         movwf        fsr0
  1741. lbClrRamLoop:
  1742.         clrf        ind0
  1743.         incfsz        fsr0,F
  1744.         goto        lbClrRamLoop
  1745.         
  1746.         bsf        fRstRun
  1747.         call        fnInitSamp

  1748. lbPwrRstWait:
  1749.         btfss        fBat2ms
  1750.         goto        $-1
  1751.         bcf        fBat2ms
  1752.         incf        var1,F
  1753.         movfw        var1
  1754.         sublw        49                                ;50*2ms=100ms
  1755.         btfsc        c
  1756.         goto        lbPwrRstWait
  1757.         clrf        var1
  1758.         
  1759. ;====================================================================
  1760. ;IO口初始化部分(x代表1/3)
  1761. ;PTx............IO口寄存器
  1762. ;
  1763. ;PTxEN..........输入/输出控制寄存器:0=输入,1=输出
  1764. ;
  1765. ;PTxPU..........上拉电阻控制寄存器: 0=禁能,1=使能
  1766. ;
  1767. ;PT1CON[7...0]..见上描述
  1768. ;
  1769. ;PT3CON[7...0]..模拟/数字口使能控制:0=数字口        1=模拟口
  1770. ;
  1771. ;PT3OD[6.5].....PT3.6/PT3.5开漏设定:0=禁止开漏输出,1=使能开漏输出
  1772. ;
  1773. ;PT5[2...0]
  1774. ;
  1775. ;PT5EN[2...0]
  1776. ;
  1777. ;PT5PU[2...0]
  1778. ;
  1779. ;PT5CON[2...0]:bit2:        0=PT5.1禁止开漏输出,1=使能PT5.1开漏输出
  1780. ;               bit1:        0=PT5.0禁止开漏输出,1=使能PT5.1开漏输出
  1781. ;               bit0:        0=PT5.0为数字口,1=PT5.0为模拟口
  1782. ;
  1783. ;EX0CFG.........PT3.0口输入控制
  1784. ;bit7~bit6......PWMRL[1:0]:外部中断0触发模式        00=外部中断0不受PWM2/PWM3/PWM4影响
  1785. ;                                                01=外部中断0只受PWM2影响,只有在PWM2输出特定极性时有效
  1786. ;                                                10=外部中断0只受PWM3影响,只有在PWM3输出特定极性时有效
  1787. ;                                                11=外部中断0只受PWM4影响,只有在PWM4输出特定极性时有效
  1788. ;bit5...........POLSEL:外部中断0触发极性选择,只在PWMRL[1:0]不为00时有效
  1789. ;                0=PWM输出为高时外部中断0有效,PWM输出为低时,外部中断0被屏蔽
  1790. ;                1=PWM输出为低时外部中断0有效,PWM输出为高时,外部中断0被屏蔽
  1791. ;bit1~bit0......EX0FILT[1:0]:外部中断0滤波时间选择        00=滤波时间为0us
  1792. ;                                                        01=滤波时间为5us
  1793. ;                                                        10=滤波时间为10us
  1794. ;                                                        11=滤波时间为15us
  1795. ;
  1796. ;CURCON:端口输出电流选择寄存器
  1797. ;        bit7:        P36CUR        0=PT3.6输出电流Ioh/Iol为20mA/20mA@5V
  1798. ;                        1=PT3.6输出电流Ioh/Iol为54mA/57mA@5V
  1799. ;        bit6:        P35CUR        0=PT3.5输出电流Ioh/Iol为20mA/20mA@5V
  1800. ;                        1=PT3.5输出电流Ioh/Iol为54mA/57mA@5V
  1801. ;        bit5~4:P14CUR[1:0]        00=PT1.4输出电流Ioh/Iol为20mA/20mA@5V...\
  1802. ;                                01=PT1.4输出电流Ioh/Iol为54mA/57mA@5V... |com[0]为0时有效
  1803. ;                                1x=PT1.4输出电流Ioh/Iol为31mA/35mA@5V.../
  1804. ;        bit2~1:CURP17[1:0]        00=PT1.7输出电流Ioh/Iol为20mA/20mA@5V...\
  1805. ;                                01=PT1.7输出电流Ioh/Iol为1.5mA/20mA@5V...|com[3]为0时有效
  1806. ;                                1x=PT1.7输出电流Ioh/Iol为31mA/35mA@5V.../
  1807. ;
  1808. ;SYSCFG1:
  1809. ;        bit7:        PDP13        0=PT1.3不接下拉电阻
  1810. ;                        1=PT1.3接400K下拉电阻
  1811. ;        bit6:        PDP31        0=PT3.1不接下拉电阻
  1812. ;                        1=PT3.1接1K下拉电阻
  1813. ;        bit5:        PDP34        0=PT3.4不接下拉电阻
  1814. ;                        1=PT3.4接10K下拉电阻(默认)
  1815. ;        bit4:        PDP36        0=PT3.6不接下拉电阻
  1816. ;                        1=PT3.6接10K下拉电阻(默认)
  1817. ;        bit3~2:        CURP16        00=PT1.6输出电流Ioh/Iol为20mA/20mA@5V...\
  1818. ;                        01=PT1.6输出电流Ioh/Iol为1.3mA/20mA@5V...|com[2]为0时有效
  1819. ;                        1x=PT1.6输出电流Ioh/Iol为31mA/35mA@5V.../
  1820. ;        bit1~0:        CURP15        00=PT1.5输出电流Ioh/Iol为20mA/20mA@5V...\
  1821. ;                        01=PT1.5输出电流Ioh/Iol为1.3mA/20mA@5V...|com[1]为0时有效
  1822. ;                        10=PT1.5输出电流Ioh/Iol为2.6mA/20mA@5V...|
  1823. ;                        11=PT1.5输出电流Ioh/Iol为31mA/35mA@5V.../
  1824. ;====================================================================
  1825.         clrf        curcon                                ;关闭大电流
  1826.         clrf        syscfg1                                ;关闭内部下拉电阻
  1827.         
  1828.         movlw        0x00
  1829.         movwf        pt1
  1830.         movlw        00001000b
  1831.         movwf        pt1pu
  1832.         movlw        11110111b
  1833.         movwf        pt1en                                ;led1/motor/led2/pwm/key/led4/led3/x
  1834.         
  1835.         movlw        0x08
  1836.         movwf        pt3
  1837.         clrf        pt3pu
  1838.         movlw        01110001b
  1839.         movwf        pt3con
  1840.         movlw        10001100b                        ;x/bat2/cur/bat1/pwr/buz/hall/usb
  1841.         movwf        pt3en

  1842. lbFirstChkUsb:
  1843.         call        fnSelectUSBDc
  1844.         call        fnReadADC
  1845.         movlw        low(USB_3000MV)
  1846.         subwf        var2,W
  1847.         movlw        high(USB_3000MV)
  1848.         subwfc        var1,W
  1849.         btfss        c
  1850.         goto        lbNoUsbPlug

  1851. lbUsbPlugIn:        
  1852.         clrf        var4
  1853.         incf        var3,F
  1854.         movfw        var3
  1855.         sublw        10
  1856.         btfsc        c
  1857.         goto        lbFirstChkUsb
  1858.         clrf        volume
  1859.         goto        lbContinueInit

  1860. lbNoUsbPlug:
  1861.         clrf        var3
  1862.         incf        var4,F
  1863.         movfw        var4
  1864.         sublw        10
  1865.         btfsc        c
  1866.         goto        lbFirstChkUsb
  1867.         movlw        BAT_VOLUME_100
  1868.         movwf        volume

  1869. lbContinueInit:        
  1870. ;====================================================================
  1871. ;WDTCON
  1872. ;bit7(WDTEN)        :0=禁止WDT        1=使能WDT
  1873. ;bit2~0(WDTS)        :当WDTIN=0xFF时
  1874. ;                :000=2048ms        001=1024ms        010=512ms        011=256ms
  1875. ;                :100=128ms        101=64ms        110=32ms        111=16ms
  1876. ;====================================================================
  1877.         movlw        0x02
  1878.         movwf        wdtcon
  1879.         movlw        0xff
  1880.         movwf        wdtin
  1881.         bsf        wdten
  1882.         bcf        cst_wdt
  1883. lbAllDefaultSetEnd:
  1884.         return

  1885. ;******************************************************************************
  1886. ;【说明】:中断处理程序,T0做为系统时钟的定时基准,为2ms
  1887. ;******************************************************************************
  1888. intService:
  1889.         push
  1890.         btfss        tm0ie
  1891.         
  1892. …………
  1893. …………
  1894. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

全部资料51hei下载地址:
V0.0.111.zip (54.15 KB, 下载次数: 21)
果汁-V05.zip (1 MB, 下载次数: 20)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:535917 发表于 2019-5-12 09:22 | 只看该作者
原理图都没有
回复

使用道具 举报

板凳
ID:1090486 发表于 2023-8-8 16:51 | 只看该作者
能不能转换为8脚MCU的BIN代码 ?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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