概述:
本次设计是一种基于C52单片机基础之上来实现对电机转速检测的方法;本次设计基于霍尔传感器来完成速度的检测,其中硬件系统包括:脉冲信号的产生,脉冲信号的处理和显示模块,以及用C语言编程,使用Keil和Proteus进行编译、调试和仿真。
研究的主要内容:
1、具体地研究转速测量的方法:周期(T)法,频率(M)法,以及2种测量方法的具体计算方式并分析其优劣,理解转速测量的原理。
2、构建系统总体设计框图,构建硬件系统,用C语言编程完成软件系统。
3、使用Keil uVision4 和Proteus 7 Professional 进行编译,调试和仿真。
4、根据设计的要求设置各控制字,并且使用C语言来编程,对计数和定时来进行同步,并采用数码管动态显示来显示转速。
系统的总体设计框图:
本次设计主要是利用AT89C52单片机和传感器来设计的。通过传感器来采集脉冲信号,并且通过定时/计数的算法,最后将转速数值通过LED实时显示。此次设计利用单片机进行信号处理,利用传感器采集信号,并使用Keil uVision4和Proteus 7 Professional进行编译,调试和仿真。
系统总体设计如下图所示:
各部分模块的功能:
1.传感器:用来采集脉冲信号。
2.单片机:对接收到的信号进行处理后送LED显示。
3.电机驱动:驱动电机,使其运转。
4.LED显示:显示转数的瞬时值。
Proteus仿真电路图:
初始界面
仿真运行:
测速代码:
#include<reg51.h>
#include<intrins.h>
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
sbit BF=P0^7;
unsigned char code digit[ ]={"0123456789"};
unsigned int v;
unsigned char count;
bit flag;
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
void delay(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
unsigned char BusyTest(void)
{
bit result;
RS=0;
RW=1;
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=BF;
E=0;
return result;
}
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1);
RS=0;
RW=0;
E=0; _nop_();
_nop_();
P0=dictate;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
}
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80);
}
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1;
RW=0;
E=0;
P0=y;
_nop_();
_nop_();
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
E=0;
void LcdInitiate(void)
{
delay(15);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x0c);
delay(5);
WriteInstruction(0x06);
delay(5);
WriteInstruction(0x01);
delay(5);
}
void display_sym(void)
{
WriteAddress(0x00);
WriteData('v');
WriteData('=');
}
void display_val(unsigned int x)
{
unsigned char i,j,k,l;
i=x/1000;
j=(x%1000)/100;
k=(x%100)/10;
l=x%10;
WriteAddress(0x02);
WriteData(digit[i]);
WriteData(digit[j]);
WriteData(digit[k]);
WriteData(digit[l]);
}
void display_unit(void)
{
WriteAddress(0x06);
WriteData('r');
WriteData('/');
WriteData('m');
WriteData('i');
WriteData('n');
}
void main(void)
{
LcdInitiate();
TMOD=0x51;
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
EA=1;
ET0=1;
TR0=1;
count=0;
display_sym();
display_val(0000);
display_unit();
while(1)
{
TR1=1;
TH1=0;
TL1=0;
flag=0;
while(flag==0) ;
v=(TH1*256+TL1)*60/16;
display_val(v);
}
}
void Time0(void ) interrupt 1 using 1
{
count++;
if(count==20)
{
flag=1;
count=0;
}
TH0=(65536-46083)/256;
TL0=(65536-46083)%256;
}
模拟霍尔脉冲代码:
#include<reg51.h>
sbit cp=P3^2;
void delay()
{
unsigned char i;
for(i=0;i<200;i++)
;
}
void main(void)
{
while(1)
{
cp=1;
delay();
cp=0;
delay();
}
}