用途:
广泛用于电机转速检测,脉冲计数,位置限位等。
高低电平:
有遮挡,输出高电平;
无遮挡,输出低电平。
接线:
VCC——正极
GND——接地
DO TTL开关信号输出
AO 此模块不起作用
轮子走一圈,周长:C = 3.14 x 直径(6.5cm)
对应码盘也转一圈,码盘有20个格子,每经过一个会遮挡(高电平),一个脉冲走了3.14 x 6.5cm / 20 = 1.0205cm
定时器可以设置一秒,统计脉冲数,一个脉冲就是1cm。假设有100个脉冲,也就是100cm/s
测速数据通过串口发送到上位机:
主函数:
#include "motor.h"
#include "Delay.h"
#include "uart.h"
#include "reg52.h"
#include "time.h"
sbit speedIO = P3^2;//外部中断
unsigned int speedCnt = 0; //速度统计
extern unsigned int speed;
extern char signal;
void Ex0Init()
{
EX0 = 1; //允许中断
//EA = 1; //开始总中断,在串口初始化函数已经开启
IT0 = 1; //外部中断0触发
}
void main()
{
Time0Init();//定时器0初始化
UartInit(); //串口初始化
Ex0Init(); //外部中断初始化
while(1){
if(signal){
SendString("speed:");
SendByet(speed);
signal = 0;
}
}
}
void speedHandler() interrupt 0
{
speedCnt++;
}
定时器:
#include "motor.h"
#include "reg52.h"
unsigned int speed;
extern unsigned int speedCnt;
char signal = 0;
char cnt = 0;
void Time0Init()
{
TMOD = 0x01; //配置定时器0工作模式位16位时
TL0 = 0x33; //给初值,定一个0.5ms
TH0 = 0xFE;
ET0 = 1; //打开定时器0中断
EA = 1; //打开总中断EA
TR0 = 1; //开始计时
TF0 = 0;
}
void Time0Handler() interrupt 1
{
cnt++; //统计爆表的次数
TL0 = 0x33; //重新给初值
TH0 = 0xFE;
if(cnt == 2000){ //爆表2000次,经过1s
signal = 1;
cnt = 0; //重新计算cnt
speed = speedCnt;
speedCnt = 0;//计算小车速度,1s拿speedCnt的值,
// 清零
}
}