📄 pic
字号:
SUBWF RTCC ,0
SKPNZ
GOTO CHULI
GOTO RECEIVE
TC15
MOVLW 19
SUBWF RTCC ,0
SKPNZ
GOTO CHULI
MOVLW 50
SUBWF RTCC ,0
SKPNZ
GOTO CHULI
MOVLW 88
SUBWF RTCC ,0
SKPNZ
GOTO CHULI
GOTO RECEIVE
CHULI
MOVF RTCC ,0 ;在一个时间点上不要多次增加级数,COUNT1记录了上次增加级数是的RTCC值
SUBWF COUNT1,0
SKPNZ
GOTO RECEIVE
MOVF RTCC ,0
MOVWF COUNT1
BSF RC,1
NOP
BCF RC,1
RECEIVE
BTFSS RA,2 ; RA2 为高电平则接受到声波
GOTO TIMEJS
NOP
NOP
NOP
BTFSS RA,2; 再次判断
GOTO TIMEJS
MOVF TIMECOUNT,W
SKPZ
GOTO RECEIVE1
MOVLW 138 ;138大概是9ms,也就是1.5m
SUBWF RTCC ,W
SKPNC
GOTO TIMEJS
RECEIVE1
INCF JSGS,F ;;如何把时间存下来???
BSF 4,5
BCF 4,6 ;选择BANK1
MOVLW 1
SUBWF JSGS,W
SKPZ
GOTO REJS2
MOVF RTCC,W
MOVWF 10
MOVF TIMECOUNT,W
MOVWF 11
GOTO TIMEJS
REJS2
MOVLW 2
SUBWF JSGS,W
SKPZ
GOTO REJS3
MOVF RTCC,W
MOVWF 12
MOVF TIMECOUNT,W
MOVWF 13
GOTO TIMEJS
REJS3
MOVLW 3
SUBWF JSGS,W
SKPZ
GOTO REJS4
MOVF RTCC,W
MOVWF 14
MOVF TIMECOUNT,W
MOVWF 15
GOTO TIMEJS
REJS4
MOVLW 4
SUBWF JSGS,W
SKPZ
GOTO REJS5
MOVF RTCC,W
MOVWF 16
MOVF TIMECOUNT,W
MOVWF 17
GOTO TIMEJS
REJS5
MOVLW 5
SUBWF JSGS,W
SKPZ
GOTO REJS5
MOVF RTCC,W
MOVWF 18
MOVF TIMECOUNT,W
MOVWF 19
GOTO TIMEJS
REJS6
MOVLW 6
SUBWF JSGS,W
SKPZ
GOTO REJS7
MOVF RTCC,W
MOVWF 01AH
MOVF TIMECOUNT,W
MOVWF 01BH
GOTO TIMEJS
REJS7
MOVLW 7
SUBWF JSGS,W
SKPZ
GOTO REJS8
MOVF RTCC,W
MOVWF 01CH
MOVF TIMECOUNT,W
MOVWF 01DH
GOTO TIMEJS
REJS8
MOVLW 8
SUBWF JSGS,W
SKPZ
GOTO TIMEJS ;如果超过8个怎么办? 就记录他最后一个了?????
MOVF RTCC,W
MOVWF 16
MOVF TIMECOUNT,W ;TIMECOUNT放在高位,RTCC放在低位
MOVWF 17
TIMEJS
MOVLW 255
SUBWF RTCC,0
SKPNZ
INCF TIMECOUNT ,1
MOVLW 16
SUBWF TIMECOUNT,0
SKPNZ
GOTO DATAOP
GOTO LOOPR1
----------------------------------------
DATAOP ;数据处理部分,将采集得到的数据,最终得出结果
MOVF JSGS ,W
MOVWF TEMP4
BSF 4,5
BSF 4,6 ;BANK3
OP0
MOVF TEMP4 ,W
SKPZ
GOTO OP1
MOVLW 0
MOVWF TEMP2 ;注意TEMP2 TEMP3在BANK3中
MOVWF TEMP3 ;TEMP2 TEMP3是得到最终结果
GOTO ENDOP
OP1 MOVLW 1
SUBWF TEMP4 ,W
SKPZ
GOTO OP2
MOVF 10,W
MOVWF TEMP2
MOVF 11,W
MOVWF TEMP3
GOTO ENDOP
OP2 ;得到两个及两个以上的结果
MOVF TEMP4 ,W
MOVWF COUNT1 ;COUNT1作为 循环变量
OP3
DECF COUNT1,F
MOVF COUNT1,F
SKPZ ;如果COUNT循环完,为0,则认为没有谐波
GOTO OPJS
MOVF TEMP4,W
MOVWF COUNT ;COUNT可以看做指针
DECF COUNT
RLF COUNT,F ; 左移一位,为找存储位置服务
MOVLW 10H
IORWF COUNT,F ;跟10H或操作
MOVF COUNT,W
MOVWF 4 ;放到F4中去
MOVF 0,W ;F0--》W中去 这里有问题吗?
MOVWF TEMP2
INCF COUNT,F
MOVF COUNT,W
MOVWF 4
MOVF 0,W
MOVWF TEMP3
GOTO ENDOP ;退出
OPJS
MOVF TEMP4,W
MOVWF COUNT ;COUNT可以看做指针
DECF COUNT
RLF COUNT,F ; 左移一位,为找存储位置服务
MOVLW 10H
IORWF COUNT,F ;跟10H或操作
MOVF COUNT,W
MOVWF 4 ;放到F4中去
MOVF 0,W ;F0--》W中去 这里有问题吗?
MOVWF TEMP2
INCF COUNT,F
MOVF COUNT,W
MOVWF 4
MOVF 0,W
MOVWF TEMP3
MOVF COUNT1,W
MOVWF COUNT
DECF COUNT
RLF COUNT,F
MOVLW 10H
IORWF COUNT,F
MOVF COUNT,W
MOVWF 4
MOVF 0,W ;f0的内容
MOVWF TEMP0
INCF COUNT,F
MOVF COUNT,W
MOVF 0,W
MOVF TEMP1
RLF TEMP1 ;TEMP1*2 看是否是2次谐波
RLF TEMP0 ;temp0记录的是RTCC
BTFSS STATUS ,C
GOTO OP4
INCF TEMP1,F
OP4
MOVF TEMP1
SUBWF TEMP3,W
SKPZ
GOTO OP3
MOVF TEMP0
SUBWF TEMP2,W
MOVWF TEMP0 ;将他们的差值放在TEMP0中合适吗
MOVLW 3
SUBWF TEMP0
TEFSS STATUS,C ;TEMP0-3 如果有借位说明是有谐波的!
GOTO OP3 ;3没有借位说明再对 1234 8 在对2进行判断
DECF TEMP4 ,F
GOTO OP1 ;1234 8 8已经有谐波了,再对7进行判断重新开始
ENDOP
GOTO CALRESULT ;计算结果
-------------------------------------------------------------------------------------
JSMS ;计算米数的函数 TEMP5 TEMP6是接受参数,TEMP6=TIMECOUNT TMEP5=RTCC
;TEMP7 TEMP8 TEMP9 TEMP10 TEMP11 是结果(5 BYTE)
MOVLW 0
MOVWF TEMP11
MOVWF TEMP10
MOVWF TEMP9
MOVWF TEMP8
MOVWF TEMP7
JSTESTTEMP6
MOVF TEMP6 ;最大误差0.004
SKPNZ
GOTO JSTESTTEMP5
DECF TEMP6,F
MOVLW 5
ADDWF TEMP11 ,F
MOVLW 8
ADDWF TEMP10,F
MOVLW 7
ADDWF TEMP9
MOVLW 2
ADDWF TEMP8
GOTO JSTESTTEMP6
JSTESTTEMP5
MOVLW 200 ;+2.176
SUBWF TEMP5,W
SKPNC ;没有借位说明>=200
GOTO JST5100
MOVLW 6
ADDWF TEMP11,F
MOVLW 7
ADDWF TEMP10,F
MOVLW 1
ADDWF TEMP9
MOVLW 2
ADDWF TEMP8
MOVLW 200
SUBWF TEMP5,F
GOTO JST590 ;>90?
JST5100
MOVLW 100 ;+1.088
SUBWF TEMP5,W
SKPNC ;没有借位说明>=100
GOTO JST590
MOVLW 8
ADDWF TEMP11,F
MOVLW 8
ADDWF TEMP10,F
MOVLW 0
ADDWF TEMP9
MOVLW 1
ADDWF TEMP8
MOVLW 100
SUBWF TEMP5,F
JST590 ; 处理完百位后,处理十位 有一个,就加0.109 (最大误差0.003)
MOVLW 10
SUBWF TEMP5,W
SKPNC
GOTO JST59
INCF TEMP9,F
MOVLW 9
ADDWF TEMP11
MOVLW 10
SUBWF TEMP5,F
GOTO JST590
JST59 ;有一个,就加0.011 误差0.001
MOVF TEMP5
SKPNZ
GOTO JSTZ
DECF TEMP5,F
INCF TEMP11
INCF TEMP10
GOTO JST59
JSTZ ; JSTZ 调整成0---9 ,不要出现TEMP>9
JSTZ1
MOVLW 10
SUBWF TEMP11,W
SKPNC ;没有借位说明大于9,要调整
GOTO JSTZ2
MOVLW 10
SUBWF TEMP11,F
INCF TEMP10
GOTO JSTZ1
JSTZ2
MOVLW 10
SUBWF TEMP10,W
SKPNC
GOTO JSTZ3
MOVLW 10
SUBWF TEMP10,F
INCF TEMP9
GOTO JSTZ2
JSTZ3
MOVLW 10
SUBWF TEMP9,W
SKPNC
GOTO JSTZ4
MOVLW 10
SUBWF TEMP11,F
INCF TEMP8
GOTO JSTZ3
JSTZ4
MOVLW 10
SUBWF TEMP8,W
SKPNC
GOTO JSTZEND
MOVLW 10
SUBWF TEMP8,F
INCF TEMP7
GOTO JSTZ8
JSTZEND
RETLW 0
CONVERT2 MOVWF PC ;共阳数码管显示???
TABLE2 RETLW C0H ;0
RETLW F9H ;1
RETLW A4H ;2
RETLW B0H ;3
RETLW 99H ;4
RETLW 92H ;5
RETLW 82H ;6
RETLW F8H ;7
RETLW 80H ;8
RETLW 90H ;9
CALRESULT ;得到的结果放在TEMP2 TEMP3中,现在要把它们转化为show1 show2 show3 show4
;另外还要计算出LIGHT1 LIGHT2 LIGHT3 LIGHT4 LIGHT5
MOVF TEMP2 ,W ;如果没有结果,则TEMP2,TEMP3为0
MOVWF TEMP5
MOVF TEMP3
MOVWF TEMP6
CALL JSMS
MOVLW TABLE2 ; 最高位
MOVWF COUNT
MOVF TEMP7,W
ADDWF COUNT,W
CALL CONVERT2
MOVWF SHOW1
MOVLW TABLE2 ; 次高位
MOVWF COUNT
MOVF TEMP8,W
ADDWF COUNT,W
CALL CONVERT2
MOVWF SHOW2
MOVLW TABLE2 ; 3位
MOVWF COUNT
MOVF TEMP9,W
ADDWF COUNT,W
CALL CONVERT2
MOVWF SHOW3
MOVLW TABLE2 ; 4位
MOVWF COUNT
MOVF TEMP10,W
ADDWF COUNT,W
CALL CONVERT2
MOVWF SHOW4
MOVLW 0
MOVWF LIGHT1
MOVWF LIGHT2
MOVWF LIGHT3
MOVWF LIGHT4
MOVWF LIGHT5
MOVF JSGS,W
MOVWF COUNT
JSLIGHT
DECF COUNT ;COUNT--
MOVF COUNT,W
MOVWF COUNT1
RLF COUNT1,F
MOVLW 10H
IORWF COUNT1,F
MOVF COUNT1,W
MOVWF 4 ;F4
MOVF 0,W ;F0
MOVWF TEMP5
INCF COUNT1
MOVF COUNT1,W
MOVWF 4
MOVF 0,W
MOVWF TEMP6
CALL JSMS ;返回 TEMP7 TEMP8 TEMP9 TEMP10
MOVF TEMP7,W
MOVWF TEMP0
RLF TEMP0,F
RLF TEMPO,F
RLF TEMP0,F
MOVF TEMP7,W
ADDWF TEMP0,W
ADDWF TEMP7 ;TEMP7*10=TEMP7
MOVF TEMP8,W
ADDWF TEMP7,F ;TEMP7*10+TEMP8--》TEMP7
MOVLW 1
MOVWF TEMP0 ;TEMP0 为哪个LIGHT
MOVLW 1
MOVWF TEMP8 ;为哪个灯
JSL00P1
MOVLW 8
SUBWF TEMP7,W
SKPNC
GOTO JSLOOP2
MOVLW 8
SUBWF TEMP7,F
INCF TEMP0
GOTO JSLOOP1
JSLOOP2
DECF TEMP7,F
SKPNZ
GOTO JSLOOP3
RLF TEMP8
GOTO JSLOOP2
JSLOOP3
MOVLW 5
SUBWF TEMP0
SKPZ
GOTO JSLOOP4
MOVF TEMP8,W
IORWF LIGHT5
GOTO JSLOOP8
JSLOOP4
MOVLW 4
SUBWF TEMP0
SKPZ
GOTO JSLOOP5
MOVF TEMP8,W
IORWF LIGHT4
GOTO JSLOOP8
JSLOOP5
MOVLW 3
SUBWF TEMP0
SKPZ
GOTO JSLOOP6
MOVF TEMP8,W
IORWF LIGHT3
GOTO JSLOOP8
JSLOOP6
MOVLW 2
SUBWF TEMP0
SKPZ
GOTO JSLOOP7
MOVF TEMP8,W
IORWF LIGHT2
GOTO JSLOOP8
JSLOOP7
MOVLW 1
SUBWF TEMP0
SKPZ
GOTO JSLOOP8
MOVF TEMP8,W
IORWF LIGHT1
JSLOOP8
MOVF COUNT,F
SKPZ ;COUNT==0? YES 退出
GOTO JSLIGHT
JSEND
GOTO SHOWALL
--------------------------------------------------------------------------------------
SHOWALL ;显示结果0.75s,在这个过程中,监视手动级数的变化
CLRF RTCC
MOVLW 45
MOVWF TIMECOUNT
LOOPSHOW
MOVF SHOW1,W
MOVWF RB
BCF RC,4
BSF RC,5
BSF RC,6
BCF RC,7
CALL DELAY1MS
MOVF SHOW2,W
MOVWF RB
BCF RC,4
BSF RC,5
BSF RC,6
BSF RC,7
CALL DELAY1MS
MOVF SHOW3,W
MOVWF RB
BSF RC,4
BCF RC,5
BCF RC,6
BCF RC,7
CALL DELAY1MS
MOVF SHOW4 ,W
MOVWF RB
BSF RC,4
BCF RC,5
BCF RC,6
BSF RC,7
CALL DELAY1MS
MOVF LIGHT1,W
MOVWF RB
BCF RC,4
BCF RC,5
BCF RC,6
BCF RC,7
CALL DELAY1MS
MOVF LIGHT2,W
MOVWF RB
BCF RC,4
BCF RC,5
BCF RC,6
BSF RC,7
CALL DELAY1MS
MOVF LIGHT3,W
MOVWF RB
BCF RC,4
BCF RC,5
BSF RC,6
BCF RC,7
CALL DELAY1MS
MOVF LIGHT4,W
MOVWF RB
BCF RC,4
BCF RC,5
BSF RC,6
BSF RC,7
CALL DELAY1MS
MOVF LIGHT5,W
MOVWF RB
BCF RC,4
BSF RC,5
BCF RC,6
BCF RC,7
CALL DELAY1MS
MOVF LIGHT6,W
MOVWF RB
BCF RC,4
BSF RC,5
BCF RC,6
BSF RC,7
CALL DELAY1MS
;是否增加/减少手动级数
TEFSS RC,3
GOTO TEST
CALL DELAY1MS
TEFSS RC,3
GOTO TESTRC2
MOVF TIMECOUNT,W
SUBWF COUNT,W
MOVWF TEMP0,F ;差直放在TEMP0中
MOVLW 20
SUBWF TEMP0 ;TEMP0 - 20
SKPNC
GOTO TESTRC2
INCF SDJS
MOVLW 45 ;重新记时
MOVWF TIMECOUNT
MOVWF COUNT
MOVLW 4 ;<=4
SUBWF SDJS,W
SKPNC
GOTO TESTRC2
MOVLW 4
MOVWF SDJS
TESTRC2
TEFSS RC,2
GOTO ENDTEST
CALL DELAY1MS
TEFSS RC,2
GOTO ENDTEST
MOVF TIMECOUNT,W
SUBWF COUNT,W
MOVWF TEMP0,F ;差直放在TEMP0中
MOVLW 20
SUBWF TEMP0 ;TEMP0 - 20
SKPNC
GOTO ENDTEST
DECF SDJS ,F
MOVLW 45 ;重新记时
MOVWF TIMECOUNT
MOVWF COUNT
MOVF SDJS,F
SKPZ
GOTO ENDTEST
MOVLW 1
MOVWF SDJS
ENDTEST
MOVLW 255
SUBWF RTCC,W
SKPZ
GOTO RT
DECF TIMECOUNT
RT
MOVLW TIMECOUNT
SKPZ
GOTO LOOPSHOW
GOTO SENDWAVE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -