久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3035|回復: 2
收起左側

果汁機的單片機源程序與PCB設計資料

[復制鏈接]
ID:386239 發表于 2018-8-14 16:02 | 顯示全部樓層 |閱讀模式
水果機硬件與軟件,共享
Altium Designer畫的果汁機電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png

芯海單片機源程序如下:
  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)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区不卡 | 国产原创在线观看 | 欧美亚洲视频在线观看 | 国产成人免费视频 | 国产精品一区二区视频 | 毛片免费观看 | 国产一区二区三区在线免费 | 日本激情一区二区 | 国产91久久久久久 | 欧美精品一区二区三区在线 | 欧美激情区| 国产欧美日韩精品一区二区三区 | 亚洲一区 中文字幕 | 日本免费小视频 | 国产日韩欧美精品 | 久草资源在线视频 | 国产精品精品视频一区二区三区 | 91tv在线观看 | 欧美性大战久久久久久久蜜臀 | 亚洲人成网亚洲欧洲无码 | 国产精品久久久久久久久久久久久 | 亚洲瑟瑟 | 午夜a区| 中文字幕成人免费视频 | 97超碰在线免费 | 不卡一区二区三区四区 | 九九热在线免费观看 | 久久精品二区 | 国产一区二区三区在线视频 | 精品国产乱码久久久久久图片 | 国产免费a视频 | 亚洲成人国产综合 | 精品久久久久久 | 国产伦精品一区二区三区照片91 | 插插宗合网 | 黄色一级免费 | 国产精品久久久久久久久久免费看 | 一区二区三区高清在线观看 | 天天拍天天操 | 欧美一区二区三区在线播放 | 亚洲图片视频一区 |