数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1199|回复: 34

[other] 求助,在单片机已有程序中如何添加24小时某个引脚触发一次低电平

[复制链接]
发表于 2024-10-12 17:23:04 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 枫飞秋语 于 2024-10-12 17:31 编辑


求助,在单片机已有程序中如何添加24小时某个引脚触发一次低电平,我这个是瞎搞的,利用蓝牙主从模块回连状态灯控制地锁遥控,但是发现主模块时间长了,蓝牙信号不见了,像死机了,造成回连不成功,问了客服说加个复位程序,小弟智商有限,蓝牙程序不会弄,只有在单片机这动一下了,不知道怎么写,才可以让一个引脚24小时输出一次低电平控制蓝牙模块复位,但又不影响程序一直监控回连状态,求大神帮帮帮忙。
芯片型号 : STC15W104

#include <reg52.h>  
#include "intrins.h"
sfr P3M0=0xB2;
sfr P3M1=0xB1;
sbit sheng=P3^0;
sbit jiang=P3^1;
sbit dianping=P3^5;

unsigned char x=0;

void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 2;
        j = 134;
        k = 20;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void DelayMs(unsigned int n)
{
   do
   {
          Delay200ms();
   }
         while(n--);
}

void main()
{
        P3M0 = 0x03;
P3M1 = 0x00;
        sheng=0;
        jiang=0;
        dianping=1;
if(dianping==1)
{
x=1;
}
else
{
x=0;
}
    DelayMs(10);
                sheng=1;
         DelayMs(1);
                sheng=0;
while(1)
{
if(dianping==1 && x==0)
{
                jiang=1;
         DelayMs(1);
                jiang=0;
                 DelayMs(5);
                jiang=1;
         DelayMs(1);
                jiang=0;
x=1;
}
else if(dianping==0 && x==1)
{
        sheng=1;
         DelayMs(1);
                sheng=0;
                 DelayMs(5);
                sheng=1;
         DelayMs(1);
                sheng=0;
x=0;
}
                 DelayMs(5);
}
}

 楼主| 发表于 2024-10-12 17:43:51 | 显示全部楼层
在STC上,这个芯片最大只能定时1毫秒吗?

void Timer0_Isr(void) interrupt 1
{
}

void Timer0_Init(void)                //1毫秒@12.000MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x20;                                //设置定时初始值
        TH0 = 0xD1;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-12 22:45:56 | 显示全部楼层
猪小呆 发表于 2024-10-12 20:27
https://www.mydigit.cn/thread-439202-1-1.html

看了,还是懵逼
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-12 22:46:36 | 显示全部楼层
595953427@qq 发表于 2024-10-12 20:33
用freertos,直接添加一个任务就行了

这个更高端了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-13 01:39:37 | 显示全部楼层
t3486784401 发表于 2024-10-12 22:55
加个光敏电阻?日升日落重启一把?

大哥,你的办法不错,硬件重启
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-13 17:11:17 | 显示全部楼层
kindzhon 发表于 2024-10-13 16:13
这个电路也不简单。

是啊,后面睡觉时想了想,蓝牙模块重启复位只需要一个脚接地短接一下就行了,这个光感也做不到点动,估计还是得回到单片机程序判断做一次点动。。硬搭硬件的话,我就想到搭个延时关闭,模拟点动了一次,我之前有个小的延时板子,最低也只能做到通电3秒
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-18 00:42:44 | 显示全部楼层
mmxx2015 发表于 2024-10-17 09:43
程序很短,可能功能也很简单,但是,在使用delay()大法的程序中增加功能容易引起原来的程序功能不正常。 ...

是啊,很简单的,就是检测一个引脚的高低电平,在电平变化的时候做不同的通断(模拟遥控器的两个按键),,只是现在碰到的问题是负责输出高低电平的蓝牙模块会死机,就想一天(不需要精确)拉低一次蓝牙模块的复位脚,复位一次防死机
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-18 00:45:37 | 显示全部楼层
kindzhon 发表于 2024-10-17 09:22
用单片机的延时搞24小时非常的不准,不然就不需要RTC芯片了。当然如果你不介意一天差几秒甚至几分钟,用也 ...

嗯,不用很精确的,目的就是大概1天复位一次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-18 00:48:58 | 显示全部楼层
devcang 发表于 2024-10-16 09:32
楼主 ,,大概隔多长时间的话,抄一下“下载工具的定时程序,用一个变量计数,到差不多时间,就拉低一下 ...

目前6MHz,12T模式,最高131毫秒,,一天要计数659542次?会崩盘吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-18 00:49:32 | 显示全部楼层
mmxx2015 发表于 2024-10-17 09:25
其实,LZ要求的时间不需要很准,差半个小时都可以。

是的,你懂我的想法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-19 02:00:35 | 显示全部楼层
wpppmlah 发表于 2024-10-18 08:46
//参考一下,加入到代码 中.
//定义计时变量
unsigned int hour = 0;//小时

这让我眼前一亮哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-19 02:03:00 | 显示全部楼层
chanwah2009 发表于 2024-10-18 09:35
外挂一个ds1307吧,,又简单又精准,做个boom弹都可以

手里没呢,,其实想最好不加硬件呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-21 15:29:21 | 显示全部楼层
ckvlhf 发表于 2024-10-20 20:59
你是要用STC的IO定时复位蓝牙吗?用STC内部定时器生成定时中断不就行了。

开始不知道怎么写计时24小时才稳妥
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-25 01:52:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-30 00:22:43 | 显示全部楼层
突发奇想,我的主程序可否用掉电模式来判断执行一次性的操作指令呢?

#include "reg51.h"
#include "intrins.h"

//-----------------------------------------------

bit FLAG;                       //1:上升沿中断 0:下降沿中断

sfr P3M0=0xB2;
sfr P3M1=0xB1;
sbit sheng=P3^0;
sbit jiang=P3^1;
sbit dianping=P3^5;

void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 2;
        j = 134;
        k = 20;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void DelayMs(unsigned int n)
{
   do
   {
          Delay200ms();
   }
         while(n--);
}
//-----------------------------------------
//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
    FLAG = dianping;                //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)
}

//-----------------------------------------------

void main()
{
       P3M0 = 0x03;
       P3M1 = 0x00;
        sheng=0;
        jiang=0;
        dianping=1;


         DelayMs(10);
                sheng=1;
         DelayMs(1);
                sheng=0;

    IT0 = 0;                    //设置INT0的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒

    EX0 = 1;                    //使能INT0中断
    EA = 1;

    while (1)
    {
        PCON = 0x02;            //MCU进入掉电模式
        _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
        _nop_();
if(PCON ==1)
{
                sheng=1;
         DelayMs(1);
                sheng=0;
                 DelayMs(5);
                sheng=1;
         DelayMs(1);
                sheng=0;
}
else
{       jiang=1;
         DelayMs(1);
                jiang=0;
                 DelayMs(5);
                jiang=1;
         DelayMs(1);
                jiang=0;
}
    }
}








回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-30 03:36:01 | 显示全部楼层
上面写错了个if,应该是if(FLAG ==1),感觉好像应该把判断执行放在中断里面?

#include "reg51.h"
#include "intrins.h"
//-----------------------------------------------
bit FLAG;                       //1:上升沿中断 0:下降沿中断
sfr P3M0=0xB2;
sfr P3M1=0xB1;
sbit sheng=P3^0;
sbit jiang=P3^1;
sbit dianping=P3^5;

void Delay200ms()                //@12.000MHz
{
        unsigned char i, j, k;
        _nop_();
        i = 2;
        j = 134;
        k = 20;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void DelayMs(unsigned int n)
{
   do
   {
          Delay200ms();
   }
         while(n--);
}

//-----------------------------------------

//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
    FLAG = dianping;                //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)
    if(FLAG ==1)
{
         sheng=1;
         DelayMs(1);
         sheng=0;
         DelayMs(5);
         sheng=1;
         DelayMs(1);
         sheng=0;
}
else
{       jiang=1;
         DelayMs(1);
         jiang=0;
         DelayMs(5);
         jiang=1;
         DelayMs(1);
         jiang=0;
}
}
//-----------------------------------------------

void main()
{
       P3M0 = 0x03;
       P3M1 = 0x00;
       sheng=0;
       jiang=0;
       dianping=1;
       DelayMs(10);
       sheng=1;
       DelayMs(1);
       sheng=0;
    IT0 = 0;                    //设置INT0的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
    EX0 = 1;                    //使能INT0中断
    EA = 1;

    while (1)
    {
        PCON = 0x02;            //MCU进入掉电模式
        _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
        _nop_();
    }
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-30 22:01:56 | 显示全部楼层
sayno_86 发表于 2024-11-30 15:58
/*********************************************
函数名:Clock()
函数功能:时钟

哥,这个太高端了,超过我的认知了
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-19 07:25 , Processed in 0.218400 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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