单片机蓝牙控制小车
单片机蓝牙小车实习报告

一、实习背景随着科技的发展,单片机技术得到了广泛应用。
为了提高自己的动手能力,拓宽知识面,我们选择了单片机蓝牙小车作为实习项目。
本项目旨在利用单片机技术,通过蓝牙通信实现小车的无线遥控,使其具备基本移动和避障功能。
二、实习目的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小车蓝牙模块是利用STM32单片机控制小车运动方向和速度的一种外围装置,通过蓝牙模块与手机进行通讯控制小车运动。
其原理主要包括以下几个方面:
1. STM32单片机控制小车运动
STM32单片机作为小车的控制核心,通过GPIO口输出控制小车
电机的转动方向和速度,从而实现小车的运动。
通过编写相应的程序,可以实现小车的前进、后退、左转、右转等基本运动。
2. 蓝牙模块实现与手机的通讯
蓝牙模块作为小车与手机之间的通讯接口,主要负责接收手机发来的指令,并将指令传输给STM32单片机进行处理。
同时,蓝牙模块也可以将小车的状态信息反馈给手机,以便用户了解小车的运行状态。
3. 手机APP控制小车运动
用户通过手机APP向小车发送指令,控制小车的运动。
指令通过蓝牙模块传输给STM32单片机进行处理,从而实现小车的运动控制。
用户可以通过手机APP调整小车的运动速度和方向,以便适应不同的运动环境。
综上所述,STM32小车蓝牙模块实现了通过手机控制小车运动的功能,为用户提供了一种方便、灵活的控制方式。
未来,随着物联网技术的发展,STM32小车蓝牙模块有望成为物联网领域的重要应用之一。
基于AT89C52单片机的蓝牙调速循迹小车

• 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语言代码

蓝牙小车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单片机蓝牙控制小车工作原理随着科技的不断发展,各种智能设备逐渐成为人们生活中不可或缺的一部分。
其中,单片机与蓝牙技术结合的小车应用,既有趣又具有一定的实用价值。
本文将介绍51单片机蓝牙控制小车的工作原理,以期为大家提供一些有益的信息。
在实际应用中,小车的移动、旋转控制是至关重要的。
为此,我们可以选用一种简单而有效的蓝牙通信协议——UART通信协议。
它可以在单片机与蓝牙控制小车之间建立通信连接,实现对小车的远程操控。
51单片机蓝牙控制小车的工作原理主要包括以下几个方面:一、单片机端硬件设计单片机端硬件设计主要包括单片机本身和与蓝牙控制小车连接的接口电路。
单片机可以内置UART通信模块,用于与蓝牙控制小车进行通信。
同时,还需要一个驱动电路,用于将单片机与蓝牙控制小车连接起来。
这些硬件设计可以通过电路图的形式呈现,具体电路图可以在相关资料中查阅。
二、蓝牙控制小车端硬件设计蓝牙控制小车端硬件设计主要包括一个小车的接收单元、一个驱动单元和一个微控制器。
接收单元用于接收单片机发送的指令,将指令转换为小车可以理解的动作信号。
驱动单元用于控制小车的运动,可以根据接收到的指令控制小车的移动、旋转等动作。
微控制器用于接收接收单元发送的信号,并根据接收到的信号控制单片机的功能。
这些硬件设计也可以通过电路图的形式呈现,具体电路图可以在相关资料中查阅。
三、通信协议51单片机与蓝牙控制小车之间的通信,需要遵循一种合适的通信协议。
在这里,我们主要采用UART通信协议。
它是一种串口通信,具有接口简单、速度较慢的特点,非常适合于这种简单而有趣的应用场景。
四、软件编程软件编程是单片机与蓝牙控制小车之间的桥梁。
为此,我们需要编写一段程序,用于实现单片机端与蓝牙控制小车端的通信功能。
这段代码需要包含以下几个主要部分:1.初始化函数:用于对单片机和蓝牙控制小车的硬件进行初始化,包括开启相应接口、配置默认值等。
2.数据接收函数:用于接收蓝牙控制小车发送的数据,并进行解码和处理。
基于-51单片机的蓝牙遥控小车

单片机大作业“基于单片机的蓝牙遥控小车”某:班级:通信工程卓越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手机与蓝牙模块建立连接配对之后,却无法进行正常连接,导致从手机发送的指令,单片机无法收到。
二是单片机线路的连接花费了不少的时间,但最后终于解决了。
由于蓝牙通信建立的失败,本次实习项目只是一个半成品,希望以后有时间能解决蓝牙通信的问题。
通过这次实习,对嵌入式有了一个更好的理解,知道通过代码编写控制硬件,这或许就是嵌入式的一个主要作用。
stm32蓝牙单片机小车

//将接收到字节发送给PC
*@param无
*@retval无
*/
void USART1INIT(void)
{
//相关结构体声明
GPIO_InitTypeDef GPIO_InitStructure;//端口
USART_InitTypeDef USART_InitStructure; //串口
NVIC_InitTypeDef NVIC_InitStructure; //NVIC
软件设计
1.
封装两个函数,如下:
void L298NINIT(void);//L298n电机初始化,时钟、端口配置
void L298Ctrl(uint8_t str);// L298n方向控制,参数0(停)1(前)2(后)3(左)4(右)
,附件源码。
2.
封装一个函数:void USART1INIT(void);//串口初始化,时钟、端口、波特率、中断优先级配置,附件源码。修改中断服务函数,进行接收数据判断,调用L298N的void L298Ctrl(uint8_t str);
GPIO_ResetBits( GPIOA, GPIO_Pin_5);
GPIO_ResetBits( GPIOA, GPIO_Pin_4);
GPIO_SetBits( GPIOB, GPIO_Pin_0);
GPIO_ResetBits( GPIOB, GPIO_Pin_1);
}
if(str==4)//右转
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//端口配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课题:基于单片机的蓝牙控制小车专业:班级:学号:姓名:指导教师:设计日期:成绩:重庆大学城市科技学院电气信息学院目录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语言基础,单片机的基础知识我还是多多少少知道一些,可是让我直接来做这一个项目,我却无从下手。