基于DS18B20温度传感器的HC-SR04超声波模块与温度报警的蓝牙连接 一:前言: 这个小项目算是我硬件学习的入门吧,我把其中的问题与大家分享一下,同样作为入门的一员 功能:(1)基于温度值算出声速从而计算障碍物的距离 (2)设定额定温度,超过额定温度五次发出警告
效果图:
发送“99”后,重置 输入合法温度值后,Distance为0是因为前方无障碍
二:项目的简单介绍 这个工程总共分为四个模块:显示模块1602;温度模块DS18B20;;超声波模块HC- SR04; 蓝牙模块HC-06; 显示模块1602,大家应该都比较清晰,这里不做过多描述。 附录代码: - #include<reg52.h> // 由于液晶我们这里只写不读,所以RW直接接地
- sbit dula = P2^;
- sbit wela =P2^; // 俩锁存器,观看各自原理图是否有
- sbit RS = P3^;
- sbit LCDEN =P3^; // RS与lcden接口
- void writeComm(ucharcomm) // 写指令
- {
- RS = 0;
- P0 = comm;
- LCDEN = 1;
- delayMs(1);
- LCDEN = 0;
- delayMs(1);
- }
-
- void writeData(uchardat) //写数据:RS=1, RW=0;
- {
- RS = 1;
- P0 = dat;
- LCDEN = 1;
- delayMs(1);
- LCDEN = 0;
- delayMs(1);
- }
- void init()
- {
- dula = wela = 0;
- writeComm(0x38);
- writeComm(0x0c);
- writeComm(0x06);
- writeComm(0x01);
-
- }
复制代码 温度模块:DS18B20模块,不过多描述,想要说一下负温度的计算与读取,网上资料也比较多一些。首先要了解,LS(低字节)的高四位 和 MS(高字节)的低四位共8个字节构成了实际的一个带符号位的字节数据可以表示18B20的温度范围。MS的高四位为符号为的扩展,当温度值为正时MS高5位全为0,温度值为负时全为1。第一种:读取的温度为负数时,MS高五位全1,我们已经得到十六位数据value, 如果value<0x0fff,则为正,反之为负数 第二种:Hvalue&0x1f==1,为负温度,Hvalue为MS; 代码如下:
超声波模块:HC-SR04模块 具体可以看模块说明书 附录代码,主要看注释 其中要了解的基础知识点:(1)‘\0’与‘0’ 1)’\0’,就是空字符,代表字符串结束的标志。对应的ASCLL码是0(NULL) 2)’0’,字符常量,表示字符0,对应的ASCLL码是48,也就是0x30
(2)单片机内不同进制数计算 运算时机器都是转换为二进制计算,所以书写没有必要转换为统一的进制表达
蓝牙模块:HC-06 主要介绍见代码,AT指令集可以查使用手册 - void init_uart_and_HC() // 串口与HC模块的初始化
- {
- TMOD=0X21; //设置定时器模式
- PCON=0X00; //设置电源寄存管理器
- SCON=0x50; //串行口控制管理器
- TH1=0XFD;
- TL1=0XFD;
- //设定9600波特率
- TH0=0XFC;
- TL0=0X66;
- //对HC-SR04所用定时器赋初值
- TR1=1;
- ET0=1;
- EA=1;
- ES=1;
- }
- void uart_senddata(char dat) // 串口发送单位数据
- {
- ES=0;
- SBUF=dat;
- while(!TI);
- TI=0;
- ES=1;
- }
- void uart_sendstr(char *p) // 串口发送字符串
- {
- ES=0;
- do
- {
- uart_senddata(*p);
- }
- while(*p++!='\0');
- ES=1;
- }
- void delayUs()
- {
- _nop_();
- }
- void delayMs(uint a)
- {
- uint i, j;
- for(i = a; i > 0; i--)
- for(j = 110; j > 0; j--);
- }
复制代码主函数:
整体思想: (1) mode,flag为主要参数,mode决定是否进入运行,是否响应 (2) 对输送数据的发送接收要清晰
可以改进的几点: (1) 设定温度可以到小数点后俩位,提高精确度,只需要加一个判断小数点的函数 (2) 可以将功能提高一些,比如判断距离或其他 |