微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机超声波测距程序C调汇编

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

时间:11-19 来源:互联网 点击:
#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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top