#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内数值即为速度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)