单片机蓝牙控制小车
- 格式:docx
- 大小:1.59 MB
- 文档页数:27
一、实习背景随着科技的发展,单片机技术得到了广泛应用。
为了提高自己的动手能力,拓宽知识面,我们选择了单片机蓝牙小车作为实习项目。
本项目旨在利用单片机技术,通过蓝牙通信实现小车的无线遥控,使其具备基本移动和避障功能。
二、实习目的1. 掌握单片机的基本原理和编程方法。
2. 熟悉蓝牙通信技术及其应用。
3. 培养团队合作精神和动手能力。
4. 提高解决实际问题的能力。
三、实习内容1. 硬件设计(1)主控芯片:选用STC89C52单片机作为小车的主控芯片,具有丰富的I/O口,便于扩展。
(2)蓝牙模块:选用HC-05蓝牙模块,实现手机与单片机的无线通信。
(3)电机驱动:采用L293D电机驱动芯片,为直流电机提供足够的驱动能力。
(4)传感器:选用红外传感器作为避障传感器,检测前方障碍物。
(5)电源:采用两节3.7V锂电池为小车提供电源。
2. 软件设计(1)主控程序:编写单片机主程序,实现蓝牙通信、电机控制、避障等功能。
(2)手机端程序:编写手机端蓝牙控制程序,实现小车的无线遥控。
3. 系统调试(1)硬件调试:检查电路连接,确保各模块正常工作。
(2)软件调试:通过串口调试助手,观察程序运行状态,发现问题并修改。
四、实习过程1. 硬件制作(1)根据电路图,焊接各元器件,包括单片机、蓝牙模块、电机驱动芯片、红外传感器等。
(2)组装小车底盘,将各模块安装到位。
2. 软件编程(1)编写单片机主程序,实现蓝牙通信、电机控制、避障等功能。
(2)编写手机端蓝牙控制程序,实现小车的无线遥控。
3. 系统调试(1)硬件调试:检查电路连接,确保各模块正常工作。
(2)软件调试:通过串口调试助手,观察程序运行状态,发现问题并修改。
五、实习成果1. 成功制作了一台单片机蓝牙小车,具备基本移动和避障功能。
2. 掌握了单片机编程、蓝牙通信、电机控制等技术。
3. 提高了动手能力和团队合作精神。
4. 为今后的学习和工作打下了基础。
六、实习总结通过本次单片机蓝牙小车实习,我们深刻体会到理论与实践相结合的重要性。
stm32小车蓝牙模块原理
本文将简要介绍STM32小车蓝牙模块的原理。
STM32小车蓝牙模块是利用STM32单片机控制小车运动方向和速度的一种外围装置,通过蓝牙模块与手机进行通讯控制小车运动。
其原理主要包括以下几个方面:
1. STM32单片机控制小车运动
STM32单片机作为小车的控制核心,通过GPIO口输出控制小车
电机的转动方向和速度,从而实现小车的运动。
通过编写相应的程序,可以实现小车的前进、后退、左转、右转等基本运动。
2. 蓝牙模块实现与手机的通讯
蓝牙模块作为小车与手机之间的通讯接口,主要负责接收手机发来的指令,并将指令传输给STM32单片机进行处理。
同时,蓝牙模块也可以将小车的状态信息反馈给手机,以便用户了解小车的运行状态。
3. 手机APP控制小车运动
用户通过手机APP向小车发送指令,控制小车的运动。
指令通过蓝牙模块传输给STM32单片机进行处理,从而实现小车的运动控制。
用户可以通过手机APP调整小车的运动速度和方向,以便适应不同的运动环境。
综上所述,STM32小车蓝牙模块实现了通过手机控制小车运动的功能,为用户提供了一种方便、灵活的控制方式。
未来,随着物联网技术的发展,STM32小车蓝牙模块有望成为物联网领域的重要应用之一。
• 139•伴随着制造业升级,工业智能化,在既定路线自动导引行驶的小车得到广泛应用。
本文基于AT89C52单片机为核心控制器件,提供了一种控制模块设计、电机驱动模块设计、循迹模块设计、蓝牙模块设计及其程序设计的蓝牙调速智能循迹小车设计思路,可以为工业自动引导装置车载设计提供一定参考。
1 多种模块的硬件电路设计本文设计的蓝牙调速小车主要包括单片机核心控制模块、电机驱动模块、红外循迹模块、蓝牙模块以及电源模块。
整个小车各模块在单片机控制模块下相互协调工作,各模块关系如图1所示:图1 小车各模块关系框图1.1 以单片机为核心的最小系统本文比较了市场上常用的单片机控制芯片,最后选择了更经典,更具成本效益的ATC89 C52微控制器。
它具有低电压,高性能和抗干扰的特点。
时钟电路和复位电路建立在所选单片机的基础上,构成单片机的最小系统。
通过单片机的部分I/O 接口与其他模块相连接,形成了以单片机为核心的智能小车控制电路,如图2所示。
图2 MCU最小系统控制电路图1.2 电机驱动模块本文采用L298N 双H 桥直流电机驱动芯片,驱动能力强,发热基于AT89C52单片机的蓝牙调速循迹小车东北石油大学机械科学与工程学院 曹海洋量低。
抗干扰能力强,可靠性高,工作电压高,输出电流大。
(谢富珍,戈林发,基于51单片机的智能小车设计:新余学院学报,2015)由于该模块是双向H 桥驱动器,因此可以同时驱动两个直流电机,L298N 电机驱动模块原理图如图3所示。
P2.6、P2.7产生PWM波后,启用了ENA 和ENB ,可以控制IN1和IN2输入高低电平,以确定电机1输出正向,反向和停止。
另外一个电机也同理控制。
图3 L298N电机驱动模块原理图1.3 红外循迹模块循迹模块选用TCRT5000传感器,该传感器模块对环境光线适应能力强,性能可靠,探测高度为10MM 到15MM 。
该传感器是一种基于红外光学反射原理的传感器,即将光信号转化成电信号,以便单片机识别处理。
蓝牙小车51单片机C语言代码LT蓝牙小车51单片机C语言代码#include<reg52.h>#include<math.h>#define uchar unsigned char#define uint unsigned intuchar Buffer[4] = {0}; //从串口接收的数据uint i,j;sbit Left_Positive=P1^4;sbit Left_Negative=P1^5;sbit Right_Positive=P1^6;sbit Right_Negative=P1^7;sbit LeftLight=P2^1;sbit RightLight=P2^2;/*********************************************************** ********** 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无************************************************************ ***********/void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/*********************************************************** ********** 名称 : Com_Int()* 功能 : 串口中断子函数* 输入 : 无* 输出 : 无************************************************************ ***********/void Com_Int(void) interrupt 4{EA = 0;if(RI == 1) //当硬件接收到一个数据时,RI会置位{if(SBUF==65) //这里减去48是因为从电脑中发送过来的数据是ASCII 码。
51单片机蓝牙控制小车工作原理随着科技的不断发展,各种智能设备逐渐成为人们生活中不可或缺的一部分。
其中,单片机与蓝牙技术结合的小车应用,既有趣又具有一定的实用价值。
本文将介绍51单片机蓝牙控制小车的工作原理,以期为大家提供一些有益的信息。
在实际应用中,小车的移动、旋转控制是至关重要的。
为此,我们可以选用一种简单而有效的蓝牙通信协议——UART通信协议。
它可以在单片机与蓝牙控制小车之间建立通信连接,实现对小车的远程操控。
51单片机蓝牙控制小车的工作原理主要包括以下几个方面:一、单片机端硬件设计单片机端硬件设计主要包括单片机本身和与蓝牙控制小车连接的接口电路。
单片机可以内置UART通信模块,用于与蓝牙控制小车进行通信。
同时,还需要一个驱动电路,用于将单片机与蓝牙控制小车连接起来。
这些硬件设计可以通过电路图的形式呈现,具体电路图可以在相关资料中查阅。
二、蓝牙控制小车端硬件设计蓝牙控制小车端硬件设计主要包括一个小车的接收单元、一个驱动单元和一个微控制器。
接收单元用于接收单片机发送的指令,将指令转换为小车可以理解的动作信号。
驱动单元用于控制小车的运动,可以根据接收到的指令控制小车的移动、旋转等动作。
微控制器用于接收接收单元发送的信号,并根据接收到的信号控制单片机的功能。
这些硬件设计也可以通过电路图的形式呈现,具体电路图可以在相关资料中查阅。
三、通信协议51单片机与蓝牙控制小车之间的通信,需要遵循一种合适的通信协议。
在这里,我们主要采用UART通信协议。
它是一种串口通信,具有接口简单、速度较慢的特点,非常适合于这种简单而有趣的应用场景。
四、软件编程软件编程是单片机与蓝牙控制小车之间的桥梁。
为此,我们需要编写一段程序,用于实现单片机端与蓝牙控制小车端的通信功能。
这段代码需要包含以下几个主要部分:1.初始化函数:用于对单片机和蓝牙控制小车的硬件进行初始化,包括开启相应接口、配置默认值等。
2.数据接收函数:用于接收蓝牙控制小车发送的数据,并进行解码和处理。
单片机大作业“基于单片机的蓝牙遥控小车”某:班级:通信工程卓越2014-1学号:在班编号:基于单片机的蓝牙遥控小车目录第一章绪论11.1研究背景和意义1第二章系统框架及软硬件结构设计22.1 系统要求22.2 系统整体算法流程22.3 总体任务设计32.4 整体硬件结构设计42.5 整体软件结构设计4第三章模块的详细设计53.1 L293D电机驱动模块53.1.1模块介绍53.1.2 PWM脉冲控制原理63.1.3 脉冲控制代码63.2 HC05蓝牙模块73.2.1 模块简介73.2.2 蓝牙串口程序说明83.2.3 模块引脚说明83.3 USB转TTL模块9第四章系统功能设计与实现104.1 安卓手机蓝牙遥控的设计与实现104.1.1 设计基本思路104.1.2 遥控任务分配114.2.3 蓝牙遥控操作流程11第五章软硬件调试135.1 硬件调试135.2 软件调试14第一章绪论1.1 研究背景和意义智能化无处不在。
各种智能化设备在不同的领域中发挥着自己的特长,而在家用方面的智能有着相当重要的意义。
本次所设计的智能小车系统包含着对周围环境的检测、舵机控制以及短距离无线遥控等的功能,它需要实现微控制器、多传感器技术、蓝牙遥控、机械结构原理、数字逻辑、自动控制等各学科技术内容的渗透融合。
智能小车通过其上部搭载的89C52芯片作为核心控制器,通过多种传感器来获取周围环境信息并将采集到的信息输送给CPU,然后由CPU来给各个部分下达相对应的指令。
智能小车不仅价格低廉,而且甚至能够担任人类难以从事的任务,它在工业、农业以及社会生产生活等许多领域都起到了重要作用。
本次课题设计中所采用到的短距离无线遥控、单片机控制原理、多传感器技术、自动避障技术等等。
现在在工业制造、农业生产、国家安全、军事武器,医疗保健、太空探测等许多领域都日益发挥着其作用,在军事侦察、反恐、防暴、防核化等高危任务方面、环境污染检测方面和在恶劣环境中均有着非常好的发展前景,从这些方面可知本课题研究意义非凡。
手机蓝牙控制小车
报告
*若需源码,请关注后,发私信
一、主要思路
利用Android手机的蓝牙功能,通过蓝牙模块与单片机进行串口通信,通过手机发送不同的指令使单片机控制电机的转动,进而使小车产生前进、后退、左转、右转的效果。
二、主要设备
Android手机一部、单片机最小系统一个,蓝牙模块一个、单片机一个、电机驱动模块一个、电动马达两个以及玩具车等。
三、实现细节
Android手机蓝牙与单片机蓝牙模块建立连接通信,发送a,b,c,d,e依次控制小车的前进、后退、左转、右转和停止。
单片机接收Android手机发送的指令,依次辨别,进而控制电机驱动模块,使马达具有不同的转向。
两个马达同时正转,小车表现前进
两个马达同时反转,小车表现后退
左边马达反转,右边马达正转,小车表现左转
右边马达反转,左边马达正转,小车表现右转
两个马达停止,小车表现停止
四、总结
本次实习项目遇到不少问题,其中最主要的有两点,一是对单片机串口通信掌握不好,主要是对单片机的不熟,每次
Android手机与蓝牙模块建立连接配对之后,却无法进行正常连接,导致从手机发送的指令,单片机无法收到。
二是单片机线路的连接花费了不少的时间,但最后终于解决了。
由于蓝牙通信建立的失败,本次实习项目只是一个半成品,希望以后有时间能解决蓝牙通信的问题。
通过这次实习,对嵌入式有了一个更好的理解,知道通过代码编写控制硬件,这或许就是嵌入式的一个主要作用。
基于stc89c52手机蓝牙控制小车—程序先简单介绍下开发环境,芯片类型是stc89c52,集成开发环境用的是Keil4需要准备:L298N驱动电路板,两个直流电机,HC-05蓝牙模块,亚克力板,一个万向轮和两个普通小轮,stc89c52最小系统板,一个7.5伏电源,若干杜邦线。
连接方式:L298N驱动电路与单片机部分(注意:单片机要与HC-05蓝牙模块的共地)HC-05蓝牙模块与单片机部分HC-05蓝牙模块的RX接单片机的TX;HC-05蓝牙模块的TX接单片机的RX;HC-05蓝牙模块的GND接单片机的GND;HC-05蓝牙模块的VCC接单片机的VCC。
代码:#include <REGX52.H>void UART_Init()//******************{SCON=0x50;//工作模式PCON &=0x7F;//波特率不倍速//配置定时器,与波特率有关TMOD&=0x0F;//设定定时器模式TMOD|=0x20;//设定定时器模式TL1=0xFD;//设定定时器初始值TH1=0xFD;//设定定时器重装值ET1=0;//禁止定时器1中断TR1=1;//启动定时器1EA=1;//启动串口中断ES=1;//串口使能}void Timer0_Init()//10ms{//定时器部分TMOD&=0xF0;//将低四位清零,高四位不变TMOD|=0x01;//将最低的位置1,其余不变TR0=1;//T0定时器的运行控制TF0=0;//为一时跳入中断函数会自动清0和置1 TH0=0xDC;//高位TL0=0x00;//低位//中断器部分ET0=1;//IE总开关前的开关EA=1;//中断总开关PT0=0;//高级为1,低级为0}unsigned char control=0,compare1=7,compare2=7;unsigned int T0count=0;void main(){UART_Init();//初始化串口通信Timer0_Init();//初始化定时器while (1){}}void UART_Routine() interrupt 4//串口中断部分{if(RI==1){control=SBUF; //单片机接收值RI=0;//手动清除标志位}}void Timer0_Routine() interrupt 1//T0口中断程序{TH0=0xDC;//高位TL0=0x00;//低位//重新刷新if(control=='0') //停车{P2_0=0;P2_1=0;P2_2=0;}if(control=='1') //后退{T0count++;T0count%=10;//100msif(T0count<=compare1){P2_0=0;P2_1=1;}else{P2_0=0;P2_1=0;}if(T0count<=compare2){P2_2=0;P2_3=1;}else{P2_2=0;P2_3=0;}}else if(control=='2')//直行{T0count++;T0count%=10;//100msif(T0count<=compare1){P2_0=1;P2_1=0;}else{P2_0=0;P2_1=0;}if(T0count<=compare2){P2_2=1;}else{P2_2=0;P2_3=0;}}else if(control=='3')//右转{T0count++;T0count%=10;//100msif(T0count<=7){P2_0=1;P2_1=0;}else{P2_0=0;P2_1=0;}P2_2=0;P2_3=0;}else if(control=='4')//左转{T0count++;T0count%=10;//100msif(T0count<=7){P2_2=1;P2_3=0;}else{P2_2=0;P2_3=0;}P2_0=0;P2_1=0;}}。
单片机课程设计蓝牙控制小车设计人员:班级:完成日期:指导老师:摘要:利用蓝牙进行无线传输数据,并以STC89C52单片机为控制芯片控制电机旋转,从而实现通过蓝牙控制小车运动的目的。
其中电机驱动为L298N驱动电路,蓝牙模块与单片机的TXD和RXD相连,进行串口通信。
速度由单片机输出的PWM波控制。
1.实验目的:通过《单片机原理与应用》课程设计,使学生掌握单片机及其扩展系统设计的方法和设计原则及相应的硬件调试的方法。
进一步加深单片机及其扩展系统设计和应用的理解2.设计任务与要求通过设计双单片机控制系统,实现蓝牙控制小车的功能。
单片机1通过电机驱动模块来控制电机正反转,从而驱动小车运动。
单片机2通过串口TXD,RXD与蓝牙模块从机连接,进行串口通讯,而蓝牙模块主机与电脑相连,从而实现电脑与单片机二之间的通讯。
在电脑上通过使用串口调试助手软件向单片机发送控制命令,单片机二接受到电脑的控制命令后,将数据命令转换为I/O口高点电平控制命令,传送到单片机一,进而单片机一根据命令来控制电机而正反转,从而实现电脑控制小车前进、后退、转弯。
3. 电路设计3.1单片机控制电路:单片机是控制单元的核心。
起着控制小车所有运行状态的作用。
单片机控制模块使用的是STC89C52,使用该芯片很容易实现对其他模块的控制。
通过对单片机STC89C52写入程序,可以方便的用软件来控制整个过程.3.2单片机最小系统:包括单片机主机、复位电路、时钟电路。
3.3双单片机系统:有两个单片机最小系统组成,其中单片机1的P0.2-P0.7口通过拨码开关分别与单片机2的P3.2-P3.7口相连,利用拨码来控制I/O 端口的导通与断开。
3.4电机驱动系统直流电机和步进电机都可以用于小车驱动。
故有两种方案。
方案一:使用直流电机,加上适当减速比的减速器。
直流电机具有良好的调速性能,控制起来也比较简单。
直流电机只要通上直流电源就可连续不断的转动,调节电压的大小就可以改变电机的速度。
摘要无线遥控的小车,可以在危险的环境作业,人员搜索,可以在各类领域中发挥着它特殊的作用,本次设计是选择基于蓝牙遥控的多功能智能小车为对象。
控制系统以C51单片机为主控芯片,采用L298N为电机驱动芯片、HC-06蓝牙无线模块、12864液晶显示模块、四路循迹模块等构成外围扩展电路。
将自制的控制电路、控制程序和四轮小车机械相结合,制作多功能智能小车。
实验调试实现了智能小车的蓝牙无线遥控、自动避障、自动测距及各种灯光的功能。
关键词:51单片机;蓝牙遥控;智能小车目录摘要 (1)1. 绪论.................................. 错误!未定义书签。
1.1 研究背景与意义 (4)1.2课题目的 (5)1.3课题研究内容 (5)2 方案论证 (6)2.1 总体方案设计 (6)2.2设计系统的功能要求 (7)2.3 系统硬件方案 (7)3系统硬件设计 (9)3.1STC89C52芯片简介 (9)3.2 STC89C52最小系统 (10)3.3电机驱动设计 (11)3.4显示电路设计 (11)3.5 蓝牙模块设计 (12)3.6 PCB图设计 (13)3.7 智能车结构分析 (14)3.7.1 底板设计 (14)3.7.2电机与底板的连接支架设计 (15)3..7.3整体装配图 (15)3.7.4整车材料明细 (15)4.系统软件设计 (16)4.1系统的程序流程 (16)4.2蓝牙模块参数设置程序 (16)4.3蓝牙发送程序接收程序和中断程序 (17)4.4自动避障及灯光声音控制程序设计 (19)4.5液晶显示程序设计 (21)5 调试结果分析 (25)5.1蓝牙遥控调试及结果分析 (25)5.2避障功能调试及结果分析 (25)5.3无人驾驶模式调试及结果分析 (25)5.4液晶显示功能调试及结果分析 (25)5.4调试过程中遇到的困难及解决方法 (25)6.总结 (26)致谢 (27)参考文献 (28)附录:程序 (29)1.绪论1.1 研究背景与意义随着汽车工业的的迅速发展,关于汽车的研究也就越来越受人关注。
基于51单片机的手机蓝牙遥控小车设计(程序元件清单实物图)本人一直想做一个遥控车,终于今天实现了,跟大家分享一下。
一、元件清单1、某宝购买一个智能小车底盘(本人车是四驱的,因此有四个电机,两块亚克力板和一些配件螺丝)2、L298n模块两个(一个298控制两个电机)3、HC-06蓝牙模块4、电池盒跟18650电池3个5、单片机最小系统6、杜邦线至少12根,当然越多越好7、若干根导线(连接电机用的,以及电池盒连到L298N跟单片机)二、制作过程首先,先去了解一下L298N的接线,我当时也是懵逼了好久,反正摸索着也会了,一般店家都有资料。
然后是蓝牙模块的使用,拿到蓝牙模块后,有开发板的话(没有就用单片机的烧录器),先按照TXD接TXD,RXD接RXD,打开电脑的串口助手与蓝牙构建通信,打开AT,发送AT指令集,比如设设波特率,改个名字,改个配对的密码。
但通过蓝牙与单片机连接通信的时候,就是TXD接RXD了。
最后一个就是,本人在接线的时候经常碰壁。
比如,你以为接好的线他其实没接好,根本没通,还是拿万用表B了才知道。
因为本人忘了买电池盒,所以我是用12V的直流电接着的,导致遥控车拖着跟电线。
三、实物图(拖着跟电线以及充电宝供电的车不过我没通电)资料内包括L298N的部分资料,以及蓝牙的说明书(看AT指令集就好)和源程序。
app:单片机源程序如下:1./*手机蓝牙遥控小车 APP可以在应用市场搜蓝牙串口助手2.左转右转大概是90度我的是四驱的,如果是只有一个l298N 的话就把带2的删了3.pwm有十级变速*/4.5.6.#include <reg52.h>7.8.#define Left_moto2_pwm P0_4 //接驱动模块ENA 使能端,输入PWM信号调节速度左后轮9.#define Right_moto2_pwm P0_5 //接驱动模块ENB 右后轮10.#define Left_moto_pwm P1_4 //接驱动模块ENA 使能端,输入PWM信号调节速度左前轮11.#define Right_moto_pwm P1_5 //接驱动模块ENB 右前轮12.#define uchar unsigned char13.#define uint unsigned int14.15.sbit P0_4=P0^4; //定义P0_416.sbit P0_5=P0^5; //定义P0_517.sbit P1_4=P1^4; //定义P1_418.sbit P1_5=P1^5; //定义P1_519.20./*电机驱动IO定义*/21.sbit IN1 = P1^2; //为1 左电机反转前轮22.sbit IN2 = P1^3; //为1 左电机正转前轮23.sbit IN3 = P1^6; //为1 右电机正转前轮24.sbit IN4 = P1^7; //为1 右电机反转前轮25./*sbit EN1 = P1^4; //为1 左电机使能26.sbit EN2 = P1^5; //为1 右电机使能 */27.28.sbit IN5 = P0^2; //为1 左电机反转后轮29.sbit IN6 = P0^3; //为1 左电机正转后轮30.sbit IN7 = P0^6; //为1 右电机正转后轮31.sbit IN8 = P0^7; //为1 右电机反转后轮32./*sbit EN3 = P0^4; //为1 左电机使能后轮33.sbit EN4 = P0^5; //为1 右电机使能后轮 */34.35.bit Right_moto_stop=1;36.bit Left_moto_stop =1;37.unsigned int time=0;38.int pwm=1;39.40.#define left_motor_en EN1 = 1 //左电机使能41.#define left_motor_stops EN1 = 0 //左电机停止42.#define right_motor_en EN2 = 1 //右电机使能43.#define right_motor_stops EN2 = 0 //右电机停止44.45.#define left_motor2_en EN3 = 1 //左电机使能后46.#define left_motor2_stops EN3 = 0 //左电机停止后47.#define right_motor2_en EN4 = 1 //右电机使能后48.#define right_motor2_stops EN4 = 0 //右电机停止后49.50.51.#define left_motor_go IN1 = 0, IN2 = 1//左电机正传52.#define left_motor_back IN1 = 1, IN2 = 0//左电机反转53.#define right_motor_go IN3 = 1, IN4 = 0//右电机正传54.#define right_motor_back IN3 = 0, IN4 = 1//右电机反转55.56.#define left_motor2_go IN5 = 0, IN6 = 1//左电机正传57.#define left_motor2_back IN5 = 1, IN6 = 0//左电机反转58.#define right_motor2_go IN7 = 1, IN8 = 0//右电机正传59.#define right_motor2_back IN7 = 0, IN8 = 1//右电机反转60.61.unsigned char pwm_val_left =0;//变量定义62.unsigned char push_val_left =0;// 左电机占空比N/1063.unsigned char pwm_val_right =0;64.unsigned char push_val_right=0;// 右电机占空比N/1065.66.67.void delay(uint z)68.{69.uint x,y;70.for(x = z; x > 0; x--)71.for(y = 114; y > 0 ; y--);72.}73.74.75.76.//蓝牙初始化77.void UART_INIT()78.{79.SM0 = 0;80.SM1 = 1;//串口工作方式181.REN = 1;//允许串口接收82.EA = 1;//开总中断83.ES = 1;//开串口中断84.TMOD = 0x20;//8位自动重装模式85.TH1 = 0xfd;86.TL1 = 0xfd;//9600波特率87.TR1 = 1;//启动定时器188.}89.90./************************************************************************/91.void run(void) //pwm调速函数92.{93.push_val_left =pwm; //PWM 调节参数1-10 1为最慢,10是最快改这个值可以改变其速度94.push_val_right =pwm; //PWM 调节参数1-10 1为最慢,10是最快改这个值可以改变其速度95.if(pwm==10) pwm=0;96.if(pwm==0&&pwm<0) pwm=0;97.98.}99.100.101./******************************************************** ****************/102./* PWM调制电机转速 */ 103./******************************************************** ****************/104.105.106./* 左侧电机调速 */107./*调节push_val_left的值改变电机转速,占空比 */108.void pwm_out_left_moto(void)109.{110.if(Left_moto_stop)111.{112.if(pwm_val_left<=push_val_left)113.{ Left_moto_pwm=1;114.Left_moto2_pwm=1; }115.else116.{ Left_moto_pwm=0;Left_moto2_pwm=0; }117.118.if(pwm_val_left>=10)119.pwm_val_left=0;120.}121.else { Left_moto_pwm=0;Left_moto2_pwm=0; }122.}123./******************************************************** **********/124./* 右侧电机调速 */125.void pwm_out_right_moto(void)126.{127.if(Right_moto_stop)128.{129.if(pwm_val_right<=push_val_right)130.{ Right_moto_pwm=1;131.Right_moto2_pwm=1; }132.else133.{Right_moto_pwm=0;134.Right_moto2_pwm=0;}135.if(pwm_val_right>=10)136.pwm_val_right=0;137.}138.else {Right_moto_pwm=0;Right_moto2_pwm=0; } 139.}140./***************************************************/141.///*TIMER0中断服务子函数产生PWM信号*/142.void timer0()interrupt 1 using 2143.{144.TH0=0XF8; //1Ms定时145.TL0=0X30;146.time++;147.pwm_val_left++;148.pwm_val_right++;149.pwm_out_left_moto();150.pwm_out_right_moto();151.}152.153.//小车前进154.void forward()155.{156.ET0 = 1;157.run(); //pwm 程序158.left_motor_go; //左电机前进159.right_motor_go; //右电机前进160.left_motor2_go; //左电机前进后轮161.right_motor2_go; //右电机前进后轮162.}163.164.void left_go() //左转165.{166.ET0 = 1;167.run();168.left_motor_back;169.right_motor_go;170.left_motor2_back;171.right_motor2_go;172.delay(700);173.forward();174.}175.//右转176.void right_go()177.{178.ET0 = 1;179.run();180.delay(50);181.right_motor_back;182.left_motor_go;183.right_motor2_back;184.left_motor2_go;185.delay(700);186.forward();187.}188.//小车左转圈189.void left()190.{191.ET0 = 1;192.run();193.delay(50);194.right_motor_go; // 右电机前进195.left_motor_back; // 左电机后退196.right_motor2_go; // 右电机前进197.left_motor2_back; // 左电机后退198.}199.200.//小车右转圈201.void right()202.{203.ET0 = 1;204.run();205.left_motor_go;206.right_motor_back;207.left_motor2_go;208.right_motor2_back; 209.}210.211.//小车后退212.void back()213.{214.ET0 = 1;215.run();216.left_motor_back;217.right_motor_back; 218.left_motor2_back;219.right_motor2_back; 220.}221.222.//小车停止223.void stop()224.{225.ET0 = 0;226.P1=0;227.P0=0;228.}229.230.231.//串口中断232.void UART_SER() interrupt 4 233.{234.if(RI)236.RI = 0;//清除接收标志237.switch(SBUF)238.{239.case 'g': forward(); break;//前进240.case 'b': back(); break;//后退241.case 'l': left(); break;//左转圈242.case 'r': right(); break;//右转圈243.case 's': stop(); break;//停止244.case 'z': left_go(); break;//左转行驶245.case 'y': right_go(); break;//右转行驶246.case 'p': pwm++;break; //加速247.case 'c': pwm--;break; //减速248.}249.250.}251.}252.253.void main()254.{255.TMOD=0X01;256.TH0= 0XF8; //1ms定时257.TL0= 0X30;258.TR0= 1;259.ET0= 1;260.EA = 1;261.UART_INIT();//串口初始化262.while(1);263.}264.。
基于51单片机的蓝牙小车程序程序中有我写的注释,看不懂程序的话,可以参考。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuint PWM1,PWM2,num1=0,num2=0;sbit IN1=P2^1;//左电机输入端1sbit IN2=P2^2;//左电机输入端2sbit IN3=P2^3;//右电机输入端1sbit IN4=P2^4;//右电机输入端2sbit ENA=P2^0;//右电机使能控制端sbit ENB=P2^5;//左电机使能控制端uint bht;//蓝牙uint bht_mode=0,forward=0,backward=0,left=0,right=0,stop=0;void Time0init() //定时器0的初始化函数,用于产生PWM,控制小车的速度{TH0=0xff;//定时0.1msTL0=0xa3;TMOD=0x01;//工作方式1EA=1;//开总中断ET0=1;//开定时器中断TR0=1;//开定时器0中断}void time0() interrupt 1//定时计数器0{TH0=0xff;TL0=0xa3;num1++;num2++;if(num1==100) //PWM的周期为100*0.1=10msnum1=0;if(num2==100)num2=0;if(num1<PWM1)ENA=1;//打开右电机使能控制端if(num2<PWM2)ENB=1;if(num1>PWM1)ENA=0;//关闭右电机使能控制端if(num2>PWM2)ENB=0;}void UsartInit()//定时计数器1的初始化子函数{TH1=0XFA;//计数器初始值设置,注意波特率是9600的TL1=0XFA;SCON=0X50;//设置为工作方式1ES=1;//打开接收中断EA=1;//打开总中断TR1=1;//打开计数器TMOD|=0X20;//设置计数器工作方式2 (特别注意第二次设置工作方式时要加或)PCON=0X80;//波特率加倍}void usart() interrupt 4//串口中断子函数{bht=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位SBUF=bht;//将接收到的数据放入到发送寄存器while(!TI);//等待发送数据完成TI=0;if(bht=='Y')//开关控制函数{bht_mode=1;//允许发送数据forward=0;backward=0;left=0;right=0;stop=0;}if(bht=='N')//开关控制函数{bht_mode=0;forward=0;backward=0;left=0;right=0;stop=0;}if(bht_mode==1){if(bht=='f')//前进控制{forward=1;backward=0;left=0;right=0;stop=0;}else if(bht=='b')//后退控制{forward=0;backward=1;left=0;right=0;stop=0;}else if(bht=='l')//左转控制{forward=0;backward=0;left=1;right=0;stop=0;}else if(bht=='r')//右转控制{forward=0;backward=0;left=0;right=1;stop=0;}else if(bht=='s')//停止控制{forward=0;backward=0;left=0;right=0;stop=1;}}else{forward=0;backward=0;left=0;right=0;stop=1;}}void forwardg()//前进函数{IN1=1;IN2=0;IN3=1;IN4=0;PWM1=25;//右轮PWM2=20;}void backwardg()//后退函数{IN1=0;IN2=1;IN3=0;IN4=1;PWM1=20;PWM2=20;}void leftg()//左转函数{IN1=1;IN2=0;IN3=1;IN4=0;PWM1=10;PWM2=20;}void rightg()//右转函数{IN1=1;IN2=0;IN3=1;IN4=0;PWM1=20;PWM2=10;}void stopg()//停止函数{IN1=1;IN2=1;IN3=1;IN4=1;PWM1=0;PWM2=0;}void drive(){if(bht_mode==1){if(forward==1)forwardg();if(backward==1)backwardg();if(left==1)leftg();if(right==1){rightg();}if(stop==1){stopg();}}else{stopg();}}void main(){Time0init();UsartInit();while(1){drive();}}。
蓝牙遥控小车
一、实验目的
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。
进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
二、设计方案
该智能车采用蓝牙模块对单片机进行控制,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。
本次设计的蓝牙小车可实现5种状态:前进、后退、左转、右转、停止。
三、硬件电路设计
1、最小系统(AT89C52)
2、电源装置(LM7805)
3、电机驱动电路(L298N)
4、蓝牙模块(HC-06)
5、原理图(暂无)
四、软件系统
1、手机蓝牙控制软件(基于Android的蓝牙串口助手)
2、控制程序
五、笔记
六.总结
虽然一切都还没开始,但是我相信在兴趣和坚持的作用下我一定可以做出属于自己的蓝牙遥控小车,加油!。
基于51单⽚机的蓝⽛循迹⼩车51单⽚机课程设计做了辆蓝⽛⼩车,下⾯是对课程设计内容的⼀些总结基于51单⽚机的蓝⽛循迹⼩车硬件模块L298N具体如图所⽰:⼯作原理简介:可以直接驱动两路 3-16V 直流电机,并提供了 5V 输出接⼝(输⼊最低只要 6V),可以给 5V 单⽚机电路系统供电。
输⼊电压最好是7v以上,输⼊电压低了会导致⼀系列问题,在后⾯有具体实践总结具体应⽤:可以⽅便的控制直流电机速度和⽅向,也可以控制 2 相步进电机,5 线 4 相步进电机。
管脚应⽤可以参考如图所⽰:①板载5V输出使能:如果跳线帽接上,则5v端⼦可以输出电压,若跳线帽没有街上,则12v输⼊端⼦没有作⽤,只能5v输⼊⼝输⼊(如果不接上直接废了,5v 输⼊基本不能使电机模块正常⼯作)②AB通道使能:端⼦接在上⾯表⽰AB通道⼀直保持⾼电平,处于使能状态,并且电压和5v输⼊端⼝电压相同;若处于没有使能状态,直接影响到输⼊端,让其⽆法⼯作!③单⽚机IO控制输⼊ + 马达AB输出 :顾名思义,四个IO输⼊端⼝和单⽚机四个IO⼝相连,然后通过电机驱动模块(双H桥电路)马达AB输出,以获得更⼤的驱动直流减速电机的能⼒,带动电机转动!B站直接搜L298N电机驱动模块,有视频详情介绍问题以及解决⽅案下⾯是⼀些使⽤L298N驱动电机的⼀些问题以及解决⽅法总结问题:1.直流减速电机不能正常转动,⼀个轮⼦只能单⽅向转动2.使能端⼝帽摘下来后,pwm信号输⼊问题3.供电问题解决:1.起初⽤4节南孚电池供电,⽤万⽤表测电压⼩于4.8v(电池快没啥电了),更换四节电池后⽤万⽤表测得4.9v+,上⾯出现的问题解决了2.输⼊端电压⼩于7v(⽤得四节南孚电池6v不到供电),使能电压和5v输⼊端⼦的电压相同,经测量5v端⼝电压只有3.8v左右,故使能电压就只有3.8v左右了,对PWM输出使能有⼀定影响3.L298N电机驱动中有稳压降压模块,如果供电⾜够⼤(⼤于7v),那么稳压降压模块会发挥作⽤,使得5v输⼊端⼦、使能端⼦、马达电机都能有稳定的5v⾼电平输出。
ARM-STM32校园创新大赛项目报告题目:基于stm32f4的蓝牙控制小车学校:中南民族大学指导教师:视频观看地址:v.youku./v_show/id_XNjA3NTE4MzU2.html题目:基于stm32f4的蓝牙控制小车关键词:STM32F4 LM2940-5.0 L298N FBT06_LPDB 蓝牙串口通信android摘要“基于stm32f4的蓝牙控制小车”是一个基于意法半导体与ARM公司生产的STM32F4 DISCOVERY开发板的集电机驱动模块、电源管理模块、stm32f4主控模块、蓝牙串口通信模块、android控制端模块。
电机驱动模块使用了两个L298N 芯片来驱动4路电机,使能端连接4路来自主控板的PWM波信号,8个输入端接主控板的8个输出端口;电源管理模块使用了LM2940-5.0芯片进行12V到5V的转换,12V用于电机模块的供电,5V用于蓝牙模块、传感器等的供电;主控模块采用了MDK编辑程序,然后下载到主控板,实现硬件与软件的交互;蓝牙串口通信模块则是采用了FBT06_LPDB针插蓝牙模块,与主控板进行串口通信,同时与android手机进行通信;android控制端模块是一个集开启蓝牙、搜索蓝牙、控制小车等功能。
用户可以通过android控制端进行控制小车的运动,实现一些用户需要的功能和服务。
1.引言蓝牙的创始人是瑞典爱立信公司,蓝牙技术是一种无限数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。
手机之间通过蓝牙实现数据共享成为常理,将手机变为遥控器为人们的生活带来无限方便。
遥控小车在工业、国防、科研等领域应用越来越广泛,例如说:消防遥控小车、探测小车等。
本文详细阐述了使用蓝牙通信的手机遥控小车前行、倒退、左转、右转和停止等功能的软硬件设计过程。
2. 系统方案该系统分为电机驱动模块、电源管理模块、主控板、蓝牙通信模块、android 控制端等5个模块,如图2.1所示:图2.1 系统模块图3.系统硬件设计3.1 电机驱动模块3.1.1 L298N的封装H 桥电路虽然有着诸多的优点,但是在实际制作过程中,由于元件较多,电路的搭建也较为麻烦,增加了硬件设计的复杂度。
课题:基于单片机的蓝牙控制小车专业:班级:学号:姓名:指导教师:设计日期:成绩:重庆大学城市科技学院电气信息学院目录1.设计目的作用 (2)2.设计要求 (2)3.设计的具体实现 (2)3.1设计原理 (2)3.2系统设计 (12)3.3系统实现 (13)4.总结 (19)参考文献 (20)附录 (21)附录1 (21)附录2 (22)C51蓝牙控制小车设计报告1设计目的与意义目的与意义:提高学生动手能力,培养学生的思维,巩固理论知识,让我们能对单片机更加深入的了解,加深同学们对单片机的认识,通过自己动手让小车跑起来还能让同学们更加有积极性,参与感,成就感。
让学生们亲自体验这门课程的神奇性。
因为无线技术的广泛使用,使蓝牙技术的发展成为了趋势之一,蓝牙可以发送和接受语音和数据,满足了大多数人的需求,它也融合了其他相关产品的特点,也是这样技术变得更多样性。
实现了无线控制小车,摆脱了有线控制的不方便,更加智能。
2设计要求SPP蓝牙串口调试助手 ----》聊天窗口--》1、在Bluetooth_Car项目中添加超声波躲避障碍功能(在小车前进的过程中,实时检测障碍物,一旦检测的距离,接近设定的值,触发蜂鸣器,报警系统工作,小车停止前进);2、在Bluetooth_Car项目中的串口中断服务函数中,添加小车前进的8个方向,前后左右,左前,右前,左后,右后;3、利用外部中断,强制停止小车运行(无论小车现在处于什么状态),蜂鸣器报警1s后,可再运行;4、用手机的蓝牙串口调试助手来远程操作小车。
3.设计的具体实现3.1设计原理芯片常识: STM8、C52 、STM32 、ARMC52:主要做末端的控制 11.0592MHZSTM32:主要做工业控制领域——智能设备 168MARM:主要做消费市场——手机==============单片机小车==========了解原理图和数据手册一、软件建立工程建立工程时芯片选择--》Atmel-->AT89C52设置芯片频率,选择生成16进制可执行文件。
=============中断========单片机获取外部数据的方式:1.程序控制方式a.无条件发送方式单片机认为外部设备一直都是准备好的,直接就拿数据使用。
b.条件判断方式在满足一定条件才获取数据。
2.中断方式由外部控制的,当有中断请求产生的时候,就可以在中断里面去实现获取数据。
3.DMA直接存储控制器当需要从外界获取数据的时候,DMA可以向CPU申请获取数据,由DMA直接获取数据。
使用DMA可以绕过CPU处理数据,降低CPU的使用率。
中断:当CPU正常运行的时候,突然收到一个中断请求(任务),完成中断任务之后立即返回原来的程序继续执行。
中断源:中断来源,发送中断的源头中断请求:中断发出的请求,申请执行任务中断响应:CPU响应中断请求,暂停正在执行的任务,转而执行中断任务8个中断源:INT0 外部中断0INT1 外部中断1INT2 外部中断2INT3 外部中断3T0 定时器0T1 定时器1T2 定时器2Uart 串口中断中断有优先级:分为4级,从0~3,数字越大优先级越高,高优先级的中断可以打断低优先级的中断。
中断的查询次序:在中断优先级相同的情况下,并且两个中断同时产生的时候,会优先执行查询次序级别高的中断.查询次序不能打断中断.中断服务函数:void INT1_func(void) interrupt 2{if()}小车两轮驱动:单片机的IO口不能直接驱动电机运行,必须使用驱动模块才可以。
电机转动原理:电机的两条线一根接电源正极,一根接负极就可以转动,当电极的方向改变,转动的方向也会改变。
BIA = 1;BIB = 0;控制右轮电机,如果想让轮子转动,只需要设置以上两个引脚,一个为1,一个为0.P0.0 左轮 1P0.1 左轮 0P0.2 右轮 1P0.3 右轮 0如果轮子想要动起来,需要接电源线。
思考:封装函数:前进、后退、停止、左前转、右前转、左后转、右后转=============定时器==============定时器就是定时,定时产生中断或者是计数。
工作方式:定时器:主要产生定时中断计数器:计时计数工作模式:模式0:12位寄存器模式1:16位寄存器模式2:8位自动重装载寄存器模式3:两个8位寄存器,T1无效时钟周期:就是频率的倒数假设晶振12M,时钟周期是1/12us,实际上大多使用的是:1/11.0592状态周期:状态周期是时钟周期的两倍:1/12*2机器周期:12个时钟周期定为1个机器周期,如果晶振是12M,那么一个机器周期就刚好是1us。
寄存器:TCON 控制寄存器 TMOD 模式寄存器定时器0作模式1: TMOD.1 = 0 TMOD.0 = 1设置寄存器计数的初值:TL0和TH050ms = (65536-初值)* (1/11.0592*12)50000us = (65536-初值) * 1.0850746080 = 65536-初值初值 = 19456 ==》 0x4C00TH0 = 0x4C;TL0 = 0x00;=============串口==============一、计算机内部通讯的方式:UART(串口)、I2C、SPI、1-Write(单总线)二、数据通讯方式并行通讯:多个任务同时进行,增加速度。
串行通讯:数据只通过一根数据线传输,一位一位的传输数据。
三、串行通讯同步通讯:发送一位数据必须要接收一位数据,通过时钟线确定数据收发:I2C、SPI异步通讯:可以独立收发数据,不需要发送数据的时候接收数据。
:串口UART、1w总线单工:只能一方发送数据,一方接收数据(收音机)半双工:同一时刻只能一方发送数据,一方接收数据,但是方向可以转换。
(对讲机)全双工:数据在同一时刻可以收也可以发。
(电话)四、电平特性TTL和RS232TTL:0V~5V 0V表示数据0 3.3V/5V表示数据1RS232:-15V~+15V 3V~15V表示数据0 -15V~-3V表示数据1单片机直接使用的是TTL电平:VCC正极; GND负极; TXD数据发送; RXD数据接收五、串行通讯的协议六、单片机串口寄存器SCON控制寄存器串口选择方式1,8位UART,波特率可变。
设置SCON寄存器:SCON = // 0101 0000 ==》 0x50PCON电源管理寄存器,设置SMOD的值SMOD默认值就是0,也可以主动设置为0.设置好之后需要开启总中断:EA = 1; ES = 1; 串口波特率计算:波特率 = (2^SMOD /32)* (定时器溢出率)9600 = (1 /32)* (11059200/12/(256-TH1)) 9600 = (1 /32)* (921600/(256-TH1))921600/(256-TH1) = 307200(256-TH1) = 3TH1 = 253 ==> 0xFD串口发送数据SUBF = 'h'; // 发送数据,还要判断是否发送3.2系统设计项目框图:3.3系统实现程序代码如下:#include <reg52.h> //器件配置文件#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define LCM_Data P2#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit RX = P1^1 ;sbit TX = P1^2 ;sbit LCM_RW = P0^3; //定义LCD引脚sbit LCM_RS = P0^4;sbit LCM_E = P0^2;sbit FM = P0^7; //定义蜂鸣器sbit AIA = P2^3; //定义电机sbit AIB = P2^2;sbit BIB = P2^1;sbit BIA = P2^0;void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Delay5Ms(void);void Delay400Ms(void);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);void SendOneByte(unsigned char c);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code mcustudio[] ={"YueQian "};unsigned char code email[] = {" "};unsigned char code Cls[] = {" "};unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};static unsigned char DisNum = 0; //显示用指针unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff[4] ={ 0,0,0,0,};void Init_Int1(void){IT1 = 1; //下降沿触发EX1 = 1; //开启外部中断1EA = 1; //开启总中断}void delay_ms(uint x) //延时函数{uint i;while(x--){for(i=0;i<133;i++);}}void car_go() //控制小车的函数前进{AIA = 1; //运用电机的电位差来控制小车的前进方向AIB = 0;BIA = 1;BIB = 0;}void car_back() //后退{AIA = 0;AIB = 1;BIA = 0;BIB = 1;}void right() //右转课程设计正文{AIA = 1;AIB = 0;BIA = 1;BIB = 1;}void left() //左转{AIA = 1;AIB = 1;BIA = 1;BIB = 0;}void go_right() //右转前进{AIA = 1;AIB = 0;BIA = 1;BIB = 1;delay_ms(500);AIA = 1;AIB = 0;BIA = 1;BIB = 0;}void go_left() //左转前进{AIA = 1;AIB = 1;BIA = 1;BIB = 0;delay_ms(500);AIA = 1;课程设计正文AIB = 0;BIA = 1;BIB = 0;}void back_right() //右转后退{AIA = 1;AIB = 1;BIA = 1;BIB = 0;delay_ms(500);AIA = 0;AIB = 1;BIA = 0;BIB = 1;}void back_left() //左转后退{AIA = 1;AIB = 0;BIA = 1;BIB = 1;delay_ms(500);AIA = 0;AIB = 1;BIA = 0;BIB = 1;}void WriteDataLCM(unsigned char WDLCM) //写数据{ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}void WriteCommandLCM(unsigned char WCLCM,BuysC) //写指令BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}unsigned char ReadDataLCM(void) //读数据{LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}unsigned char ReadStatusLCM(void) //读状态{LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); /显示单个字符ListLength++;X++;}}}void Delay5Ms(void) //5ms延时{unsigned int TempCyc = 5552;while(TempCyc--);}void Delay400Ms(void) //400ms延时{unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/**************超声波测距函数*************************/void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.87)/100; //算出来是CM/*晶振为11.0592MHz时|t(us) = 计数* (12/11.0592) * (1/58)| = 计数* 0.0187| = (计数* 1.87)/100*/if((S>=700)||flag==1) //超出测量范围显示“-”{flag=0;DisplayOneChar(0, 1, ASCII[11]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[11]);DisplayOneChar(3, 1, ASCII[11]);DisplayOneChar(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100;disbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;DisplayOneChar(0, 1, ASCII[disbuff[0]]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[disbuff[1]]);DisplayOneChar(3, 1, ASCII[disbuff[2]]);DisplayOneChar(4, 1, ASCII[12]); //显示M}}/********************************************************//*********** 定时器T0中断服务函数***********/void Timer0IRQ() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1;}/********************触发超声波模块************************************/ //超声波模块Trig控制端给大于10us的高电平触发模块测距void StartModule() //启动模块{TX=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}/********************************************************/ void delayms(unsigned int ms){unsigned char i=100,j;for(;ms;ms--){while(--i){j=10;while(--j);}}}/******************************/void SendOneByte(unsigned char c) //发送单个字符{SBUF = c;while(!TI);TI = 0;}/*********************************************************/void main(void){unsigned char TempCyc;Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 0, mcustudio);DisplayListChar(0, 1, email);ReadDataLCM(); //测试用句无意义for (TempCyc=0; TempCyc<10; TempCyc++)Delay400Ms(); //延时DisplayListChar(0, 1, Cls);FM = 1;// TMOD=0x01; //设T0为方式1;// TH0=0;// TL0=0;// ET0=1; //允许T0中断// EA=1; //开启总中断TMOD=0x21; //设T0为方式1,定时器1方式2;// 0010 0001课程设计正文SCON=0x50;TH1=0xFD;TL1=0xFD;TH0=0;TL0=0;TR0=1;ET0=1; //允许T0中断TR1=1; //开启定时器TI=1;ES = 1;EA=1; //开启总中断Init_Int1();while(1){StartModule();// DisplayOneChar(0, 1, ASCII[0]);while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算FM = 1;AIA = 1;AIB = 1;BIA = 1;BIB = 1;//超声波测距检测if(S<20){FM = 0;AIA = 1;AIB = 1;BIA = 1;BIB = 1;课程设计正文}elseFM =1;delayms(80); //80MS}}void UARTInterrupt(void) interrupt 4{unsigned char buf;if(RI){RI = 0;//add your code here!buf = SBUF; //作回显没有任何作用SendOneByte(buf);if(buf == '1'){car_go();delay_ms(1000);}else if(buf == '2'){car_back();delay_ms(1000);}else if(buf == '3'){right();delay_ms(1000);}else if(buf == '4'){left();课程设计正文delay_ms(1000);}else if(buf == '5'){go_right();delay_ms(1000);}else if(buf == '6'){go_left();delay_ms(1000);}else if(buf == '7'){back_right();delay_ms(1000);}else if(buf == '8'){back_left();delay_ms(1000);}}elseTI = 0;}void Int1_Routine(void) interrupt 2{EX1 = 0;AIA = 1;AIB = 1;BIA = 1;BIB = 1;FM = 0;delay_ms(500);FM = 1;EX1 = 1;}总结学习单片机要有一定的c语言基础,单片机的基础知识我还是多多少少知道一些,可是让我直接来做这一个项目,我却无从下手。