这个51超声波测距程序为什么数码管只显示最高位?后面几位都很暗?应该怎么改一下,谢谢
时间:10-02
整理:3721RD
点击:
#include <reg52.H> //器件配置文件
#include <intrins.h>
unsigned int time=0;
unsigned int timer=0;
unsigned long S=0; //用于显示最后计算得到的距离
bit flag =0; //判断是否溢出
sbit dula=P2^6;
sbit wela=P2^7; //用于数码管显示
sbit RX=P1^1; //echo
sbit TX=P1^2; //trig
// sbit D5=P1^4; //可以不要。echo高电平时点亮D5灯
unsigned long x; //用于数码管显示
unsigned char code table[]={ //共阴数码管
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void Display(unsigned long num);
void Delay(unsigned int z); //z=1大概是1ms
void Conut(void)///////////计算程序
{
time=TH0*256+TL0; //这是最后算到的时间往返时间但应该再乘以
//12/11.0593M是一个机器周期时间应该是
time*12/11.0592 ;
TH0=0; //定时器0的初始值为0
TL0=0;
S=(time*1.845)/100; //算出来是CM
// S=(time*1.845)/10; //算出来是mm
//time*12*170/(11.0592*1000)mm=time*1845/10000 mm
if (S>=500) //最大距离5m即500cm
S=888888;
if (flag==1) //判断是否溢出
{S=888888;
flag=0;
TH0=0;
TL0=0;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
} //这是最重要的计时0中断TH0和TL0初始值为0
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{ //这是计时器1中断
TH1=0xf8; //赋初值应该是2ms
TL1=0x30;
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
Delay(30); //一次超声波信号时长30ms
TX=0;
}
}
/*********************************************************/
void main( void )
{
TMOD=0x11; //设T0为方式1GATE=1
TH0=0; //目的都是用中断T0和T1
TL0=0; //中断0初始化
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{
while(!RX); //当RX为零时等待即echo为低电平
TR0=1; //开启计数
// D5=0; //可以不要指示灯
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
// D5=1; //可以不要指示灯
Conut(); //计算
Display(S); //数码管显示
}
}
void Display(unsigned long num) //定义子函数用于显示五位数
{
//调用子函数前先要在main函数前面声明位选和段选
/*即
sbit dula=P2^6;
sbit wela=P2^7;
*/
unsigned int temp; //用于延迟for函数
unsigned char shiwanwei,wanwei,qianwei,baiwei,shiwei,gewei;
//定义这个六位数的十万位到个位
shiwanwei=num/100000;
wanwei=num%100000/10000;
qianwei=num%10000/1000;
baiwei=num%1000/100;
shiwei=num%100/10;
gewei=num%10;
wela=1;
P0=0xdf;//1111 1011 //位选个位
wela=0;
dula=1;
P0=table[gewei];
dula=0;
for(temp=100;temp>0;temp--);
if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0||shiwei!=0)
{//判断高位是否都为0为0的话不显示高位的0
wela=1;
P0=0x6f; //1111 0110 //位选十位
wela=0;
P0=0xff;
dula=1;
P0=table[shiwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0)
{
wela=1;
P0=0x77; //1110 1110 //位选百位
wela=0;
P0=0xff;
dula=1;
P0=table[baiwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0||qianwei!=0)
{
wela=1;
P0=0x7b; //1101 1110 //位选千位
wela=0;
P0=0xff;
dula=1;
P0=table[qianwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0)
{
wela=1;
P0=0x7d; //1011 1110 //位选万位
wela=0;
P0=0xff;
dula=1;
P0=table[wanwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0)
{
wela=1;
P0=0x7e; //0111 1110 //位选万位
wela=0;
P0=0xff;
dula=1;
P0=table[shiwanwei];
dula=0;
for(temp=50;temp>0;temp--);
}
}
void Delay(unsigned int z) //基本上是z赋值为1就对应1ms
{
unsigned int a,b;
for(a=z; a>0; a--)
for(b=110; b>0; b--);
}
#include <intrins.h>
unsigned int time=0;
unsigned int timer=0;
unsigned long S=0; //用于显示最后计算得到的距离
bit flag =0; //判断是否溢出
sbit dula=P2^6;
sbit wela=P2^7; //用于数码管显示
sbit RX=P1^1; //echo
sbit TX=P1^2; //trig
// sbit D5=P1^4; //可以不要。echo高电平时点亮D5灯
unsigned long x; //用于数码管显示
unsigned char code table[]={ //共阴数码管
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void Display(unsigned long num);
void Delay(unsigned int z); //z=1大概是1ms
void Conut(void)///////////计算程序
{
time=TH0*256+TL0; //这是最后算到的时间往返时间但应该再乘以
//12/11.0593M是一个机器周期时间应该是
time*12/11.0592 ;
TH0=0; //定时器0的初始值为0
TL0=0;
S=(time*1.845)/100; //算出来是CM
// S=(time*1.845)/10; //算出来是mm
//time*12*170/(11.0592*1000)mm=time*1845/10000 mm
if (S>=500) //最大距离5m即500cm
S=888888;
if (flag==1) //判断是否溢出
{S=888888;
flag=0;
TH0=0;
TL0=0;
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
} //这是最重要的计时0中断TH0和TL0初始值为0
/********************************************************/
void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块
{ //这是计时器1中断
TH1=0xf8; //赋初值应该是2ms
TL1=0x30;
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
Delay(30); //一次超声波信号时长30ms
TX=0;
}
}
/*********************************************************/
void main( void )
{
TMOD=0x11; //设T0为方式1GATE=1
TH0=0; //目的都是用中断T0和T1
TL0=0; //中断0初始化
TH1=0xf8; //2MS定时
TL1=0x30;
ET0=1; //允许T0中断
ET1=1; //允许T1中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{
while(!RX); //当RX为零时等待即echo为低电平
TR0=1; //开启计数
// D5=0; //可以不要指示灯
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
// D5=1; //可以不要指示灯
Conut(); //计算
Display(S); //数码管显示
}
}
void Display(unsigned long num) //定义子函数用于显示五位数
{
//调用子函数前先要在main函数前面声明位选和段选
/*即
sbit dula=P2^6;
sbit wela=P2^7;
*/
unsigned int temp; //用于延迟for函数
unsigned char shiwanwei,wanwei,qianwei,baiwei,shiwei,gewei;
//定义这个六位数的十万位到个位
shiwanwei=num/100000;
wanwei=num%100000/10000;
qianwei=num%10000/1000;
baiwei=num%1000/100;
shiwei=num%100/10;
gewei=num%10;
wela=1;
P0=0xdf;//1111 1011 //位选个位
wela=0;
dula=1;
P0=table[gewei];
dula=0;
for(temp=100;temp>0;temp--);
if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0||shiwei!=0)
{//判断高位是否都为0为0的话不显示高位的0
wela=1;
P0=0x6f; //1111 0110 //位选十位
wela=0;
P0=0xff;
dula=1;
P0=table[shiwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0||qianwei!=0||baiwei!=0)
{
wela=1;
P0=0x77; //1110 1110 //位选百位
wela=0;
P0=0xff;
dula=1;
P0=table[baiwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0||qianwei!=0)
{
wela=1;
P0=0x7b; //1101 1110 //位选千位
wela=0;
P0=0xff;
dula=1;
P0=table[qianwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0||wanwei!=0)
{
wela=1;
P0=0x7d; //1011 1110 //位选万位
wela=0;
P0=0xff;
dula=1;
P0=table[wanwei];
dula=0;
for(temp=50;temp>0;temp--);
}
if(shiwanwei!=0)
{
wela=1;
P0=0x7e; //0111 1110 //位选万位
wela=0;
P0=0xff;
dula=1;
P0=table[shiwanwei];
dula=0;
for(temp=50;temp>0;temp--);
}
}
void Delay(unsigned int z) //基本上是z赋值为1就对应1ms
{
unsigned int a,b;
for(a=z; a>0; a--)
for(b=110; b>0; b--);
}
可能延时太长。各位之间显示延时去掉。或者减少
会不会是硬件连接的问题,我曾经就碰到过这样的例子
不知道,我再看看。
嗯,以后试试。