历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2020年02月18日 | 单片机+直流电机转速控制程序+Proteus仿真电路

2020-02-18 来源: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键:开始暂停键,按一下开始,再按一下暂停。

程序如下:

#include

#define uchar unsigned char

#define uint unsigned int

void displaym();

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 out=P3^4;                                                         //PWM输出用于正传

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

uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;

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=0;

  delay(10);

  en=1;

}

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

{

  rs=1;

  P0=date;

  delay(5);

  en=0;

  delay(5);

  en=1;

}

void init()//初始化函数

{

  en=0;

  rw=0;

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

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

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

  TMOD=0x01;               //定时器方式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('r');

  write_data('p');

  write_data('m');

  write_com(0xc0);

  write_data('z');

  write_data('h');

  write_data('a');

  write_data('n');

  write_data('k');

  write_data('o');

  write_data('n');

  write_data('g');

  write_data('b');

  write_data('i');          //在第二行显示zhankongbi:

  write_data(':');

  displaym();

}

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)

         {

          zheng=1;                //正传标志置1

          fan=0;          // 反转标志置0

         }

  }

      if(num4==0)

  {

    delay(5);

         if(num4==0)

         {

          zheng=0;                 //正传标志置0

          fan=1;          // 反转标志置1

         }

  }

      if(num5==0)

  {

    delay(5);

         if(num5==0)

         {

         while(num5==0)         ;

          kai=1-kai;

         }

  }

}

void display()

{

  write_com(0x82);

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

  if(zhuansu/10000!=0)

   write_data(zhuansu/10000+0x30);                                                  //如果转速的万位不为0        正常显示否则显示空格

   else

   write_data(' ');

  if(zhuansu/1000==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000+0x30);                                                                //如果转速小于1000 千位为空格 否则正常显示

  if(zhuansu/100==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000/100+0x30);                                           //如果转速小于100 百位为空格 否则正常显示

    if(zhuansu/10==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000%100/10+0x30);                                  //如果转速小于10 十位为空格 否则正常显示

  write_data(zhuansu%10000%1000%100%10+0x30);

  write_com(0xd0);                          //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码

}

void displaym()

{

write_com(0xcb);

   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 main()

{

    flag_1=0;

        m=100;                                                         //占空比为100

        zhuansu=0;                                           //转速初值0

        flag=0;

        zheng=1;                                  //初始化电机正转动

推荐阅读

史海拾趣

Barry Industries Inc公司的发展小趣事

Barry Industries Inc深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,公司还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。

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

近年来,三环(CCTC)公司更加注重产品品质和品牌建设。公司建立了完善的质量管理体系和检测手段,确保产品质量稳定可靠。同时,公司加强了品牌宣传和推广力度,提高了品牌知名度和美誉度。通过不断提升产品品质和加强品牌建设,公司赢得了更多客户的信任和支持,实现了可持续发展。

粤翔(FlyWin)公司的发展小趣事
完成电路设计后,进行严格的测试验证,确保掉电保护电路在实际应用中能够正常工作。
GS Yuasa Battery Sales UK Ltd.公司的发展小趣事
如硬盘、闪存等存储设备,需要掉电保护电路来确保数据在断电时不会损坏。
Emerging Display Technolgies公司的发展小趣事

另一家新兴显示技术公司,专注于透明显示技术的研发。他们通过优化显示材料的透光性和显示效果,成功研发出了高透明度的显示屏。这种显示屏可以像玻璃一样透明,同时又能显示图像和文字。这一技术的创新,为商业广告、智能家居、公共交通等领域带来了全新的视觉体验。

Greatbatch-Sierra Inc公司的发展小趣事

另一家新兴显示技术公司,专注于透明显示技术的研发。他们通过优化显示材料的透光性和显示效果,成功研发出了高透明度的显示屏。这种显示屏可以像玻璃一样透明,同时又能显示图像和文字。这一技术的创新,为商业广告、智能家居、公共交通等领域带来了全新的视觉体验。

问答坊 | AI 解惑

2008黑龙江电子竞赛试题下载

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 A题 宽带前置放大器电路(本科) B题 运水机器人(本科) C题 无线汉字识别装置(本科) [ 本帖最后由 open82977352 于 2010-2-3 10:46 编辑 ]  …

查看全部问答>

有谁了解HART协议的?小妹求助啊

最近在准备一个智能变送器的项目,要用到HART协议,差了些资料,大致了解了HART协议的内容,但就是不知道如何下手,还请高手指点迷津啊! 先在这里谢谢了。…

查看全部问答>

关于舵机的编程问题

小弟最近刚学汇编,还是个菜鸟,正在研究舵机,需要用汇编写一点程序驱动舵机转动,到网上找了半天,很少有现成的程序,而且写的很复杂,很难理解,有没有那位大侠帮帮写一点关于驱动舵机的汇编程序示例,顺带稍微的讲解,小弟感激不尽。(我买的舵 ...…

查看全部问答>

make后的问题

在make后,提示出现一个error 请指正错误在哪? 谢谢 [root@localhost qt-serial]# make g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -Wall -W -O2 -fno-default-inline -DNO_DEBUG -I/working/qt/qt-2.3.7/include -o hello.o hello.cpp I ...…

查看全部问答>

STM32F105串口乱码问题

采用的是STM32F105,串口输入始终是乱码 以下是串口的配置信息 void USART1_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;     USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructur ...…

查看全部问答>

MSP430依次采样

最近在做一个项目,想实现MsP430对Flash的控制,有On和OFF按钮,ON可以控制电路开始采样,OFF控制停止采样,比如第一次按下on后采集到的数据存到了Flash的第一块和第二块的一部分,按下Off停止采集,下一次采集的时候就可以直接存在Flash的第三块上 ...…

查看全部问答>

TI 工程师讲如何进行运放稳定性的SPICE仿真

作者: TI专家Bruce Trump 翻译: TI信号链工程师 Rocky Xiong (熊尧) SPICE是一种检查电路潜在稳定性问题的有用工具 。本文将介绍一种使用SPICE工具来检查电路潜在稳定性的简单方法。 图1是使用OPA211搭建 的一个同相放大器,在许多应用中,只是 ...…

查看全部问答>

谁能解释下这个步进电机驱动电路?

输入占空比50%的PWM:A路:A+N,A-N,A+P,A-P;B路:B+N,B-N,B+P,B-P;AB两路信号相差90度,其中+路和-路反相,A+N和A+P信号完全一样,A-N和A-P一样,B+N和B+P信号完全一样,B-N和B-P一样,,A+A-B+B-是两相步进电机的四个接线端子,现在的情况是电机 ...…

查看全部问答>

四层板学习---整体布局

本帖最后由 jishuaihu 于 2015-5-18 10:21 编辑 四层板学习活动中的布局基本完成了,但是因为没有做过射频和高速信号的设计,有些地方不敢确定布局是否合理。有熟悉这方面的童鞋给看看呗。 周六回复到别人帖子后面没人看。今天单独拿出来发一 ...…

查看全部问答>