我自己写了一个超声波测距的程序,用51单片机,1602液晶显示,但是现在显示不出来,请各位大神帮忙

我自己写了一个超声波测距的程序,用51单片机,1602液晶显示,但是现在显示不出来,请各位大神帮忙,第1张

希望对你有帮助

//超声波模块显示程序

#include <reg52h> //包括一个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,bai,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);//等待测量的结果,周期65535毫秒(可用中断实现)

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秒=( 2Y米)/344 ==》X秒=00058Y米 ==》厘米=微秒/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=bai;P2=0xdf;flag=0;break;

}

}

//显示数据转换程序

void conversion(uint temp_data)

{

uchar ge_data,shi_data,bai_data ;

bai_data=temp_data/100 ;

temp_data=temp_data%100; //取余运算

shi_data=temp_data/10 ;

temp_data=temp_data%10; //取余运算

ge_data=temp_data;

bai_data=SEG7[bai_data];

shi_data=SEG7[shi_data]&0x7f;

ge_data =SEG7[ge_data];

EA=0;

bai = bai_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;}

}

呵呵,小同学,平时不好好学习,知道急了吧。无线电波范围比较广,无线电是指在自由空间(包括空气和真空)传播的电磁波,是其中的一个有限频带,上限频率 在300GHz(吉赫兹),下限频率较不统一, 在各种射频规范书, 常见的有三 3KHz~300GHz(ITU-国际电信联盟规定), 9KHz~300GHz, 10KHz~300GHz。

无线电技术是通过无线电波传播信号的技术。

无线电技术的原理在于,导体中电流强弱的改变会产生无线电波。利用这一现象,通过调制可将信息加载于无线电波之上。当电波通过空间传播到达收信端,电波引起的电磁场变化又会在导体中产生电流。 通过解调将信息从电流变化中提取出来,就达到了信息传递的目的。

声音广播的最早形式是航海无线电报。它采用开关控制连续波的发射与否,由此在接收机产生断续的声音信号,即摩尔斯电码。

调幅广播可以传播音乐和声音。调幅广播采用幅度调制技术,即话筒处接受的音量越大则电台发射的能量也越大。 这样的信号容易受到诸如闪电或其他干扰源的干扰。

调频广播可以比调幅广播更高的保真度传播音乐和声音。对频率调制而言,话筒处接受的音量越大对应发射信号的频率越高。调频广播工作于甚高频段(Very High Frequency,VHF)。频段越高,其所拥有的频率带宽也越大,因而可以容纳更多的电台。同时,波长越短的无线电波的传播也越接近于光波直线传播的特性。

调频广播的边带可以用来传播数字信号如,电台标识、节目名称简介、网址、股市信息等。在有些国家,当被移动至一个新的地区后,调频收音机可以自动根据边带信息自动寻找原来的频道。

航海和航空中使用的话音电台应用VHF调幅技术。这使得飞机和船舶上可以使用轻型天线。

政府、消防、警察和商业使用的电台通常在专用频段上应用窄带调频技术。这些应用通常使用5KHz的带宽。相对于调频广播或电视伴音的16KHz带宽,保真度上不得不作出牺牲。

民用或军用高频话音服务使用短波用于船舶,飞机或孤立地点间的通讯。大多数情况下,都使用单边带技术,这样相对于调幅技术可以节省一半的频带,并更有效地利用发射功率。

陆地中继无线电(Terrestial Trunked Radio, TETRA)是一种为军队、警察、急救等特殊部门设计的数字集群电话系统。

电话

蜂窝电话或移动电话是当前最普遍应用的无线通信方式。蜂窝电话覆盖区通常分为多个小区。每个小区由一个基站发射机覆盖。理论上,小区的形状为蜂窝状六边形,这也是蜂窝电话名称的来源。当前广泛使用的移动电话系统标准包括:GSM,CDMA和TDMA。运营商已经开始提供下一代的3G移动通信服务,其主导标准为UMTS和CDMA2000。

卫星电话存在两种形式:INMARSAT 和 铱星系统。两种系统都提供全球覆盖服务。 INMARSAT使用地球同步卫星,需要定向的高增益天线。铱星则是低轨道卫星系统,直接使用手机天线

电视

通常的模拟电视信号采用将图像调幅,伴音调频并合成在同一信号中传播。

数字电视采用MPEG-2图像压缩技术,由此大约仅需模拟电视信号一半的带宽。

紧急服务

无线电紧急定位信标 (emergency position indicating radio beacons,EPIRBs), 紧急定位发射机或 个人定位信标是用来在紧急情况下对人员或测量通过卫星进行定位的小型无线电发射机。它的作用是提供给救援人员目标的精确位置,以便提供及时的救援。

数据传输

数字微波传输设备、卫星等通常采用正交幅度调制(Quadrature Amplitude Modulation,QAM)。QAM调制方式同时利用信号的幅度和相位加载信息。这样,可以在同样的带宽上传递更大的数据量。

IEEE 80211是当前无线局域网(Wireless Local Area Network,WLAN)的标准。它采用2GHz或5GHz频段,数据传输速率为11 Mbps或54 Mbps。

蓝牙(Bluetooth)是一种短距离无线通讯的技术。

超声波是频率高于20000赫兹的声波,它方向性好,穿透能力强,易于获得较集中的声能,在水中传播距离远,可用于测距,测速,清洗,焊接,碎石、杀菌消毒等。在医学、军事、工业、农业上有很多的应用。超声波因其频率下限大约等于人的听觉上限而得名。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹。我们人类耳朵能听到的声波频率为20~20000Hz。当声波的振动频率大于20KHz或小于20Hz时,我们便听不见了。因此,我们把频率高于20000赫兹的声波称为“超声波”。通常用于医学诊断的超声波频率为1~5兆赫兹。

最大的区别在于一个是电波,一个是声波,电波可以不借助介质就自由传播,声波则不行,必须借助介质才能传播。

你好,我前段时间使用了HC-SR04超声波测距仪来测距离,用51单片机控制,LCD1602显示距离,精确到001cm,最大可测400cm。

我把我的程序给你,能做个测距和显示的参考。

若我们使用的是同一型号的超声波测距仪,可以回复我一起讨论。

希望我的回答能帮助到你。

洗菜机肯定有用的。经过无数个测试和研究,洗菜机有用吗?已经不是个疑问句,而是肯定句。世界健康卫生组织已在呼吁更多家庭购买洗菜机来确保食材的安全。那么目前上洗菜机哪个牌子好呢?

1、冰尊洗菜机(又称果蔬清洗机)

2022SS年冰尊果蔬清洗机,冰尊净水器和冰尊空气净化器被中央电视台CCTV推荐上榜,我们要相信品牌的力量!

据统计,冰尊果蔬清洗机连续5年位居行业榜首,一直是行业的标杆!

冰尊最大优势:技术最强、资格最老、效果最好。冰尊研发出“负离子净化”、“超声波消毒灭菌”、“HEPA过滤”、“双核内胆”、“弱碱性净化”、“无缝设计”、“多层分体压缩”、“纯天然物理净芯”、“磁化高氧活化”等高新技术,真正实现无任何化学物质的添加,所以净化更干净,更健康!

德国冰尊到今年为止已连续10年获得全球十大净水净化排名第一名,冰尊在行业里是一个不灭的神话,是全世界公认最顶级的净水净化品牌,世界上90%的皇宫皇室、皇亲贵族、成功人士等都在使用冰尊果蔬清洗机、冰尊净水器和冰尊空气净化器。冰尊已经是至高无上的尊贵身份象征,是“高端、大气、上档次”的代名词!

2、史密斯果蔬清洗机

AO史密斯公司是一家跨国电器企业,史密斯近年来研究开发的果蔬清洗机对于食品程度重等情况的净食机效果也不错。

3、CDE果蔬清洗机

CDE果蔬清洗机来自成都圣百纳公司。该公司专注健康领域,聚焦食品污染,自主研发、销售产品,。所以这个品牌的净食机技术和质量是过硬的,品牌也是一个很多青年人支持的国产新生品牌,受到很多消费者的支持。

4、轩帝果蔬清洗机

轩帝尼果蔬清洗机脱胎于圣帝尼,创始人是圣帝尼高级工程师。高能效实现低能耗,两天仅需一度电。

5、时道果蔬清洗机

时道作为一家知名家电品牌,其公司把综合性家电服务为主营业务,在净食机上,时道也专注于研究滤网离子技术,采用独有的“净离子群”食品净化技术,双重净化方式,也是深受消费者们的喜欢。

给你贴一个吧,显示部分的代码你需要修改一下(因为这个代码里面的数码管显示用不到段选位选) //超声波模块显示程序 #include <reg52h> //包括一个52标准内核的头文件 #define uchar unsigned char //定义一下方便使

//超声波模块ME007显示程序

//晶振=8M

//MCU=STC10F04XE

//P00-P06共阳数码管引脚

//Trig = P1^0

//Echo = P3^2

#include <reg52h> //包括一个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 code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9

uint distance[4]; //测距接收缓冲区

uchar ge,shi,bai,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);//等待测量的结果,周期65535毫秒(可用中断实现)

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秒=( 2Y米)/344 ==》X秒=00058Y米 ==》厘米=微秒/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=bai;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,bai_data ;

bai_data=temp_data/100 ;

temp_data=temp_data%100; //取余运算

shi_data=temp_data/10 ;

temp_data=temp_data%10; //取余运算

ge_data=temp_data;

bai_data=SEG7[bai_data];

shi_data=SEG7[shi_data];

ge_data =SEG7[ge_data];

EA=0;

bai = bai_data;

shi = shi_data;

ge = ge_data ;

EA=1;

}

//

void delay_20us()

{ uchar bt ;

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;} /交换值

}

/

我的一个超声波程序

有问题,请问~~

//超声波模块显示程序

#include <reg52h> //包括一个52标准内核的头文件

#include<intrinsh> //包含_nop_()函数定义的头文件

#define uchar unsigned char //定义一下方便使用

#define uint unsigned int

#define ulong unsigned long

sbit Tx = P3^3; //产生脉冲引脚

sbit Rx = P3^2; //回波引脚

sbit RS=P2^0; //寄存器选择位,将RS位定义为P20引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P21引脚

sbit E=P2^2; //使能信号位,将E位定义为P22引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P07引脚

unsigned char code string[ ]= {"CHAO SHENG BO"};

//unsigned char code string1[ ]={"QUICK STUDY MCU"};

unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

//uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9

uint distance[4]; //测距接收缓冲区

uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定义寄存器

bit succeed_flag; //测量成功标志

//函数声明

void conversion(uint temp_data);

void delay_20us();

void pai_xu();

/

函数功能:延时1ms

(3j+2)i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

/

void delay1ms()

{

unsigned char i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/

函数功能:延时若干毫秒

入口参数:n

/

void delay(unsigned char n)

{

unsigned char i;

for(i=0;i<n;i++)

delay1ms();

}

/

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

/

unsigned char BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空 *** 作

_nop_();

_nop_();

_nop_(); //空 *** 作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0; //将E恢复低电平

return result;

}

/

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_(); //空 *** 作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空 *** 作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空 *** 作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/

函数功能:指定字符显示的实际地址

入口参数:x

/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码x"

}

/

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空 *** 作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空 *** 作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/

函数功能:对LCD的显示模式进行初始化设置

/

void LcdInitiate(void)

{

delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38); //连续三次,确保初始化成功

delay(5);

WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁

delay(5);

WriteInstruction(0x06); //显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除

delay(5);

}

void main(void) // 主程序

{ uint distance_data,a,b;

uchar CONT_1;

uchar k; //定义变量i指向字符串数组元素

LcdInitiate(); //调用LCD初始化函数

delay(10); //延时10ms,给硬件一点反应时间

WriteAddress(0x01); // 从第1行第3列开始显示

k = 0; //指向字符数组的第1个元素

while(string[k] != '\0')

{

WriteData(string[k]);

k++; //指向下字符数组一个元素

}

i=0;

flag=0;

Tx=0; //首先拉低脉冲输入引脚

TMOD=0x10; //定时器0,定时器1,16位工作方式

// TR0=1; //启动定时器0

IT0=0; //由高电平变低电平,触发外部中断

//ET0=1; //打开定时器0中断

EX0=0; //关闭外部中断

EA=1; //打开总中断0

while(1) //程序循环

{

WriteAddress(0x41); // 从第2行第6列开始显示

WriteData('J'); //将万位数字的字符常量写入LCD

WriteData('U'); //将万位数字的字符常量写入LCD

WriteData('L'); //将万位数字的字符常量写入LCD

WriteData('I'); //将万位数字的字符常量写入LCD

WriteData(':'); //将万位数字的字符常量写入LCD

WriteData(digit[bai]); //将万位数字的字符常量写入LCD

WriteData(digit[shi]); //将千位数字的字符常量写入LCD

WriteData(''); //将万位数字的字符常量写入LCD

WriteData(digit[ge]); //将百位数字的字符常量写入LCD

WriteData(' '); //将百位数字的字符常量写入LCD

WriteData('C'); //将万位数字的字符常量写入LCD

WriteData('M'); //将万位数字的字符常量写入LCD

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);//等待测量的结果,周期65535毫秒(可用中断实现)

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秒=( 2Y米)/344 ==》X秒=00058Y米 ==》厘米=微秒/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;

}

//显示数据转换程序

void conversion(uint temp_data)

{

uchar ge_data,shi_data,bai_data ;

bai_data=temp_data/100 ;

temp_data=temp_data%100; //取余运算

shi_data=temp_data/10 ;

temp_data=temp_data%10; //取余运算

ge_data=temp_data;

//bai_data=SEG7[bai_data];

//shi_data=SEG7[shi_data]&0x7f;

//ge_data =SEG7[ge_data];

EA=0;

bai = bai_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;}

}

第一个需要修改,你还是试试这个吧!这个你先理解下,修改引脚……显示为1602

以上就是关于51单片机控制的超声波测距仪程序全部的内容,包括:51单片机控制的超声波测距仪程序、“无线电波”和“超声波”的区别!急急急急急急急急急急急急急急急急~~~~~~~~这是我周末的作业呀!、我自己写了一个超声波测距的程序,用51单片机,1602液晶显示,但是现在显示不出来,请各位大神帮忙等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8815303.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-21
下一篇 2023-04-21

发表评论

登录后才能评论

评论列表(0条)

保存