华维单片机编程-无线红外探测器03-环境搭建及程序详解

大家好,我是华维,专注10年单片机实战/教学/辅导

一、红外探测器需要实现的主要功能:

  • 红外报警检测
  • 电池低压检测
  • 防拆开关检测
  • OOK无线发射
  • 设备低功耗设计

二、搭建软件开发环境

本产品的主控芯片是STC15W204S

1. Keil软件的安装

关于Keil C51的安装我在这里就不给大家介绍了,这块视频教程大家直接在小破站搜华维单片机编程,看单片机c语言编程视频教程第4节即可。

2.安装STC的库文件到Keil软件里

①打开STC-ISP软件

②选择Keil仿真设置-> 增加型号和头文件到Keil中,如下图。

③选择Keil C51的安装目录,点击确定

④安装完成

3. 项目工程新建:

双击Keil 软件图标,打开软件

选择Project ->new uvision Project…

选择工程文件夹,给工程命名,然后点击确定

选择单片机对应的型号,如下图,点击OK

新建main.c 文件,并添加到工程中,在这里就给大家不介绍了。

三、软件设计

这里会对每个模块的代码进行详细讲解,整体源代码可以在公号华维单片机编程拿到。

1.红外报警检测

我们先看一下硬件接口:

  • 逻辑分析:

1. 无线红外报警触发的逻辑,我们在硬件设计中,已经有讲过, 如果红外报警PIR_ALARM 脚会有一个下降沿信号。

2. PIR_ALARM 连接到单片机的P3.6,也是单片机的外部中断2功能脚。

3. 单片机平时需要进入休眠状态,所有红外报警需要使用外部中断唤醒功能。

  • 我们先了解一下单片机的IO寄存器和外部中断2寄存器配置:

IO的寄存器介绍:

 STC单片机的IO有3个寄存器。例如P3.6 包括P3, P3M0、P3M1。

其中P3M0、P3M1是用来配置单片机IO的模式的具体如下:

无线红外报警器的P3.6口,我们配置为准双向口即可。

P3 口和传统51单片机的功能是一样的,P3的输入输出端口。

外部中断2的寄存器介绍:

 STC15W系列单片机的INT2只支持下降沿中断。详细的信息大家可以查阅STC15系列单片机的规格书。

外部中断2相关的寄存器INT_CLK0如下:

EX2= 1 打开外部中断2功能。

  • 软件程序开发:

程序初始化:

 
  1. sbit PIR_ALARM P3^6 ///定义红外报警的端口为P3.6
  2. unsigned char alarm_state; ///初始化为2 =0表示防拆报警 =1 表达红外报警
  3. ///P3.6 配置成准双向IO口
  4. P3M0 &= b10111111; //P3M0.6 = 0;
  5. P3M1 &= b10111111; //P3M1.6 =0;
  6. PIR_ALARM = 1; //准双向IO口是输入状态是,需要先把该端口置1
  7. ///初始化外部中断2
  8. INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中断
  9. EA = 1; //打开总中断开关
  10. 报警状态变量初始化
  11. alarm_state = 2;

外部中断2的中断服务函数

 
  1. void exint2() interrupt 10 //INT2中断入口
  2. { //无线红外报警
  3. alarm_state = 1;//
  4. }

报警信号处理程序

 
  1. if(ala
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F407IGT6单片机 HC-SR501人体红外感应模块(串口屏显示)KEIL软件工程源码, int main(void) { uint8_t state; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); HMI_USARTx_Init(); /* 初始化LED */ LED_GPIO_Init(); HC_SR501_GPIO_Init(); /* 无限循环 */ while (1) { state=HC_SR501_StateRead(); switch(state) { case HC_SR501_LOW: HMI_string_setting("page1.t1.txt=\"无人\""); break; case HC_SR501_HIGH: HMI_string_setting("page1.t1.txt=\"有人\""); break; } } } /** * 函数功能: 向串口屏发送数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_value_setting(const char *val_str,uint32_t value) { uint8_t tmp_str[30]={0}; uint8_t i; sprintf((char *)tmp_str,"%s=%d",val_str,value); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } /** * 函数功能: 向串口屏发送浮点数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_string_setting(const char *val_str) { uint8_t tmp_str[50]={0}; uint8_t i; sprintf((char *)tmp_str,val_str); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

华维单片机编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值