原理是用单片机的定时器计时测出时间,然后除去距离得到速度,测试中要仔细调整铝箔的间距,保证穿破的时候两片铝箔可以接通,一片铝箔大概可以测几十次用弹弓实验两次分别是92m/s和112m/s
以下为程序:
/*************************
名称:铝箔测速仪
功能:0.5m的两块铝箔依次被炮弹击穿,接通0.4和0.5,
根据时间和位移计算速度1~9999米/秒,慢于1米/秒的显示0
备注:铝箔间距50cm 开机显示5536
若改变距离可以修改displayLED(50000/t)括号中的数字
时间=10*t微秒 displayLED(距离/时间)
作者:忆昔长别
***********************/
#include<stc12c5a.h>
unsigned char table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned long int t=0;
unsigned char i=0;//为了锁死定时器开关TR0
unsigned char *p; //为了判断语句控制外面的定时器开关
unsigned char second=0,minute=0;
unsigned int t1=0;
sbit K1=P3^6; //铝箔开关1
sbit K2=P3^7;//铝箔开关2
void displayLED(unsigned int a) //四位数显示函数带小数点
{
unsigned char b[4];
unsigned char i,j;
for(i=0;i<4;i++)
{
b[i]=a%10;
a=a/10;
}
P0=0XF7;
for(i=0;i<4;i++)
{
P2=table[b[i]];
for(j=0;j<100;j++);
P2=0x00;
P0=P0>>1;
}
P2=0X80;P0=0X0d; //显
for(j=0;j<100;j++); //示
P2=0x00; //小数点
}
void timer0_init()
{
TL0 =0xEC; //设置定时初值
TH0 =0xEC;
TMOD=0X02;
ET0=1;
EA=1;
}
void displayLED_(unsigned int a) //四位数显示函数不带小数点
{
unsigned char b[4];
unsigned char i,j;
for(i=0;i<4;i++)
{
b[i]=a%10;
a=a/10;
}
P0=0XF7;
for(i=0;i<4;i++)
{
P2=table[b[i]];
for(j=0;j<100;j++);
P2=0x00;
P0=P0>>1;
}
}
void main()//这里把main写出了mian半天没看出来!
{
P2M0=0Xff;
P2M1=0X00;
P3|=0xc0;
p= &i;
timer0_init();
while(1)
{
TR0=i;
if(t==0) //结合定时器状态的双重判断,防止开关误判
{
if(K1==0)*p=1; //第一块铝箔击中瞬间打开定时器
}
if(t!=0)
{
if(K2==0)*p=0; //在第二块铝箔击中瞬间关闭定时器
}
if(i==0)
displayLED_(165600/t);
if(i==1)
displayLED(100*minute+second);
}
}
void T0_Service() interrupt 1
{
t++;//10微秒计数
t1++;//1毫秒跑秒
if(t1==100)
{
t1=0;
second++;
if(second==100)
{
second=0;
minute++;
}
if(minute==100)
minute=0;
}
}
最后 。。。发不了图片
end
200字以内,仅用于支线交流,主线讨论请采用回复功能。