超声波测距C语言遇到问题
敬请高手降临!//////////超声波测距模块理论测量范围0.1275m~~~22.2819m(最小量程程序已定,实际最大量程取决于硬件,程序只显示前2位小数)#inc...
敬请高手降临!
//////////超声波测距模块 理论测量范围 0.1275m~~~22.2819m(最小量程程序已定,实际最大量程取决于硬件,程序只显示前2位小数)
#include<reg51.h>
#define WEI P0
#define DUAN P1 //10/11///12
/////////////////0////1///2////3////4////5////6////7////8////9/ //E///r////o//
char TAB[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
sbit TX=P2^0;////发送端
void send();
void delay8us(unsigned char x);//
void delayms(unsigned char x);//
///////////////主程序
void main()
{TH1=0X00;
TL1=0X00;
TH0=0X00;
TL0=0X00;/////////////////软复位T1 T0
IT1=0;///////负边缘触发
EX1=1;///////开INT1中断
ET0=1;///////开TF0中断
ET1=1;///////开TF1中断
TMOD=0x11;/////////////设定两个计时器工作方式一
IP=0x04;/////////INT1最高优先级
TX=0;
send();
}
////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
////////////////////////////////////////////////////
void send()////发送子程序
{
unsigned int n;
EA=1;////////开总中断
TR0=1;
TX=0;
for(n=15;n>0;n--)
{
delay8us(3); ////电平保持25US
TX=!TX;
}
delayms(100);/////延时1s 等待返回声波
}
void Times (void)interrupt 1 ////T0溢出 启动T1接力
{EX0=0;//////关TF0中断
TH1=0X00;
TL1=0X00;
TR1=1;
}
void rec (void)interrupt 2///第一个脉冲到来 保存数据 T1计数!丢失大于5个电平丢弃!
{unsigned char a,b,j,y;
unsigned int s;
unsigned short t1,t0;
unsigned long c;
EX1=0;///////关int1中断
TR0=0;/////关停定时器
TR1=0;///
t0=(TL0+TH0*256);/////////
t1=(TL1+TH1*256);////////
////////////////////////////
TMOD=0xc0;
TH1=0X00;
TL1=0X00;
TR1=1;
delayms(1);
if(TL1>10)///////////////////////////////
{
////////////////////////////////////////////////////////////////////////////
c=(unsigned long)340*(t0+t1)/2; /// S=v(t0+t1)/2
a=c/10000000;//小数点前2位
b=(c%10000000)/1000000; //个位 计算区
j=(c%1000000)/100000; // 小数点后一位
y=(c%100000)/10000; //小数点后2位
//////////////////////////////////////////////////////////////////////////////
for(s=1000;s>0;s--){
WEI=TAB[a];/////十位
DUAN=0xf7;// //
delayms(1);//延时
//个位
delayms(1);
WEI=~0X80; ///小数点
DUAN=0xfb;
delayms(1);
WEI=TAB[b];
DUAN=0xfb;//
delayms(1);//
///小数点后一位
WEI=TAB[j];//
DUAN=0xfd;///
delayms(1);// //延时 显示距离区
/// //小数点后第二位
DUAN=0xff;
WEI=0x00;
delayms(1);
WEI=TAB[y];
DUAN=0xfe;//
delayms(1);//
}///////////////////////////////////////////////////
}
else
{
for(s=1000;s>0;s--)
{
WEI=0xf8;//0x61;
DUAN=0xf7;
delayms(1);
WEI=0xf8;//0x0b;
DUAN=0xfb; ////////////////////////显示错误区(电平丢失数大于5,精度得不到保证)显示7777
delayms(1);
WEI=0xf8;//0x0b;
DUAN=0xfd;
delayms(1);
WEI=0xf8;//0xc5;
DUAN=0xfe;;
delayms(1);
}}
main();
}
未完!
void CC (void)interrupt 3///T1溢出超出量程 显示 C C C C
{unsigned int s;
EA=0;
for(s=10;s>0;s--)
{WEI=0xa7;
DUAN=0xf7;
delayms(1);
DUAN=0xfb;
delayms(1);
DUAN=0xfd;
delayms(1);
DUAN=0xfe;;
delayms(1);
}}
///////
//////////////////////////////////////////////////////
///// 1ms延时
void delayms(unsigned char x)///1Ms延时子程序
{
unsigned char y;
for (x=0;x<y;x++)
for (y=0;y<120;y++);
}
/////////8.3us延时
void delay8us(unsigned char x)
{unsigned char y;
for (x=0;x<y;x++)
for (y=0;y<1;y++);
}
该程序只能显示7777 (T1在1MS的闸门时间内接收不到10个电平丢弃) 麻烦高手挑错 挑漏洞! 展开
//////////超声波测距模块 理论测量范围 0.1275m~~~22.2819m(最小量程程序已定,实际最大量程取决于硬件,程序只显示前2位小数)
#include<reg51.h>
#define WEI P0
#define DUAN P1 //10/11///12
/////////////////0////1///2////3////4////5////6////7////8////9/ //E///r////o//
char TAB[10] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
sbit TX=P2^0;////发送端
void send();
void delay8us(unsigned char x);//
void delayms(unsigned char x);//
///////////////主程序
void main()
{TH1=0X00;
TL1=0X00;
TH0=0X00;
TL0=0X00;/////////////////软复位T1 T0
IT1=0;///////负边缘触发
EX1=1;///////开INT1中断
ET0=1;///////开TF0中断
ET1=1;///////开TF1中断
TMOD=0x11;/////////////设定两个计时器工作方式一
IP=0x04;/////////INT1最高优先级
TX=0;
send();
}
////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
////////////////////////////////////////////////////
void send()////发送子程序
{
unsigned int n;
EA=1;////////开总中断
TR0=1;
TX=0;
for(n=15;n>0;n--)
{
delay8us(3); ////电平保持25US
TX=!TX;
}
delayms(100);/////延时1s 等待返回声波
}
void Times (void)interrupt 1 ////T0溢出 启动T1接力
{EX0=0;//////关TF0中断
TH1=0X00;
TL1=0X00;
TR1=1;
}
void rec (void)interrupt 2///第一个脉冲到来 保存数据 T1计数!丢失大于5个电平丢弃!
{unsigned char a,b,j,y;
unsigned int s;
unsigned short t1,t0;
unsigned long c;
EX1=0;///////关int1中断
TR0=0;/////关停定时器
TR1=0;///
t0=(TL0+TH0*256);/////////
t1=(TL1+TH1*256);////////
////////////////////////////
TMOD=0xc0;
TH1=0X00;
TL1=0X00;
TR1=1;
delayms(1);
if(TL1>10)///////////////////////////////
{
////////////////////////////////////////////////////////////////////////////
c=(unsigned long)340*(t0+t1)/2; /// S=v(t0+t1)/2
a=c/10000000;//小数点前2位
b=(c%10000000)/1000000; //个位 计算区
j=(c%1000000)/100000; // 小数点后一位
y=(c%100000)/10000; //小数点后2位
//////////////////////////////////////////////////////////////////////////////
for(s=1000;s>0;s--){
WEI=TAB[a];/////十位
DUAN=0xf7;// //
delayms(1);//延时
//个位
delayms(1);
WEI=~0X80; ///小数点
DUAN=0xfb;
delayms(1);
WEI=TAB[b];
DUAN=0xfb;//
delayms(1);//
///小数点后一位
WEI=TAB[j];//
DUAN=0xfd;///
delayms(1);// //延时 显示距离区
/// //小数点后第二位
DUAN=0xff;
WEI=0x00;
delayms(1);
WEI=TAB[y];
DUAN=0xfe;//
delayms(1);//
}///////////////////////////////////////////////////
}
else
{
for(s=1000;s>0;s--)
{
WEI=0xf8;//0x61;
DUAN=0xf7;
delayms(1);
WEI=0xf8;//0x0b;
DUAN=0xfb; ////////////////////////显示错误区(电平丢失数大于5,精度得不到保证)显示7777
delayms(1);
WEI=0xf8;//0x0b;
DUAN=0xfd;
delayms(1);
WEI=0xf8;//0xc5;
DUAN=0xfe;;
delayms(1);
}}
main();
}
未完!
void CC (void)interrupt 3///T1溢出超出量程 显示 C C C C
{unsigned int s;
EA=0;
for(s=10;s>0;s--)
{WEI=0xa7;
DUAN=0xf7;
delayms(1);
DUAN=0xfb;
delayms(1);
DUAN=0xfd;
delayms(1);
DUAN=0xfe;;
delayms(1);
}}
///////
//////////////////////////////////////////////////////
///// 1ms延时
void delayms(unsigned char x)///1Ms延时子程序
{
unsigned char y;
for (x=0;x<y;x++)
for (y=0;y<120;y++);
}
/////////8.3us延时
void delay8us(unsigned char x)
{unsigned char y;
for (x=0;x<y;x++)
for (y=0;y<1;y++);
}
该程序只能显示7777 (T1在1MS的闸门时间内接收不到10个电平丢弃) 麻烦高手挑错 挑漏洞! 展开
展开全部
好长的题目,标记一些,等有空再来找出错误。
且说说楼主,给个分数好吸引人啊,0分,确实没什么吸引的,而且这个调试貌似很繁琐
且说说楼主,给个分数好吸引人啊,0分,确实没什么吸引的,而且这个调试貌似很繁琐
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
通测科技
2021-07-30 广告
2021-07-30 广告
选择正确的光时域反射仪 (OTDR)1.OTDR是一种光纤测试仪,用于测试光通信网络的特性。OTDR旨在探测、定位和测量光纤链路任何位置上的事件。OTDR只需接入链路的一端,其工作方式类似于一维雷达系统。通过提供被测光纤的图形化迹线特征,用...
点击进入详情页
本回答由通测科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询