您的位置 首页 资料

51单片机超声波测距程序C调汇编

#includereg51.h>#includeabsacc.h>//绝对地址存取#includemath.h>#pragmaNOREGPARMS//固定单元参数传递,以减少C与汇编

#include

#include //肯定地址存取

#include

#pragma NOREGPARMS //固定单元参数传递,以削减C与汇编在寄存器Rn参数传

#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(双字节)[0x32]/ DBYTE(1个字节),这两种做法都不可?界说错

//误导致数据传送不过来,导致不能进行核算,显现0000。高字节TH0寄存于32h,低字节TL0寄存

//于33h,在c语言中只界说高字节即可,运算时,将高字节低字节看作一个全体进行运

//算,见《混合编程》20页;此为无符号整型,两个字节,能够寄存凹凸16位。。

unsigned data a0 _at_ 0x52; //榜首个数存储单元

unsigned data a1 _at_ 0x54; //第二个数存储单元

unsigned data a2 _at_ 0x56;

void count() //被汇编调用的子程序

{

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 ;设置为守时器且为方法为1

CLR P3.1 ;为了使体系安稳,P3.1硬件须接地,软件须清零

SETB P3.2

SETB EA ;开总中止

CLR IT0 ;设置为电平触发方法,为低电平则会触发外部零中止 MOV SP,#60H

START:MOV R6,#0 ;进入中止的标识

MOV R7,#4

MOV 40H,#00H ;寄存厘米位的数字

MOV 41H,#00H ;寄存分米位的数字

MOV 42H,#00H ;寄存米位的数字

MOV 43H,#00H ;寄存十米位的数字

MOV TL0,#00H ;设置守时时刻为65536微秒

MOV TH0,#00H

CLR TF0 ;溢出标志位清0

SETB P3.0 ;从此处开端到下一个高电平到来的时刻必须在*12–13 ;微秒*之间,确保频率为40khz,若频率规模相差太大 ;则导致接纳器接纳不到信号 ;/*要注意程序运行时时刻带来的影响*/

INT: CPL P3.0 ;40KHZ超声波发射子程序 1个

LCALL DELAY1

DJNZ R7,INT ;超声波发送结束

CALL DELAY2 ;延时0.1MS防止过错

SETB EX0

SETB TR0 ;开端计时

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 ;进入外部中止后,一般所做的工作为:封闭守时器/计数器,封闭外部 ;中止,维护当时的值

CLR EX0 ;改动1

PUSH ACC

PUSH PSW

MOV 32H,TH0

MOV 33H,TL0 ;改动2

MOV R6,#1

POP PSW

POP ACC

RETI

dis: MOV R0,#250 ;现在显现时刻为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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/265338.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部