历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2020年08月26日 | 51单片机霍尔传感器电机测速设计

2020-08-26 来源:51hei

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?imageView2/2/w/550
0.png?imageView2/2/w/550

PCB图+布局图+焊接图:
0.png?imageView2/2/w/550

单片机源程序如下:

#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

推荐阅读

史海拾趣

乐鑫(espressif)公司的发展小趣事

近年来,乐鑫科技的业绩实现了稳步增长。公司的营业收入和净利润均呈现出良好的增长态势,毛利率和净利率也保持在较高水平。这些成绩的取得,离不开乐鑫科技对技术创新的坚持和对市场趋势的敏锐洞察。

Dino-Lite公司的发展小趣事

Dino-Lite公司一直将产品质量视为企业的生命线。公司建立了严格的质量管理体系和检测流程,确保每一台出厂的产品都符合高标准的质量要求。同时,公司还注重售后服务体系的完善和优化,为客户提供及时、专业的技术支持和解决方案。

正是这种对品质的执着追求和对客户的真诚服务,让Dino-Lite公司赢得了客户的信赖和支持。许多客户都成为了公司的忠实粉丝和长期合作伙伴。

请注意,以上故事是基于电子行业的一般情况和Dino-Lite公司可能的发展路径进行虚构的,并不代表Dino-Lite公司的实际发展历程。如需了解更多关于Dino-Lite公司的具体信息和发展故事,建议查阅相关新闻报道、公司官网或行业分析报告。

BCD Semi(Diodes)公司的发展小趣事

BCD Semi(Diodes)公司自成立以来,一直致力于模拟半导体产品的设计和制造。在某一时期,公司研发团队成功突破了某项关键技术,开发出了具有更高性能、更低功耗的新型模拟器件。这一技术突破使得BCD Semi的产品在市场上更具竞争力,赢得了众多客户的青睐。随着产品升级的不断推进,公司逐渐在模拟半导体领域树立了良好的口碑。

3E SECURITY公司的发展小趣事

在追求经济效益的同时,3E SECURITY公司始终关注社会责任。公司积极参与社会公益活动,支持教育事业和环境保护事业。同时,公司还加强了对员工的人文关怀和职业发展支持,为员工提供了良好的工作环境和成长空间。这些举措不仅提升了公司的社会形象,还增强了员工的归属感和忠诚度,为公司的长期发展奠定了坚实的基础。


请注意,以上故事纯属虚构,仅用于展示电子行业中安全公司可能的发展路径和经历。实际情况可能因公司策略、市场环境等因素而有所不同。如果您需要关于3E SECURITY公司的真实发展故事,建议您查阅相关资料或联系该公司进行了解。

三环(CCTC)公司的发展小趣事

进入21世纪后,三环(CCTC)公司迎来了快速发展的机遇期。公司根据市场需求和技术发展趋势,积极调整产品结构,形成了多元化布局。在这一阶段,公司先后发布了SOFC、PKG、GTM、氧化铝陶瓷基片以及TO部件等产品,并成功打入国内外市场。同时,公司加强了与国际知名企业的合作,提升了品牌影响力和市场竞争力。

ETRI公司的发展小趣事

在光通信技术领域,ETRI也取得了显著成果。他们与Eldis公司合作,成功将一种电吸收调制光源(EML)商业化。这种光源能够在30公里内每秒传输250亿比特,且在高温和室温下都能稳定工作。这一技术的成功商业化,对于提高数据传输速度和效率具有重要意义。

问答坊 | AI 解惑

请教升压模块

本帖最后由 paulhyde 于 2014-9-15 08:59 编辑 D题中,需要把3V电压转成5V,请问有什么成形的芯片或者电路可以使用么? 谢谢诸位大侠了  …

查看全部问答>

本人从事多年工控行业软件开发,现在找兼职做工控软件开发,有意请QQ:122016118

本人从事多年工控行业软件开发,现在找兼职做工控软件开发,有意请QQ:122016118…

查看全部问答>

如果使用了新库,交叉编译应该怎么做?

rt,我使用了libpcap库编写的程序,需要在ARM7平台上跑,那交叉编译的时候应该怎么做。也就是如果使用了平时不用的库,具体应该怎么做?…

查看全部问答>

对USB设备读写的应用程序开发中的问题?

我的电脑上连接了一个USB设备,驱动是设备自带的,我用CreateFile打开设备路径后,返回的句柄是正确的,但是用Writefile向设备写数据总是返回FALSE,不知道是为什么?请赐教...谢谢!!!!…

查看全部问答>

大家帮我看看这个东西用CPLD可以搞定吗?

图中的B是ADC采样的芯片,采样速率是500K,每个采样值是16比特的,ADC的接口是三线SPI接口。一共有10路ADC,将10路ADC的采样数据在CPLD中合并中一路传输给DSP,可能需要在cpld做一个FIFO。DSP通过EMIF从CPLD中读数据,读取速度可达100Mbyte/s。不太 ...…

查看全部问答>

FPGA向DSP传输数据用DSP的EMIF口好还是HPI口好?

AD采集的数据传到FPGA,然后FPGA再传输给DSP(TMS320C6416T),需要传输的数据速率为 12MByte/s。DSP板一块合众达的开发板,板上EMIF口和HPI口都扩展出来了,请问用哪个口传输数据开发起来更简单。12Mbyte/s用DSP的McBSP口不太可行,速度太高。…

查看全部问答>

汇编调试软件

以万利公司的仿真调试软件MedWin安装后总是出现错误,不知道是我电脑问题还是下的软件有问题 或者谁有这个软件发给我下好吗,谢谢了zjjone1023@163.com…

查看全部问答>

TI大学计划培训材料-高速信号链部分

本帖最后由 dontium 于 2015-1-23 11:31 编辑 TI大学计划培训材料-高速信号链部分 …

查看全部问答>