HC-SR04超声波测距 程序怎么写啊!! 输出代码 和输入定时器计数高电平时间代码~ MSP430F149单片机

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=0i<ki++)

{

for(j=0j<121j++)

{}

}

}

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=11i>闷渗0i--)

}

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=0i<szi++)

{

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

{

}

测算方式如下:

1.对于颂颤桐测速,主要用于三菱PLC的SPD指令(测速),该指令的应用格式是:SPD D1 D2 D3,将D1(输入野坦口X0或X1,假定为X0)在D2(如K1000,指1000ms,即1s)时间内输入的脉冲数送入D3,因而D3内数值的意义就是在刚刚过去的1000ms内输入的脉冲数。另外你再洞陆算出电机旋转一周旋转编码器输出多少脉冲,电机旋转一周装置运行多少米,对应算出一个脉冲装置运行多少米,假定为K米,接下来,将D3中数值与K相乘,即为1s内装置运行的距离,也就是速度。

2.关键程序:SPD  X0  K1000  D3 每过1秒钟,将X0输入的脉冲数送给D3,MUL  D3  K  D4  D4内数值即为速度。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12355614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存