这是一个超声波测距的程序,现在数码管显示有问题 50
#include<AT89X51.H>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#...
#include <AT89X51.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
sbit PWM = P0^0;
sbit Trig = P2^4;
sbit Echo = P3^2;
uint tc0,ge,shi,bai,qian,time,timeh,timel,temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i;
uchar a,b,succeed_flag;
void delay(uint z);
void StartModule();
void display(uint qian,uint bai,uint shi,uint ge);//显示函数
void main(void)
{
Trig=0; //首先拉低脉冲输入引脚
TMOD = 0x11; //timer0方式1 ,time1方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
EA = 1; //开总中断
PWM = 1;
while(1)
{ EA=0; //关总中断
StartModule() ;
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
while(Echo==1); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeh*256+timel;
temp=time*0.17; //毫米
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
display(qian,bai,shi,ge);
}
if(succeed_flag==0)
{
temp=0; //没有回波则清零
}
}
delay(120); //延时80ms
}
void display(uint qian,uint bai,uint shi,uint ge)//显示函数
{
P2=0xf7;
P1=table[qian];
delay(1);
P2=0xfb;
P1=table[bai];
delay(1);
P2=0xfd;
P1=table[shi];
delay(1);
P2=0xfe;
P1=table[ge];
delay(1);
}
void timer0(void) interrupt 1
{
TH0 =(65536 - 50000)/256;//50ms
TL0 =(65536 - 50000)%256;
tc0++;
if(tc0==20)
{PWM = ~PWM;
tc0 = 0;}
}
void timer1() interrupt 3 //定时器1中断,用做超声波测距计时
{
TH1=0;
TL1=0;
}
void exter() interrupt 0 // 外部中断0
{
timeh =TH1; //取出定时器的值
timel =TL1; //取出定时器的值
succeed_flag=1;//成功测量的标志
EX0=0; //关闭外部中断
}
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void StartModule() //启动模块程序
{
Trig=1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
Trig=0;
}帮忙看一下程序哪里有问题。 展开
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
sbit PWM = P0^0;
sbit Trig = P2^4;
sbit Echo = P3^2;
uint tc0,ge,shi,bai,qian,time,timeh,timel,temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i;
uchar a,b,succeed_flag;
void delay(uint z);
void StartModule();
void display(uint qian,uint bai,uint shi,uint ge);//显示函数
void main(void)
{
Trig=0; //首先拉低脉冲输入引脚
TMOD = 0x11; //timer0方式1 ,time1方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
EA = 1; //开总中断
PWM = 1;
while(1)
{ EA=0; //关总中断
StartModule() ;
while(Echo==0); //等待Echo回波引脚变高电平
succeed_flag=0; //清测量成功标志
EA=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
while(Echo==1); //等待测量的结果
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
time=timeh*256+timel;
temp=time*0.17; //毫米
qian=temp/1000;
bai=temp%1000/100;
shi=temp%100/10;
ge=temp%10;
display(qian,bai,shi,ge);
}
if(succeed_flag==0)
{
temp=0; //没有回波则清零
}
}
delay(120); //延时80ms
}
void display(uint qian,uint bai,uint shi,uint ge)//显示函数
{
P2=0xf7;
P1=table[qian];
delay(1);
P2=0xfb;
P1=table[bai];
delay(1);
P2=0xfd;
P1=table[shi];
delay(1);
P2=0xfe;
P1=table[ge];
delay(1);
}
void timer0(void) interrupt 1
{
TH0 =(65536 - 50000)/256;//50ms
TL0 =(65536 - 50000)%256;
tc0++;
if(tc0==20)
{PWM = ~PWM;
tc0 = 0;}
}
void timer1() interrupt 3 //定时器1中断,用做超声波测距计时
{
TH1=0;
TL1=0;
}
void exter() interrupt 0 // 外部中断0
{
timeh =TH1; //取出定时器的值
timel =TL1; //取出定时器的值
succeed_flag=1;//成功测量的标志
EX0=0; //关闭外部中断
}
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<110;j++);
}
void StartModule() //启动模块程序
{
Trig=1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
Trig=0;
}帮忙看一下程序哪里有问题。 展开
2个回答
艾因蒂克
2024-11-28 广告
2024-11-28 广告
超声阵列探头是艾因蒂克科技(上海)有限公司在超声检测领域的一项重要技术产品。它采用先进的阵列设计,能够显著提高超声检测的精度和效率。该探头通过多个超声传感器的协同工作,实现对被检测物体的全方位、多角度扫描,从而更准确地发现物体内部的缺陷和问...
点击进入详情页
本回答由艾因蒂克提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询