2019-02-25 20:41:23 qq_41204464 阅读数 3603
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

 

51单片机蓝牙小车(是我大二做的一个课程设计,小菜鸟一个,欢迎大家指正和参考。)

 

摘要   本次设计选择基于蓝牙遥控的多功能智能小车为对象。选用STC98C52RC单片机作为主控芯片,电机驱动采用L293N ,电源部分采用两节3.7V锂电池供电.采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车.

 

关键词  

51单片机

L298N_电机驱动

蓝牙遥控

 


目 录
1 前言 1
11 系统研究背景 1
12 系统研究的意义和目的 1
2 系统概述 2
21 系统的结构 2
22 系统的功能 2
23 开发环境 2
3 系统实现 3
31 传感器技术 3
32 其它相关技术 3
33 硬件实现 3
34 软件实现 3
35 系统测试 3
4 系统使用说明 4
5 总结 5
6 参考文献 6


1. 前言
1.1.     系统研究背景
 

        蓝牙属于短距离内进行无线控制和收发的通信技术,伴随着科技的飞跃性发展,也让蓝牙找到了发展的空间,它可以代替和取代落后的数字化硬件设备之间繁琐的电缆连接。在蓝牙创造的初期,没有人预料到蓝牙会有如此大的潜力和前景,而现在的发展也是完全超出了我们的预期,因为蓝牙的安全性高,制造成本低廉和所消耗的功率也是同类产品中最低的,所以被很多人使用,越来越受到了广大消费者的欢迎,基于蓝牙技术的产品也在不断的更新和投入市场。

       蓝牙技术是近年来出现的新技术是一种短距离无线通信和信息传输的新型通讯科技,它使数据线的硬件设备接收更方便快捷。它可以广泛应用于世界各地,是一个蓝牙设置一个通用的范围,频率调制技术的使用,以防止外部干扰和多一些。低成本,低功耗和小辐射,和加密设置,让蓝牙的安全性更高;应用范围广,这些特点使得蓝牙技术被广泛的应用在我们日常生活中的蓝牙也支持一对一和一对多传输的通信连接,和多个蓝牙成为微网,也有网络的特点。

     在现在的智能时代,小车智能控制,方便了人们的使用。在51单片机的基础下,通过蓝牙来控制小车的驾驶。



1.2. 系统研究的意义和目的

 

        因为无线技术的广泛使用,我们在研究无线和有线通信技术的方法中了解到蓝牙系统的小区域性有很大的技术突破,在国际上也得到了广泛的采纳,在市场上也有很大的需求。这也使蓝牙技术的发展成为了趋势之一,蓝牙可以发送和接受语音和数据,满足了大多数人的需求,它也融合了其他相关产品的特点,也是这样技术变得更多样性。然而,蓝牙的安全性不足,而且在小区域范围内的一点对多点的通信受到了很大的限制,这些都是其本身需要改进和完善的

      可以使人们更方便,更简单的控制小车。实现了无线控制小车,摆脱了有线控制的不方便,更智能。


2. 系统概述2.1.  系统的结构

                                                                                     系统框图

 

 



2.2.  系统的功能

51单片机的基础下,通过蓝牙来控制驱动,此驱动能把5~12V的电压,一部分给小车轮子转动,一部分通过降压,稳压,最终降为5V来供给此驱动,单片机和传感器供电。

 

2.3.  开发环境

AT89C5RC单片机开发环境。

          AT89C52是一种8位单片机,它是在MCS-51单片机系列上加强了一些功能后升级得到的产物。它的作用基本上就是把外界的数据和命令在中断和时钟的帮助下,在自身内部储存器上把使用者的数据进行处理。AT89C52 由8位的内部处理器,内部数据储存器(RAM,有256个字节)内部储存器有8K的大小,输入和输出双向口有32个,16位的定时器和5个两级中断,全双工串行通信口一个和时钟电路组成。

         AT89C52能够自主地执行给它的指令,也就是你把所需要的指令写在单片机的内部储存器上,它会一步步执行。AT89C52可以在功耗特别低的情况下工作,就是设置成空闲选择和掉电模式两种状态来实现低功耗。

 

                                                                     AT89C52

 

       单片机与外界的通讯是依靠它自身的I/O 口进行的,对单片机I/O 口的控制就是对单片机的控制。I/O 口的存在不仅可以实现数据的传输,还可以改变电平和信号的性质,最重要的一点就是I/O 口可以实现与外部不同电路的连接来使单片机工作。

         AT89C52单片机上我们通常使用的是4个独立的双向通用I/O 口:P0口、P1口、P2和P3口。由于外部设备的工作速率比较慢或者很快的时候,我们可以采用同步传送的方式,而单片机存在的异步传送是为了更加简练的和硬件连接进行传出。也可以通过中断传送和DMA传送来完成。AT89C52单片机还可以实现外部接口单独的编址和外部端口和存储器的统一编制两种方式。AT89C52单片机上一共有32个I/O 口,不同的I/O 口实线的作用和运行的方式都有其自己的方式,我也要通过这次课程设计,更好地了解,更熟练的运用。


3.  系统实现3.1. 相关技术技术

蓝牙技术,驱动模块,

3.2.  硬件实现

HC-06蓝牙模块

其TX接单片机的RX,RX接单片机的TX,VCC接5V(或3.3V),GND接单片机的地。HC-06蓝牙模块是通过一款手机APP(蓝牙串口助手)作为中间媒介,在蓝牙串口助手发送相关的数据到串口,串口再把相关信息送到蓝牙模块,蓝牙模块再把相关信号送到单片机中。

                                                                              HC-06蓝牙模块


                                                      HC-06蓝牙模块和51单片机连接



 

L298N电机驱动模块,

该该电机可以驱动2路直流电机,使能端ENA,ENB,为高电频有效,

通过单片机的输入信号给IN1和IN2来控制左轮,输入信号给IN3和IN4来控制右轮

IN1和IN2,分别给0,1  :正转

 IN1和IN2,分别给1,0  :反转

IN1和IN2,分别给1,1 :停止

IN1和IN2,分别给0,0  :停止

IN3和IN4,分别给0,1  :正转

IN3和IN4,分别给1,0  :反转

IN3和IN4,分别给1,1 :停止

IN3和IN4,分别给0,0  :停止

 

L298N的主要引脚功能如下:

+5V:芯片电压5V;

VCC:电机电压,最大可接50V;

GND:共地接法;

Output1—Output2:输出端,接电机1;

Output3—Output4:输出端,接电机2;

EN1、EN2:高电平有效,EN1、EN2分别为 IN1和IN2、IN3和IN4的使能端;

Input1~ Input4:输入端,输入端电平和输出端电平是对应的;

  

                                                                  L298N




3.3.  软件实现
                 

                                                                     程序流程图

 

            

 

51单片机,源程序:

 

sbit in1 = P1^0;//左电机

sbit in2 = P1^1;//左电机

sbit in3 = P1^2;//右电机

sbit in4 = P1^3;//右电机

char i;

/*前进*/

void forward()

{

in1=1;

in2=0;

in3=1;

in4=0;

}

/*后退*/

void back()

{

in1=0;

in2=1;

in3=0;

in4=1;

}

                                                                                                                                                                                             

/*左转*/

void left()

{

in1=1;

in2=1;

in3=1;

in4=0;

}

/*右转*/

void right()

{

in1=1;

in2=0;

in3=1;

in4=1;

}

/*停止*/

void stop()

{

in1=1;

in2=1;

in3=1;

in4=1;

}

void main (void)               

{

TMOD=0x20;                         //设置T1为工作方式2

      TH1=0xfd;                        //装入初值,比特率为9600bps

      TL1=0xfd;

      TR1=1;                              //开启T1

      REN=1;                             //接收允许

      SM0=0;                             //方式1

      SM1=1;

      EA=1;                               //开全局中断

      ES=1;                                //开串口中断

while(1)

{i=SBUF;//SBUF为单片机接收到的数据,单片机接收到的数据都存放在SBUF里;

RI=0;

if (i==0x02){forward();}     //如果蓝牙助手发送0x02,小车前进

if (i==0x08){back();}        //如果蓝牙助手发送0x08,小车后退

if (i==0x01){left();}         //如果蓝牙助手发送0x01,小车左转

if (i==0x03){right();}        //如果蓝牙助手发送0x03,小车右转

if (i==0x05){stop();}        //如果蓝牙助手发送0x05,小车停止

}

}

 

 

3.4.  系统测试

小车能实现基本功能,成功地用蓝牙控制小车。测试了一段时间,单片机工作稳定,蓝牙稳定的控制,小车较好的按照控制方向行走。

 


4.  系统使用说明

1.      为小车装上两节锂电池,来供电。

2.     打开总开关,在手机端,打开一个蓝牙通讯助手(在手机应用商店可以找到下载),连接上此小车的蓝牙(HC-06),如图:

 

                                    蓝牙 HC-06模块

 

 



 

3.     然后就可以在手机端按相应的前进,后退,左转,右转,停止等,如图:

 

                                        APP

 

解析:前进,后退,左转,右转,停止,都对应着程序中相应的信息,如图;

当手机端发送 0x02 给蓝牙模块,就会执行 forward()函数; 小车会向前走

当手机端发送 0x08 给蓝牙模块,就会执行 back();函数;,小车会向后走

当手机端发送 0x01 给蓝牙模块,就会执行 left();函数;,小车会向左走

当手机端发送 0x03 给蓝牙模块,就会执行 right()函数;,小车会向右走

当手机端发送 0x05 给蓝牙模块,就会执行stop()函数;,小车会停止

具体的编辑如图:

                                          APP2

 

最后这是小车的整体模型;

 

                                                     整体图

 

  注:上面有个RC522读卡器的,哪个是方便后面的课设,在这里,大家可以忽略哈。

5.  总结

     本设计采用的是STC89C52RC单片机,这主要是因为该单片机的稳定性比较好和执行指令的速度很快。还可以采用其它系列的单片机。电机驱动采用L293N ,稳定电压,充足地向直流电机供电和稳定控制;电源部分采用两节3.7V锂电池供电,电压稳定,电流充足,还可以循环充电,节能环保。采用C语言模块化编程,提高开发效率.蓝牙控制功能.用按键或遥控器来控制小车,简单方便经过自己不断的搜索努力以及老师的耐心指导和热情帮助,本设计已经基本完成。

        过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学两年的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这两个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。  由于自身水平有限,设计中一定存在很多不足之处,敬请各位批评指正.


6.  参考文献

C语言程序设计 :清华大学出版社作者:谭浩强

51单片机C语言教程:电子工业出版社 ,作者:郭天祥

 

希望对你有帮助。

 

为了大家方便,我上传了手机APP在网盘:https://pan.baidu.com/s/1UNjlUhUQa25K2RNW8hjwOQ

  提取码:wn7k 

 

 

 

2018-05-19 22:37:03 Prediction_185 阅读数 2377
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

蓝牙舵机篇  

引语  本系列博客将分为三篇来讲解,第一篇讲解如何通过HC-05蓝牙模块控制舵机,第二篇会介绍HC-SR04超声波模块的测距程序,第三篇会将两者组装在一起。


最终目的:通过手机连接蓝牙向单片机发送信号,单片机收到信号后向舵机发送pwm信号,让舵机达到相应的角度。

实现效果需要达到的目标:

1.会使用HC-05蓝牙模块,了解51单片机的串口通信。

2.会用51单片机输出pwm波控制舵机,并校正舵机的误差。

材料:51单片机最小系统、HC-05蓝牙模块、舵机、杜邦线、数据传输线。

51单片机最小系统:如图:


HC-05


如上图所示为蓝牙模块与51单片机的连接方式

那么如何让手机控制单片机呢?

这里我们需要下载一个app,如图


我们可以在聊天栏中,向单片机发送信息,手机将信息分解为ASCII码发给单片机。单片机接受到的也是ASCII码,因此在下面的程序中的case语句中是以16进制来分情况的。

舵机:我们这里所使用的是SG-90舵机 如图


将舵机的橙线连接到P1.2接口

              红线连接到VCC口

              棕色连接到GND

想要控制舵机,那么我们就需要一个周期T = 20ms,高电平的时间(t)等于0.5ms-2.5ms之间的这样一个信号。 
以下是高电平持续的时间(t)与舵机的关系。


t = 0.5ms——————-舵机会转动 0 ° 
t = 1.0ms——————-舵机会转动 45° 
t = 1.5ms——————-舵机会转动 90° 
t = 2.0ms——————-舵机会转动 135° 

t = 2.5ms——————-舵机会转动180° 

但是在实际的应用中,我发现每一个舵机都存在误差,也就是说输出对应空占比的pwm信号,舵机不会精确地转动到相应的度数。因此我将在下面的程序中加以校正。

以下是代码

#include <AT89x51.H>//注意这里的头文件为 <AT89x51.H>

#define SEH_PWM P1_2//舵机PWM口定义

unsigned char SEH_count=5;
unsigned char count=0;


unsigned char T0RH = 0xff;  //T0重载值的高字节
unsigned char T0RL = 0xa3;  //T0重载值的低字节
unsigned char RxdByte = 0;  //串口接收到的字节

void ConfigTimer0();
void ConfigUART(unsigned int baud);

void PWM(unsigned char x)
{
	SEH_count=x;
}

void main()
{
    EA = 1;       //使能总中断
;
    ConfigTimer0();   //配置T0定时1ms
    ConfigUART(9600);  //配置波特率为9600
    
    while (1)
    {  
					switch(RxdByte)
				{
					case 0x31:{
											PWM(5);//手机向单片机发送‘0’,舵机转到0度    
										};break;
					case 0x32:{
										PWM(10);//手机向单片机发送‘1’,舵机转到45度  
										};break;
					case 0x33:{
										PWM(15);//手机向单片机发送‘2’,舵机转到90度  
										};break;
					case 0x34:{
										PWM(20);//手机向单片机发送‘3’,舵机转到135度  
										};break;
					case 0x35:{
										PWM(25);//手机向单片机发送‘4’,舵机转到180度  
										};break;
					case 0x36:{
										;//														
										};break;
					case 0x37:{
									   ;//																
										};break;
					case 0x38:;break;
				}
    }
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0()
{
  


    TMOD &= 0xF0;   //清零T0的控制位
    TMOD |= 0x01;   //配置T0为模式1
    TH0 = T0RH;     //加载T0重载值
    TL0 = T0RL;
    ET0 = 1;        //使能T0中断
    TR0 = 1;        //启动T0
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  //配置串口为模式1
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x20;  //配置T1为模式2
    TH1 = 256 - (11059200/12/32)/baud;  //计算T1重载值
    TL1 = TH1;     //初值等于重载值
    ET1 = 0;       //禁止T1中断
    ES  = 1;       //使能串口中断
    TR1 = 1;       //启动T1
}

/* T0中断服务函数,完成LED扫描 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH;  //重新加载重载值
    TL0 = T0RL;
	  if(count <= SEH_count) 
    {
     
        SEH_PWM = 1;
    }
    else
    {
        SEH_PWM = 0;
    }

    
    count++;
    if (count >= 200) 
    {
        count = 0;
			
    }
	
}
/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
    if (RI)  //接收到字节
    {
        RI = 0;  //手动清零接收中断标志位
        RxdByte = SBUF;  //接收到的数据保存到接收字节变量中
        SBUF = RxdByte;  //接收到的数据又直接发回,叫作-"echo",
                         //用以提示用户输入的信息是否已正确接收
    }
    if (TI)  //字节发送完毕
    {
        TI = 0;  //手动清零发送中断标志位
    }
}

2019-12-17 11:20:17 I_am_hardy 阅读数 23
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

硬件驱动

  • 初始化
    拿到蓝牙模块先将其串口与电脑连接,波特率一般默认为9600,由于我用的是12M的晶阵,产生9600的波特率精度不行所以用4800的波特率。通过电脑串口调式助手发送AT指令修改蓝牙模块的波特率为4800,这些指令在资料里应该都有。(指令之后还有个回车)
AT+BAUD3

  • 然后接贴下面代码烧到单片机上去观察相应输出IO的电平看是否正确完事,再按照备注上的说明搭建小车就完美执行(电机驱动用的L289N)
#include "reg52.h"			 
#include<intrins.h>

//控制四轮的小车IO
#define control P0

typedef unsigned int u16;
typedef unsigned char u8;

//车灯控制,为0时亮
sbit LED = P2^4;

//电机驱动使能控制IO
//前面(俯视)
//motor1   motor2
//motor3   motor4

//control  11 11 11 11
//         m1 m2 m3 m4
//所有的都是01向前,10向后
sbit motor1=P2^0;
sbit motor2=P2^1;
sbit motor3=P2^2;
sbit motor4=P2^3;



//保存串口接收到的数据
u8 recv[50];
u8 count=0,length=0;

//速度调节
u16 time=0;
u16 speed=50;

//小车状态
u8 state=4;

//延迟10us
void delay(u16 i)	
{
	while(i--);	
}




//初始化
void init()
{
	//发送AT指令初始化蓝牙模块和客户端对应,客户端的UUID就是这个,还有蓝牙的名称为hardy
	char *a="at+namehardy\r\n";
   char *b="at+UUID0xFFE0\r\n";
	char *c="at+char0xFFE1\r\n";
	TMOD = 0x21;	  //T1工作方式2,T0工作方式2
	//设置波特率为4800
	SCON = 0x50;
	PCON = 0X80;	//波特率加倍
	TL1 = 0XF3;
	TH1 = 0XF3;	
	TR1 = 1;   //打开定时器

	//T0定时器初始化  100us
	TH0 = 0x0FF;
    TL0 = 0x0A4;
    ET0 = 1;
    TR0 = 1;
	
	IT0=1;	//设置外部中断0的触发方式为下降沿
	EX0=1;	//开启外部中断0

	EA = 1;	 //允许总中断
	ES = 0;  
	delay(50000);  //适当延迟给模块反应时间
    while(*a!='\0')
    {
        SBUF=*a;   
        while(!TI);  
        TI=0;        
        a++;
    }
	delay(50000);
    while(*b!='\0')
    {
		SBUF=*b;  
        while(!TI);  
        TI=0;
        b++;
    }
	delay(50000);
    while(*c!='\0')
    {
		SBUF=*c;  
        while(!TI);
        TI=0;
        c++;
    }
	ES = 1;
}


//输出PWM控制车速
void PWM(){
	if(time>100)  //PWM周期为100*100us
		{
			time=0;
		}
	if(time <speed)	  
		{
			motor1=1;
			motor2=1;
			motor3=1;
			motor4=1;
		}
	else
		{
			motor1=0;
			motor2=0;
			motor3=0;
			motor4=0;
	 	}

}


//通过串口发送字符串,发送到手机客户端用于提示
void send(char *str)  
{                
    ES=0;  //发送时先将串口接收中断关掉发送完成再打开
     while(*str!='\0') 
    {                      
        SBUF=*str;
        while(!TI);
        TI=0;    
        str++;
    }
    ES=1; 
}

//获取速度用以传入客户端显示
char* getspeed(){
	if(speed<20){
		return (char*)"speed:1";
	}
	if(speed>=20&&speed<40){
		return (char*)"speed:2";
	}
	if(speed>=40&&speed<60){
		return (char*)"speed:3";
	}
	if(speed>=60&&speed<80){
		return (char*)"speed:4";
	}
	if(speed>=80){
		return (char*)"speed:5";
	}
	return "error";
}

//获取小车状态用以传入客户端显示
char* getstate(){
	if(state==0){
		return (char*)"go";
	}
	if(state==1){
		return (char*)"back";
	}
	if(state==2){
		return (char*)"trun left";
	}
	if(state==3){
		return (char*)"trun right";
	}
	if(state==4){
		return (char*)"stop";
	}
	if(state==5){
		return (char*)"speed:5";
	}
	if(state==6){
		return (char*)"speed:5";
	}
	return "error";
}


//前进
void forword(){
	motor1=1;
	motor2=1;
	motor3=1;
	motor4=1;
	//对应01010101
	control=0x55;
	state = 0;
	send(getstate());
}
//后退
void back(){
	motor1=1;
	motor2=1;
	motor3=1;
	motor4=1;
	//对应10101010
	control=0xAA;
	state = 1;
	send(getstate());
}
//左转
void trunLeft(){
	//只有电机2前进,其他停止
	motor1=0;
	motor2=1;
	motor3=0;
	motor4=1;
	//对应xx01xxxx
	control=0x55;
	state = 2;
	send(getstate());
}
//右转
void trunRight(){
	//只有电机1前进,其他停止
	motor1=1;
	motor2=0;
	motor3=3;
	motor4=0;
	//对应01xxxxxx
	control=0x55;
	state = 3;
	send(getstate());
}
//停止
void stop(){
	 //全部电机使能停止
	motor1=0;
	motor2=0;
	motor3=0;
	motor4=0;
	state = 4;
	LED=1;
	send(getstate());
}
//开灯
void trunOnLight(){
	char *error = "light on";
	send(error);
	LED = 0;
	_nop_(); 
	_nop_(); 
	_nop_();
	LED = 1; 
}
//加速
void acce(){
	if(speed<100){
		speed = speed+10;
	}
	send(getspeed());
}
//减速
void slow(){
	if(speed>0){
		speed = speed-10;
	}
	send(getspeed());
}
//其他
void other(){
	char *error = "error";
	send(error);
}

void main()
{	
	init();
	 //初始化全部电机使能停止
	motor1=0;
	motor2=0;
	motor3=0;
	motor4=0;
	control=0xff;
	LED = 1;
	P1=0xFF;
	while(1)
	{
		//客户端发出指令
		if(length != 0){
			switch(recv[0]){
				//前进指令
				case 'f': forword();break;
				//后退指令
				case 'b': back();break;
				//左转指令
				case 'l': trunLeft();break;
				//右转指令
				case 'r': trunRight();break;
				//停止指令
				case 's': stop();break;
				//开灯指令
				case 'o':trunOnLight();break;
				//加速指令
				case 'c':acce();break;
				//减速指令
				case 'w':slow();break;
				//未知指令
				default:other(); break;
			}
			length=0;
		}
		//如果前进或者后退则speed速度有效,转弯全速
		if(state==0||state==1){
			PWM();
		}
	}		
}


//外部中断0触发时,读取P0中的控制数据
//这个用于另外单片机互动的,由于这个单片机只有两个定时器用完了,超声波模块需要用没有了
void ex0() interrupt 0 
{
	//外部信号拉低,对电机进行控制
	if(P1 != 0xFF){
		if(P1 == 0xFE){
			forword();
		}
		if(P1 == 0xFD){
			back();
		}
		if(P1 == 0xFB){
			trunLeft();
		}
		if(P1 == 0xF7){
			trunRight();
		}
		if(P1 == 0xEF){
			stop();
		}
		P1 = 0xFF;	
	}
}

//计数做PWM的产生
void Time0(void) interrupt 1   
{
	TH0 = 0x0FF;
    TL0 = 0x0A4;
	time++; 
}

//串口接收中断接收蓝牙模块发来的数据
void rev() interrupt 4
{
	//接收数据并且手动清空标志位
	char res;
	res=SBUF;
	RI = 0;
	//将字符串在符号$和符号#之间的保存到数组中 ,并记录长度,用$#两个符号包围数据防止干扰这里接收到的是数据的ASCII,比如客户端发送$过来接收到的ASCII码是35
	if(res == 35){
		length=count;
		count = 0;
	}
	else{
		if(res == 36){
			length=0;
			count = 0;
		}
		else{
			recv[count]=res;
			count++;
		}
	}
}

手机客户端——微信小程序

  • 客户端需要很麻烦的蓝牙连接过程,已经全部写好了直接调用接收和发送函数就可以了。代码上千行就不帖了,GitHub地址https://github.com/hddhardy/xiaoche
2015-10-27 09:49:36 baiyuhancooL 阅读数 3820
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏
51单片机与hc06蓝牙模块,对于HC-04,HC-06 主机而言,WAKEUP 按下后会放弃记忆,重新搜索新的从机,如果不放弃记
忆,主机将一直搜索上一次配对过的从机,直到搜到并配对成功为止,HC-04/06 的主机有个特性
就是记忆最后一次配对过的从机。WAKEUP 对于从机而言没有意义。
2019-05-28 09:12:12 qq_36071362 阅读数 248
  • 51单片机综合小项目-第2季第4部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第4个课程,也是51单片机学完之后的一个综合小项目,该项目运用了开发板上大多数外设设备,并将之结合起来实现了一个时间、温度显示以及报警功能、时间调整功能等单片机控制常见的功能,有一定代码量,需要一定调试技巧和编程能力来完成,对大家是个很好的总结和锻炼,并且能拓展项目经验。

    3408 人正在学习 去看看 朱有鹏

上一次介绍了基于51单片机的蓝牙遥控小车,使用的是手机APP作为遥控器,本节中介绍使用51单片机制作遥控器。

1.单片机

同样使用51单片机作为控制芯片,同样只需要一个芯片和一个晶振电路单片机就能运行,但是注意可以将需要的引脚外拉

2.按键电路

将按键开关的两端,一端连接到单片机引脚,另一端接到地,接单片机的一端再通过一个10K电阻上拉到5V,也可以不上拉,亲试能用,上拉的话稳定一些,能够防干扰,按键数目自行而定,按照遥控器的那件分布来在洞洞板上焊接

3.蓝牙电路

蓝牙信号脚要结对,只需要单片机的发射脚,即P3.1接到蓝牙模块的接收脚,注意和之前的不一样;蓝牙模块设置成主模块,但是注意车上的蓝牙设置成从模块,注意波特率一致

4.降压电路

需要两节18650电池(两节7.2V),使用一个lm2940稳压芯片就可以产生5V电压给设备供电,或使用其他的5V电源来供电,比如说充电宝

5.程序

初始化部分:

 EA=0; //ÔÝʱ¹Ø±ÕÖжÏ
 TMOD&=0x0F;  //¶¨Ê±Æ÷1ģʽ¿ØÖÆÔÚ¸ß4λ
 TMOD|=0x20;    //¶¨Ê±Æ÷1¹¤×÷ÔÚģʽ2£¬×Ô¶¯ÖØװģʽ
 SCON=0x50;     //´®¿Ú¹¤×÷ÔÚģʽ1
 TH1=256-jingzhen/(botelv*12*16);  //¼ÆË㶨ʱÆ÷ÖØ×°Öµ
 TL1=256-jingzhen/(botelv*12*16);
 PCON|=0x00;    //´®¿Ú²¨ÌØÂʼӱ¶
 ES=1;         //´®ÐÐÖжÏÔÊÐí
 TR1=1;        //Æô¶¯¶¨Ê±Æ÷1
 REN=1;        //ÔÊÐí½ÓÊÕ 
 EA=1;         //ÔÊÐíÖжÏ

 

执行部分:

void send(unsigned char d)          //·¢ËÍÒ»¸ö×Ö½ÚµÄÊý¾Ý£¬ÐβÎd¼´Îª´ý·¢ËÍÊý¾Ý¡£
{
 
 SBUF=zifu; //½«Êý¾ÝдÈëµ½´®¿Ú»º³å
 sending=1;     //ÉèÖ÷¢ËͱêÖ¾
 while(sending); //µÈ´ý·¢ËÍÍê±Ï
}

void main()
{
    init();
    while(1)
    {
                    if(s2==0)
        {
            delay(20);
                                    if(!s2)
            {
                while(!s2);
                zifu=0x02;           
                send(zifu);
            }
        }

        if(s3==0)
        {
            delay(20);
            if(!s3)
            {
                while(!s3);
                zifu=0x08;           
                send(zifu);
            }
        }
        if(s4==0)
        {
            delay(20);
            if(!s4)
            {
                while(!s4);
                zifu=0x20;           
                send(zifu);
            }
        }
                    if(F1==0)
        {
            delay(20);
            if(!F1)
            {
                while(!F1);
                zifu=0x20;           
                send(zifu);
            }
        }
        
    }
}

void uart(void) interrupt 4         //´®¿Ú·¢ËÍÖжÏ
{
 if(RI)    //ÊÕµ½Êý¾Ý
 {
  RI=0;   //ÇåÖжÏÇëÇó
 }
 else      //·¢ËÍÍêÒ»×Ö½ÚÊý¾Ý
 {
  TI=0;
  sending=0;  //ÇåÕýÔÚ·¢ËͱêÖ¾
 }
}

附上过程下载网址:https://download.csdn.net/download/qq_36071362/11209740

没有更多推荐了,返回首页