51單片機(jī)超聲波測(cè)距程序C調(diào)匯編
#include //絕對(duì)地址存取
本文引用地址:http://m.butianyuan.cn/article/201611/318300.htm#include
#pragma NOREGPARMS //固定單元參數(shù)傳遞,以減少C與匯編在寄存器Rn參數(shù)傳
#define f DBYTE[0x40] //cm
#define g DBYTE[0x41] //dm
#define h DBYTE[0x42] //m
#define i DBYTE[0x43]
unsigned data a _at_ 0x32; // #define a DWORD(雙字節(jié))[0x32]/ DBYTE(1個(gè)字節(jié)),這兩種做法都不行?定義錯(cuò)
//誤導(dǎo)致數(shù)據(jù)傳送不過來,導(dǎo)致不能進(jìn)行計(jì)算,顯示0000。高字節(jié)TH0存放于32h,低字節(jié)TL0存放
//于33h,在c語(yǔ)言中只定義高字節(jié)即可,運(yùn)算時(shí),將高字節(jié)低字節(jié)看作一個(gè)整體進(jìn)行運(yùn)
//算,見《混合編程》20頁(yè);此為無(wú)符號(hào)整型,兩個(gè)字節(jié),可以存放高低16位。。
unsigned data a0 _at_ 0x52; //第一個(gè)數(shù)存儲(chǔ)單元
unsigned data a1 _at_ 0x54; //第二個(gè)數(shù)存儲(chǔ)單元
unsigned data a2 _at_ 0x56;
void count() //被匯編調(diào)用的子程序
{
unsigned long int temp; //中間變量定義
a0=a/10;
a1=a0*17;
a2=a1/100;
f=a2%10;
temp=a2/10;
g=temp%10;
temp=temp/10;
h=temp%10;
i=temp/10;
}
EXTRN CODE(COUNT)
ORG 0000H
JMP MAIN
ORG 0003H
LJMP EXT0
MAIN: MOV TMOD,#01H ;設(shè)置為定時(shí)器且為方式為1
CLR P3.1 ;為了使系統(tǒng)穩(wěn)定,P3.1硬件須接地,軟件須清零
SETB P3.2
SETB EA ;開總中斷
CLR IT0 ;設(shè)置為電平觸發(fā)方式,為低電平則會(huì)觸發(fā)外部零中斷 MOV SP,#60H
START:MOV R6,#0 ;進(jìn)入中斷的標(biāo)識(shí)
MOV R7,#4
MOV 40H,#00H ;存放厘米位的數(shù)字
MOV 41H,#00H ;存放分米位的數(shù)字
MOV 42H,#00H ;存放米位的數(shù)字
MOV 43H,#00H ;存放十米位的數(shù)字
MOV TL0,#00H ;設(shè)置定時(shí)時(shí)間為65536微秒
MOV TH0,#00H
CLR TF0 ;溢出標(biāo)志位清0
SETB P3.0 ;從此處開始到下一個(gè)高電平到來的時(shí)間必須在*12--13 ;微秒*之間,保證頻率為40khz,若頻率范圍相差太大 ;則導(dǎo)致接收器接收不到信號(hào) ;/*要注意程序運(yùn)行時(shí)時(shí)間帶來的影響*/
INT: CPL P3.0 ;40KHZ超聲波發(fā)射子程序 1個(gè)
LCALL DELAY1
DJNZ R7,INT ;超聲波發(fā)送完畢
CALL DELAY2 ;延時(shí)0.1MS避免錯(cuò)誤
SETB EX0
SETB TR0 ;開始計(jì)時(shí)
LOOP2:JBC TF0,LOOP3 ;檢查是否有溢出,若為1則跳到LOOP3,并清零
CJNE R6,#0,LOOP4
JMP LOOP2
LOOP4:
LCALL COUNT
LCALL dis
LJMP START
LOOP3:CLR TR0
CLR EX0
MOV 40H,#09H
MOV 41H,#09H
MOV 42H,#09H
MOV 43H,#09H
LCALL dis
LJMP START
EXT0: CLR TR0 ;進(jìn)入外部中斷后,一般所做的工作為:關(guān)閉定時(shí)器/計(jì)數(shù)器,關(guān)閉外部 ;中斷,保護(hù)當(dāng)前的值
CLR EX0 ;改動(dòng)1
PUSH ACC
PUSH PSW
MOV 32H,TH0
MOV 33H,TL0 ;改動(dòng)2
MOV R6,#1
POP PSW
POP ACC
RETI
dis: MOV R0,#250 ;目前顯示時(shí)間為1S
D0: MOV A,40H
MOV P2, A
ACALL DELAY
MOV A, 41H
ADD A, #10H
MOV P2, A
ACALL DELAY
MOV A, 42H
ADD A, #20H
MOV P2, A
ACALL DELAY
MOV A, 43H
MOV P2, A
ADD A, #30H
MOV P2, A
ACALL DELAY
DJNZ R0,D0
RET
DELAY: MOV R1,#02 ;1MS
D1: MOV R2,#248
DJNZ R2,$
DJNZ R1,D1
RET
DELAY1:MOV R3,#2 ;1US
D3: DJNZ R3,D3 ;6*2=12US+1=13US
RET
DELAY2:MOV R4,#50
D4: DJNZ R4,D4 ;50*2=100US=0.1MS
RET
END
評(píng)論