【STC8A8K64D4开发板】第3-4讲:雨滴传感器检测雨水

第3-4讲:雨滴传感器检测雨水

    1. 学习目的
  1. 了解雨滴传感器的功能。
  2. 掌握单片机编程读取雨滴传感器数字输出和模拟输出,从而判断有没有下雨。
    1. 雨滴传感器简介

雨滴传感器是一款用来检查是否下雨以及雨量大小的传感器模块,如下图所示。雨滴传感器包括雨滴感应板和控制模块,雨滴感应板传感器采用高品质的FR-04双面材料,面积超大(4.0×5.3cm),其表面采用镀镍处理,具有对抗氧化、高导电性、长寿命等优点。

图1:雨滴传感器

  1. 雨滴传感器参数

图2:雨滴传感器尺寸

雨滴传感器模块各个引脚功能如下表所示。

表1:雨滴传感器模块引脚描述

序号

针脚名称

功能描述

1

VCC

模块3.3V~5V供电正。

2

GND

模块供电负。

3

DO

数字量输出(高低电平)。

4

AO

模拟量输出。

  1. 雨滴传感器功能

接上电源后(3.3V~5V电源供电),电源指示灯点亮。感应板上没有水滴时,DO 输出为高电平,感应板上有雨水时,DO 输出为低电平,调节雨滴传感器控制板上的电位器可以调整检测的灵敏度。

雨滴传感器的AO 为模拟输出,单片机可以使用ADC采样AO输出的电压,从而判断雨量的大小。雨量越大,AO引脚输出的电压越低。

    1. 软件设计
      1. 雨滴传感器实验
  • 注:本节的实验是在“实验2-11-1:ADC采样电位器电压(查询方式)”的基础上修改,本节对应的实验源码是:“实验3-4-1:雨滴传感器检测雨水实验”。
        1. 实验内容

单片机实时读取雨滴传感器的数字输出引脚DO的状态,同时通过ADC采样雨滴传感器模拟输出引脚AO的电压值,并通过串口输出检测结果。

  1. 当雨滴传感器感应板没有检测到雨水时,DO引脚输出为高电平,AO引脚电压值为2.5V。
  2. 当雨滴传感器感应板检测到雨水时,DO引脚输出为低电平,AO引脚电压值为降低,雨水量越大,AO引脚输出电压越低。
        1. 代码编写
  • 关于ADC应用相关的内容,读者可以参阅《第2-11讲:模数转换ADC》,本节我们关注的是雨滴传感器。

本节的代码比较简单,我们直接在“main.c”文件中编写相关的代码。

  1. 定义引脚

首先,定义连接雨滴传感器的引脚,本例中,我们用P7.6连接雨滴传感器的数字输出引脚(DO),P0.6(ADC14)连接雨滴传感器的模拟输出引脚(AO)。P0.6由ADC初始化代码配置,这里我们只需要定义P7.6就可以了。

代码清单:定义引脚

  1. sbit sensor_in = P7^6;     //用于读取雨滴传感器数字输出引脚(DO)状态
  1. 监测雨滴传感器状态

P7.6配置为输入,程序中通过读取P7.6的电平判断雨滴传感器感应板是否检测到雨水,通过采样AO引脚的电压判断雨量的大小,并通过串口输出结果,代码清单如下。

代码清单:主函数

  1. /************************************************************************** 
  2. 功能描述:主函数 
  3. 入口参数:无 
  4. 返 回 值:int类型 
  5. **************************************************************************/  
  6. int main(void)  
  7. {  
  8.     u16 adc_value;  //存放ADC采样值  
  9.     float voltage;  //存放ADC采样值计算后的电压值  
  10.       
  11.     P2M1 &= 0xBF;   P2M0 &= 0xBF;     //设置P2.6为准双向口(LED1)  
  12.     P3M1 &= 0xFE;   P3M0 &= 0xFE;     //设置P3.0为准双向口(串口1的RxD)  
  13.     P3M1 &= 0xFD;   P3M0 |= 0x02;     //设置P3.1为推挽输出(串口1的TxD)  
  14.     P7M1 &= 0xBF;   P7M0 &= 0xBF;     //设置P7.6为准双向口(雨滴传感器数字口)  
  15.       
  16.     uart1_init();                     //串口1初始化  
  17.     adc_config();                     //初始化ADC  
  18.       
  19.     while(1)  
  20.     {  
  21.         if(sensor_in == 0)            //雨滴传感器检测到雨滴,数字输出引脚(DO)输出低电平  
  22.         {  
  23.             led_on(LED_2);            //点亮用户指示灯D2,指示检测到雨水  
  24.             printf("检测到雨水\r\n");  //串口输出提示信息  
  25.         }  
  26.         else                       
  27.         {  
  28.             led_off(LED_2);           //熄灭用户指示灯D2  
  29.         }  
  30.           
  31.         adc_start();                          //启动ADC转换  
  32.         while(adc_completed() == false);      //等待ADC转换完成  
  33.         led_toggle(LED_1);                    //翻转指示灯D1状态,指示一次ADC采样完成  
  34.   
  35.         adc_value = get_adc_value();          //读取ADC采样值  
  36.         voltage   = (2.5*adc_value)/4096;     //将ADC采样值转换为电压(单位V)  
  37.         printf("voltage: %.2fV\r\n",voltage);//串口打印ADC采样电压  
  38.         delay_ms(500);                        //延时500ms,方便在串口调试助手中观察实验数据  
  39.     }  
  40. }  
        1. 硬件连接

如下图所示,用杜邦线将雨滴模块控制板的VCC和GND分别连接到开发板J19端子的3.3V(开发板选择的工作电源是3.3V,所以连接3.3V,如果选择的工作电源是5V,则连接到J18端子的5V上)和GND上;DO连接到J9端子的P76;AO连接到J27端子的P06。

图3:硬件连接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验3-4-1:雨滴传感器检测雨水实验”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\rain_sensor\project”目录下的工程文件“rain_sensor.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“rain_sensor.hex”位于工程的“…\rain_sensor\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 电脑上打开串口调试助手,选择开发板对应的串口号,将波特率设置为9600bps。
  6. 程序运行后,可以观察到串口调试助手接收窗口显示的电压值是2.5V,向雨滴传感器感应板上滴几滴水,即可观察到电压降低并且提示检测到雨水,如下图所示。

图4:串口调试助手中观察雨水检测结果

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是STC8A8K64D4单片机与JDY-31蓝牙模块进行通信的基本代码: ```c #include <STC8.H> #include <intrins.h> #define FOSC 24000000L //系统时钟频率 #define BAUD 9600 //串口波特率 #define MD0 P3_0 //定义STC8A8K64D4 P3.0引脚作为蓝牙模块的模式选择引脚 bit busy; //串口忙标志位 unsigned char RcvBuff; //串口接收缓冲区 void InitUART() //初始化串口 { SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0F; //清除原来的定时器设置 TMOD |= 0x20; //设定定时器1为8位自动重装方式 TH1 = TL1 = -(FOSC/12/32/BAUD);//设定波特率 TR1 = 1; //启动定时器1 ES = 1; //串口中断允许 EA = 1; //总中断允许 } void UART_SendByte(unsigned char dat) //串口发送一个字符 { while(busy); //等待前面的数据发送完成 busy = 1; SBUF = dat; //写数据到UART数据寄存器 } void main() { InitUART(); //初始化串口 while(1) { MD0 = 0; //将P3.0引脚置为低电平,使蓝牙模块进入AT指令模式 UART_SendByte('A'); //向蓝牙模块发送AT指令 MD0 = 1; //将P3.0引脚置为高电平,使蓝牙模块退出AT指令模式 } } void UART_Isr() interrupt 4 using 1 //串口中断服务程序 { if(RI) { RI = 0; RcvBuff = SBUF; } if(TI) { TI = 0; busy = 0; } } ``` 以上代码实现了串口初始化、发送一个字符的函数以及主函数中对蓝牙模块的AT指令操作。其中,P3.0引脚作为蓝牙模块的模式选择引脚,当该引脚为低电平时,蓝牙模块进入AT指令模式;当该引脚为高电平时,蓝牙模块退出AT指令模式。此外,还需要注意将STC8A8K64D4单片机的串口接口连接到JDY-31蓝牙模块的TX和RX引脚上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电子友人张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值