找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6902|回复: 1
收起左侧

单片机手机蓝牙小车设计+代码+分析

[复制链接]
ID:686090 发表于 2020-1-14 15:50 | 显示全部楼层 |阅读模式
1.1 基本设计要求

(1)在综合单片机实验箱的硬件结构上编写软件完成设计。

(2)程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。

(3)利用无线发射和无线接收模块控制单片机,让单片机翻译传输指令,从而实现相应的功能。具体的过程如下:无线发射模块发出指令,无线接收模块接收信号后,传输给单片机,单片机接收到信号后翻译并传输给电机驱动模块驱动电机旋转,从而实现小车的前进、左转、右转、后退、停止、加速。

(4)使用TB6612驱动直流电机。

(5)软件设计采用定时中断,串口中断结构,不得应用软件延时法。

(6)使用蓝牙手机APP远程控制。

1.2 选做项目

1、蓝牙小车测速手机返回速度数据。

2、在以上设计的基础上,增加超声波测距模块。

2 设计阐明
2.1设计内容

用STC80c52芯片单片机实验箱及串口电路设计实现显示时间并能够调校时间的时钟,还能够实现启动/暂停,复位功能。

用STC80c52芯片、蓝牙模块及串口电路、定时器、TB6612驱动芯片、蓝牙手机APP,TT电机、5v直流电源转接板、设计实现更改PWM值、并能够调校时间的时钟,还能够实现小车的前进、左转、右转、后退、停止、加速功能。

2.2设计要求

(1) 在ZY15MCU12BD型综合单片机实验箱的硬件结构上编写软件完成设计。

(2) 程序的首地址应使目标机可以直接运行,即从0000H开端。在主程序的开端部分必须设置一个合适的栈底。程序放置的地址须持续且靠前,不要在中间留下大批的空间地址,以使目标机可以应用较少的硬件资源。

(3)利用无线发射和无线接收模块控制单片机,让单片机翻译传输指令,从而实现相应的功能。具体的过程如下:无线发射模块发出指令,无线接收模块接收信号后,传输给单片机。使用串口中断,接收到数据之后,进入串口中断。

(4单片机接受到指令之后,使用小车的TB6612驱动芯片,驱动电机前进、左转、右转、后退、停止、加速。

(5) 软件设计必须应用8051片内定时器,采用定时中断结构,不得应用软件延时法。

(6) 上机调试程序。

(7) 写出设计报告。

2.3设备及工作环境

  (1) 硬件:盘算机一台、51核心板、5v直流电源转接板、充电头。

  (2) 软件:Windows操纵系统、Keil C51软件。

3 系统方案整体设计3.1 设计思路

用STC80c52芯片、蓝牙模块及串口电路、定时器、TB6612驱动芯片,TT电机、5v直流电源转接板、蓝牙手机APP、设计实现更改PWM值、并能够调校时间的时钟,还能够实现小车的前进、左转、右转、后退、停止、加速功能。

3.2 系统整体框图

代码设计思路:当蓝牙手机APP连接上蓝牙,通过手机APP向单片机发送相应指令,当单片机接收到指令。进入相应的串口中断,执行相应的程序。设计实现更改PWM值,还能够实现小车的前进、左转、右转、后退、停止、加速功能。

如下图所示。

图1 系统整体框图

4 硬件设计
4.1 系统硬件设计
4.1.1 最小单片机系统

(一)1、原理图绘制

由于自己画板子,没有加引脚标识,有相同的引脚名称,导致有AD原理图一直报错,有重复的引脚命名。由于自己不熟悉ad元件封装,导致找不到合适的元件,需要自己画原理图元件库,和pcb封装库。

使用编译覆盖功能,对原理图中不需要在PCB图中显示的模块,即使用现有PCB的模块进行遮盖。

2、在对原理图工程进行编译后,进行生成PCB文件,并更改其布局。

3、对封装不符合的元件,绘制PCB封装。

查找晶振封装,画元件pcb库。

4、修改元件布局,尽量减少线路交错,如果有交错,需要增加过孔。

5、禁止布线区的绘制操作

将板层标签切换到keep-out layer,执行菜单place》走线》绘制一闭合区域,

6、进行自动布线操作,并利用手动布线,进行修改布局,利用规则检查,修改pcb图中有错误的地方。

7、检查—运行DRC规则检查 纠错

元件丝印跑到顶层,修改其到顶层,选中元件,在页面右下方,选中pcb》右键》pcb inspector》更改元件所在层

8、补泪滴的操作

执行工具》泪滴;通过设置选项设置泪滴种类圆弧形、直线型 、为焊盘或者过孔补泪滴》选择泪滴类型

9、覆铜操作

菜单栏》工具》放置覆铜菜单命令


元件清单

4.1.2TB6612


TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。同PWA,AIN2,AIN1控制电机。其中PWMA接到单片机的PWM引脚,一般10KHZ即可,并通过改变占空比调节电机的速度。

4.1.3HC-06模块蓝牙

本次设计选择的蓝牙模块是HC-06模块,HC-06 是一款高性能的从机蓝牙串口模块,模块兼容 5V 或 3.3V 单片机系统,使用非常灵活、方便。

4.2 系统工作原理论述

当蓝牙手机APP连接上蓝牙,通过手机APP向单片机发送相应指令,当单片机接收到指令。进入相应的串口中断,执行相应的程序。设计实现更改PWM值、并能够调校时间的时钟,还能够实现小车的前进、左转、右转、后退、停止、加速功能。软件设计采用定时中断,串口中断结构,未用软件延时法。

5 软件设计5.1 分析论证

软件设计采用定时中断,串口中断结构,未用软件延时法。大大提高芯片运行速率。使用tb6612驱动芯片控制电机,前进、左转、右转、后退、停止、加速功能。使用蓝牙可远程控制电机。

5.1.1 hc06蓝牙模块

模块使用串口通讯,通过蓝牙模块连接手机APP,使用手机APP向单片机发送16进制数据。

5.1.2 TB6612驱动模块

通过控制该芯片的PWA,AIN2,AIN1、STBY引脚,PWB,BIN2,BIN1,控制两路电机的正反转,前进、左转、右转、后退、停止、加速。

5.1.3 pwm占空比更改模块

该模块重要功效是修改占空比,更改电机转速。

3.1.4直流电压转接模块

该模块的功能是引出电源排针,给电机及各个模块供电。

5.1.5 整体功能

当蓝牙手机APP连接上蓝牙,通过手机APP向单片机发送相应指令,当单片机接收到指令。进入相应的串口中断,执行相应的程序。设计实现更改PWM值、并能够调校时间的时钟,还能够实现小车的前进、左转、右转、后退、停止、加速功能。软件设计采用定时中断,串口中断结构,未用软件延时法。

5.2 程序流程图

软件设计采用定时中断,串口中断结构,未用软件延时法。蓝牙手机APP连接上蓝牙,通过手机APP向单片机发送相应指令,当单片机接收到指令,进入相应的串口中断,执行相应的程序。接收到“0x01”车的前进,接收到“0x02”车的左转,接收到“0x03”车的右转,接收到“0x04”车的后退,接收到“0x05”车的加速,接收到“0x06”车的停止。

5.3程序清单

1、主程序


6 调试过程及分析
  • 仿真测试

编写好的源程序在 Keil 编译后未呈现正常的现象,这些错误导致浪费了很多时间。例如:像蓝牙模块使用9600波特率,为了模拟蓝牙模块通过串口给单片机接收数据,使用XCOM模拟软件,利用usb转ttl模块给单片机发送数据。在硬件焊接问题上,LED引脚焊反,部分引脚虚焊,导致接触不良,stc89c52芯片损坏,导致无法正常下载入程序。在前期的程序编写和几天的上机调试,使我又获得了很多新的知识,由于前期编写程序时查了很多材料学到了很多知识,这几天的调试更时获得很新的知识,由于程序中又很多的错误,为了修正错误必须看书或向别人请教,在这个过程中无意识的获得了很多知识。同时也使我对单片机更感兴趣了,这点我感到很重要,相信这会对以后的学习有所帮助。

  • 实物制作与测试

51最小系统板PCB焊接图

蓝牙小车实物图

7 设计总结

本次设计是用stc89c52单片机及串口电路设计一个基于手机APP的蓝牙小车,经过一个星期的调试,成果满足基本设计请求,验证无误。设计重要用到了多种硬件,程序也比较长,比较麻烦,同时也碰到了不少艰苦,尤其是关于蓝牙模块与单片机通讯,使电机正常工作的设计实现。由于电机及驱动需要供电充足对电流也有一定要求,导致电机一直未正常转动。通过本次设计,我懂得了小车的设计流程,尤其是硬、软件的设计方法,以及电源及硬件焊接的重要性,以及电机驱动芯片及串口中断和定时器中断的一般原理,也进一步了解了8051定时器的应用和中断CPU程序的编程方法,开辟了思路,提高了分工协作才能和分析题目,解决题目的能力。

  1. void main()                                            
  2. {     Initialize_time0();
  3.      bluetooth_init();
  4. PWMA=1;
  5.       PWMB=1;
  6.                             STBY=1;
  7.                  BackwhilePWMA=1;
  8.       BackwhilePWMB=1;

  9.                             BackwhileSTBY =1;
  10.                             led3=1; led2=0;                           
  11.        while(1)  ;}
  12. 蓝牙串口、定时器初始化
  13. void bluetooth_init()//初始化子程序
  14.               {TMOD=0x22;//设置定时器T1为工作方式2              9600
  15.     PCON = 0x00;                //SMOD=1
  16.               TH1=0xfd;
  17.               TL1=0xfd;//T1定时器装初值
  18.               TR1=1;//启动定时器T1
  19.               REN=1;//允许串口接收
  20.               SM0=0;
  21.               SM1=1;//设置串口工作方式1
  22.               EA=1;//开总中断
  23.               ES=1;//开串口中断}
  24. void Initialize_time0(void)
  25. {   EA=1;
  26.     ET0=1;                         //EA=1;ET0=1;开启总中断、定时器0
  27.     TMOD=0x22;                               //M1=1,M1=0;方式2
  28.     TH0 = 0XA3;                                   //定时时间为100us   
  29.     TL0 = 0XA3;                                                                                          
  30.     TR0=1; } //启动定时器0,开始计数
  31.   void send(unsigned char a)        //单字节数据发送
  32. {  //注意:若单片机TXD(P3.1)无上拉能力,必须在P3.1端接上拉电阻。本次测试需要接上拉电阻
  33.         TI=0;      
  34.         SBUF=a;
  35.         while(TI==0);
  36.         TI=0;}
  37. 小车的前进、左转、右转、后退、停止、加速
  38. void forward()      
  39.        { AIN1=1;
  40.                             AIN2=0;      
  41.                             BIN1=1;
  42.                             BIN2=0;              
  43.         PWMA=1;
  44.         PWMB=1;
  45.                             BackwhileAIN1=1;
  46.                             BackwhileAIN2=0;      
  47.                             BackwhileBIN1=1;
  48.                             BackwhileBIN2=0;              
  49.         BackwhilePWMA=1;
  50.         BackwhilePWMB=1;
  51.         send(tem); }                                                               
  52. Void case2(){
  53.        AIN1=0;
  54.                             AIN2=0;      
  55.                             BIN1=1;
  56.                             BIN2=0;              
  57.        PWMA=1;
  58.        PWMB=1;
  59.                             BackwhileAIN1=0;
  60.                             BackwhileAIN2=0;      
  61.                             BackwhileBIN1=1;
  62.                             BackwhileBIN2=0;              
  63.         BackwhilePWMA=1;
  64.         BackwhilePWMB=1;
  65.         send(tem);}                                                                                                               
  66. Void case3(){
  67.            AIN1=1;
  68.                                           AIN2=0;      
  69.                                           BIN1=0;
  70.                                           BIN2=0;              
  71.            PWMA=1;
  72.            PWMB=1;
  73.                                           BackwhileAIN1=1;
  74.                                           BackwhileAIN2=0;      
  75.                                           BackwhileBIN1=0;
  76.                                           BackwhileBIN2=0;              
  77.            BackwhilePWMA=1;
  78.            BackwhilePWMB=1;
  79.            send(tem);}
  80. Void backward(){
  81.                                AIN1=0;
  82.                                           AIN2=1;      
  83.                                           BIN1=0;
  84.                                           BIN2=1;              
  85.            PWMA=1;
  86.            PWMB=1;
  87.                                           BackwhileAIN1=0;
  88.                                           BackwhileAIN2=1;      
  89.                                           BackwhileBIN1=0;
  90.                                           BackwhileBIN2=1;              
  91.            BackwhilePWMA=1;
  92.            BackwhilePWMB=1;
  93.                      send(tem);}        
  94. void case5speed()
  95.    {Degree++;
  96.               if(Degree==180){Degree=0;}
  97.               send(tem);}
  98. void case6stop()   
  99.                             {PWMA=0;
  100.         PWMB=0;
  101.                             AIN1=0;
  102.                             AIN2=0;      
  103.                             BIN1=0;
  104.                             BIN2=0;            
  105.                             BackwhilePWMA=0;
  106.        BackwhilePWMB=0;
  107.                             BackwhileAIN1=0;
  108.                             BackwhileAIN2=0;      
  109.                             BackwhileBIN1=0;
  110.                             BackwhileBIN2=0;
  111.          send(tem);}
  112. 4、串口中断,定时器中断
  113. void chuan() interrupt 4//串口中断服务程序
  114. {RI=0;//软件清除串口响应
  115. tem=SBUF;//读取单片机串口接受的蓝牙模块发送的数据  
  116. led3=!led3;
  117. if(tem==0x09){   led2=!led2;  send(tem);  }     
  118. if(tem==0x01){   forward();  }
  119. if(tem==0x02){   case2();  }
  120. if(tem==0x03){   case3();  }
  121. if(tem==0x04){  backward(); }
  122. if(tem==0x05){  case5speed(); }
  123. if(tem==0x06){  case6stop(); } }
  124. void timer0 (void) interrupt 1            //定时中断0子程序
  125. {                                                                                                                                                                                    
  126.         Count++;      
  127.         if(Count>=0 && Count<=Degree)
  128.         {       PWMA=0;
  129.                 PWMB=0;
  130.                                                           BackwhilePWMA=0;
  131.                 BackwhilePWMB=0;        }  
  132.         else
  133.         {       PWMA=1;
  134.                 PWMB=1;
  135.                                                           BackwhilePWMA=1;
  136.                 BackwhilePWMB=1;        }
  137.                if(Count==200)            
  138.        Count=0;               }
复制代码

完整的Word格式文档51黑下载地址:

文档.doc (9.95 MB, 下载次数: 51)



回复

使用道具 举报

ID:36831 发表于 2020-1-14 23:06 | 显示全部楼层
谢谢分享 学习你的思路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表