HC-SR04超声波测距 程序怎么写啊!! 输出代码 和输入定时器计数高电平时间代码~ MSP430F149单片机
1个回答
展开全部
给你个at89c51的程序,自己稍微改一下就可以了。这个是用数码管显示的。
#include <REG52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
extern char *itoa(int i);
uint code SEG7[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,
0x30,0x25,0xa9,0x26,0xa1,0xb1};//0 1 2 3 4 5 6 7 8 9 A-E
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管显示位置
uchar dis[4];
sbit trig=P1^0;
sbit echo=P1^1;
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
void display(uint dis)
{
P0=SEG7[dis%10];
P2=ACT[3];
delay(1);
P0=SEG7[(dis/10)%10];
P2=ACT[2];
delay(1);
P0=SEG7[(dis/100)%10];
P2=ACT[1];
delay(1);
P0=SEG7[dis/1000];
P2=ACT[0];
delay(1);
}
void display2(uint Hi,uint Low)
{
P0=SEG7[Hi%10];
P2=ACT[3];
delay(1);
P0=SEG7[(Hi/10)%10];
P2=ACT[2];
delay(1);
P0=SEG7[(Hi/100)%10];
P2=ACT[1];
delay(1);
/* P0=SEG7[Hi/1000];
P2=ACT[0];
delay(1);
*/
//Low
P0=SEG7[Low%10];
P2=ACT[7];
delay(1);
P0=SEG7[(Low/10)%10];
P2=ACT[6];
delay(1);
P0=SEG7[(Low/100)%10];
P2=ACT[5];
delay(1);
/* P0=SEG7[Low/1000];
P2=ACT[4];
delay(1); */
}
void delay10us()
{
uchar i;
for(i=11;i>0;i--);
}
void init()
{
TMOD=0x21;//模式1
TH1=0xf3;//4800bps fosc=12M
TL1=0xf3;
TR0=0;
trig=0;
echo=0;
TH0=0;
TL0=0;
TCON=0x00;
SCON=0x50;//SM0=0 SM1=1 SM2=0 REN=1 TB8=0 R8=0 TI=0 RI=0
PCON=0x80;//SMOD=1
TR1=1;
ES=1;
EA=1;
}
uint getDistance()
{
uint i=29412;//5m来回需要的时间(us) (5*2/340)*1000000
TR0=0;
TH0=0;
TL0=0;
//接收信号端置0
echo=0;
//开始触发
trig=1;
//延时10微秒
delay10us();
//停止触发
trig=0;
//没有信号返回并且在5米障碍物信号返回需要的时间前则等待 (无信号即时返回,防止死循环,阻碍其它程序的执行)
while(!echo&&i>0)
{
i--;
}
if(i>0)//小于5米,说明有信号返回
{
TR0=1;//开始计时
while(echo); //持续高电平则计时,转为低电平则退出
TR0=0;//停止计时
return (uint)((TH0*256+TL0)*0.170); //单位:mm //340000/1000000/2=0.17 mm/us
}
//display2(TH0,TL0);
return 0; //大于5米则返回0
}
void SendChar(uchar ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
void SendCmd(uchar *cmd,uchar sz)
{
uchar i=0;
SendChar('$');
for(i=0;i<sz;i++)
{
SendChar(*(cmd+i));
}
SendChar('@');
}
void main()
{
uint distance=0;
init();
while(1)
{
//测距
distance=getDistance();
//sprintf(dis,"%4d",distance);
//SendCmd(dis,4);
display(distance);
/* if(TF0)
{
TF0=0;
TH0=0;
TL0=0;
} */
}
}
void serial_serve(void) interrupt 4
{
}
#include <REG52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
extern char *itoa(int i);
uint code SEG7[16]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,
0x30,0x25,0xa9,0x26,0xa1,0xb1};//0 1 2 3 4 5 6 7 8 9 A-E
uchar code ACT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管显示位置
uchar dis[4];
sbit trig=P1^0;
sbit echo=P1^1;
void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
void display(uint dis)
{
P0=SEG7[dis%10];
P2=ACT[3];
delay(1);
P0=SEG7[(dis/10)%10];
P2=ACT[2];
delay(1);
P0=SEG7[(dis/100)%10];
P2=ACT[1];
delay(1);
P0=SEG7[dis/1000];
P2=ACT[0];
delay(1);
}
void display2(uint Hi,uint Low)
{
P0=SEG7[Hi%10];
P2=ACT[3];
delay(1);
P0=SEG7[(Hi/10)%10];
P2=ACT[2];
delay(1);
P0=SEG7[(Hi/100)%10];
P2=ACT[1];
delay(1);
/* P0=SEG7[Hi/1000];
P2=ACT[0];
delay(1);
*/
//Low
P0=SEG7[Low%10];
P2=ACT[7];
delay(1);
P0=SEG7[(Low/10)%10];
P2=ACT[6];
delay(1);
P0=SEG7[(Low/100)%10];
P2=ACT[5];
delay(1);
/* P0=SEG7[Low/1000];
P2=ACT[4];
delay(1); */
}
void delay10us()
{
uchar i;
for(i=11;i>0;i--);
}
void init()
{
TMOD=0x21;//模式1
TH1=0xf3;//4800bps fosc=12M
TL1=0xf3;
TR0=0;
trig=0;
echo=0;
TH0=0;
TL0=0;
TCON=0x00;
SCON=0x50;//SM0=0 SM1=1 SM2=0 REN=1 TB8=0 R8=0 TI=0 RI=0
PCON=0x80;//SMOD=1
TR1=1;
ES=1;
EA=1;
}
uint getDistance()
{
uint i=29412;//5m来回需要的时间(us) (5*2/340)*1000000
TR0=0;
TH0=0;
TL0=0;
//接收信号端置0
echo=0;
//开始触发
trig=1;
//延时10微秒
delay10us();
//停止触发
trig=0;
//没有信号返回并且在5米障碍物信号返回需要的时间前则等待 (无信号即时返回,防止死循环,阻碍其它程序的执行)
while(!echo&&i>0)
{
i--;
}
if(i>0)//小于5米,说明有信号返回
{
TR0=1;//开始计时
while(echo); //持续高电平则计时,转为低电平则退出
TR0=0;//停止计时
return (uint)((TH0*256+TL0)*0.170); //单位:mm //340000/1000000/2=0.17 mm/us
}
//display2(TH0,TL0);
return 0; //大于5米则返回0
}
void SendChar(uchar ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
void SendCmd(uchar *cmd,uchar sz)
{
uchar i=0;
SendChar('$');
for(i=0;i<sz;i++)
{
SendChar(*(cmd+i));
}
SendChar('@');
}
void main()
{
uint distance=0;
init();
while(1)
{
//测距
distance=getDistance();
//sprintf(dis,"%4d",distance);
//SendCmd(dis,4);
display(distance);
/* if(TF0)
{
TF0=0;
TH0=0;
TL0=0;
} */
}
}
void serial_serve(void) interrupt 4
{
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询