基于51单片机的霍尔传感器测速

1、设计需求及目标

①本设计采用STC89C51/52单片机作为主控制器

②采用霍尔传感器非接触式测电机转速

③LCD1602液晶显示当前的转速,转速单位为转/分(RPM)和显示当前的pwm占空比0~100%。

④电机的速度可以通过按键调整,也可以开始暂停,正转和反转。

2、设计思路及方案

本 系 统 以 52 单 片 机 为 核 心 , 采 用 霍 尔 元 件 测 速 法测 量 直 流 电 机 的 转 速 。 通 过 霍 尔 传 感 器 电 路 产 生 的 秒
脉 冲 信 号 传 给 单 片 机 , 单 片 机 经 过 处 理 和 计 算 , 测 量出 的 速 度 将 显 示 在 1602 液 晶 显 示 器 上 。

3、程序主函数

/*********************************************************************
功能:霍尔传感器测速,霍尔传感器的信号输出脚接T1(P3.5)引脚
测量范围;假设转盘只有一个磁钢,转速低于10r/S则显示0,高于655360r/s则计数溢出(一般应用不会超出此限)

*******************************************************************/
#include <reg51.h>
#define N 1//转盘上所安装的磁钢个数
sbit DLed1=P2^0;//定义第一位数码管"位选"控制线的别名
sbit DLed2=P2^1;//定义第二位数码管"位选"控制线的别名
sbit DLed3=P2^2;
sbit DLed4=P2^3;

unsigned int speed=0;//最后的转速值
unsigned int count=0;//在指定时间内记到的外部脉冲数
unsigned char k=0;
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4);//子函数前向声明

/*********************************
函数名称:void delay1ms(unsigned int k)
功能:延时子函数
入口参数:延时时长
返回值:无
**********************************/
void delay1ms(unsigned int k)
{ 
  unsigned char n,m;
  for(m=0;m<k;m++)
  {for(n=0;n<115;n++);}
}
//===================主函数
void main()
{
unsigned char n;
//EA=0;
TMOD=0x51;//0101 0001,T1纯软件启动,计数模式,工作方式1;T0纯软件启动,定时模式,工作方式1
TH0=0x3c;//12M晶振,定时50ms
TL0=0xb0;

ET0=1;//开启定时0中断
EA=1;//开启总中断
TR0=1;//同时启动定时与计数
TR1=1;
   while(1)
	{	  
	speed=count/N;//结果为:x转/s,注意防止其越界	
		for(n=20;n>0;n--)//稳定显示一阵
		{
		   disp(speed/1000,speed%1000/100,speed%100/10,speed%10);
		   		
			
		}
		TR0=1;//再次启动定时和计数功能,为下一次的测量作准备
		TR1=1;
	}


 

}
/*********************************
函数名称:
功能:T0中断处理函数
说明:定时时间到,则关闭定时器,取出计数值
入口参数:
返回值:
**********************************/
void int0_fun() interrupt 1
{
k++;
TH0=0x3c;//重载定时器T0初值
TL0=0xb0;
if(k>=20)//100ms的定时时间到
{
	TR0=0;
	TR1=0;
	count=TH1*256+TL1;
	TH1=0x00;//清除计数值
	TL1=0x00;
	k=0;  //清除标志变量
}
}

/********************************
功能:显示函数
四位数码管的显示函数
段选:P1
位选:P20-P23
注意:采用的共阳数码管
***************************/
void disp(unsigned char x1,unsigned char x2,unsigned char x3,unsigned char x4)
{
    DLed1=1;DLed2=0;DLed3=0;DLed4=0;//送位码,只让第一位数码管显示
	P1=tab[x1];//送段码
	delay1ms(10);//延时
	P1=0xff;//关闭
	
	//----扫描显示第二位数码管------
	DLed1=0;DLed2=1;DLed3=0;DLed4=0;
	P1=tab[x2];
	delay1ms(10);
    P1=0xff;

	//----扫描显示第三位数码管------
	DLed1=0;DLed2=0;DLed3=1;DLed4=0;
	P1=tab[x3];
	delay1ms(10);
	P1=0xff;

	//----扫描显示第四位数码管------
	DLed1=0;DLed2=0;DLed3=0;DLed4=1;
	P1=tab[x4];
	delay1ms(10);
	P1=0xff;
}

完整资料:

https://market.m.taobao.com/app/idleFish-F2e/widle-taobao-rax/page-detail?wh_weex=true&wx_navbar_transparent=true&id=614515106970&ut_sk=1.WUpxx7gpwUoDAMmnnrBIzAno_12431167_1585213694840.Copy.detail.614515106970.1828622527&forceFlush=1

发布了23 篇原创文章 · 获赞 7 · 访问量 328

猜你喜欢

转载自blog.csdn.net/weixin_41017942/article/details/105123465