导航:首页 > 操作系统 > 单片机超声波测距程序

单片机超声波测距程序

发布时间:2022-04-14 04:36:05

㈠ 一个单片机同时控制三个超声波测距模块,程序怎样实现呢

只不过是单片机上接了三个模块,是不可能同时控制的,写程序时,分别对三个模块进行测量,因单片机的速度是非常快的,从外观上看就好像是同时测量的,可程序是不可能同时执行的,只是互相间隔的时间极短,表面上就同时了。确切说,从微观上是分时控制,从宏观上看是同时了。

㈡ 基于单片机超声波测距c语言程序求解释

//上面这段什么意思?
//上下面这段什么意思? 没有code为什么也可以存16进制?
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

有code和没有code的区别在于 dis_smg变量的存储的存储方式上
我记得有code的适合 dis_smg的数组元素不能改变的吧 记得不清楚了
你可以网络去

//下面是不是数码管引脚和单片机引脚对应?
//数码管位选定义
sbit smg_we1 = P3^4; //数码管位选定义

答案: 是

㈢ 51单片机超声波测距仪 流程图 及 程序 急求50分

#include<at89x52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define nop _nop_()
uchar code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//0x40-不带点
//unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 带点
uchar code W[]={0xfe,0xfd,0xfb,0xf7} ;
unsigned char temp[3];
sbit RX=P3^4; //接受端,ECHO
sbit TX=P3^5; //控制端,TRIG
sbit wei=P2^7;
sbit an=P2^6;
bit flag=0;
uint time=0;
uint s=0;
void delay(int xms)//延时大概x毫秒
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void start() //给至少10us的高电平,启动模块
{
TX=1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
TX=0;
}
uchar count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
s=(time*1.7)/100;//厘米
return s;
}
void dispros()//数据分割
{
temp[0]=s/100%10;//百位
temp[1]=s/10%10; //十位
temp[2]=s%10; //个位
}
void display() //显示函数
{
if(s>=500||s<=2) //进入盲区,溢?
{
uchar i;
s=0;
TH0=0;
TL0=0; //清零
P0=0x40;
an=1;
an=0;
for(i=0;i<3;i++)
{

P0=W[i];
wei=1;
wei=0;

}
}
else //正常显示
{
wei=1;
P0=0xfe;
wei=0;
an=1;
P0= WE0[temp[0]];
delay(3);
an=0;
wei=1;
P0=0xfd;
wei=0;
an=1;
P0= WE0[temp[1]];
delay(2);
an=0;
wei=1;
P0=0xfb;
wei=0;
an=1;
P0= WE0[temp[2]];
delay(1);
}
}

void main()
{
TMOD=0X01; //定时器工作方式0
TH0=0;
TL0=0;
EA=1; //开总中断
ET0=1;//开定时器中断
while(1)
{
start();//启动模块
while(!RX); //当RX为零时等待
TR0=1; //启动计数
while(RX); //当RX为1时计数并等待
TR0=0; //关闭计数器
count(); //计数
dispros(); //处理,分割数据
display(); //显示
delay(1);
}
}

㈣ 帮忙详细解答一下基于单片机的超声波测距仪的汇编源程序(急求啊)

我可以负责的告诉你,用C吧,完全可以胜任。
2003年的时候我们为了确保MCU的效率(时效性),强制使用汇编写的超声波程序,结果程序写不大,汇编你也知道,写百八十行可以,代码多了,这程序就没法看了,更谈不上程序升级和维护了。因此,那一代超声波产品的功能很弱。
2006年,我们要重新设计第二代超声波产品,要求可靠性好、功能强大,自然的代码量也要多了,当时我们仍然固执的使用汇编、绝不用C,可汇编的代码仍然写不长,为了方便技术人员管理和后续的产品升级,我把这一套复杂的系统代码分成了4级,也就是4套汇编代码,分别在32个MCU里运行(同一个设备里),这4套代码分别交给4个人来编写和维护,这4个人中若有人跳槽走了,由于他掌握的代码量小,功能又单一,接替他的人也很容易接手。(否则,这4套汇编程序,集中在一个冗长的代码里,那么这套代码将很难维护,而且几乎只能有1个人才能完全看懂它,一旦这个人走了,别人很难接手这套‘烂’程序,这对于产品的持续改进非常不利)
2008年,我们试探性的,在DSP(TMS320F28335)上用C完成了所有的功能,而且程序量比汇编要少得多,可读性、可维护性也要好得多。后来,我们在单片机上,也用C完成了绝大部分功能,原来担心的时效性问题从没有发生,这才领悟:2003-2008这5年,我们绕了一个大圈。
从此以后,我们就不再用汇编了,用C写超声波程序一直至今(偶尔嵌入汇编代码),算一下也有5年了,从没觉得C有任何局限性。
那么,你是还觉得必须要用汇编么?

㈤ 51单片机控制的超声波测距程序问题,为什么num一直为0

嗯!这个问题是!你的外部中断使用的是外部中断0,而定时器使用的也是0.在51内,外部中断0的优先级是要大于定时器0的。所以在程序的最后是要先执行外部中断0的!

然后你的程序就会先进入外部中断服务,然后你在外部中断中又把定时器中断给关闭了!这样你就不会走到定时器中断的服务项中。

所以你的num一直是0

㈥ 求个51单片机超声波测距(距离+报警)的c程序

//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共阳数码管引脚
//Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频
//为STC单片机的IO口设置地址定义
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //产生脉冲引脚
sbit Echo = P3^2; //回波引脚
sbit test = P1^1; //测试用引脚

uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系统时钟为1/8晶振(pdf-45页)
P0M1 = 0; //将io口设置为推挽输出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test=0;
Trig=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
//ET1=1; //打开定时器1中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0

while(1) //程序循环
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //产生一个20us的脉冲,在Trig引脚
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;

while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断

if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零
test= !test; //测试灯变化
}

/// distance[i]=distance_data; //将测量结果的数据放入缓冲区
/// i++;
/// if(i==3)
/// {
/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
/// pai_xu();
/// distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
/// i=0;
/// }
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=;P2=0xfb;flag=0;break;
}
}
//*****************************************************************
/*
//定时器1中断,用做超声波测距计时
timer1() interrupt 3 // 定时器0中断是1号
{
TH1=0;
TL1=0;
}
*/
//******************************************************************
//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ ucharbt ;
for(bt=0;bt<100;bt++);
}
/*
void pai_xu()
{ uint t;
if(distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交换值
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交换值
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交换值
}
*/

㈦ 51单片机控制的超声波测距仪程序

希望对你有帮助
//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0

while(1) //程序循环
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //产生一个20us的脉冲,在Tx引脚
while(Rx==0); //等待Rx回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;

while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断

if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零

}

distance[i]=distance_data; //将测量结果的数据放入缓冲区
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
pai_xu();
distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=;P2=0xdf;flag=0;break;
}
}

//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data]&0x7f;
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************

void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}

㈧ 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单片机 HC-SR04超声波测距 我写的C语言代码,请问

1、HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。


2、例程:

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*位定义*/
sbitCHUFA=P0^1;//位定义超声波触发端(10us以上高电平触发)
sbitJIESHOU=P0^3;//接收端(接受高电平)
sbitBEEP=P2^0;//蜂鸣器
sbitOUT0=P3^2;//外部中断0
ucharJS_FLAG;//接收标志
uintCF_TIME,t0,t1,shu;
/*函数声明*/
voidtimer0();
voidint0();
voiddisplay(uint);
main(){
CHUFA=0;//初始化拉低触发端和接收端电平
JIESHOU=0;
JS_FLAG=0;
CF_TIME=15;//初始化触发时间(大于10us)
TMOD=0x11;//定时器方式选择
EA=1;//开总中断
ET0=1;//开定时器0中断
EX0=1;//开外部中断0
IT0=0;//外部中断选择下降沿触发
//JIESHOU=1;
while(1){
OUT0=JIESHOU;//外部中断0被赋值为接收端信号,当出现下降沿是触发外部中断0
if(JS_FLAG==0){//如果没有接收到高电平则触发
CHUFA=1;
while(CF_TIME--);//10us以上高电平触发传感器
}
if(JIESHOU==1){
TR0=1;//如果接收端收到高电平则启动定时器
JS_FLAG=1;//并且标志位置1
BEEP=0;//蜂鸣器响
}
display(t1);//显示测量时间(秒)
}
}
/*定时器0中断程序*/
voidtimer0()interrupt1{
TH0=(65536-10000)/256;//装初值10ms
TL0=(65536-10000)%256;
t0++;//每进入一次中断t0加1
}
/*外部中断0中断程序*/
voidint0()interrupt0{
TR0=0;//一旦进入外部中断0,说明接收端收到下降沿信号。关闭定时器0
JS_FLAG=0;//接收标志位置0
BEEP=1;//关闭蜂鸣器
t1=t0*10/1000;//测量时间为进入定时器中断次数t0乘以每次时间10ms,除以1000化为秒为单位
t0=0;//t0清零
}
/*数码管显数函数*/
voiddisplay(uintshu){
//数码管显示函数
}

㈩ 求一段汇编程序,利用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 ;结束

我见过一款制作容易免调试的超声波测距板,你可到“谷歌”上搜索一下《一款制作容易免调试的超声波测距板》,该超声波测距板结构简单、制作容易不需要调试、测量精度高,比较适合单片机初学都使用,同时也是单片机课程设计比较好的实训课题。该超声波测距系统,提供套件,及组装好的板件,含原理图、源程序、设计说明等。

阅读全文

与单片机超声波测距程序相关的资料

热点内容
我的世界如何编程 浏览:84
vue反编译代码有问题 浏览:948
linuxshell字符串连接字符串 浏览:51
androidviewpager刷新 浏览:438
python编程计算平均分 浏览:678
加密数字货币市值查询 浏览:692
时尚商圈app怎么样 浏览:584
stacklesspython教程 浏览:138
用命令行禁用135端口 浏览:212
linux防火墙编程 浏览:627
pdf阅读器删除 浏览:979
考研人如何缓解压力 浏览:822
买电暖壶哪个app便宜 浏览:505
洛克王国忘记服务器了怎么办 浏览:782
为什么cf登录服务器没反应 浏览:695
服务器如何获取文件列表 浏览:672
creo五轴编程光盘 浏览:14
苹果app网络验证在哪里 浏览:14
博科清空命令 浏览:384
简爱英文pdf 浏览:376