新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)超聲波測(cè)距程序C調(diào)匯編

51單片機(jī)超聲波測(cè)距程序C調(diào)匯編

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
#include

#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)論


技術(shù)專區(qū)

關(guān)閉