找回密码
 立即注册
查看: 101|回复: 5

定时器计时期间无法通过读取传感器数据清除定时器计数值

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-11 11:14:23
已绑定手机

1

主题

3

回帖

33

积分

新手上路

积分
33
发表于 2025-5-26 15:16:05 | 显示全部楼层 |阅读模式
求助大佬们!目前程序想在Sensor_Task_Dark函数中,通过读取PIR_Data热释电人体传感器的值进行定时器计时20s,然后在20s期间读取热释电人体传感器如果读取到人在的值就重新开始计时20s。目前无法重新开始计时20s,必须计数完成后才能进行下一次读取。主程序如下:

#include "Config.h"
//========================================================================
#include "RGB_Gradient.h"
#include "App_Pwm.h"
#include "App_GPIO.h"
#include "App_Timer.h"
#include "Touch_Key.h"
#include "App_ADC.h"
#include "KEY.h"
#include "YS312.h"
#include "Sleep_Mode.h"
#include "Delay.h"
//#include "UART.h"
//========================================================================
//全局使用
volatile u8 SYS_Mode = 0;                //系统模式:0-待机,1-常亮,2-夜晚感应
//待机模式使用
bit First_In_Standby_Task_Flag         = 0;        //第一次进入待机模式标志位

//夜间感应使用
volatile u8 PIR_Data = 0;                                                                                        //YS312感应数据,初始化为0,表示未感应到人
//bit CDS_Data = 1;                     //光敏CDS感应数据,初始化为1,表示为亮光状态
extern bit CDS_Result;
bit First_In_Sensor_Task_Flag         = 0;  //第一次进入感应模式标志位
bit Choose_Sensor_Flag = 0;                                                //选择传感器标志位:0,选择先光敏再人体。1,选择人体
//========================================================================
/****当前颜色****/
extern u8 CurRed;               
extern u8 CurGreen;
extern u8 CurBlue;

/****感应模式延时20s标志位****/
extern volatile bit Open_20s_Timer_Flag;        //定时器打开计时20s标志位
extern volatile bit Timer_20s_Flag;                         //定时器计时20ms标志位
/****感应模式定时器延时20s的计数位****/
extern volatile u32        Timer0_Cnt1;
//========================================================================
/*********待机模式*********/
void Standby_Task(void)
{
        //进入待机(渐灭) ,睡眠模式
        if(First_In_Standby_Task_Flag == 1)
        {
                Fade_Out_RGB(CurRed,CurGreen,CurBlue);
                CurRed = 0;               
                CurGreen = 0;
                CurBlue = 0;
                First_In_Standby_Task_Flag = 0;
        }
        Sleep_Handler2();//进入掉电睡眠模式
}

/*********常亮模式*********/
void Constant_Loop_Task(void)
{
        RGB_Gradient_Handler();
}

/*********夜间感应模式*********/
void Sensor_Task_Dark(void)
{
                //进入夜间感应:闪烁两次
                if(First_In_Sensor_Task_Flag == 1)
                {
                                RGB_Flicker(CurRed,CurGreen,CurBlue);
                                First_In_Sensor_Task_Flag = 0;
                }
               
                //直接先获取YS312和CDS的数据
                PIR_Data = PIR_Read();
                CDS_GetHandler();

               
                if(Choose_Sensor_Flag == 0)
                {//先判断光敏再判断YS312
                        if(CDS_Result == 0)
                        {//暗光
                                if(PIR_Data == 1)
                                {//感应到人
                                        Timer0_Cnt1 = 0;
                                        Choose_Sensor_Flag = 1;//选择再次进入为直接判断YS312        
                                        Timer_20s_Flag = 0;                        //将定时器完成20s计时标志位置0
                                        Open_20s_Timer_Flag = 1;//打开定时器20s计时标志位
                                }
                        }                                
                }
                else if(Choose_Sensor_Flag == 1)
                {//仅判断YS312
                        if(PIR_Data == 1)
                        {//感应到人
                                Timer0_Cnt1 = 0;
                                Timer_20s_Flag = 0;                        //将定时器完成20s计时标志位置0
                                Open_20s_Timer_Flag = 1;//打开定时器20s计时标志位
                        }        
                }

                //通过判断Timer_20s_Flag来让RGB灯工作
                if(Timer_20s_Flag == 0)
                {//检测到人后时间未到——>开灯
                        RGB_Gradient_Handler();
                }
                else
                {//未检测到人或者定时器20s结束 进入
                        RGB_Set(0,0,0);
                        Choose_Sensor_Flag = 0;
                        if(CDS_Result == 1)
                        {
                                //进入掉电模式,等待INT4(KEY)唤醒
                                Sleep_Handler2();//需要用非阻塞延时来让进入掉电模式不是随时进入
                        }
                        else
                        {//暗光
                                //进入掉电模式
                                Sleep_Timer_Mode();
                        }
                }
}
//========================================================================
/*********整个项目的入口任务*********/
void Project_Enter_Task(void)
{
         switch(SYS_Mode)
        {
                case 0://待机
                        Standby_Task();
                        break;
                case 1://常亮
                        Constant_Loop_Task();
                        break;
                case 2://夜晚感应
                        Sensor_Task_Dark();
                        break;
        }
}
//========================================================================
void main(void)
{
        EAXSFR();                /* 扩展寄存器访问使能 :P_SW2 |= 0x80;        */
        GPIO_Init();
        KEY_Init();
        PWM_Init();
        Touch_Key_Init();
        ADC_config();
//        Uart1_Init();
        PIR_Init();


        
        Timer0_Init();
        Timer1_Init();

        EA = 1;
        
        while (1)
        {
                 Project_Enter_Task();
        }
}
test_pir.7z (130.68 KB, 下载次数: 7)



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-11 11:14:23
已绑定手机

1

主题

3

回帖

33

积分

新手上路

积分
33
发表于 2025-5-26 15:17:31 | 显示全部楼层
跪求大佬解答
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-11 11:14:23
已绑定手机

1

主题

3

回帖

33

积分

新手上路

积分
33
发表于 2025-5-26 15:57:28 | 显示全部楼层
这是我目前使用的keil5的版本信息
截图202505261557084048.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1920

回帖

4311

积分

荣誉版主

无情的代码机器

积分
4311
发表于 2025-5-26 16:15:59 | 显示全部楼层
定时器部分看着没问题。怎么判断PIR_Read正常的呢
三天不学习,赶不上刘少奇~
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-06-11 11:14:23
已绑定手机

1

主题

3

回帖

33

积分

新手上路

积分
33
发表于 2025-5-26 16:36:39 | 显示全部楼层
erci*** 发表于 2025-5-26 16:15
定时器部分看着没问题。怎么判断PIR_Read正常的呢

谢谢大佬,我使用逻辑分析仪抓取了一下我热释电传感器的数据,发现是传感器后续获取数据出现错误的原因导致无法改变定时器的值。改了YS312热释电驱动程序后就可以使用了。再次感谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-06-16 08:41:37
已绑定手机

67

主题

1920

回帖

4311

积分

荣誉版主

无情的代码机器

积分
4311
发表于 2025-5-26 16:42:56 | 显示全部楼层
ccc*** 发表于 2025-5-26 16:36
谢谢大佬,我使用逻辑分析仪抓取了一下我热释电传感器的数据,发现是传感器后续获取数据出现错误的原因导 ...

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 00:10 , Processed in 0.129359 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表