51单片机超声波测距程序C调汇编
#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
51单片机超声波测距C调汇 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)