精华内容
下载资源
问答
  • 基于STC89C51单片机的温湿度检测系统

    万次阅读 多人点赞 2019-02-21 21:04:30
    基于STC89C51单片机的温湿度检测系统 摘 要:设计一种计算机教室温度、湿度检测系统,用于控制机房的温、湿度。整个系统采用STC89C51微处理器作为主控系统,硬件电路主要包括51单片机、DHT11温湿度传感器、显示器...

    基于STC89C51单片机的温湿度检测系统

    摘 要:设计一种计算机教室温度、湿度检测系统,用于控制机房的温、湿度。整个系统采用STC89C51微处理器作为主控系统,硬件电路主要包括51单片机、DHT11温湿度传感器、显示器模块、警报器以及控制设备等5部分。通过给定的温湿度的上下限值并由1602 LCD显示器显示,传感器测量的信号由LCD显示出来,LCD显示实时的温、湿度值。当温、湿度超过限定值时,蜂鸣器鸣叫报警。
    关键词:单片机;温湿度传感器;LCD显示器

    0 引 言

    当计算机教室温度过高,会导致机器的散热功能无法正常运行,影响电路稳定运行。为了确保机房的设备正常运转,机器的温度最好保持在18-25℃。如果室内的空气湿度过大,会导致设备金属部件产生锈蚀,电路板的绝缘性能降低,从而影响设备的稳定运行。为防止静电产生,保证设备的安全系数不受影响,机房的空气也不能过于干燥。因此,机房的温度、湿度要控制在稳定状态,避免意外发生[1]。

    一、整个作品采用STC89C51微处理器作为MCU(Microcontroller Unit),硬件电路主要包括51单片机、温湿度传感器、显示模块、报警器以及控制设备等5部分。其中由DHT11温湿度传感器及1602 LCD液晶显示器构成系统的显示模块。系统程序给定温湿度上下限值并通过1602 LCD显示器显示,传感器测量的信号由LCD显示出来,LCD显示实时的温、湿度值。当室内的温湿度超过限定值,蜂鸣器鸣叫报警。

    二、温湿度的检测和控制是研究的主要内容。当环境中的温湿度发生变化时,DHT11温湿度传感器随着温度、湿度的变化而变化,然后将变化的电阻通过转换电路和转换信号检测为相对应变化的电压,然后把模拟电压信号由A/D转换器转换为数字信号并送入到单片机中。单片机对采集到的信号进行滤波处理并通过查表得到实际测量的湿度值。

    三、该系统通过按钮设定最适宜的温度和湿度,传感器向最小系统输送监控信号,若超过预设值,蜂鸣器就会报警提醒,控制温、湿度的设备即可做出调整,使室内的温、湿度回到正常范围。

    四、根据各种不同的计算机教室最适温度进行温度调节,若低于下限温度则采取升温措施,通常采取电热增温和空调增温。若高于上限温度则采取降温措施,通常通过空调降温和风扇降温;为满足机房不同种类计算机对湿度的要求,我们可以随时对温、湿度进行调节,对于不利情况能够及时的显示,并采取相应的措施提醒用户进行调整,以达到最适宜的温湿度。

    1 整体方案结构

    1.1 总体设计方案及其论证

    本设计要实现的功能是:实时显示当前环境的温、湿度,允许用户设定温、湿度的上下限值,当环境温湿度超过或低于限定值时,系统会以蜂鸣器鸣叫的方式进行报警,并且使控温设备启动。待室内达到正常范围时,蜂鸣器停止鸣叫,控温设备停止运行,系统正常工作。

    (1)温度检测:对温室温度进行测量并反映在显示器上。

    (2)湿度检测:对温室湿度进行测量并反映在显示器上。

    (3)显 示:1602 LCD显示器显示实时温度、湿度值。

    依据功能设定,本系统主要分为以下三个模块:

    (1)温湿度采集模块

    (2)数据处理模块

    (3)用户交互模块

    其中温湿度采集模块使用的是DHT11数字温湿度传感器,它使用单总线方式,接口简单,而且无需另外校准。分辨率为8bit,能够满足日常环境温湿度的检测要求。

    数据处理模块使用的是STC89C51单片机作为最小系统,其完成温湿度数据的采集、运算和控制设备运行的功能。

    用户交互模块主要由按键、1602液晶显示器、蜂鸣器和控制设备构成。其中按键用于用户设定温湿度的限定值,1602 LCD用于显示数据,蜂鸣器用于提示用户,控制设备用于调节和控制不符合要求的温、湿度。

    1.2 系统设计简图

    C51单片机作为主控制器,负责处理由DHT11传输的数据,并把处理好的数据送向显示器模块,DHT11温湿度传感器主要用来采集周围的环境参数,并把采集得到的数据送向单片机。按键电路主要是用来完成单片机的复位操作和温湿度限定值的设定。蜂鸣器电路是用三极管来实现的,用来提示周围的温度或者湿度是否超出设定数值,控制设备等候指令,当蜂鸣器响起且温、湿度不在标准范围内,控制设备自行启动,直到温、湿度正常。显示电路主要用来显示当前的温湿度。

    在这里插入图片描述
    图1-2-1 温湿度监控系统原理图

    2 系统硬件设计

    2.1 器件选定

    将单片机用作测控系统时,总要有被测信号输入通道,由计算机拾取必要的输入信息。对于测量系统而言,其核心任务是怎么样获得准确的被测信号;而对测控系统来说,不可缺少的环节是对条件的监测和对被控对象状态的测试,传感器是实现测量与控制的第一环节,是测控系统的关键部分,一切准确的测量和控制都将在传感器对原始信号的准确可靠的转换和捕捉,工业生产过程的自动化测量和控制,基本主要依赖各种传感器来控制和检测生产过程中的各种量,使系统和设备在最佳状态正常运行,从而保证生产的高质量和高效率[2]。

    2.1.1 DHT11温湿度传感器

    DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH,温度0~50℃。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准,校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,采用单线制串行接口[5],使系统集成变得简易快捷。
    在这里插入图片描述
    图2-1-1 封装信息

    四条引脚中有两条是电源引脚,有一条是输出数据的引脚,只需要给其供上额定电压,输出引脚采集信号即可完成。若输出信号是模拟量,则通过A/D芯片,将模拟量转换为数字信号,然后传送给单片机。DHT11是数字传感器,不需要进行模数的转换。
    

    在这里插入图片描述2.1.2 1602LCD显示器

    液晶显示器(Liquid Crystal
    Display, LCD)是一种被动式发光的低功耗显示器件。由于液晶这种物质本身不发光,它只是在外加电场的作用下使液晶内部的分子有序排列,从而改变通过这些液晶分子的光线方向,光线再经过底板的反射、散射最终进入人们的视野中。液晶显示器具有重量轻、体积小、功耗低、抗扰能力强等优点,广泛应用于人们的生活中、仪器仪表、控制系统等领域[3]。

    本设计将采用点阵字符型1602液晶显示模块。

    在这里插入图片描述
    在这里插入图片描述
    基本操作时序
    (1)读状态;输入:RS=L,R/W=H,E=H;输出:D0~D7为状态字。
    (2)读数据;输入:RS=H,R/W=H,E=H;输出:无。
    (3)写指令;输入:RS=L,R/W=L,E=H,D0D7为指令码;输出:D0D7为数据。
    (4)写数据;输入:RS=H,R/W=L,E=H,D0~D7为数据;输出:无。
    在这里插入图片描述 图 2-1-2 外形尺寸

    在这里插入图片描述
    图2-1-3 点阵字符型1602液晶显示器的显示地址映射图
    控制器内部带有80B的RAM缓冲区,对应关系如图2-1-2所示。
    在图中的00H0FH、40H4FH地址中的任意处写显示数据时,液晶都可以立即显示出来,但写入到10H27H或50H67H地址处时,必须通过移屏指令将他们移入可显示区域才能正常显示[4]。

    2.2 主控系统电路和各硬件模块

    2.2.1
    STC89C51单片机简介
    STC89C51单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。

    其主要特性如下:
    工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
    工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
    用户应用程序空间为12K/10K/8K/6K/4K/2K字节
    片上集成512字节RAM
    通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
    ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RXD/P3.0,TXD/P3.1)直接下载用户程序,数秒即可完成一片
    具有EEPROM功能
    具有看门狗功能
    共3个16位定时器/计数器。即定时器T0、T1、T2
    外部中断4路,下降沿中断或低电平触发电路,Power Down模式可由外部中断低电平触发中断方式唤醒
    通用异步串行口(UART),还可用定时器软件实现多个UART
    工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)
    PDIP封装

    2.2.2 单片机最小系统
    在这里插入图片描述
    图2-2-2 最小系统原理图

    2.2.3 复位电路与晶振电路

    检测系统采用上电复位,当RST引脚上出现了两个周期以上的高电平就会触发内部复位,这里的EA端与复位电路无关,由于数据都放在了内部存储器,所以EA端直接上拉高电平。

    晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率,可以用于同一个晶振项链的不同锁相环来提供的。单片机STC89C51的晶振电路采用无源晶振,微调电容取30pF。
    在这里插入图片描述
    图2-2-3 复位电路、晶振电路

    2.2.4 蜂鸣器警报模块

    本设计采用蜂鸣器报警电路,如图所示。当蜂鸣器额定电流≤30mA,而对于STC89C51单片机,P3.2口的灌电流为15mA,仅靠单片机的P3.2口电流是不能驱动蜂鸣器的,必须使用晶体管放大电流。通常使用PNP型晶体管,当外部环境的温度或者湿度超过预设值的时候,基级变为低电平,蜂鸣器导通鸣叫,实现报警。
    在这里插入图片描述

    图2-2-4 蜂鸣器警报模块

    2.2.5 温湿度按键模块
    在这里插入图片描述
    图2-2-5 按键模块

    2.2.6 系统显示模块

    显示模块选用1602点阵字符型液晶显示器,它是目前工控系统中使用最广泛的液晶屏之一。它的显示的质量高,驱动方便,经过编程后显示的内容丰富多样。

    DHT11是数字型温湿度传感器,可直接以数字的方式传输所采集到当前环境的温、湿度,DHT11采用的是单总线通信,因此只需将单片机的一个I/O端口与DHT11的通信接口连接就可以实现数据的采集和传送。
    在这里插入图片描述
    图2-2-6 1602LCD与DHT11原理图

    2.3 硬件实施控制与实物成品
    在这里插入图片描述
    操作说明:

    S1:复位键 S2:设置/保存 S3:数值加 S4:数值减

    1、系统上电后,LCD1602显示当前环境的温湿度值,按下S2设置键,依次进入预设温度上限、湿度上限、湿度下限、温度下限的调节模式。
    2、按S3数值加键,预设值加。
    3、按S4数值减键,预设值减。
    4、设置成功后,再按S2设置键退出,返回到正常监测模式。
    在这里插入图片描述
    图2-3-1 硬件实物图1
    在这里插入图片描述图2-3-2 硬件实物图2

    3 系统软件设计
    系统软件设计采用分部模块化设计,其中包括主程序、温度检测子程序、湿度检测子程序、数据储存、子程序读取、LCD显示子程序。软件设计时温湿度监测系统的核心部分,将采用循环的方式来完成数据的收集,并进行数据对比。系统上电后正常运转,并进行温、湿度的检测与处理。
    在这里插入图片描述
    图3-1 软件设计流程图

    4 结 语
    本文设计的是计算机教室的温湿度检测、报警、控制系统。由高性价比单片机STC89C51对传感器数据进行处理,通过温湿度传感器,实现对温、湿度数据的采集,并对数据进行处理, 1602
    LCD显示器显示即时温、湿度值。当测出数值超出设定的温、湿度值时,由单片机驱动蜂鸣器模块,实现报警功能,控制设备自行启动,调节室内的温度、湿度,使其恢复到正常范围。综合上述的功能,就可以构造一个以DHT11传感器和C51单片机为基础的系统,实现稳定和简便的温、湿度环境数据监测功能。

    资料链接:
    https://download.csdn.net/download/qq_41979953/11884796

    展开全文
  • 针对上述存在的问题,设计了一种基于单片机的汽车尾气检测系统,该系统通过电化学传感器检测气体,并用无线通信技术将探测的数据进行传输,提高了汽车尾气检测的灵活方便性,实现对汽车尾气的全面实时监测。...
  • 51单片机DHT11温湿度检测手机蓝牙APP显示设计

    万次阅读 多人点赞 2018-08-18 21:50:42
    今天给大家介绍的是一个温湿度检测设计,基于51单片机、蓝牙模块、温湿度传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。 1.系统方案 先...

    完整源码下载地址:https://download.csdn.net/download/tongxin082/21440739 

    今天给大家介绍的是一个温湿度检测设计,基于51单片机、蓝牙模块、温湿度传感器、Android APP完成。首先先展示一下设计好的实物,接下来将从系统方案、硬件设计、软件设计这三个方面来阐述。

    1.系统方案

    先来看一下整体的架构图:硬件部分由STC89C52单片机、DHT11温湿度传感器、BT08蓝牙串口模块和Android手机组成。传感器将采集到的温湿度数据传送给单片机,然后单片机通过蓝牙串口模块将数据发送到手机APP,从而将温湿度在APP显示出来。在APP上可以设置温湿度告警的阈值,超过阈值将显示“偏高”或者“偏低”的相关信息。

    2.硬件设计

    整个设计的原理图如下所示,由单片机最小系统、蓝牙串口模块、温湿度传感器组成。传感器的DATA管脚连接单片机的P2^0口,蓝牙串口模块的RXD、TXD分别连接单片机的TXD、RXD。

    蓝牙串口模块的功能是串口协议和蓝牙协议之间的相互转换,在单片机上自己编写一套蓝牙驱动代码是非常复杂的,借助这个模块我们在编写单片机代码时只需要编写串口收发的代码即可,该模块得到串口数据后会转成蓝牙数据。对于APP它接收到的是蓝牙数据,开发APP时只需要编写蓝牙相关的代码,Android封装了蓝牙相关的API,所以开发起来简单。蓝牙串口模块的引脚图如下图所示,在这个设计中用到了四个引脚,VCC、GND接5V电源和地,蓝牙模块的TXD接单片机的RXD,RXD接TXD。

    DHT11温湿度传感器负责采集环境中的温湿度数据,在单片机软件设计部分会详细的介绍该传感器的使用步骤。引脚说明:
    VDD 供电3.3~5.5V DC
    DATA 串行数据,单总线
    NC 空脚
    GND 接地,电源负极

    3.单片机软件设计

    单片机程序主要是两个点,一是读取DHT11传感器的温湿度数据,二是串口通信。DHT11的官方文档写的很规范,有关于读取数据的详细步骤,文档更新也比较及时,最新的更新日期是2017年3月31号,官网的下载地址:http://www.aosong.com/products-21.html

    DHT11采用单总线通信,单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。

    • 传送数据位定义

    DATA 管脚用于DHT11与单片机之间的通讯和同步,采用单总线数据格式,一次传送40 位数据,高位先出。
    数据格式:
    8bit 湿度整数数据+ 8bit 湿度小数数据+ 8bit 温度整数数据+ 8bit 温度小数数据+ 8bit 校验位。
    注:其中湿度小数部分为0。

    • 校验位数据定义

    8bit 湿度整数数据 +  8bit 湿度小数数据 +  8bit 温度整数数据 +  8bit 温度小数数据 = 8bit 校验位
    如果以上等式成立,则本次传感器采集的数据有效,否则无效。

    先看采集数据有效的示例,接收到的40 位数据为:
    0011 0101     0000 0000     0001 1000     0000 0100      0101 0001
    湿度高8 位     湿度低8 位     温度高8 位     温度低8 位    校验位
    计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,接收数据正确。
    湿度:0011 0101(整数)=35H=53%RH 0000 0000(小数)=00H=0.0%RH =>53%RH + 0.0%RH = 53.0%RH
    温度:0001 1000(整数)=18H=24℃ 0000 0100(小数)=04H=0.4℃ =>24℃ + 0.4℃ = 24.4℃

    采集数据无效的示例,接收到的40 位数据为:
    0011 0101     0000 0000     0001 1000    0000 0100     0100 1001
    湿度高8 位    湿度低8 位     温度高8 位    温度低8 位    校验位
    计算: 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 不等于0100 1001,本次接收的数据不正确,放弃,重新接收数据。

    通过以上两个示例可以清楚DHT11数据格式以及数据如何去校验有效性。

    • 数据时序图

    用户主机(MCU)发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出40bit 的数据,并触发一次信采集。信号发送如图所示。这里的主机是指单片机,从机是指DHT11传感器。

    下面这个图表罗列了时序图相关的参考时间,在读取数据的详细步骤中会用到这些数值。

    根据时序图和表中的参考时间,我们可以得出读取传感器数据的步骤。

    step1:单片机输出低电平保持20ms

    step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号

    step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。

    step4:通过while语句等待83us的低电平响应时间结束

    step5:通过while语句等待87us的高电平响应时间结束

    step6:计算温湿度数据

    step7:单片机输出高电平结束一次数据采集的读取

    step8:校验数据

    在时序图中可以看到,数据读取是每次一位进行的,数据0位和数据1位的低电平时间是相同的,即54us。数据0位的高电平时间是24us,而数据1为的高电平时间是71us,通过高电平时间的差异我们就可以判断出是数据0还是数据1。所以单独写了一个函数用来计算数据0位和1位,由于温湿度的整数和小数部分分别是由8位表示的,我们定义该函数得到8位数据之后给出返回值。步骤6对应的函数computeData() 用来完成上述工作。我们对步骤6进行详细的描述:

    step 6.1:等待54us低电平结束

    step 6.2:延时30us判断高电平是否结束,因为数据0位的电平最大时长是27us,如果超过27us之后高电平结束,则为数据0位,否则为数据1位。

    step 6.3:通过while语句等待高电平结束

    step 6.4:通过移位和或与的方式保存一个数据位

    step 6.5:循环6.1到6.4步骤8次,得到一个字节的数据

    //--------------------------------
    //-----湿度读取子程序 ------------
    //--------------------------------
    //----以下变量均为全局变量--------
    //----温度高8位== temperature_H------
    //----温度低8位== temperature_L------
    //----湿度高8位== humidity_H-----
    //----湿度低8位== humidity_L-----
    //----校验 8位 == checkdata-----
    //--------------------------------
    void readData()
    {
        U8  humidity_H_temp,humidity_L_temp,temperature_H_temp,temperature_L_temp,checkdata_temp;
        //step1:单片机输出低电平保持20ms
        P2_0=0;
        delayms(20);
        //step2:单片机拉高电平保持13us等待DHT11传感器的低电平响应信号
        P2_0=1;
        delay13us();
        //step3:判断DHT11是否给出低电平响应,如果有低电平响应则进入步骤4,否则等待下一轮的尝试。
        if(P2_0==0)
        {
            //step4:通过while语句等待83us的低电平响应时间结束
            while(P2_0==0);	
            //step5:通过while语句等待87us的高电平响应时间结束			
            while(P2_0==1);				
            //step6:计算温湿度数据
            humidity_H_temp = computeData();
            humidity_L_temp = computeData();
            temperature_H_temp = computeData();
            temperature_L_temp = computeData();
            checkdata_temp = computeData();
            //step7:单片机输出高电平结束一次数据采集的读取
            P2_0 = 1;		
            //step8:校验数据
            if(checkdata_temp = humidity_H_temp + humidity_L_temp + temperature_H_temp + temperature_L_temp)
            {
                humidity_H = humidity_H_temp;
                humidity_L = humidity_L_temp;
                temperature_H = temperature_H_temp;
                temperature_L = temperature_L_temp;
                checkdata = checkdata_temp;
            }
        }
    
    }
    
    /**
    *根据时序计算温湿度值
    */
    U8 computeData()
    {
        U8 i,U8comdata;
        for(i=0; i<8; i++)
        {
            //step 6.1:等待54us低电平结束
            while(P2_0==0);
            //step 6.2:延时30us判断高电平是否结束	
            Delay_10us();					
            Delay_10us();
            Delay_10us();
            U8temp=0;
            if(P2_0==1)						
            {											
                U8temp=1;
            }
            //step 6.3:通过while语句等待高电平结束
            while(P2_0==1);
            //step 6.4:通过移位和或与的方式保存一个数据位			
            U8comdata<<=1;
            U8comdata|=U8temp;
        }
        return U8comdata;
    }

    温湿度数据读取完毕,接下来就是通过串口发送出去,串口发送数据的代码相对简单了,我们在主函数中对串口通信进行初始化,然后在一个while语句中每隔2s读取数据然后发送。

    //----------------------------------------------
    //main()功能描述:  STC89C52RC  11.0592MHz   串口发送温湿度数据,波特率 9600
    //----------------------------------------------
    void main()
    {
        U8  i;
        TMOD = 0x20;          //定时器T1使用工作方式2
        TH1 = 253;        // 设置初值
        TL1 = 253;
        TR1 = 1;          // 开始计时
        SCON = 0x50;          //工作方式1,波特率9600bps,允许接收
        ES = 1;
        EA = 1;           // 打开所以中断
        TI = 0;
        RI = 0;
        Delay(1);         //延时100US(12M晶振)
        while(1)
        {
            //调用温湿度读取子程序
            readData();
            str[0]=humidity_H;
            str[1]=humidity_L;
            str[2]=temperature_H;
            str[3]=temperature_L;
            str[4]=checkdata;
            //发送到串口
            for(i=0; i<5; i++)
            {
                sendOneChar(str[i]);
            }
            //读取模块数据周期不易小于 2S
            delayms(2000);
        }
    
    }

    至此,单片机端的主要代码就讲解完了,可以看到核心代码是如何读取DHT11的数据。

    4.手机APP软件设计

    APP是用Android Studio(AS)开发的,不建议初学者学习Eclipse结合ADT(Android Eclipse Tools)插件的方式开发Android APP,这种方式已经过时并且以后会被淘汰,Google在2016年底已经停止了对ADT的更新,我之前所在的公司已经将Eclispe的代码全部迁移到AS平台了,推荐使用Google自家的AS集成开发环境。AS有很多优点,但是在使用时也有问题,AS借助gradle进行项目构建,至于为什么Google利用gradle进行Android app项目构建,读者可以自行上网搜索。gradle插件版本要和AS版本相对应,不同的开发者的gradle版本可能不同,所以当你拿到另外一个开发者的代码在自己的AS运行时时有可能会构建失败。这个现象对于国外开发者而言不是一个问题,AS可以自动去下载所需要的gradle插件版本,但是在国内,由于众所周知的原因,如果不会科学上网那么AS直接尝试下载gradle插件时会失败,会令很多初学者不知所措。在以后有时间我会单独写一篇blog来讲解如何去解决这个问题。最近听到Google要重返中国市场,如果能回归成功,对于国内的很多开发者和学术研究者而言是个好消息。

    言归正传,本设计APP的代码主要分成两个部分,一是蓝牙数据的接收,二是图表显示。

    4.1 APP蓝牙软件设计

    蓝牙通信的三个基本步骤:搜索、配对、连接。这之后就可以进行数据传输了。

    • 权限

    在蓝牙通信中需要获取Android系统的以下三个权限,如果不能给APP授予相关的权限会影响蓝牙的正常使用:
    BLUETOOTH:允许配对的设备进行连接
    BLUETOOTH_ADMIN:允许搜索和配对设备
    ACCESS_COARSE_LOCATION:广播接收器接收BluetoothDevice.ACTION_FOUND广播需要改权限

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    在下文中还会提到在Android6.0及以上的版本中关于ACCESS_COARSE_LOCATION权限的申请。

    • 开启蓝牙

    建立蓝牙通信之前需要验证是否有蓝牙设备,以及蓝牙设备是否已经开启。对于一个Android系统而言只有一个蓝牙适配器,通过getDefaultAdapter()方法可以返回其一个实例,如果返回为null,则说明该设备不支持蓝牙。

    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
            // device doesn't support Bluetooth
    }

    接下来是检查蓝牙设备是否已经开启,如果没有开启,可以调用startActivityForResult()方法来弹出对话框让用户选择开启,这种方式不会停止当前的应用。

    if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
    }
    • 搜索设备

    搜索设备可以分成两部分,一是查找已经与本机配对的设备,通过getBondedDevices()方法返回已经配对的设备信息:

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if (pariedDevices.size > 0) {
            for (BluetoothDevice device: pairedDevices) {
                    String deviceName = device.getName();
                    String deviceMACAddress = device.getAddress();
            }
    }

    二是搜索周围可用的但是还未配对的设备。
    系统在发现蓝牙设备会通过广播的形式通知app,所以在搜索设备之前需要注册广播接收器来接收发现蓝牙设备的消息,在销毁Activity时注销广播接收器。

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
            public void onReceiver(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                            BluetoothDevie device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    }
            }
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Register for broadcasts when a device is discovered.
        IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mReceiver, filter);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Don't forget to unregister the ACTION_FOUND receiver.
        unregisterReceiver(mReceiver);
    }

    BluetoothDevice.ACTION_FOUND广播需要ACCESS_COARSE_LOCATION权限,该权限是个危险权限,在Android 6.0及以上,除了在manifest中声明还需要在java代码中申请。获取了该权限之后,在搜索蓝牙设备时才能收到系统发出的蓝牙设备发现的广播。搜索设备调用startDiscovery()方法,当周围有可用设备时,系统会通过广播的形式通知应用。

    //检查ACCESS_COARSE_LOCATION权限
                    if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION)
                            == PackageManager.PERMISSION_GRANTED){
                        Toast.makeText(MainActivity.this,"搜索回调权限已开启",Toast.LENGTH_SHORT).show();
                        if(mBluetoothAdapter.isDiscovering()){
                            mBluetoothAdapter.cancelDiscovery();
                        }
                        mBluetoothAdapter.startDiscovery();
                    }else{
                        Toast.makeText(MainActivity.this,"搜索回调权限未开启",Toast.LENGTH_SHORT).show();
                        ActivityCompat.requestPermissions(MainActivity.this,
                                new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_ACCESS_COARSE_LOCATION);
                    }
    
    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(requestCode==REQUEST_ACCESS_COARSE_LOCATION){
                if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    mBluetoothAdapter.startDiscovery();
                    if(mBluetoothAdapter.isDiscovering()){
                        mBluetoothAdapter.cancelDiscovery();
                    }
                    mBluetoothAdapter.startDiscovery();
    
                } else {
                    Toast.makeText(MainActivity.this,"action found is not granted.",Toast.LENGTH_LONG).show();
                }
    
            }
        }
    • 建立连接

    在建立连接时需要一个UUID,UUID是用来标识不同设备的ID,对于蓝牙串口设备而言其对应的UUID是“00001101-0000-1000-8000-00805F9B34FB”。

    If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB
    https://developer.android.google.cn/reference/android/bluetooth/BluetoothDevice.html

    手机端是作为客户端与蓝牙模块进行连接的。
    在蓝牙socket进行connect之前,一定要调用BluetoothAdapter的cancelDiscovery()方法。连接的第一步是通过调用BluetoothDevice的createRfcommSocketToServiceRecord(UUID)获取BluetoothSocket.第二步是调用BluetoothSocket的connect()方法发起连接。由于connect()为阻塞调用,因此该连接过程应该在主线程之外的线程中执行。在调用connect()时,应始终确保设备未在执行设备发现。如果正在进行发现操作,则会大幅降低连接尝试的速度,并增加连接失败的可能性。

    String macAddr = "20:15:05:25:02:43";
    BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(macAddr);
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
    try {
        mSocket = device.createRfcommSocketToServiceRecord(uuid);
    } catch (IOException e) {
        e.printStackTrace();
    }
    new Thread(){
        @Override
        public void run() {
            mBluetoothAdapter.cancelDiscovery();
            try {
                mSocket.connect();
            } catch (IOException e) {
                try {
                    mSocket.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
            super.run();
        }
    }.start();

    确保在建立连接之前始终调用cancelDiscovery(),而且调用时无需实际检查其是否正在运行,如果确实想要执行检查,请调用isDiscovering()。

    • 发送数据

    try {
         OutputStream os = mSocket.getOutputStream();
         os.write("发送的数据".getBytes());
         } catch (IOException e) {
             e.printStackTrace();
         }

     完整源码下载地址:https://download.csdn.net/download/tongxin082/21440739 

    展开全文
  • 当时拿到板子自己费尽九牛二虎之力将0603(有的还是0402)封装器件焊好之后,打算使用仿真器下载程序调试,但是Keil软件里识别不到芯片型号,更别说下载程序了。当时查了好多资料,也问了好多人最终也没有将问题解决...

    2020四月份开始做毕设,题目是无线温湿度记录仪,主控是STM32单片机。下面是第一版板子(现在看着好丑)在这里插入图片描述
    在这里插入图片描述
    当时拿到板子自己费尽九牛二虎之力将0603(有的还是0402)封装器件焊好之后,打算使用仿真器下载程序调试,但是Keil软件里识别不到芯片型号,更别说下载程序了。当时查了好多资料,也问了好多人最终也没有将问题解决,到底还是不知道哪里出了问题,无奈只好画第二版,第二版我将芯片所有用到的引脚用排针引出,这样即使最小系统不能用我还用现成的最小模块可以用。下面是第二版
    在这里插入图片描述
    果然还是线少好看,这次没有让我失望,成功运行。但是第一版的问题始终没有解决,直到今天,我在公司问了领导这个问题,领导跟我列出下面几点检查步骤:
    1.将单片机引脚再过一边锡,排除虚焊问题
    2.检查仿真器是否正常
    3.排除布线问题,因为单片机兼容性还不错,而且我晶振布线离单片机也挺近,最小系统相关管脚连接也都正确。
    4.即使我晶振里单片机远,单片机内部也很会自动切换到内部振荡器给系统提供时钟信号。这样晶振部分也就可以排除了。
    5.检查复位电路,看看系统是否一直处于复位状态,检查仪器用示波器,上电后示波器信号变化应该是从低到高的变化,比如这样
    在这里插入图片描述
    查看波形是否正确,如果波形正确就看一下时间T是否满足复位最低要求
    6.检查仿真器到下载管脚的线是都连通
    如果检查完都是好的还是检测不到单片机型号,八成是单片机坏掉了。

    如有什么遗漏,还请留言补充,谢谢

    展开全文
  • 单片机的最小系统就是让单片机能正常工作并发挥其功能所必须的组成部分,也可理解为单片机正常运行的最小环境。 其主要构成为四部分: 1.单片机芯片 2.系统电源 3.时钟电路 4.复位电路 这四个部分可缺少...

    单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分,也可理解为单片机正常运行的最小环境。
    在这里插入图片描述
    其主要构成为四部分:
    1.单片机芯片
    2.系统电源
    3.时钟电路
    4.复位电路
    这四个部分不可缺少,缺少其中一部分,便会造成单片机无法正常运行。以STM32F103C8T6单片机为例。

    1. STM32F103C8T6单片机
      单片机,相信大家应该都知道,主要作用是程序的执行和外部电路的控制。
      在这里插入图片描述

    2. 系统时钟
      系统时钟是由晶振、电容、电阻构成的。单片机内部振荡器在外部晶振、电容的作用下产生自激振荡,为单片机提供12MHz的正弦信号。时钟电路相当于单片机的心脏,它的每一次跳动(振荡节拍)都控制着单片机执行代码的工作节奏。振荡得慢时,系统工作速度就慢;振荡得快时,系统工作速度就快。此款单片机提供有内部时钟,无特殊要求可省去此电路。
      在这里插入图片描述

    3. 复位电路
      由电容串联电阻构成,我们知道,电容的电压不能突变的,当系统一上电,单片机的RST脚将会出现一个持续的高电平,并且,这个高电平持续的时间由电路的电容值来决定.STM32单片机的RST脚检测持续到持续到20us以上的高电平后,会对单片机进行复位操作。所以,适当组合RC的取值就可以保证可靠的复位。
      在这里插入图片描述

    4. 系统电源
      由于我们使用的电源适配器产生的直流电压为5V,单片机的工作电压为3.3V。所以需要对电压进行降压处理。此电路使用了LP3965-3.3芯片,可将5V转换为3.3V。
      在这里插入图片描述

    5. 其他辅助电路
      此电路可供用户进行程序调试和下载
      在这里插入图片描述

    信号指示灯:可作为程序正常运行的状态灯
    在这里插入图片描述
    BOOT0/BOOT1:这两个引脚可控制单片机程序的启动方式,

    1. BOOT0=X,BOOT=0:主闪存存储器启动
    2. BOOT0=0,BOOT=1:系统存储器启动
    3. BOOT0=1,BOOT=1:内置SRAM启动
      此电路BOOT0=0,BOOT1=0,单片机程序为默认启动模式。
      在这里插入图片描述

    此电路的电容和磁珠只要是作为系统电源的滤波处理。
    在这里插入图片描述

    以上就是单片机最小系统的全部电路。

    如果您喜欢,可关注个人公众号“电子应用学习馆”,获取更多的资料例程
    在这里插入图片描述

    展开全文
  • 本文介绍了一种基于单片机的心率体温检测系统。此次设计的电路部分主要包括:传感测量电路、放大电路、滤波整形电路、AD转换电路、控制电路、电源供电电路等。上位机为通过VC编程界面。通过上位机按键控制,
  • 对于51这种低端单片机做一些功能很多的项目软件延时的方法不仅浪费CPU资源而且软件还会莫名其妙的出现很多BUG。所以我们今天就试着剖析一下按键抖动的问题。 下面我们分析一下按键的抖动 我已经先把图上的这个时间...
  • 单片机

    千次阅读 多人点赞 2013-06-09 22:18:00
    单片机就是一个小的计算机,不过他没有计算机那么好,方便的输入输出设备,计算机的输入设备就是鼠标,键盘等,方便的很,输出设备就是显示器,将输出非常清晰的显示在屏幕上。但是单片机的输入输出都是他的引脚,...
  • 本文是笔者在学习51单片机的笔记心得。这篇着重介绍C51单片机是如何检测独立按键以及矩阵键盘操作。
  • 系统由STC89C52单片机、DHT11...1、DHT11数字温湿度传感器把采集的温湿度数据传给单片机并显示液晶屏上; 2、可以手动设置温湿度上下限值; 3、当温湿度值超过设定的上下限值,蜂鸣器响起,相应指示灯闪烁。
  • 基于51单片机的心率脉搏计检测系统

    万次阅读 多人点赞 2019-01-11 21:34:05
    系统运行中能显示脉搏心率次数和时间,系统停止运行时,能够显示总的脉搏心率次数和时间。 (3)其他硬件电路 除了主要的心率检测电路外,还包括单片机最小系统、LCD1602显示屏电路、蜂鸣器报警电路。因为这几个...
  • STM32cubeMX生成的程序,烧写一次程序后,再次烧写识别不到单片机 解决方法:Debug这里默认是No Debug,生成的程序烧写一次以后,就会出现再次烧写识别不到单片机的现象,把此选项选为Serial Wire即可解决问题。 ...
  • 此系统以道路上方架设的摄像机作为传感器,将路面交通图像传交通信息视频检测系统,对图像进行实时分析,提取出车辆运行交通信息数据(包括车流量、车速度、车辆密度等),通过一定的通信链路发给交通信息控制中心。...
  • 单片机烧录程序后如何运行

    千次阅读 2016-07-08 21:47:21
    一、 ...1、首先得保证程序正确,别有什么死循环之类的,根本运行不到灯亮的那句程序 2、在Keil里单步运行,通过寄存器观察器看看对应口是否有变化 3、然后确定是否连线正确,连线接口与程序是否对应
  • 最近大学课程里的单片机实训选了题目为DHT11温湿度检测系统,在本论坛看了很多大佬的资料后,自己简单写了一下能够完成任务的程序,主要使用了STC89C52单片机、LCD1602显示屏以及DHT11模块。模块的详细略过,直接贴...
  •  每次单片机加电,上电复位电路都要对电源电压VDD的上升过程进行检测,当VDD值上升规定值1.6~1.8V,就产生一个有效的复位信号,需经过72ms加1024个时钟周期的延时,才会使单片机复位。  2.人工复位...
  • 很多时候,我们想知道这些参数,但是由于懒惰或者没有简单的办法,将这件事推“明天”。笔者提出了一种简便的测试方法,可以解决这些问题。  测试代码的运行时间的思路: 使用单片机内部定时器,在待测程序段...
  • 本文介绍了一种基于单片机的心率体温检测系统。此次设计的电路部分主要包括:传感测量电路、放大电路、滤波整形电路、AD转换电路、控制电路、电源供电电路等。上位机为通过VC编程界面。 通过上位机按键控制,将...
  • 设定的参数具有掉电保存,保存在STC单片机的内部,上电无需重新设置; 3、当光照值高于设定的报警值或温度湿度超出上下限范围,蜂鸣器和指示灯会发出声光报警; 4、当温湿度值低于或高于设定的范围,相应的指示...
  • 单片机远程语音报警系统 张 伟 (中国电子科技集团公司第20研究所 陕西西安 710068) 工业控制中,很多设备是间断运行或无人职守,为了保证设备的正常运转,需要维护人员经常现场勘察设备是否正常,若设备距离很远...
  • 视频链接: 该设计是由AT89C51为主控芯片LCD1602液晶显示温度传感器红外人体感应热释电红外遥控组成 开机运行后屏幕显示当前温度值以及显示温度高低限控制风扇转...当热释电感应有人风扇开启,没人风扇开。 ...
  • 单片机基础-第一个单片机系统

    千次阅读 多人点赞 2020-05-14 10:17:11
    单片机基础-第一个单片机系统 简单的单片机系统 构成单片机系统——单片机+外围器件 如果把单片机和外围器件组合起来,实现一定的功能,那我们就称单片机和外围器件组成了单片机系统。 如何控制一个发光...
  • STC51系列单片机不断电自动下载程序

    千次阅读 2017-10-11 23:45:52
    以前在进行单片机编程比较烦恼的每次下载程序都需要断电,点击下载,再上电才能将程序下载到单片机,如果偶尔一两次这样操作可以忍受,但是往往我们都是需要调试代码,多次进行下载操作,不断的断电上电无疑对...
  • 本文是用于个人学习记录,如有...(已51单片机为例) 2.打开仿真 先看一下此刻sec所对应的的数字记录下 然后点击要你要运行的语句(在词条语句的数字行点击,点击完成红色) 点击运行按钮 运行后的...
  • 本篇文章主要介绍如何使用STM32CubeMX初始化STM32L431RCT6的EXIT检测按键,讲述了一些NVIC的小知识,并一步一步探索了HAL库的中断处理机制。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是...
  • 51单片机学习

    千次阅读 多人点赞 2021-01-21 21:01:56
    单片机概述 1.什么是单片机 2.单片机的特点及应用领域 3.单片机的发展趋势 4.学习51单片机需要哪些基础知识 5.如何快速的掌握51单片机 微型计算机的应用形态 将cpu芯片、存储器芯片、I/O接口芯片和简单的I/O设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,109
精华内容 4,443
关键字:

单片机运行时检测不到单片机