|
程序清單
以下是用匯編語言編寫的超聲波測距控制源程序:
采用AT89S51 12MHz晶振
顯示緩沖單元在40H~43H,使用內(nèi)存44H、45H、46H用于計算距離
20H用于標(biāo)志
完整資料下載:
asdfdf.doc
(59 KB, 下載次數(shù): 57)
2017-5-8 11:20 上傳
點擊文件名下載附件
源程序 下載積分: 黑幣 -5
單片機源程序:
- VOUT EQU P1.0 ;脈沖輸出端口
- *中斷入口程序*
- ORG 0000H
- LJMP START
- ORG 0003H
- LJMP PINT0
- ORG 000BH
- LJMP INTT0
- ORG 0013H
- RETI
- ORG 001BH
- LJMP INTT1
- ORG 0023H
- RETI
- ORG 002BH
- RETI
-
- *主程序*
- START: MOV SP, #4FH
- MOV R0, #40H ;40~43H為顯示數(shù)據(jù)存放單元(40為最高位)
- MOV R7,#0BH
- CLEARDISP:MOV @R0, #00H
- INC R0
- DJNZ R7, CLEARDISP
- MOV 20H, #00H
- MOV TMOD, #21H ;T1為8位自動重裝模式,T0為16位定時器
- MOV TH0, #00H ;65ms初值
- MOV TL0, #00H ;40KHz初值
- MOV TH1, #0F2H
- MOV TL1, #0F2H
- MOV P0, #0FFH
- MOV P1, #0FFH
- MOV P2, #0FFH
- MOV P3, #0FFH
- MOV R4, #04H ;超聲波脈沖個數(shù)控制(為賦值的一半)
- SETB PX0
- SETB ET0
- STEB EA
- CLR 00H
- SETB TR0 ;開啟測距定時器
- START1: LCALL DISPLAY
- JNB 00H, START1 ;收到反射信號時標(biāo)志位為1
- CLR EA
- LCALL WORK ;計算距離子程序
- SETB EA
- CLR 00H
- SETB TR0 ;重新開啟測距定時器
- MOV R2, #64H ; 測量間隔控制(約4*100=400ms)
- LOOP: LCALL DISPLAY
- DJNZ R2, LOOP
- SJMP START 1
- *中斷程序*
- ;T0中斷,65ms中斷一次
- INTT0: CLR EA
- CLR TR0
- MOV TH0, #00H
- MOV TL0, #00H
- SETB ET1
- SETB EA
- SETB TR0 ;啟動計時器T0,用以計算超聲波來回時間
- SETB TR1 ;開啟發(fā)超聲波用定時器T1
- OUT: RETI
- ;T1中斷,發(fā)超聲波用
- INTT1: CPL VOUT
- DJNZ R4,RETIOUT
- CLR TR1 ;超聲波發(fā)送完畢,關(guān)T1
- CLR ET1
- MOV R4,#04H
- SETB EX0 ;開啟接收回波中斷
- RETIOUT: RETI
- ;外中斷0,收到回波時進(jìn)入
- PINT0: CLR TR0 ;關(guān)計數(shù)器
- CLR TR1
- CLR ET1
- CLR EA
- CLR EX0
- MOV 44H, TL0 ;將計數(shù)值移入處理單元
- MOV 45H, TH0
- SETB 00H ;接收成功標(biāo)志
- RETI
- *延時程序*
- DL1MS: MOV R6, #14H
- DL1: MOV R7, #19H
- DL2: DJNZ R6, DL2
- DJNZ R6, DL1
- RET
- *顯示程序*
- ;40H為最高位,43H為最低位,先掃描高位
- DISPLAY: MOV R1, #40H;G
- MOV R5,#0F7H;G
- PLAY: MOV A, R5
- MOV P0, #0FFH
- MOV P2, A
- MOV A, @R1
- MOV DPTR, #TAB
- MOVC A, @A+DPTR
- MOV P0, A
- LCALL DLIMS
- INC R1
- MOV A, R5
- JNB ACC.0, ENDOUT;G
- RR A
- MOV R5, A
- AJMP PLAY
- ENDOUT; MOV P2, #0FFH
- MOV P0, #0FFH
- RET
- TAB; DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
- ;共陽數(shù)碼管 0 ,1, 2,3,4,5,6,7,8,9,不亮,A, —
- *距離計算程序(=計算值×17/1000cm) 近似
- WORK: PUSH ACC
- PUSH PSW
- PUSH B
- MOV PSW, #18H
- MOV R3, 45H
- MOV R2, 44H
- MOV R1, #00D
- MOV R0, #17D
- LCALL MUL2BY2
- MOV R3, #03H
- MOV R2, #0E8H
- LCALL DIV4BY2
- LCALL DIV4BY2
- MOV 40H, R4
- MOV A, 40H
- JNZ JJ0
- MOV 40H, #0AH ;最高位為0,不點亮
- JJ0: MOV A R0
- MOV R4, A
- MOV A R1
- MOV R5 A
- MOV R3, #00D
- MOV R2, #100D
- LCALL DIV4BY2
- MOV 41H, R4
- MOV A, 41H
- JNZ JJ1
- MOV A, 40H ;此高位為0,先看最高位是否為不亮
- SUBB A, #0AH
- JNZ JJ1
- MOV 41H, #0AH ; 最高位不亮,次高位也不亮
- JJ1: MOV A, R0
- MOV R4, A
- MOV A, R1
- MOV R5, A
- MOV R3, #00D
- MOV R2, #10D
- LCALL DIV4BY2
- MOV 42H, R4
- MOV A 42H
- JNZ JJ2
- MOV A, 41H ;次高位為0,先看次高位是否為不亮
- SUBB A, #0AH
- JNZ JJ2
- MOV 42H, #0AH ;次高位不亮,次高位也不亮
- JJ2: MOV 43H, R0
- POP B
- POP PSW
- POP ACC
- RET
- *兩字節(jié)無符號數(shù)乘法程序
- MUL2BY2: CLR A
- MOV R7, A
- MOV R6, A
- MOV R5, A
- MOV R4, A
- MOV 46H, #10H
- MULLOOP1: CLR C
- MOV A, R4
- RLC A
- MOV R4, A
- MOV A, R5
- RLC A
- MOV R5, A
- MOV A, R6
- RLC A
- MOV R6, A
- MOV A, R7
- RLC A
- MOV R7, A
- MOV A, R0
- RLC A
- MOV R0, A
- MOV A, R1
- RLC A
- MOV R1, A
- JNC MULLOOP2
- MOV A, R4
- ADD A, R2
- MOV R4, A
- MOV A, R5
- ADDC A, R3
- MOV R5, A
- MOV A, R6
- ADDC A, #00H
- MOV R6, A
- MOV A, R7
- ADDC A, #00H
- MOV R7, A
- MULLOOP2: DJNZ 46H, MULLOOP1
- RET
-
- *四字節(jié)/兩字節(jié)無符號數(shù)除法程序*
- DIV4BY2: MOV 46H, #20H
- MOV R0, #00H
- MOV R1, #00H
- DIVLOOP1: MOV A, R4
- RLC A
- MOV R4, A
- MOV A, R5
- RLC A
- MOV R5, A
- MOV A, R6
- RLC A
- MOV R6, A
- MOV A, R7
- RLC A
- MOV R7, A
- MOV A, R0
- RLC A
- MOV R0, A
- MOV A, R1
- RLC A
- MOV R1, A
- CLR C
- MOV A, R0
- SUBB A, R2
- MOV B, A
- MOV A, R1
- SUBB A, R3
- JC DIVLOOP2
- MOV R0, B
- MOV R1, A
-
- DIVLOOP2: CPL C
- DJNZ 46H, DIVLOOP1
- MOV A, R4
- RLC A
- MOV R4, A
- MOV A, R5
- RLC A
- MOV R5, A
- MOV A, R6
- RLC A
- MOV R6, A
- MOV A, R7
- RLC A
- MOV R7, A
- RET
- ;
- END
- 附C51程序
- #INCLUDE <REG51.H>
- #DEFINE UCHAR UNSIGNED CHAR
- #DEFINE UINT UNSIGNED INT
- #DEFINE ULONG UNSIGNED LONG
- EXTERN VOID CS_T(VOID);
- EXTERN VOID DELAY(UINT);
- EXTERN VOID DISPLAY(UCHAR*);
- //DATA UCHAR DISPLAY(UCHAR*);
- DATA UCHAR TESTOK;
- VOID MAIN (VOID)
- {
- DATA UCHAR DISPRAM[5];
- DATA UINT I;
- DATA ULONG TIME;
- P0=0XFF;
- P2=0XFF;
- TMOD=0X11;
- IE=0X80;
- WHILE (1)
- {
- CS_T();
- DELAY(1);
- TESTOK=0;
- EX0=1;
- ET0=1;
- WHILE(! TESTOK) DISPLAY(DISPRAM);
- IF (1==TESTOK)
- {
- TIME=TH0;
- TIME=(TIME<<8)| TL0;
- TIME*=172;
- TIME/=10000;
- DISPRAM[0]=(UCHAR) (TIME%10);
- TIME/=10;
- DISPRAM[1]=(UCHAR) (TIME%10);
- TIME/=10;
- DISPRAM[2]=(UCHAR) (TIME%10);
- DISPRAM[3]=(UCHAR) (TIME/10);
- IF (0==DISPRAM[3]) DISPRAM[3]=17;
- } ELSE
- {
- DISPRAM [0]=16;
- DISPRAM [1]=16;
- DISPRAM [2]=16;
- DISPRAM [3]=16;
- }
- FOR (I=0;I<300;I++) DISPLAY(DISPRAM);
- }
- }
- VOID CS_R(VOID) INTERRUPT 0
- {
- TR0=0;
- ET0=0;
- EX0=0;
- TESTOK=1;
- }
- VOID OVERTIME(VOID) INTERRUPT 1
- {
- EX0=0;
- TR0=0;
- ET0=0;
- TESTOK=2;
- }
- NAME CS_T
- ?PR?CS_T?CS_T SEGMENT CODE
- PUBLIC CS_T
- RSEG ?PR?CS_T?CS_T
- CS_T: PUSH ACC
- MOV TH0, #00H
- MOV TL0, #00H
- MOV A, #4D
- SETB TR0
- CS_T1: CPL p1.0
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- DJNZ ACC,CS_T1
- POP ACC
- RET
- ;
- END
- NAME DELAY
- ?PR?_DELAY?DELAY SEGMENT CODE
- PUBLIC _DELAY
- RSEG ?PR?_DELAY?DELAY
- _DELAY: PUSH ACC
- MOV A,R7
- JZ DELA1
- INC R6
- DELA1: MOV R5,#50D
- DJNZ R5, $
- DJNZ R7,DELA1
- DJNZ R6,DELA1
- POP ACC
- RET
- END
- NAME DISPLAY
- ?PR?_DISPLAY?DISPLAY SEGMENT CODE
- ?CO?_DISPLAY?DISPLAY SEGMENT DATA
- EXTRN CODE (_DELAY)
- PUBLIC _DISPLAY
- RSEG ?CO?_DISPLAY?DISPLAY
- ?_DISPLAY?BYTE:
- DISPBIT: DS 1
- DISPNUM: DS 1
- RSEG ?PR?_DISPLAY?DISPLAY
- _DISPLAY: PUSH ACC
- PUSH DPH
- PUSH DPL
- PUSH PSW
- INC DISPNUM
- MOV A,DISPNUM
- CJNE A,#4D,DISP1
- DISP1: JC DISP2
- MOV DISPNUM,#00H
- MOV DISPBIT,#0FEH
- DISP2: MOV A,R1
- ADD A,DISPNUM
- MOV R0,A
- MOV A,@R0
- MOV DPTR,#DISPTABLE
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,DISPNUM
- CJNE A,#2D,DISP3
- CLR P0.7
- DISP3: MOV P2,DISPBIT
- MOV R5,#00H
- MOV R7,#0AH
- LCALL _DELAY
- MOV P0,#0FFH
- MOV P2,#0FFH
- MOV A,DISPBIT
- RL A
- MOV DISPBIT,A
- POP PSW
- POP DPL
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
|
評分
-
查看全部評分
|