永发信息网

超声波测距程序问题

答案:2  悬赏:30  手机版
解决时间 2021-02-20 16:01
#include 我这样写的中断服务行吗?不知为什么总是只能测2-20cm的超过20cm就会发神经。大神帮帮忙。

#define uint unsigned int
#define uchar unsigned char
#define sm unsigned char
sbit gnd1=P1^0;
sbit gnd2=P1^1;
sbit rx=P1^2;
sbit tx=P1^3;
sbit rs=P2^6; //命令
sbit rw=P2^5; //读写
sbit lcde=P2^7; //时钟

uchar code zf2[]="0123456789 abcdefghijklmnopqrxtuvwxyz .,?!<>=+-();*/%~#_[]{} ";

uchar k;num;ge;shi;bai;qian;

void delay_short(uchar x)
{
uint i;
for(i=x;i>0;i--);
}

void delay_long(uchar y)
{
uint i,j;
for(i=y;i>0;i--)
for(j=120;j>0;j--);
}

void write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay_short(400);
lcde=1;
delay_short(1);
lcde=0;
}

void write_dat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay_short(1);
lcde=1;
delay_short(1);
lcde=0;
}
void init()
{
gnd1=0;
gnd2=0;
write_com(0x38); //设置显示模式
write_com(0x0c); //开显示且光标不显示
write_com(0x01); //清屏
write_com(0x06);
for(num=0;num<1;num++)
{
write_com(0x18);
delay_long(1);
}
}

void xscx()
{
write_com(0x80+0x01); //地址
write_dat(zf2[qian]); //内容

write_com(0x80+0x02);
write_dat(zf2[bai]);

write_com(0x80+0x03);
write_dat(zf2[shi]);

write_com(0x80+0x04);
write_dat(zf2[41]);

write_com(0x80+0x05);
write_dat(zf2[ge]);

write_com(0x80+0x06);
write_dat(zf2[13]);

write_com(0x80+0x07);
write_dat(zf2[23]);
}
最佳答案



我贴一个测试成功的51程序,试了多个超声波模块,可以测试0到5米距离。测试结果从串口反馈到PC,也有从数码管显示的。有疑问欢迎Q我。QQ号在最后:

#include
#include "stdio.h"
#include "MCU_UART.H"
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P1^0 ;
sbit Echo = P3^2 ;



uchar code table[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar code table_d[16] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};
//
int timeH = 0;
int timeL = 0;
int succeed_flag;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//
void delay_20us()
{
uchar a ;
for(a=0;a<100;a++);
//for(a=0;a<5;a++);
}
/

}
//***************************************************************
void main()
{
uint distance;
int test;
char str[5];
int discount=0;
int MaxCount = 10;
int minDistance = 90000;//最小距离是90000米
float distforeachcyle = 0.172*1.085; //fosc=11.0592
int time;
init_uart();
test =0;
Trig=0; //首先拉低脉冲输入引脚
EA=1; //打开总中断0
TMOD=TMOD|0x01; //定时器0,16位工作方式
printu("Begin Ceju.\r\n");
while(1)
{
EA=0; //关总中断
Trig=1; //超声波输入端
delay_20us(); //延时20us
Trig=0; //产生一个20us的脉冲
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
TH0=0; //定时器1清零
TL0=0; //定时器1清零
TF0=0; //计数溢出标志
EX0=1; //打开外部中断0
TR0=1; //启动定时器1
delay(40); //等待测量的结果
TR0=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;

//distance=time*0.172; //12MHz晶振,每个机器周期是1us,单位应该是毫米 声速340m/s,1us往返距离是0.34mm,1us单程距离是0.17mm
distance=time*distforeachcyle; //11.0592MHz晶振,每个机器周期是1us,单位应该是毫米 声速340m/s,1us往返距离是0.34mm,1us单程距离是0.17mm
//display(distance);

if (discount < MaxCount) //取20次的最小值作为结果
{
discount++ ;
if (distance display(minDistance); //取一段时间的最小距离作为测距结果,在数码管显示出来

}
else
{
if (minDistance<90000) display(minDistance); //取一段时间的最小距离作为测距结果,在数码管显示出来
discount=0;
minDistance = 90000;//最小距离是90000米
printu("The distance is:");
sprintf(str, "%d\r\n", distance);//
printu(str);

}
}
if(succeed_flag==0)
{
distance=0; //没有回波则清零
test = !test; //测试灯变化
}
//delay(200); //延迟再开始下一次测量
}
}
//***************************************************************
//外部中断0,用做判断回波电平
void exter() interrupt 0 // 外部中断0是0号
{
timeH =TH0; //取出定时器的值
timeL =TL0; //取出定时器的值
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做超声波测距计时
void timer0() interrupt 3 //
{
TH0=0;
TL0=0;
}

QQ:1041539926
全部回答
导火索粉红色说得好豆腐干豆腐干
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
唐朝的京城在哪里?
家访的家访目的
纳当在什么地方啊,我要过去处理事情
长安悦翔V3为什么双闪灯常亮关不了怎么了
1923年,孙中山在《中国革命史》一文中曾自述
成都乐山理工大学工程技术学院的学费好高
上面一个繁写的龙下面一个虫是什么字
江岸区武汉CINE CAFE地址是什么,有没有知道
香港2次,澳门一次的,有效期一年的港澳通行证,
la prairie莱珀妮含义激素吗
高二学生有叛逆心理不爱学习怎么办
a1524是什么版本,能支持移动3g网络吗
扫荣这个地址在什么地方,我要处理点事
内蒙古牧区牧场的特色是AA. 温带草原牧场B.
怎么炸土豆条才能不变软?
推荐资讯
短的英文单词是什么
河北康辉国旅(藁城营业部)地址有知道的么?有
冰糖白糖水煮多长时间才会黏稠?
丰硕堂大药房NO.69地址在哪,我要去那里办事
帮我想一个广招女朋友的广告词,要幽默风趣搞
问两部tvb播过的动漫,第一部是叫《xx童》的
驾照刚刚处理车上违章被扣了9分,昨天路上又
不锈钢生锈可不可以酸洗?
用友固定资产卡片汇总入的怎么分开
哪吒纹身图案大全
能帮忙把这个名字翻译成泰语么.高玉碧.谢啦.
夏天的结尾
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?