这个51单片机HC-SR04超声波测距程序哪里错了
//晶振11.0592MHz#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbittrig...
//晶振11.0592MHz
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P0^2;
sbit echo=P3^3;
float dis=0;
uint irtime=0;
void delay_20us()
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
void TIM1init(void)//定时器1初始化
{
TMOD=0x22;//定时器1工作方式2,TH1是重装值,TL1是初值
TH1=0xd2; //重载值 溢出一次约50us
TL1=0xd2; //初始化值
ET1=1; //开中断
}
void EX1init(void) //外部中断1初始化
{
IT1 = 1; //指定外部中断0下降沿触发,INT1 (P3.3)
EA = 1; //开总中断
}
/*------------------------------------------------
定时器1中断处理
------------------------------------------------*/
void tim1_isr (void) interrupt 3
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断1中断处理
------------------------------------------------*/
void EX1_ISR (void) interrupt 2 //外部中断1服务函数
{
dis=340*(irtime/2.0)*50/10000;
irtime=0;
TR1=0;
EX1=0;
}
void test(void)
{
trig=1;
delay_20us();
trig=0;
EX1=1;
while(!echo);
TR1=1;
}
void main(void)
{
TIM1init();
EX1init();
while(1)
{
test();
display(dis);
}
}
主函数调用test,然后在数码管上显示(显示函数略过),测试的时候,在数码管上显示的距离明显不对,还各种不稳定,有时就个位数上显示一个1或2,不知道怎么回事 展开
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P0^2;
sbit echo=P3^3;
float dis=0;
uint irtime=0;
void delay_20us()
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
void TIM1init(void)//定时器1初始化
{
TMOD=0x22;//定时器1工作方式2,TH1是重装值,TL1是初值
TH1=0xd2; //重载值 溢出一次约50us
TL1=0xd2; //初始化值
ET1=1; //开中断
}
void EX1init(void) //外部中断1初始化
{
IT1 = 1; //指定外部中断0下降沿触发,INT1 (P3.3)
EA = 1; //开总中断
}
/*------------------------------------------------
定时器1中断处理
------------------------------------------------*/
void tim1_isr (void) interrupt 3
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断1中断处理
------------------------------------------------*/
void EX1_ISR (void) interrupt 2 //外部中断1服务函数
{
dis=340*(irtime/2.0)*50/10000;
irtime=0;
TR1=0;
EX1=0;
}
void test(void)
{
trig=1;
delay_20us();
trig=0;
EX1=1;
while(!echo);
TR1=1;
}
void main(void)
{
TIM1init();
EX1init();
while(1)
{
test();
display(dis);
}
}
主函数调用test,然后在数码管上显示(显示函数略过),测试的时候,在数码管上显示的距离明显不对,还各种不稳定,有时就个位数上显示一个1或2,不知道怎么回事 展开
若以下回答无法解决问题,邀请你更新回答
展开全部
//晶振11.0592MHz
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig = P0^2;
sbit echo = P3^3;
float dis = 0;
void delay_20us()
{
uchar bt ;
for(bt = 0;bt<10;bt++); //此处100太大改为10即可
}
void TIM1init(void)//定时器1初始化
{
TMOD=0x11;//定时器1工作方式2,TH1是重装值,TL1是初值
TH1=0x00; //重载值 溢出一次约50us
TL1=0x00; //初始化值
}
void test(void)
{
//因为超声波最大测量4m当计时器计满时
//实际距离已经超过4m了所以此处不要用中断
TH1 = 0X00;
TL1 = 0X00;
trig = 1;
delay_20us();
trig = 0;
EX1 = 1;
while(!echo);
TR1 = 1;
//最好不要用下降沿中断检测高电平时间,
//因为在进中断函数之前会产生很多压栈
//动作会产生比较大的误差
while(echo);
TR1 = 0;
//下面计算的是米,单位自己换算一下就行了
dis = (TH1 * 256 + TL1) * 0.17f; //(TH1 * 256 + TL1) * 340 / 2 / 1000
}
void main(void)
{
TIM1init();
while(1)
{
test();
//你没有给是什么显示此处计算出来dis单位为米
//要显示厘米需要自己换算
//display(dis);
}
}
/***********************************************************************************************
此处给你改了许多,不知道你是不是刚入门,源程序有好多问题,已经帮你修改好了
不过我没做具体测试,你需要要测试一下,好久没弄过超声波了,凭记忆帮你改的,
希望对你有帮助。
************************************************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig = P0^2;
sbit echo = P3^3;
float dis = 0;
void delay_20us()
{
uchar bt ;
for(bt = 0;bt<10;bt++); //此处100太大改为10即可
}
void TIM1init(void)//定时器1初始化
{
TMOD=0x11;//定时器1工作方式2,TH1是重装值,TL1是初值
TH1=0x00; //重载值 溢出一次约50us
TL1=0x00; //初始化值
}
void test(void)
{
//因为超声波最大测量4m当计时器计满时
//实际距离已经超过4m了所以此处不要用中断
TH1 = 0X00;
TL1 = 0X00;
trig = 1;
delay_20us();
trig = 0;
EX1 = 1;
while(!echo);
TR1 = 1;
//最好不要用下降沿中断检测高电平时间,
//因为在进中断函数之前会产生很多压栈
//动作会产生比较大的误差
while(echo);
TR1 = 0;
//下面计算的是米,单位自己换算一下就行了
dis = (TH1 * 256 + TL1) * 0.17f; //(TH1 * 256 + TL1) * 340 / 2 / 1000
}
void main(void)
{
TIM1init();
while(1)
{
test();
//你没有给是什么显示此处计算出来dis单位为米
//要显示厘米需要自己换算
//display(dis);
}
}
/***********************************************************************************************
此处给你改了许多,不知道你是不是刚入门,源程序有好多问题,已经帮你修改好了
不过我没做具体测试,你需要要测试一下,好久没弄过超声波了,凭记忆帮你改的,
希望对你有帮助。
************************************************************************************************/
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
都没程序,还哪里错了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询