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

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

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

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

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

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

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

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

#include 
#include 

#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;
}

你可能感兴趣的:(单片机,嵌入式硬件)