第一步:准备材料(光电门)也叫测距模块
产品用途:广泛用于电机转速检测,脉冲计数,位置限位等。
模块特色:
1、使用进口槽型光耦传感器,槽宽度 5mm。
2、有输出状态指示灯,输出高电平灯灭,输出低电平灯亮。
3、有遮挡,输出高电平;无遮挡,输出低电平。
4、比较器输出,信号干净,波形好,驱动能力强,超过 15mA。
5、工作电压 3.3V-5V
6、输出形式 :数字开关量输出(0 和 1)
7、设有固定螺栓孔,方便安装
8、小板 PCB 尺寸:3.2cm x 1.4cm
9、使用宽电压 LM393 比较器
模块使用说明:
1.模块槽中无遮挡时,接收管导通,模块 DO 输出低电平,遮挡时,
DO 输出高电平;
2、DO 输出接口可以与单片机 IO 口直接相连,检测传感器是否有遮
档,如用电机码盘则可检测电机的转速。
2.模块 DO 可与继电器相连,组成限位开关等功能,也可以与有源蜂
鸣器模块相连,组成报警器。
还有一个普中的开发板
直接上代码吧
这个原理主要是光点门没有东西过的时候反馈的是一个低电平,反之是高电平。然后根据高低电平来判断是否启动定时器来计速既是反应时间(毫秒级别)可以用来测人的反应时间。神经反应时间。
main.c
#include <REGX52.H>
#include "LCD1602.h"
sbit LightDoor=P3^7;
typedef unsigned int uint;
uint fen,miao,umiao;
uint m1,m2,m3,m4,m5;
void Timer0_Init()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0开始计时
ET0=1;
EA=1;//打开中断
}
void main()
{
Timer0_Init();
LCD_Init();//初始化
LCD_ShowString(1,12,"GAP");
while(1)
{
LCD_ShowString(1,1,"F");//显示分
LCD_ShowString(1,4,"M");//显示miao
LCD_ShowString(1,7,"mM");//显示微秒
LCD_ShowNum(2,1,fen,2);//显示分
LCD_ShowChar(2,3,'.');//显示.
LCD_ShowNum(2,4,miao,2);//显示秒
LCD_ShowChar(2,6,'.');//显示.
LCD_ShowNum(2,7,umiao,2);//显示u秒
LCD_ShowString(2,9,"s");
LCD_ShowChar(2,14,'.');
LCD_ShowNum(2,15,umiao,2);
LCD_ShowNum(2,12,miao,2);
// m4=umiao;//毫秒
// m3=miao;//秒转为毫秒*1000
// //m2=fen*m3;//分转为毫秒
if(LightDoor==1)
{
TR0=0;
}
else
{
TR0=1;
if(umiao>1000)
{
m1=umiao=0;
m2=miao=0;
m3=fen=0;
LCD_ShowChar(2,14,'.');
LCD_ShowNum(2,15,m1,2);
LCD_ShowNum(2,12,m2,2);
}
// LCD_ShowChar(2,14,'.');
// LCD_ShowNum(2,15,umiao,2);
// LCD_ShowNum(2,12,miao,2);
}
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
umiao++;
if(umiao>1000)
{
// m1=umiao;
umiao=0;
miao++;
if(miao>60)
{
miao=0;
fen++;
}
}
}
LCD1602模块之前的博客也发过了,如有需要请自行查找吧
最后是运行效果图