主要目标:
(1)用51系列单片机作为控制器;
(2)采用由四个MOS管组成的H桥电机驱动电路,并由IR2104S来驱动H桥;
(3)可实现电机正、反转,启停,加、减速;
(4)可采用蓝牙、按键进行效果切换,并加有LED灯(左、右方向灯)及蜂鸣器报警电路(转向时报警);
(5)采用5V直流稳压电源;

主要内容:
1、最小系统设计;
2、综合布局设计;
3、蓝牙控制C程序设计;
4、按键控制C程序设计;
5、方向灯及蜂鸣器C程序设计;
6、仿真观察实验效果;
7、电路焊接与调试;

要实现所要求的功能首先需要规划硬件模块,所需的元件为STC89C52RC芯片,12MHZ晶振,直流单机,IR2104S,MOS管IRF740,HC-05蓝牙模块,电容电阻导线若干,红、黄LED若干、按键若干、USB-TTL模块,三极管8050及8550以及蜂鸣器等一些其他模块。

首先先要实现最小系统的正常运行,单片机最小系统由单片机、晶振电路、复位电路、电源模块构成,硬件电路图会在下面给出的。实现了最小系统的运行后要开始考虑如何实现电机的驱动及状态控制, H桥由四个MOS管组成,全桥驱动可以由实现电机正反转,通过改变MOS开断的时间即通过给PWM波的方式来实现电机调速,可以选用IRF2104S来驱动H桥,需要通过蓝牙,按键切换可以判断出在编程的时候需要用到中断的知识,按下按键打开中断,来执行中断服务程序,具体可以通过代码的编写来实现,下面会对其有详细的叙述;在此次设计中我设计的功能:可实现电机调速,蓝牙控制,LED方向灯显示,蜂鸣器转向报警,在硬件焊接方面需要注意P0口要加上拉电阻、电解电容正负极不能接反等,焊接完成后需要进行电路的测试。

硬件电路图:

1.IRS2104S驱动电路:


图1-H桥
图一以四个IR740组成的H桥为基础,通过两个IR2104S来驱动,下面的图二为IR2104S数据手册中的半桥驱动电路图(左边桥和右半桥是对称的,以分析左半桥为例),图3为IR2104S内部电路原理图:
①VCC为芯片的电源输入,手册中给出的工作电压为10~20V。
② IN和#SD作为输入控制,可共同控制电机的转动状态(转向、转速和是否转动)。
③ VB和VS主要用于形成自举电路。
④ HO和LO接到MOS管栅极,分别用于控制上桥臂和下桥臂MOS的导通与截止。
COM脚直接接地即可。

图2-IR2104S半桥驱动


图3-IR2104S内部电路原理图

通过IN口给PWM波,#SD给高低电平。VCC通过一个二极管连接到VB,给VB口提供12V的电压,VB通过一个电容连接到VS,VS接到上下两个NMOS的中间,这部分是一个自举电路,因为NMOS导通需要VGS > VGSth ,由于NMOS导通后电阻很小,相当于一条导线,源极电压等于漏极电压,要确保VGS > VGSth ,所以这里需要一个自举电路来提高栅级的对地电压,并且自举电路还可以降低MOS管的导通电阻,从而减少发热损耗,还需要利用二极管的单向导电性来防止电流回流毁坏电路。下面图四为我的全桥电路图

因为PWM输出使上下两个NMOS轮流导通,(HO,LO)分别经历(0,0),(1,0),(0,1)三个过程,即自举电容电容充电,自举电容放电和下半桥栅级放电和上半桥栅级放电(上一阶段加在上面的电压),我在HO和LO与NMOS之间的限流电阻上并联一个二极管,加快放电速度。在输入电压出接了一个电容到地,是用来起滤波作用的。同时,PWM给不同的占空比可以进行电机调速。

2.HC-05蓝牙模块
HC-05蓝牙模块通过串口与51连接,可实现人机交互,我这里只将蓝牙当做接收端,通过手机端的蓝牙调试器APP向51发送控制信息(两者之间通信方式为串口通信,波特率设置为4800)。
在APP中设立了五个按键,即LEFT, RIGHT, UP, DOWN以及OK,分别用作左转,右转,加速,减速和停止,按键按下去后会通过串口发送对应的键值,HEX显示分别为0x48, 0x4A, 0x47, 0x4B, 0x49, 51单片机的SBUF寄存器存储接受到的值,然后我对接受的到信息进行处理。

3.独立按键模块
这一块我设置了三个独立按键,接到P0.0, P0.1, P0.2,同时这三个IO口接了上拉电阻起到保护引脚的作用,这三个按键分别起到加速,减速,停止的作用。
做了软件消抖(检测到按下口经过延时后再检测是否按下),提高准确性。

程序如下:

main.c文件:

#include "reg52.h"
#include "light.h"
#include "motor.h"
#include "blue.h"
#include "key.h"
extern  uchar  Turn_flag;
void main(void)
{PWM_Init();UART_Init();while(1){Key_Ctrl(Key_Scan());LED_Display(Turn_flag);}
}

blue.c文件:

#include "reg52.h"
#include "blue.h"
#include "string.h"
#define  UART_RX_STA = 0;
uchar    UART_RX_BUF[UART_MAX_RECV_LEN];
uchar    Turn_flag = 0;
extern   uchar  comp;
sbit  L = P1 ^ 3;
sbit  R = P1 ^ 4;
sbit  LED_Stop = P1 ^ 0; //红色灯--刹车灯
sbit  BEEP  = P2^7;     //蜂鸣器
//定时器1初始化
void  UART_Init(void)
{SCON = 0x50;TMOD = 0x20;PCON = 0x80;TH1  = 0xF3;      //设置波特率为4800TL1  = 0xF3;ES   = 1;EA   = 1;TR1  = 1;L = 0;
R = 0;
LED_Stop =  0; //红色灯--刹车灯
BEEP  = 1;
}
//串口发送数据
void UART_SendData(uchar *BUFF)
{uchar i;for(i = 0; i < strlen(BUFF) ; i++){SBUF = *(BUFF + i);while(!TI);TI = 0;}
}
//串口中断函数,蓝牙电机控制
void UART_ReceiveData() interrupt 4
{ES = 0;       //暂时关闭串口中断RI = 0;UART_RX_BUF[0] = SBUF;   //把收到的信息从SBUF放到UART_RX_BUF[]中switch(UART_RX_BUF[0]){case 0x47:if(comp != 80)  comp += 10;else  comp = 80;break;case 0x48:L = 0;R = 1;Turn_flag = 1;break;case 0x49:comp = 0;Turn_flag = 0;break;case 0x4A:L = 1;R = 0;Turn_flag = 2;break;case 0x4B:if(comp != 0)   comp -= 10;else  comp = 0;Turn_flag = 3;break;default:break;}ES = 1;       //重新开启串口中断SBUF = UART_RX_BUF[0];while(!TI);TI = 0;
}

blue.h文件:

#ifndef    _BLUE_H
#define    _BLUE_H
#define    UART_MAX_RECV_LEN  40
#define    uchar   unsigned char
#define    uint    unsigned int
void  UART_Init(void);
void  UART_SendData(uchar *BUFF);
#endif

motor.c文件:

#include "reg52.h"
#include "motor.h"
#define uchar unsigned char
#define uint  unsigned int sbit  PWM1 = P2 ^ 6;    //PWM输出IO口
sbit  PWM2 = P2 ^ 4;
uchar cont = 0;          //定时器0中断计数值
uchar comp ;      //定时器0的比较值
//定时器0初始化
void  PWM_Init(void)
{ TMOD = 0x01; TH0  = (65536 - 1000) / 256; TL0  = (65536 - 1000) % 256; EA   = 1; TR0  = 1; ET0  = 1; PWM1  = 0; PWM2  = 0;
} //定时器0中断函数, PWM占空比设置
void  TIMER0_INT(void) interrupt 1
{ TH0  = (65536 - 1000) / 256; TL0  = (65536 - 1000) % 256;  //1us cont++; if(cont <= comp) { PWM1 = 1; PWM2 = 1; } else  if(cont <= 100)       //10khz { PWM1 = 0; PWM2 = 0; } else cont = 0;
}

motor.h文件:

#ifndef  _MOTOR_H
#define  _MOTOR_H
void  PWM_Init(void);
#endif

light.c文件:

#include "reg52.h"
#include "light.h"
sbit  LED_Stop = P1 ^ 0; //红色灯--刹车灯
sbit  LED_L = P1 ^ 1;   //黄色灯--左边
sbit  LED_R = P1 ^ 2;   //黄色灯--右边
sbit  BEEP  = P2 ^ 7;   //蜂鸣器
sbit  Beep_ST = P1 ^ 5;//i = 1 ,延时1us
void  delay_ms(uint i)
{while(i--);
}void  LED_Display(uchar Turn_flag)
{if(Turn_flag == 0)
{LED_Stop = 0;Beep_ST = 0;LED_L = 0;LED_R = 0;BEEP  = 0;}else if(Turn_flag == 1)
{LED_Stop = 0;Beep_ST = 1;LED_L = 1;BEEP  = 1;delay_ms(5000);LED_L = 0;BEEP  = 0;delay_ms(5000);}else if(Turn_flag == 2)
{LED_Stop = 0;Beep_ST = 1;LED_R = 1;BEEP  = 1;delay_ms(5000);LED_R = 0;BEEP  = 0;delay_ms(5000);}else if(Turn_flag == 3){LED_Stop = 1;BEEP = 1;}
}

light.h文件:

#ifndef   _LIGHT_H
#define   _LIGHT_H
#define  uchar   unsigned char
#define  uint      unsigned int
void  LED_Display(uchar );
void  delay_ms(uint );
#endif

key.c文件:

 #include "key.h"
#include "reg52.h"
#include "motor.h"
sbit  K1 = P0 ^ 0;
sbit  K2 = P0 ^ 1;
sbit  K3 = P0 ^ 2;
#define uchar unsigned char
#define uint  unsigned int
extern uchar comp ;
extern uchar Turn_flag;void delay(uint i)
{while(i--);
}u8  Key_Scan(void)
{if(K1 == 0){delay(500);if(K1 == 0)  return 1;else         return 0;}else if(K2 == 0){delay(500);if(K2 == 0)  return 2;else         return 0;}else if(K3 == 0){delay(500);if(K3 == 0)  return 3;else         return 0;}else           return 0;
}void   Key_Ctrl(u8 i)
{switch (i){case  1:if(comp != 80)  comp += 10;else  comp = 80;break;case  2:if(comp != 0)   comp -= 10;else  comp = 0;Turn_flag = 3;break;case  3:comp = 0;break;default:break;}
}

key.h文件:

#ifndef  _KEY_H
#define  _KEY_H
#define  u8  unsigned char
#define  u16 unsigned intu8     Key_Scan(void);
void   Key_Ctrl(u8 );
#endif

附焊接图:

基于51单片机蓝牙直流电机控制(IR2104S驱动H桥)相关推荐

  1. 基于51单片机蓝牙密码锁

    目录 一.项目需求 二.原理图 三.设计思路 四.实物 五.代码 资料下载地址:基于51单片机蓝牙密码锁-单片机文档类资源-CSDN下载 一.项目需求 1.采用DS1302时钟模块,通过该模块可检测当 ...

  2. 步进电机的计算机控制系统设计,基于.51单片机的步进电机控制系统设计.doc

    基于51单片机的步进电机控制系统设计 中文摘要 步进电机是一种受,并且能将相应的或者的电动机.由于步进电机具有步距误差不积累.运行可靠.结构简单.惯性小.成本低等优点,因此,被广泛使用于计算机外围电路 ...

  3. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  4. 基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0031 ...

  5. 基于51单片机智能家居电路控制仿真

    [毕设课设]基于51单片机智能家居电路控制仿真 ​效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: ​效果图 更多内容请关注@WENJIE电子科技 ​ 基于51单片机pro ...

  6. 基于51单片机蓝牙小车

    文章目录 接线 电机控制模块接线(需要额外电源) 单片机接线 实物图 代码相关 目录树 .c文件 main.c Serial.c(不会参考我写的串口文章) CarTurn.c(车的相关操作) dela ...

  7. 基于51单片机的PWM控制马达电机调速正反转(仿真+源码+全套资料)

    资料编号:117 仿真图proteus 7.8 程序编译器:keil 5 编程语言:C语言 采用51单片机,用PWM控制电机脉冲频率应控制在25HZ-35HZ之间 定时1ms,1个周期30ms,脉冲频 ...

  8. 基于51单片机的PWM控制马达电机调速正反转

    资料编号:117  下面是相关功能视频演示: 117-基于51单片机的PWM控制马达电机调速正反转(仿真+源码+全套资料) 仿真图proteus 7.8(理论上高于7.8均可以打开) 程序编译器:ke ...

  9. 基于51单片机的直流电机调速测速正反转控制(仿真+源程序+原理图+PCB)

    资料编号:206 1.本设计采用STC89C51/52(与AT89S51/52.AT89C51/52通用,可任选)51单片机作为主控制器 2.采用霍尔传感器非接触式测电机转速 3.LCD1602液晶显 ...

  10. 基于51单片机智能热水器控制系统设计

    一.硬件方案 智能热水器主要实现的功能是可以对水位进行设置并加水,先设置好需要加水的水位段数,单片机会根据这个数判断是否需要加水,同时还可以测量并显示水温.设置水温范围,若水温超过或低于所设置的水温范 ...

最新文章

  1. cordova使用cordova-plugin-baidumaplocation插件获取定位
  2. 打趴系统的不一定是技术
  3. 前端实现数字快速递增_天正CAD教程之递增文字应用实例
  4. 记录一个相当好用的反编译工具下载地址
  5. Visual Studio Code Vue代码片段 总览
  6. 在对比中理解 Node
  7. 衡量失败检测算法的指标
  8. GNS3 思科交换机配置三层转发
  9. python如何通过以太网发送指令_Python编写的客户端给服务器发送指令执行相应的命令并返回结果...
  10. node下运行js文件实时更新文件变化
  11. MIMO系列之分集与复用
  12. 电脑声控 电脑机器人功能
  13. 【东南大学主办: IEEE ICSIP 2022】信号与图像处理热门主题,7月邀您相约苏州
  14. 2020 android平板推荐,最适合学生用的平板_2020学生党平板推荐
  15. Windows消息类型及说明
  16. 模拟手机预览(非F12)
  17. RecyclerView.Adapter notifyDataSetChanged 不起作用
  18. 看了这一篇你还不理解什么是闭包——我直播吃翔!
  19. 【Oracle】高级查询练习题详解
  20. Mari真实生物纹理绘画制作视频教程

热门文章

  1. 已知棱长求三棱锥的表面积和体积
  2. 每日单词20110507
  3. 关于跨境电商shopee平台,你了解多少?
  4. linux如何后台执行程序?
  5. VUE-日期选择器-结束时间开始时间
  6. uni-app开始时间结束时间(结束时间大于开始时间)picker编写
  7. 3 Layer and 3 Tier
  8. QAV250四轴穿越机安装全程详解(多图)
  9. Ansys电机控制系统分析
  10. win2012 加入域