|
我想做超声波模块的用超声波模块测距然后计算出来用数码管显示出来,
但是不知道为啥P2口一直为高,main函数里什么都没有的时候还是全高P(P2口和led模块相连)
百思不得其解。
#include <reg52.h>
#include <intrins.h>
#define DISPLAY P0
typedef unsigned char u8;
typedef unsigned int u16;
sbit TX = P2^0; //超声波模块控制端
sbit RX = P2^1; //超声波模块接收端
/*138控制口*/
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
bit flag = 0;
u16 time = 0;
u16 timer = 0;
unsigned long s = 0;
/*数显管段码数组*/
u8 code D[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*数显管数字位数*/
u8 disbuff[4];
/*数显管显示*/
void display()
{
u8 i;
u16 j;
for(i = 0;i < 8;i++)
{
switch(i)
{
case (0):
LSA=0;LSB=0;LSC=0; break;//0位
case (1):
LSA=1;LSB=0;LSC=0; break;//1
case (2):
LSA=0;LSB=1;LSC=0; break;//2
case (3):
LSA=1;LSB=1;LSC=0; break;//3
case (4):
LSA=0;LSB=0;LSC=1; break;//4
case (5):
LSA=1;LSB=0;LSC=1; break;//5
case (6):
LSA=0;LSB=1;LSC=1; break;//6
case (7):
LSA=1;LSB=1;LSC=1; break;//7
}
DISPLAY = disbuff[i];
j = 10;
while(j--);
DISPLAY = 0x00; //消隐
}
}
/*距离计算*/
void count()
{
time = TH0*256 + TL0;
TH0 = 0;
TL0 = 0;
s = (long)(time * 0.17); //换算为厘米
if(s <= 40 || flag == 1)
{
flag = 0;
disbuff[0] = 0x3f;
disbuff[1] = 0x50;
disbuff[2] = 0x50;
disbuff[3] = 0x79;
}
else
{
disbuff[3] = D[s/1000];
disbuff[2] = D[s%1000/100];
disbuff[1] = D[s%100/10];
disbuff[0] = D[s%10/1];
}
}
void T0_timer() interrupt 1
{
flag = 1;
}
void T1_timer() interrupt 3
{
TH1 = 0xf8;
TL1 = 0x30;
display();
timer++;
if(timer >= 40)
{
timer=0;
TX=1; //80MS
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}
void main()
{
TMOD=0x11;
TH0=0;
TL0=0;
TH1=0xf8;
TL1=0x30;
ET0=1;
ET1=1;
TR1=1;
EA=1;
while(1)
{
while(!RX);
TR0=1;
while(RX);
TR0=0;
count();
}
}
|
|