51单片机霍尔传感器电机测速设计

发布者:cheng1984最新更新时间:2020-08-26 来源: 51hei关键字:51单片机  霍尔传感器  电机测速 手机看文章 扫描二维码
随时随地手机看文章

1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器
2.采用霍尔传感器非接触式测电机转速
3.LCD1602液晶显示当前的转速,转速单位为转/分(RPM)。和显示当前的pwm占空比0~100%。
4.电机的速度可以通过按键调整,也可以开始暂停,正转和反转。
注意:磁铁和霍尔元件最近距离在2mm左右,太近可能会在电机转动时碰到霍尔元件,太远霍尔元件可能会检测不到磁铁。
使用说明:
液晶屏第一行显示电机转速,第二行显示占空比,占空比数值越大,电机转速越快。
系统一共有6个按键,单片机附近的独立按键是系统的复位按键,按下单片机会复位。
下面一排是控制按键:
1键:加速键,可以短按,占空比加1,也可长按,占空比连续加;
2键:减速键,可以短按,占空比减1,也可长按,占空比连续减;
3键:正转切换键,按下后电机正转;
4键:反转切换键,按下后电机反转;
5键:开始暂停键,按一下开始,再按一下暂停。

电路原理图如下:
0.png
0.png

PCB图+布局图+焊接图:
0.png

单片机源程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

void displaym();

void displayj();


sbit en=P2^5;                //1602  6管脚

sbit rs=P2^7;         //1602端口        4管脚

sbit rw=P2^6;//lcd1602控制端口 5管脚

sbit num1=P1^0;                                                //占空比加1

sbit num2=P1^1;                                                                   //占空比减一

sbit num3=P1^2;                                                                                           //正传

sbit num4=P1^3;                                                                                                         //反转

sbit num5=P1^4;                 //开始停止切换


sbit beep=P2^4;       


sbit out=P3^4;                                                         //PWM输出用于正传

sbit out1=P3^7;                        //PWM输出用于反转


uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai,j,su,qian,bai,shi,ge;





void delay(uint z)//延时1ms函数

{


uint x,y;

for(x=0;x     for(y=0;y<110;y++);

}




void write_com(uchar com)//向1602写一字节(控制指令)

{

  rs=0;

  P0=com;

  delay(5);

  en=1;

  delay(10);

  en=0;

}

void write_data(uchar date)//向1602写一字节(数据)

{

  rs=1;

  P0=date;

  delay(5);

  en=1;

  delay(5);

  en=0;

}

void init()//初始化函数

{

  en=0;

  rw=0;

  write_com(0x38);                                           //5X7显示

  write_com(0x0c);                         //关闭光标

  write_com(0x01);         //lcd初始化

  TMOD=0x11;               //定时器方式1           

  TH0=0xdc;

  TL0=0x00;                //定时器装入初值

  EA=1;                    //开总中断

  ET0=1;                   //定时器0开中断

  TR0=1;

  EX1=1;

IT1=1;                 //定时器启动  

TH1=0xfc;

  TL1=0x66;//定时100us

  ET1=1;                   //定时器1开中断

  TR1=1;

  write_com(0x80);

  write_data('V');

  write_data(':');

  write_com(0x87);                 //第一行显示转速

write_data('m');

  write_data('/');

  write_data('m');

        write_data('i');

        write_data('n');

  write_com(0xc0);

  write_data('z');

  write_data('k');

  write_data('b');

  write_data(':');

  displaym();

        write_com(0xc8);

        write_data('s');

        write_data('d');

        write_data(':');

        displayj();

}





void keyscan()  //键盘扫描函数

{

  if(num1==0)     

  {

    delay(5);      //消除抖动

         if(num1==0)

         {

                if(m<=199)

                 m++;

                        displaym();                                                                  //设定占空比加一

     }

  }

  if(num2==0)

  {

    delay(5);

         if(num2==0)

         {

                  if(m>=1)

                m--;

                        displaym();                                        //设定占空比减一

       

         }

  }

    if(num3==0)

  {

    delay(5);

         if(num3==0)

         {

          j=j+1;

                 displayj();       

         }

       

  }

      if(num4==0)

  {

    delay(5);

         if(num4==0)

         {

         j=j-1;

                 displayj();

       

         }

  }

      if(num5==0)

  {

    delay(5);

         if(num5==0)

         {

         while(num5==0)         ;

          kai=1-kai;


       

         }

  }

  

}

void display()

{

  write_com(0x82);

  zhuansu=zhuansu*30;          //将两秒内的计数乘以30得到转每分

  

        su=zhuansu*0.01*2*3.14/2;

            qian=(su/1000)%100;

                                                write_data(qian+0x30);

                                                bai=(su/100)%10;

                  write_data(bai+0x30);

                                                shi=(su/10)%10;

                                                write_data(shi+0x30);

                  write_data('.');

                                                ge=su%10;

                                                write_data(ge+0x30);


  write_com(0xd0);

}

void displaym()

{

write_com(0xc4);

   if(m/200%10!=0)

  write_data(m/200%10+0x30);                           //如果占空比百位不为0则显示百位否则显示空格

  else

  write_data(' ');

  

  if(m/200%10==0&&m/20%10==0)

  write_data(' ');

  else

  write_data(m/20%10+0x30);                                 //如果占空比小于10 十位正常显示  否则显示空格

  

  write_data(m/2%10+0x30);                                 //显示个位

}


void displayj()

{       

write_com(0xcb);

   if(j/100%10!=0)

  write_data(m/100%10+0x30);                          

  else

  write_data(' ');

  

  if(j/100%10==0&&j/10%10==0)

  write_data(' ');

  else

  write_data(j/10%10+0x30);                                 

  

  write_data(j/1%10+0x30);

   write_com(0xd0);       


}



void main()

{

    flag_1=0;

        m=100;                                                         //占空比为100

[1] [2]
关键字:51单片机  霍尔传感器  电机测速 引用地址:51单片机霍尔传感器电机测速设计

上一篇:超详细的单片机交通信号灯控制程序
下一篇:基于51单片机的红外智能风扇程序

推荐阅读最新更新时间:2024-11-22 10:22

51单片机串口接收数据
单片机每次发送或者接受完数据(8位数据将保存在缓冲区中),会自动触发接受或者发送中断。因此只需要中断置位以后再缓冲区中读数据(或者发送数据)。 1 /************************************************* 2 *receive code(HEX) 3 * $ P M T K 1 8 0 * 3 B \n \r 4 * 24 50 4D 54 4B 31 38 30 2A 33 42 0D 0A 5 *************************************************/ 6 7 unsign
[单片机]
采用冒泡法编写51单片机排序程序
试设计一个子程序,其功能为将(R0)指出的内部RAM中6个单字节正整数按从小到大的次序重新排列。 ;======================================== 最佳答案: 下列程序使用冒泡法排序,经过KEIL仿真测试通过。 ORG 0000H ;------------------------下面先准备6个数字 MOV 40H, #8AH MOV 41H, #3BH MOV 42H, #0B9H MOV 43H, #47H MOV 44H, #29H MOV 45H, #0AFH CALL SORT6 ;调用排序子程序 SJMP $ ;停止,此时可以
[单片机]
89C51单片机之外部中断0、1控制LED
1.proteus仿真图 2.keli代码 #include reg51.h sbit led1=P0^0; sbit led2=P1^0; //外部中断0控制程序 void INT0test() interrupt 0 { led1=~led1; } //外部中断1控制程序 void INT1test() interrupt 2 { led2=~led2; } int main() { EA=1; //全局中断使能 EX0=1; //外部中断0使能 EX1=1; //外部中断1使能 IT0=0; //外部中断0触发方式为低电平有效 IT1=1; //外部中断1触发方式为电平下降沿有
[单片机]
89C<font color='red'>51单片机</font>之外部中断0、1控制LED
AT89C51单片机外部中断
C51单片机外部中断调用P3_2 ,P3_3口。 中断方式有两种,分别为电平方式和脉冲方式。 中断请求有0和1。中断总允许为EA=1, IE0:外部中断请求0标志位; IT0:外部中断0触发方式设置位,IT0=1下降沿触发,IT0=0低电平触发; IE1:外部中断请求1标志位; IT1:外部中断1触发方式设置位,IT1=1下降沿触发,IT1=0低电平触发; 外部中断0中断服务程序的编写: void 函数名()interrupt 0 { } 外部中断1中断服务程序的编写: void 函数名()interrupt 2 { } 参考实验程序(主程序为P1口输出跑马灯程序),编写中断子程序使得发生外部中断0,且
[单片机]
AT89C<font color='red'>51单片机</font>外部中断
利用51单片机的电子琴设计
利用51单片机的电子琴设计 声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单片机某个口线不断的输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平的持续时间,就能改变输出波形的频率,从而改变音调。         乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率。如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。   本系统就是根据此原理设计,对于AT89C2051单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的
[单片机]
基于FPGA和8051单片机IP核的多功能频率计的设计与实现
  频率是电信号中重要的物理量,在电子、通信系统中,信号的频率稳定度决定了整个系统的性能,准确测量信号的频率是系统设计的重要内容。   单片机广泛地应用于电子系统设计,其性价比高,大量的外围接口电路,使基于单片机的电子系统设计方便,周期缩短。然而,单片机的串行工作特点决定了它的低速性和程序跑飞,另外还存在抗干扰能力不强等缺点。EDA(Electronic Design Automation)技术以计算机为工具,在Quartus II软件平台上,对以硬件描述语言Verilog HDL/VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、综合及优化、逻辑仿真,直至对特定目标芯片的适配、编译、逻辑映射和编程下载等工作,
[单片机]
基于FPGA和80<font color='red'>51单片机</font>IP核的多功能频率计的设计与实现
出租车计价器的项目设计
最近接到一个项目,是位一款出租车计价器设计一套软硬件系统 我用51单片机设计了一个方案,效果还不错,欢迎大家共同留言学习,讨论 废话不多说,先上实物图 AD设计原理图 出租车计价器元件清单 元件名称 单位(只) 型号 参数 备注 单片机 2 AT89S52 整流二极管 20 IN4007 电容 10 30P 电容 10 104 电解电容 8 100UF/50V 电解电容 2 220UF/50V 电解电容 10 10UF/25 微动开关(按钮) 12 74ls164 8 自锁开关 2 (白色,六脚的) 排针 2排 晶振 2 11.0592M 精调电阻 5 103 3296W 10K 排线 1米 20p 稳压管 2 LM
[单片机]
出租车计价器的项目设计
解析8051单片机的三种数据传输方式
单片机CPU与外部设备交换信息通常有如下几种方式:无条件传送方式,查询传送方式和中断传送方式。我们以单片机与微型打印机接口为例讲述这三种方式。假定用户要打印三个数据,这三个数据保存在单片机的内部数据存储器10H,11H,和12H中,8051用并口P2与微型打印机的并行数据口DB进行数据交换。 (1)无条件传送方式 这种数据传送方式中没有联络信号,即CPU总是认为打印机在如何时候都是处于“准备好”的状态。这种传送方式中只需要在程序中加入数据送往P2的指令,数据传送便可以实现。但这种数据传送方式有一个致命弱点,数据易丢失,这是因为CPU的速度相当快,而打印机的速度相对来说较慢,其结果是在打印机打印一个数据的时间内,CPU已送来了多
[单片机]
解析80<font color='red'>51单片机</font>的三种数据传输方式
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved