#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