|
我想做超聲波模塊的用超聲波模塊測距然后計(jì)算出來用數(shù)碼管顯示出來,
但是不知道為啥P2口一直為高,main函數(shù)里什么都沒有的時(shí)候還是全高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;
/*數(shù)顯管段碼數(shù)組*/
u8 code D[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*數(shù)顯管數(shù)字位數(shù)*/
u8 disbuff[4];
/*數(shù)顯管顯示*/
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; //消隱
}
}
/*距離計(jì)算*/
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();
}
}
|
|