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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3337|回復: 0
打印 上一主題 下一主題
收起左側(cè)

超聲波報警系統(tǒng)+51單片機+keil+匯編語言程序詳細注釋

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:782150 發(fā)表于 2020-6-17 15:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
4個超聲波,在顯示里由abcd代替,設(shè)置里調(diào)整報警臨界值,離得越近報警速度越快



程序如下
TXQ        EQU        P1.0                ;超聲波接口
RXQ        EQU P1.1
TXH        EQU        P1.2
RXH        EQU P1.3
TXZ        EQU P1.4
RXZ        EQU P1.5
TXY        EQU P1.6
RXY        EQU P1.7

FRON EQU P2.4
BEHD EQU P2.5
LEFT EQU P2.6
RIGT EQU P2.7

KSET        EQU P3.0        ;按鍵接口
KADD        EQU P3.1
KSUB        EQU P3.2
FMQ                EQU P3.7

SCAN        EQU 30H                ;顯示位控變量
SETH        EQU 31H                ;門限百位
SETM        EQU 32H                ;門限十位
SETL        EQU 33H                ;門限個位
DIS_NO        EQU 34H                ;超聲波編號
CNT                EQU 35H                ;中斷計數(shù)
DIS_NUM        EQU 36H                ;顯示區(qū)編號(對應(yīng)超聲波編號)
DIS_CNT        EQU 37H                ;用于控制顯示切換速度
TMP_H        EQU 38H                ;測時距離暫存高
TMP_M        EQU 39H                ;測時距離暫存中
TMP_L        EQU 3AH                ;測時距離暫存低
TMP_HO        EQU 3BH                ;比較時距離高
TMP_MO        EQU 3CH                ;比較時距離中
TMP_LO        EQU 3DH                ;比較時距離低
BEEP_F        EQU 3EH                ;響聲頻次,越大頻率越低
BEEP_C        EQU 3FH                ;響聲計數(shù)
DISBUF        EQU 40H                ;顯示緩沖區(qū)
POS_NUM        EQU 50H                ;設(shè)置位置
        
DOT                BIT 00H                ;有無小數(shù)點
FLAG        BIT 01H                ;溢出標志
TFLAG        BIT 02H                ;200ms時間標志
SETFLAG        BIT 03H                ;設(shè)置狀態(tài)標志
ALMFLAG        BIT 04H                ;報警標志
FLASH        BIT 05H                ;閃爍狀態(tài)
FLASHH        BIT 06H                ;1=高位閃爍
FLASHM        BIT 07H                ;1=中位閃爍
FLASHL        BIT 08H                ;1=低位閃爍
;-------------------------------------------------------
        ORG 0000H
        LJMP MAIN
        ORG 000BH
        LJMP T0ISR
        ORG 001BH
        LJMP T1ISR
        ORG 0030H
;-------------------------------------------------------
MAIN:
        MOV TMOD,#11H        ;定時器設(shè)置為模式1
        MOV TH0,#0
        MOV TL0,#0
        MOV TH1,#0F0H        ;4毫秒定時
        MOV TL1,#60H
        SETB ET0                ;開定時器0中斷
        SETB ET1                ;開定時器1中斷
        SETB TR1                ;啟動定時器1
        SETB EA                        ;開總中斷
        MOV SETH,#1                ;缺省門限150cm
        MOV SETM,#5
        MOV SETL,#0
        
        MOV SCAN,#0                ;初始化一些變量
        MOV CNT,#0
        MOV DIS_NO,#0
        CLR TFLAG
LOOP:
        LCALL KEYSCAN                ;掃描按鍵
        JNB TFLAG,LOOP                ;200毫秒定時未到,等待
        JB SETFLAG,LOOP                ;如果是設(shè)置狀態(tài)轉(zhuǎn)LOOP
LOOP1:
        CLR TFLAG                        ;清定時標志
//        LCALL DIST_Q                ;測前方距離
//        LCALL DIST_H                ;測后方距離
//        LCALL DIST_Z                ;測左前距離
//        LCALL DIST_Y                ;測右前距離
        

L1:JB FRON,L2
   LCALL DELAYUS
   JB FRON,L2
   LCALL DIST_Q
L2:JB BEHD,L3
   LCALL DELAYUS
   JB BEHD,L3
   LCALL DIST_H
L3:JB LEFT,L4
   LCALL DELAYUS
   JB LEFT,L4
   LCALL DIST_Z
L4:JB RIGT,LOOP
   LCALL DELAYUS
   JB RIGT,LOOP
   LCALL DIST_Y
   SJMP LOOP
;-------------------------------------------------------
;報警控制
ALARM:
        JB ALMFLAG,ALARM1        ;有報警轉(zhuǎn)報警處理
        SETB FMQ                        ;蜂鳴器置1
        RET
ALARM1:
        INC BEEP_C                        ;計數(shù)變量加1
        MOV A,BEEP_C
        CJNE A,BEEP_F,ALARM2        ;與當前距離對應(yīng)頻次數(shù)比較
ALARM2:
        JC ALARM3                                ;小于則返回
        MOV BEEP_C,#0                        ;否則清計數(shù)變量
        CPL FMQ                                        ;蜂鳴器反向
ALARM3:
        RET
;-------------------------------------------------------
KEYSCAN:
        JB KSET,KSCANA                        ;設(shè)置鍵未按下轉(zhuǎn)
        LCALL DELAY                                ;延時去抖
        JB KSET,KSCANA                        ;再判斷一次
        JNB KSET,$                                ;等待按鍵抬起
        INC POS_NUM                                ;位置變量加1
        MOV A,POS_NUM                        
        MOV B,#4                                ;0到3之間切換
        DIV AB
        MOV POS_NUM,B
        MOV A,B
        CJNE A,#0,KSCANF1
        CLR SETFLAG                                ;位置變量為0,清設(shè)置標志,退出
        RET
KSCANF1:
        CJNE A,#1,KSCANF2                ;為1,個位閃爍
        SETB FLASHL
        CLR FLASHM
        CLR FLASHH
        SETB SETFLAG
        RET
KSCANF2:
        CJNE A,#2,KSCANF3                ;為2,十位閃爍
        SETB FLASHM
        CLR FLASHH
        CLR FLASHL
        SETB SETFLAG
        RET
KSCANF3:
        SETB FLASHH                                ;為3,百位閃爍
        CLR FLASHM
        CLR FLASHL
        SETB SETFLAG
        RET
KSCANA:
        JB KADD,KSCANS                        ;加鍵
        LCALL DELAY
        JB KADD,KSCANS
        JNB KADD,$
        MOV A,POS_NUM
        DEC A
        JNZ KSCANA1
        INC SETL                                ;位置變量為1,個位加1
        MOV A,SETL
        MOV B,#10
        DIV AB
        MOV SETL,B
        RET
KSCANA1:
        DEC A
        JNZ KSCANA2
        INC SETM                                ;位置變量為2,十位加1
        MOV A,SETM
        MOV B,#10
        DIV AB
        MOV SETM,B
        RET
KSCANA2:
        INC SETH                                ;位置變量為3,百位加1
        MOV A,SETH
        MOV B,#3
        DIV AB
        MOV SETH,B
        RET
KSCANS:
        JB KSUB,KSCANR                        ;減鍵
        LCALL DELAY
        JB KSUB,KSCANR
        JNB KSUB,$
        MOV A,POS_NUM
        DEC A
        JNZ KSCANS1
        DEC SETL                                ;位置變量為1,個位減1
        MOV A,SETL
        JNB ACC.7,KSCANR
        MOV SETL,#9
        RET
KSCANS1:
        DEC A
        JNZ KSCANS2
        DEC SETM                                ;位置變量為2,十位減1
        MOV A,SETM
        JNB ACC.7,KSCANR
        MOV SETM,#9
        RET
KSCANS2:
        DEC SETH                                ;位置變量為3,百位減1
        MOV A,SETH
        JNB ACC.7,KSCANR
        MOV SETH,#2
KSCANR:
        RET
;-------------------------------------------------------
;前方測距
DIST_Q:
        MOV TH0,#0                ;初始值為0
        MOV TL0,#0
        SETB TXQ                ;拉高TXQ
        LCALL DELAYUS        ;延時20us左右
        CLR TXQ                        ;拉低TX
        JNB RXQ,$                ;等待RXQ變高
        SETB TR0                ;啟動定時器0
        JB RXQ,$                ;等待RXQ變低
        CLR TR0                        ;關(guān)閉定時器0
        MOV DIS_NO,#0        ;超聲波編號為0
        LCALL COUNT                ;計算距離
        RET
;-------------------------------------------------------
;后方測距
DIST_H:
        MOV TH0,#0
        MOV TL0,#0
        SETB TXH               
        LCALL DELAYUS
        CLR TXH
        JNB RXH,$                ;等待RXH變高
        SETB TR0
        JB RXH,$                ;等待RXH變低
        CLR TR0
        MOV DIS_NO,#1        ;超聲波編號為1
        LCALL COUNT
        RET
;-------------------------------------------------------
;左方測距
DIST_Z:
        MOV TH0,#0
        MOV TL0,#0
        SETB TXZ
        LCALL DELAYUS
        CLR TXZ
        JNB RXZ,$                ;等待RXZ變高
        SETB TR0
        JB RXZ,$                ;等待RXZ變低
        CLR TR0
        MOV DIS_NO,#2        ;超聲波編號為2
        LCALL COUNT
        RET
;-------------------------------------------------------
;右方測距
DIST_Y:
        MOV TH0,#0
        MOV TL0,#0
        SETB TXY
        LCALL DELAYUS
        CLR TXY
        JNB RXY,$                ;等待RXY變高
        SETB TR0
        JB RXY,$                ;等待RXY變低
        CLR TR0
        MOV DIS_NO,#3        ;超聲波編號為3
        LCALL COUNT
        RET
;-------------------------------------------------------
;延時20us
DELAYUS:
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        RET
;-------------------------------------------------------
;T1中斷程序
T1ISR:
        PUSH ACC                ;保護現(xiàn)場
        PUSH B
        PUSH PSW
        PUSH 00H
        CLR TR1
        MOV TH1,#0F0H        ;4ms
        MOV TL1,#60H
        SETB TR1
        INC CNT
        MOV A,CNT
        CJNE A,#50,T1COMP        ;200ms測一次
T1COMP:
        JC T1RE
        MOV CNT,#0
        SETB TFLAG                        ;置時間到標志
        CPL FLASH                        ;閃爍控制取反
        LCALL ALARM                        ;報警控制
//        INC DIS_CNT                        ;變量加1,這個變量控制顯示切換速度
//        MOV A,DIS_CNT
//        MOV B,#5                        ;這里為5,也就是1秒切換一次
//        DIV AB                                ;控制顯示切換變量/5
//        MOV DIS_CNT,B                ;余數(shù)傳給控制顯示變量
//        MOV A,B                                ;余數(shù)傳給A
//        JNZ T1RE                        ;余數(shù)不為0,則跳轉(zhuǎn)
//        INC DIS_NUM                        ;顯示的超聲波設(shè)備編號+1
//        MOV A,DIS_NUM
//        MOV B,#4
//        DIV AB                                ;超聲波編號/4
//        MOV DIS_NUM,B                ;將超聲波編號/4的結(jié)果的余數(shù)傳給超聲波編號,意在使超聲波編號在0~3之間循環(huán)
T1RE:
        JB SETFLAG,T1RE1        ;如果是設(shè)置狀態(tài)轉(zhuǎn)
        LCALL DISPLAY                ;非設(shè)置狀態(tài)顯示
        SJMP T1RE2
T1RE1:
        LCALL DIS_SET                ;設(shè)置狀態(tài)顯示
T1RE2:
        POP 00H                                ;恢復現(xiàn)場
        POP PSW
        POP B
        POP ACC
        RETI
;-------------------------------------------------------
;T0中斷程序,表示距離溢出
T0ISR:
        SETB FLAG                        ;溢出
        RETI
;-------------------------------------------------------
COUNT:
        MOV R3,TH0                        ;去定時器結(jié)果
        MOV R4,TL0
        MOV R7,#17                        ;乘以17
        LCALL NMUL21
        MOV R7,#100                        ;除以(100*10)得到厘米數(shù)
        LCALL NDIV31
        MOV R7,#10
        LCALL NDIV31
;以下處理數(shù)據(jù)將,標號以及計算結(jié)果變?yōu)榘偈畟位存入緩沖區(qū)
;前:DISBUF+0,DISBUF+1,DISBUF+2,DISBUF+3        
;后:DISBUF+4,DISBUF+5,DISBUF+6,DISBUF+7        
;左:DISBUF+8,DISBUF+9,DISBUF+10,DISBUF+11        
;右:DISBUF+12,DISBUF+13,DISBUF+14,DISBUF+15        
        MOV R0,#DISBUF          ;顯示的首地址送R0
        MOV A,DIS_NO          ;把超聲波的編號送A
        MOV B,#4                  ;把4送B
        MUL AB                          ;超聲波的編號*4
        ADD A,R0                  ;超聲波的編號*4的結(jié)果的低位+顯示數(shù)據(jù)的首地址,可得出相對應(yīng)的超聲波存放顯示數(shù)據(jù)的首地址
        MOV R0,A                  ;將地址傳給R0                                                  
        MOV A,#10                  ;把10送A
        ADD A,DIS_NO          ;每個區(qū)段的首位分別是A,B,C,D
        MOV @R0,A                  ;將要顯示的首位送到對應(yīng)地址中
        INC R0                          ;地址+1
;計算結(jié)果與700(02BCH)比較,大于它則溢出
        MOV A,R4                  ;將計算結(jié)果的低位傳給A
        CLR C                          
        SUBB A,#0BCH          ;用  計算結(jié)果的低位—700的十六進制數(shù)的低位  ,差傳給A
        MOV A,R3              ;將計算結(jié)果的高位傳給A
        SUBB A,#2                  ;用  計算結(jié)果的高位—700的十六進制數(shù)的高位  ,差傳給A
        JNC C_ERR                  ;若cy為0,則表示計算結(jié)果大于700,顯示"----"
        JB FLAG,C_ERR          ;若溢出標志為1,則顯示"----"
;求百十個位并存儲在相應(yīng)位置        
        MOV R7,#10                        ;將10傳給R7
        LCALL NDIV31                ;調(diào)用除法子程序,計算結(jié)果/10
        PUSH 07H                        ;將余數(shù),即計算結(jié)果個位數(shù)入棧
        MOV R7,#10                        ;
        LCALL NDIV31
        PUSH 07H                    ;將余數(shù),即計算結(jié)果十位數(shù)入棧
        MOV R7,#10
        LCALL NDIV31
        MOV A,R7                        ;將余數(shù),即計算結(jié)果百位數(shù)傳給A
        MOV @R0,A                        ;百位數(shù)傳到相應(yīng)地址
        MOV TMP_H,A                        ;百位數(shù)存入暫存地址
        POP ACC                                ;十位數(shù)出棧
        INC R0                                ;地址+1
        MOV @R0,A                        ;十位數(shù)傳到地址
        MOV TMP_M,A                        ;十位數(shù)存入暫存地址
        POP ACC                                ;個位數(shù)出棧
        INC R0                                ;地址+1
        MOV @R0,A                        ;個位數(shù)傳到地址
        MOV TMP_L,A                        ;個位數(shù)傳到暫存地址
        LCALL COMPLIMT        ;報警預處理
        RET
C_ERR:                                ;溢出則顯示---
        MOV A,#10H                ;將數(shù)字16傳給A,代表的是數(shù)據(jù)表中的"-"
        MOV @R0,A                ;R0為各傳感器顯示數(shù)值的地址
        INC R0
        MOV @R0,A
        INC R0
        MOV @R0,A
        CLR FLAG                ;溢出標志清0
        RET
;-------------------------------------------------------
;取一次測出的四個方向距離的最小值和臨界值比較
COMPLIMT:        
        MOV A,DIS_NO                ;送超聲波編號到A
        ;JNZ COMPLT1                        ;非前方超聲波則跳轉(zhuǎn)
        MOV TMP_HO,TMP_H        ;前方距離送中間變量
        MOV TMP_MO,TMP_M
        MOV TMP_LO,TMP_L
//COMPLT1:                                ;比較變量與四組數(shù)據(jù)比較求最小值
//        CLR C
//        MOV A,TMP_LO                ;
//        SUBB A,TMP_L                ;比較變量低位-實測距離低位
//        MOV A,TMP_MO
//        SUBB A,TMP_M                ;比較變量中位-實測距離中位-cy
//        MOV A,TMP_HO
//        SUBB A,TMP_H                ;比較變量高位-實測距離高位-cy
//        JC COMPLT2                        ;比較變量>實測距離值,跳轉(zhuǎn)
//        MOV TMP_HO,TMP_H        ;比較變量<實測距離值,實測距離值->比較值
//        MOV TMP_MO,TMP_M
//        MOV TMP_LO,TMP_L
//COMPLT2:
//        MOV A,DIS_NO                ;將超聲波編號傳給A
//        CJNE A,#3,COMPLT3        ;編號<3,cy=1,往下執(zhí)行。 若編號=3,cy=0,跳轉(zhuǎn)
COMPLT3:                                ;到最后一組數(shù)據(jù),那么比較變量與臨界值比較
        ;JC COMPLTR                        ;cy=1,即編號<3,跳轉(zhuǎn)
        CLR C
        MOV A,TMP_LO               
        SUBB A,SETL                        ;比較變量低位-臨界值低位-cy
        MOV A,TMP_MO
        SUBB A,SETM                        ;比較變量中位-臨界值中位-cy
        MOV A,TMP_HO
        SUBB A,SETH                        ;比較變量高位-臨界值高位-cy
        JNC COMPLT4                        ;若cy=0,跳轉(zhuǎn)
        SETB ALMFLAG                ;若cy=1,即比較變量<臨界值,即測得的距離<臨界值,置位報警標志
        LCALL GET_DAT                ;根據(jù)距離大小求報警聲音長短
        RET
COMPLT4:
        CLR ALMFLAG                        ;復位報警標志
COMPLTR:
        RET
;-------------------------------------------------------
;計算報警聲音時長(高位*100+中位*10+低位)/20
GET_DAT:
        MOV A,TMP_MO                ;比較變量中位傳給A
        MOV B,#10                        ;把10傳給B
        MUL AB                                ;比較變量中位*10,A存結(jié)果低位,B存高位
        ADD A,TMP_LO                ;(比較變量中位*10)結(jié)果的低位+比較變量低位
        MOV R4,A                        ;[(比較變量中位*10)結(jié)果的低位+比較變量低位]的結(jié)果存入R4
        MOV A,TMP_HO                ;比較變量高位傳給A
        MOV B,#100                        ;把100傳給B
        MUL AB                                ;比較變量高位*100,A存結(jié)果低位,B存高位
        ADD A,R4                        ;(比較變量高位*100)結(jié)果的低位+R4
        MOV R4,A                        ;[(比較變量高位*100)結(jié)果的低位+R4]的結(jié)果存入R4
        MOV A,B                                ;(比較變量高位*100)結(jié)果的高位傳給A
        ADDC A,#0                        ;A+cy+0
        MOV R3,A                        ;A->R3
        MOV R2,#0
        MOV R7,#20                        ;距離除以20得聲音長度值
        LCALL NDIV31                ;調(diào)用除法子程序,商為R3R4,余數(shù)為R7
        MOV A,R4                        ;將商的低位傳給A
        JNZ GET_DAT1                ;商的低位不等于0,則跳轉(zhuǎn)
        MOV A,#1                        ;商的低位=0,送1到A
GET_DAT1:
        MOV BEEP_F,A                ;把商的低位或者1傳給蜂鳴器響聲頻次
        RET
;-------------------------------------------------------
;(R3R4*R7)=(R2R3R4)
NMUL21:
        MOV A,R4                ;時間低位傳給A
        MOV B,R7                ;乘數(shù)R7傳給B
        MUL AB                        ;時間低位*R7,結(jié)果的低位為A,高位為B
        MOV R4,A                ;時間低位*R7的結(jié)果的低位存入R4,即為最終結(jié)果的低位
        MOV A,B                        ;時間低位*R7的結(jié)果的高位傳給A
        XCH A,R3                ;(時間低位*R7的結(jié)果的高位)與時間的高位交換
        MOV B,R7                ;乘數(shù)傳給B
        MUL AB                        ;時間高位*R7,結(jié)果的低位為A,高位為B
        ADD A,R3                ;時間高位*R7結(jié)果的低位 + 時間低位*R7的結(jié)果的高位
        MOV R3,A                ;將(時間高位*R7結(jié)果的低位 + 時間低位*R7的結(jié)果的高位)的結(jié)果傳給R3
        CLR A                        ;將A清0
        ADDC A,B                ;時間高位*R7的結(jié)果的高位 + cy
        MOV R2,A                ;(時間高位*R7的結(jié)果的高位 + cy)->R2
        CLR OV
        RET
;-----------------------------------        
;三字節(jié)無符號除法程序(R2R3R4/R7)=(R2)R3R4 余數(shù)R7
NDIV31:
        MOV A,R2                ;時間*17結(jié)果的高位傳給A
        MOV B,R7                ;將被除數(shù)傳給B
        DIV AB                        ;高位/17,商放A,余數(shù)放B
        PUSH ACC                ;將商入棧
        MOV R2,B                ;將余數(shù)重新傳給B
        MOV B,#10H                ;把16傳給B
NDV311:
        CLR C                        ;CY清0
        MOV A,R4                ;低位R4傳給A
        RLC A                        ;左移A(R4)
        MOV R4,A                ;將A傳給R4
        MOV A,R3                ;中位R3傳給A
        RLC A                        ;左移A(R3)
        MOV R3,A                ;將A傳給R3
        MOV A,R2                ;高位R2傳給A
        RLC A                        ;左移A(R2)
        MOV R2,A                ;將A傳給R2
        MOV F0,C                ;將CY的值傳給F0
        CLR C                        ;CY清0
        SUBB A,R7                ;A(R2)-R7
        JB F0,NDV312
        JC NDV313
NDV312:
        MOV R2,A
        INC R4
NDV313:
        DJNZ B,NDV311
        POP ACC
        CLR OV
        JZ NDV314
        SETB OV
NDV314:
        XCH A,R2
        MOV R7,A
RET
;-------------------------------------------------------
DIS_SET:                                ;設(shè)置狀態(tài)顯示控制(顯示設(shè)置值大小)
        MOV A,SCAN
        JNZ DIS_SET1
        MOV P2,#0F1H                        ;第一位顯示
        MOV A,#16
        CLR DOT
        SJMP SET_DIS
DIS_SET1:
        DEC A
        JNZ DIS_SET2
        MOV P2,#0F2H                        ;第二位顯示
        MOV A,SETH
        JNB FLASH,DIS_SET11        ;不閃爍轉(zhuǎn)
        JNB FLASHH,DIS_SET11        ;本位不閃爍轉(zhuǎn)
        MOV A,#17                        ;否則本位熄滅
DIS_SET11:
        SETB DOT
        SJMP SET_DIS
DIS_SET2:
        DEC A
        JNZ DIS_SET3
        MOV P2,#0F4H
        MOV A,SETM
        JNB FLASH,DIS_SET21
        JNB FLASHM,DIS_SET21
        MOV A,#17
DIS_SET21:
        CLR DOT
        SJMP SET_DIS
DIS_SET3:
        MOV P2,#0F8H
        MOV A,SETL
        JNB FLASH,DIS_SET31
        JNB FLASHL,DIS_SET31
        MOV A,#17
DIS_SET31:
        CLR DOT
SET_DIS:
        MOV DPTR,#LEDTAB        ;段碼首地址
        MOVC A,@A+DPTR                ;查表
        JNB DOT,SET_DIS1        ;不加小數(shù)點的跳轉(zhuǎn)
        ANL A,#7FH
SET_DIS1:
        MOV P0,A
        INC SCAN
        MOV A,SCAN
        MOV B,#4                        ;共4位
        DIV AB
        MOV SCAN,B
        RET
;-------------------------------------------------------
DISPLAY:                                ;正常狀態(tài)顯示(顯示距離)
        MOV A,SCAN
        JNZ DIS01                        ;顯示位控為0,順序執(zhí)行,不為0,跳轉(zhuǎn)
        MOV P2,#0F1H                        ;點亮第一位數(shù)碼管
        CLR DOT                                ;小數(shù)點標志置0
        SJMP DISP                        ;跳轉(zhuǎn)顯示數(shù)據(jù)
DIS01:
        DEC A
        JNZ DIS02
        MOV P2,#0F2H
        SETB DOT
        SJMP DISP
DIS02:
        DEC A
        JNZ DIS03
        MOV P2,#0F4H
        CLR DOT
        SJMP DISP
DIS03:
        MOV P2,#0F8H
        CLR DOT
DISP:
        MOV DPTR,#LEDTAB
        MOV R0,#DISBUF                  ;顯示首地址傳給R0
        MOV A,DIS_NO                  ;對應(yīng)超聲波編號的顯示區(qū)編號->A
        MOV B,#4                          ;傳4給B
        MUL AB                                  ;顯示區(qū)編號*4,A存低位,B存高位
        ADD A,R0                          ;首地址 + (顯示區(qū)編號*4結(jié)果的低位)
        ADD A,SCAN                          ;[首地址 + (顯示區(qū)編號*4結(jié)果的低位)]+顯示位控變量
        MOV R0,A                          ;將對應(yīng)的超聲波的某位顯示數(shù)據(jù)的地址傳給R0
        MOV A,@R0                          ;將對應(yīng)地址的值傳給A
        MOVC A,@A+DPTR              ;查表
        JNB DOT,DISP1                  ;判斷是否輸出小數(shù)點
        ANL A,#7FH                          ;需要輸出小數(shù)點,將小數(shù)點對應(yīng)的管腳置0
DISP1:
        MOV P0,A                          ;將查表結(jié)果從P0口輸出
        INC SCAN                          ;顯示位控+1
        MOV A,SCAN                          ;顯示位控傳給A
        CJNE A,#4,DISP2                  ;顯示位控!=4且<4,跳轉(zhuǎn),cy=1
DISP2:
        JC DISRE                          ;cy=1跳轉(zhuǎn)
        MOV SCAN,#0                          ;顯示位控=0
DISRE:
        RET
;-------------------------------------------------------
DELAY:
        MOV R2,#20
DLY:
        MOV R3,#249
        DJNZ R3,$
        DJNZ R2,DLY
        RET
;-------------------------------------------------------
LEDTAB:
        DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH
        END

文件打包如下:
超聲波報警.rar (112.41 KB, 下載次數(shù): 49)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久亚洲天堂 | 欧美日韩中文字幕在线 | 亚洲女优在线播放 | 亚洲精品一区二区冲田杏梨 | 欧洲一区二区在线 | 成人亚洲综合 | 日韩一区二区三区av | 日日噜噜噜夜夜爽爽狠狠视频97 | 久草色播 | 日韩一级二级片 | 天天操天天怕 | 综合久 | 91在线导航 | 亚洲精品68久久久一区 | 免费在线视频一区二区 | 视频一区在线 | 中文字幕成人av | 国产人成精品一区二区三 | 欧美精品欧美精品系列 | av二区三区 | 欧美激情精品久久久久久变态 | 黄频免费 | 久久久久久亚洲精品 | 日韩一区二区三区视频 | 日韩av网址在线观看 | 欧美日韩中文字幕在线 | 99免费在线视频 | 岛国视频 | 国产精品亚洲视频 | 午夜国产在线 | 91伦理片| 亚洲激情av| 一区二区福利视频 | 隔壁老王国产在线精品 | 日韩成人高清 | 欧美精品久久久久 | 国内精品视频免费观看 | 一区二区影视 | 中文字幕在线视频免费观看 | 国产精品日韩一区二区 | 精品欧美色视频网站在线观看 |