52单片机与MH-Sensor-Series模块使用简单检测车轮转速

Posted Booksort

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了52单片机与MH-Sensor-Series模块使用简单检测车轮转速相关的知识,希望对你有一定的参考价值。

mh sensor series模块有四个口,VCC接5V,GND接地,还有A0与D0分别是模拟量与数字量的输出。

和单片机使用,就只用D0口即可.

使用单片机的外部中断进行引脚检测。可以选择P3^2或者P3^3.

这里选择外部中断1,工作模式2

还需要使用定时器中断来检测时间差。

如果使用,可以直接复制代码,然后修改引脚即可。使用的共阳极两段数码管。

/*
*	@Author:Booksort
* @fuc:			多少圈/秒,去151修改
*
*/

#include <REG52.H>
#include <stdio.h>

#define uint8 	unsigned char 
#define uint32 	unsigned int	
	


uint8 code Num_CA[] = 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90;

unsigned char PWM_T=0;


unsigned char PWML=30;//左轮占空比
unsigned char PWMR=30;//有轮占空比

unsigned char Run_Flag=0;//电机模式->0-停止;1-运行


static char Key_Up=0;


sbit sm1=P2^0;
sbit sm2=P2^1;
//使能1-左
sbit ENL=P1^2;
sbit INL1=P1^3;
sbit INL2=P1^4;


//使能2-右
sbit ENR=P1^5;
sbit INR1=P1^6;
sbit INR2=P1^7;

//拨码开关
sbit DialSwitch1=P2^5;
sbit DialSwitch2=P2^6; 

//外部中断 P3^2,P3^3
sbit Deng=P1^0;
sbit KEY=P3^3;

char Speed=0;

uint8 t1=0;
uint8 t2=0;
uint32 TIME=0;
char Tspeed=0;

void delay_ms(int xms);
void Display_Num_Fuc1(uint8 num);

void Forward(void);
void BackForward(void);
void Run(void);

void main(void)

	
	TMOD |=0x01;
	TL0 = (65536-1000)%256;		//设置定时初始值
	TH0 = (65536-1000)/256;		//设置定时初始值
	ET0=1;
	IT1=0;
	EX1=1;
	EA=1;
	TR0 = 1;		//定时器0开始计时
	while(1)
	
		Run();
		Forward();
		if(DialSwitch1==0&&DialSwitch2==0)
		
			PWML=100;
			PWMR=100;
		
		else if(DialSwitch1==0&&DialSwitch2==1)
		
			PWML=50;
			PWMR=50;
		
		else if(DialSwitch1==1&&DialSwitch2==0)
		
			PWML=10;
			PWMR=10;
		
		else
		
			PWML=0;
			PWMR=0;
		
		
		if(Speed>=0&&Speed<=99)
			Display_Num_Fuc1(Speed);//显示多少圈每秒
	



//定时器0中断
void Timer0() interrupt 1

	TL0 = (65536-1000)%256;		//设置定时初始值
	TH0 = (65536-1000)/256;		//设置定时初始值
	
	TIME++;
	if(PWM_T>200)//周期>>1ms*200=200ms
	
		PWM_T=0;
	
	if(Run_Flag==1)
	
		if(PWM_T<=PWML)
		
			ENL=1;
		
		else
		
			ENL=0;
		
		if(PWM_T<=PWMR)
		
			ENR=1;
			
		else
		
			ENR=0;
		
	
	else if(Run_Flag==0)
	
		ENL=ENR=0;
	
	
	PWM_T++;
	
	if(KEY==1&&Key_Up==1)
	
		Key_Up=0;
		
		Deng=1;
		Tspeed++;
	
	
	if(TIME>=1000)
	
		Speed=Tspeed;
		Tspeed=0;
		TIME=0;
		
	



//60*1000
void exint1() interrupt 2

	
	if(Key_Up==0)
	
		Key_Up=1;
		t1=t2;
		
		Deng=0;
	


void delay_ms(int xms)

	int x,y;
	for(x=xms;x>=0;x--)
	
		for(y=100;y>=0;y--)
		
	

void Display_Num_Fuc1(uint8 num)

	//2位数码管,显示区间[0,99],超过区间最大值,就变成区间最小值
	//数码管的2个位选,实时切换
	//使用数组来维护各个数码管显示的数字
	P0=0xFF;
	//P2=0x02;
	sm1=0;
	sm2=1;
	P0=Num_CA[num%10];
	num=num/10;
	//delay_ms(1);
	P0=0xFF;
	//P2=0x01;
	sm1=1;
	sm2=0;
	P0=Num_CA[num];
	//delay_ms(1);
	



void Run(void)

	Run_Flag=1;


void Forward(void)

	INL1=1;
	INL2=0;
	INR1=1;
	INR2=0;


void BackForward(void)

	INL1=0;
	INL2=1;
	INR1=0;
	INR2=1;

以上是关于52单片机与MH-Sensor-Series模块使用简单检测车轮转速的主要内容,如果未能解决你的问题,请参考以下文章

无线模块推荐一下。 求stc89c52单片机与单片机之间串口无线收发程序?

STC89C52RC单片机额外篇 | 06 - 认识高内聚低耦合的模块化编程

基于51单片机酒精浓度检测仪设计-设计资料

基于单片机智能无线病床呼叫系统设计-设计资料下载

求stc89C52型单片机与DS18B20传感器和MQ-2烟雾传感器电路连接图以及原理

[51单片机]HC-SR04超声波模块与1602液晶显示