求一段汇编程序,利用51单片机控制超声波传感器测距的程序。

如题所述

; 基于AT89C2051单片机超声波测距系统
; 测量范围35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START : MOV R0,#70H ;立即数70H送寄存器R0中
MOV R7,#0BH ;立即数0BH送寄存器R7中
MOV 20H,#00H ;立即数00H送20H单元中
CLEARDISP: MOV @R0,#00H ;立即数立即数00H送R0中的地址单元中
INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的数值减1非零时转移
MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数
CJZCX:MOV TL0,#00H ;装入定时器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超声波发射持续200us
Here:CPL P3.5 ;输出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
SETB TR0
SETB P3.2
MOV R6,#53H ;延时1.5ms
DL0: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL0
QBA:JNB P3.7,QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:CLR P3.2
CLR TR0
MOV 70H,tl0
MOV 71H,tH0
MOV R2,71H
MOV R3,70H
MOV R6,#22H
MOV R7,#0H
LCALL MULD
MOV R6,#64H
MOV R7,#0H
LCALL DIVD
MOV 73H,R2
MOV 74H,R3
MOV R3,#0H
MOV R4,#0H
MOV R5,#0H
MOV R6,73H
MOV R7,74H
LCALL HB2
MOV A,R4 ;分离BCD
MOV B,#10H
DIV AB
MOV 78H,A
MOV 77H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 76H,A
MOV 75H,B
MOV 7AH,#0EFH
XXX:LCALL DISPLAY
DJNZ 7AH,XXX
AJMP CJZCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 乘34程序(乘声速) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 除100程序(除法) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD转换 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#76H ;立即数76H送寄存器中
MOV R5,#0FEH ;立即数FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的数值送累加器A中
MOV P3,A ;累加器A中的数值送P3口
MOV A,@R1 ;以寄存器R1中的数为地址单元的数值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址为基地变址寻址单元中的数送累加器
MOV P1,A ;累加器A中的数值送P1口
MOV R6,#14H ;立即数据14送寄存器R6中
DL1:MOV R7,#19H ;立即数据19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的数据减1,不为零时则转移
DJNZ R6,DL1 ;寄存器中的数据减1,不为零时则转移
INC R1 ;寄存器R1中的数值加1
MOV A,R5 ;寄存器R5中的数值送累加器A中
JNB ACC.2,ENDOUT ;地址位为0则转到ENDOUT
RL A ;累加器循环右移
MOV R5,A ;累加器A中的数值送寄存器R5中
AJMP PLAY ;绝对短转移
ENDOUT: SETB P3.5 ;置P3.5口
MOV P1,#0FFH ;立即数0FEH送P1口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
END ;结束

我见过一款制作容易免调试的超声波测距板,你可到“谷歌”上搜索一下《一款制作容易免调试的超声波测距板》,该超声波测距板结构简单、制作容易不需要调试、测量精度高,比较适合单片机初学都使用,同时也是单片机课程设计比较好的实训课题。该超声波测距系统,提供套件,及组装好的板件,含原理图、源程序、设计说明等。
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-08-02
超声波测距要有具体的传感器相关参数才可以做出来,这与要发出多大频率的脉冲有关。
你求一段汇编语言,却要一个测距的C语言程序?呵呵,不知你到底要什么?本回答被网友采纳
第2个回答  2013-05-03
这是我的毕设课题,我也想要啊

求一段汇编程序,利用51单片机控制超声波传感器测距的程序。
INC R0 ;寄存器R0加1 DJNZ R7,CLEARDISP;寄存器中的数值减1非零时转移 MOV TMOD,#01H ;置定时器T0工作方式样3,对内部机器周期计数 CJZCX:MOV TL0,#00H ;装入定时器初值 MOV TH0,#00H MOV R0,#0FH MOV R1,#5bH puzel:MOV 14H,#08H ;超声波发射持续200us Here:CPL P3.5...

51单片机超声波测距代码
include <reg51.h>#define uchar unsigned char#define uint unsigned int#define LCD_DATA P2sbit LCD_BL=P1^0;sbit LCD_RS=P1^1;sbit LCD_RW=P1^2;sbit LCD_EN=P1^3;sbit TRIG=P0^0;sbit ECHO=P0^1;bit flag=0;uchar time,b,s,g;uint l;uchar code num_tab[]="0123456789";v...

51单片机 HC-SR04超声波测距 我写的C语言代码,请问
1、HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。2、例程:include<reg52.h>#define uchar unsigned char#define uint unsigned int\/*位定义*\/sbit CHUFA=P0^1; \/\/位定义超声波触发端(10us以上高电平触发...

求US-100(模块)超声波测距的C语言程序,基于51单片机的,3Q哦~
tr=1; \/\/超声波输入端 delay_20us(); \/\/延时20us tr=0; \/\/产生一个20us的脉冲 while(ec==0); \/\/等待Echo回波引脚变高电平 TH1=0; \/\/定时器1清零 TL1=0; \/\/定时器1清零 TF1=0; \/\/计数溢出标志 TR1=1; \/\/启动定时器1 while(ec==1);th=TH1;tl=TL1;TL1...

51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加_百度知...
51单片机如何控制超声波传感器 求C语言程序(一定要能用)100追加 50 型号是DYP-ME007VCC(DC5V)、Trig(发射端)、Echo(接收端)、Out(空)、GND(地)(1)采用IO触发测距,给8--15us的高电平信号即可;(2)模块自动发送8个40khz的方波,自动检测是否有信... 型号是DYP-ME007 VCC(DC5V)、Trig(发射端)、Echo(...

51单片机,用超声波测距,怎么又调不好,大神给看看吧
while(1){ echo = 1; 改为(echo=0)Delay(1);trig = 1;Delay(20); 这为发射端发射个脉冲信号 trig = 0;while(!echo) 接受端echo不为0时,表示接收到高电平信号,然后就是计算这个高电平的时间了 TR0 = 1; 开定时器 while(echo) 直到echo变为0说明接收的高电平结束了...

51单片机超声波测距程序为什么RX=1时开启计时器,RX=0时关闭计时器?程序...
RX是串口接收完成标志位。当串口接收到完整的数据帧时RX由硬置1。用户需要手动清0,以接收下一字节。while(1){ while(!RX);\/\/等待串口接收1字节数据 TR0=1;\/\/启动计数 while(RX);\/\/等待清0,初步判断是在定时器0中清RX。TR0=0;\/\/结束计数 conut();} ...

51单片机控制的超声波测距程序问题,为什么num一直为0
你的外部中断使用的是外部中断0,而定时器使用的也是0.在51内,外部中断0的优先级是要大于定时器0的。所以在程序的最后是要先执行外部中断0的!然后你的程序就会先进入外部中断服务,然后你在外部中断中又把定时器中断给关闭了!这样你就不会走到定时器中断的服务项中。所以你的num一直是0 ...

超声波测距程序问题
我贴一个测试成功的51程序,试了多个超声波模块,可以测试0到5米距离。测试结果从串口反馈到PC,也有从数码管显示的。有疑问欢迎Q我。QQ号在最后:include <reg52.h> include "stdio.h"include "MCU_UART.H"define uchar unsigned char define uint unsigned int sbit Trig = P1^0 ;sbit ...

51单片机和NE555连接做了个超声波测距
555接成40KHz震荡电路,单片机的一个IO口接555的四脚,555的四脚是使能端,接高电平时555工作,接低电平时555不工作,单片机就是这样控制555的

相似回答