打印
[技术讨论]

小白请教各位大神,延时函数怎么写?

[复制链接]
1883|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
曾小白|  楼主 | 2024-11-25 16:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
各位大佬,想要在这个程序的基础上增加一个延时函数,作用是想要在上电前三秒系统不工作,所以想延时3s才开始工作,按键生效。
#include <sc.h>//芯片头文件,会根据工程选项自动寻找对应型号头文件

#define uint8_t  unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long int


#define  FinshDingShi_8H              959  //定时8小时
#define  FinshDingShi_12H            1439  //定时12小时
#define  DLU_FinshDingShi            2879  

//#define  FinshDingShi_4MIN             7   //3MIN
//#define  DLU_FinshDingShi            11  //6MIN   

#define  LED1    RB1
#define  LED2    RB0
#define  LED3    RB4

#define  PTC_EN    RB2

#define  KEY       RB3

#define  FST       RB5

volatile  bit  Start_flat;
volatile  bit  Get_AC220_flat;
volatile  bit  biaozhi1;
volatile  bit  PTC_GPIO_flat;
volatile  uint16_t  tt=0;
volatile  uint16_t  aa=0;
volatile  uint16_t  Timer=0;
volatile  uint8_t   count=0;
volatile  uint8_t   Ptc_DingShi_flat=0;
volatile  uint8_t   count1=0;

void Init_System();


void   KEY_Ptc_DingShi_Scan(void)
{
   if(KEY)
   {
      if(count1>5)
      {
         Ptc_DingShi_flat++;
            if(Ptc_DingShi_flat>3)Ptc_DingShi_flat=0;
            aa=0;Timer=0;
         count1=0;
      }
      biaozhi1=0;count1=0;   
   }
   else if(biaozhi1==0)
   {
      if(KEY==0)
      {
         count1++;
         if(count1==65500)
         {
            count1=0;biaozhi1=1;
         }
      }
   }
}

void main()
{
Start_flat=0;
    Get_AC220_flat=0;
biaozhi1=0;
PTC_GPIO_flat=0;
Init_System();
Get_AC220_flat=1;
while(1)
{
asm("clrwdt");
KEY_Ptc_DingShi_Scan();
if(!FST)
{

if(!FST)
{
if(Start_flat==1)
{
aa++;
if(aa>=1500)
{
aa=0;
Timer++;
}  
}
count++;
if(count>2)
{
Get_AC220_flat=1;
count=0;
}
while(!FST);
}
}
if(Get_AC220_flat==1)
{
if(Ptc_DingShi_flat==0)
{
LED1=0;LED2=0;LED3=0;
PTC_EN=0;PTC_GPIO_flat=0;
Start_flat=0;   
}
else if(Ptc_DingShi_flat==1)
{
Start_flat=1;
LED1=0;
LED3=0;
if(Timer<=FinshDingShi_8H )
              {
LED2=1;
PTC_EN=1;
PTC_GPIO_flat=1;
              }
              else   if((Timer>FinshDingShi_8H )&&(Timer<=DLU_FinshDingShi))
              {
LED2=0;
PTC_EN=0;
PTC_GPIO_flat=0;
              }
              else if(Timer>DLU_FinshDingShi)
              {
Timer=0;aa=0;
              }
}
else if(Ptc_DingShi_flat==2)
{
Start_flat=1;
LED2=0;
LED3=0;
if(Timer<=FinshDingShi_12H )
              {
LED1=1;
PTC_EN=1;
PTC_GPIO_flat=1;
              }
              else   if((Timer>FinshDingShi_12H )&&(Timer<=DLU_FinshDingShi))
              {
LED1=0;
PTC_EN=0;
PTC_GPIO_flat=0;
              }
              else if(Timer>DLU_FinshDingShi)
              {
Timer=0;aa=0;
              }
}
else if(Ptc_DingShi_flat==3)//定时24小时=浅黄
{
Start_flat=1;
LED2=0;
LED1=0;
LED3=1;
PTC_EN=1;
PTC_GPIO_flat=1;
}
}
}
}
谢谢大佬们

使用特权

评论回复
评论
曾小白 2024-11-26 12:16 回复TA
@xch :就是为了防止误判,通电后前三秒执行任何操作无效 
xch 2024-11-26 10:15 回复TA
“上电前系统不工作3秒” 好古怪的需求。也许烧柴油的内燃机可以工作。 

相关帖子

沙发
曾小白|  楼主 | 2024-11-25 16:07 | 只看该作者
请问如何根据单片机内部晶振,设置延时函数?计算方式是什么样的?
求教!!!

使用特权

评论回复
板凳
曾小白|  楼主 | 2024-11-26 08:42 | 只看该作者
有没有大佬帮帮忙啊?

使用特权

评论回复
地板
咕咕呱呱孤寡| | 2024-11-26 08:50 | 只看该作者
定时器延时也行啊

使用特权

评论回复
5
曾小白|  楼主 | 2024-11-26 09:10 | 只看该作者

那定时器延时该如何写?我纯新手,不太会

使用特权

评论回复
6
咕咕呱呱孤寡| | 2024-11-26 09:15 | 只看该作者
找个定时器的例程,自己看看计时是怎么整的,然后自己加判断,到你设定的值就启动

使用特权

评论回复
7
xionghaoyun| | 2024-11-26 11:29 | 只看该作者
while

使用特权

评论回复
8
前功尽弃| | 2024-11-26 11:36 | 只看该作者
曾小白 发表于 2024-11-26 09:10
那定时器延时该如何写?我纯新手,不太会

程序是怎么在执行流程的先去搞懂,这样你能明白怎么操作延时了 。或则花点学费,哈哈

使用特权

评论回复
9
chenczyaa| | 2024-11-26 13:07 | 只看该作者
这个要看你的晶振的啊,百度一下,直接用for就好了,放在main里的第一个运行就行了

使用特权

评论回复
10
丙丁先生| | 2024-11-26 13:57 | 只看该作者
本帖最后由 丙丁先生 于 2024-11-26 13:59 编辑

//好的,我会逐行注释代码并添加延时函数。
//```c
#include <sc.h> // 芯片头文件,会根据工程选项自动寻找对应型号头文件
#define uint8_t  unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long int
// 定时时间定义
#define FinshDingShi_8H              959  // 定时8小时
#define FinshDingShi_12H            1439  // 定时12小时
#define DLU_FinshDingShi            2879  // 总定时时间
// #define FinshDingShi_4MIN             7   // 3分钟
// #define DLU_FinshDingShi            11  // 6分钟   
#define LED1    RB1
#define LED2    RB0
#define LED3    RB4
#define PTC_EN    RB2
#define KEY       RB3
#define FST       RB5
volatile bit Start_flat;
volatile bit Get_AC220_flat;
volatile bit biaozhi1;
volatile bit PTC_GPIO_flat;
volatile uint16_t tt = 0;
volatile uint16_t aa = 0;
volatile uint16_t Timer = 0;
volatile uint8_t count = 0;
volatile uint8_t Ptc_DingShi_flat = 0;
volatile uint8_t count1 = 0;
void Init_System();
// 按键扫描和定时器设置函数
void KEY_Ptc_DingShi_Scan(void) {
    if (KEY) {
        if (count1 > 5) {
            Ptc_DingShi_flat++;
            if (Ptc_DingShi_flat > 3) Ptc_DingShi_flat = 0;
            aa = 0; Timer = 0;
            count1 = 0;
        }
        biaozhi1 = 0; count1 = 0;   
    } else if (biaozhi1 == 0) {
        if (KEY == 0) {
            count1++;
            if (count1 == 65500) {
                count1 = 0; biaozhi1 = 1;
            }
        }
    }
}
// 延时函数,单位为秒
void delay(uint16_t seconds) {
    for (uint16_t i = 0; i < seconds; i++) {
        for (uint16_t j = 0; j < 1000; j++) {
            for (uint16_t k = 0; k < 1000; k++) {
                asm("nop"); // 空操作,用于延时
            }
        }
    }
}
void main() {
    Start_flat = 0;
    Get_AC220_flat = 0;
    biaozhi1 = 0;
    PTC_GPIO_flat = 0;
    Init_System();
    Get_AC220_flat = 1;
    // 上电后延时3秒
    delay(3);
    while (1) {
        asm("clrwdt"); // 清除看门狗计时器
        KEY_Ptc_DingShi_Scan(); // 扫描按键和定时器
        if (!FST) {
            if (!FST) {
                if (Start_flat == 1) {
                    aa++;
                    if (aa >= 1500) {
                        aa = 0;
                        Timer++;
                    }  
                }
                count++;
                if (count > 2) {
                    Get_AC220_flat = 1;
                    count = 0;
                }
                while (!FST);
            }
        }
        if (Get_AC220_flat == 1) {
            if (Ptc_DingShi_flat == 0) {
                LED1 = 0; LED2 = 0; LED3 = 0;
                PTC_EN = 0; PTC_GPIO_flat = 0;
                Start_flat = 0;   
            } else if (Ptc_DingShi_flat == 1) {
                Start_flat = 1;
                LED1 = 0;
                LED3 = 0;
                if (Timer <= FinshDingShi_8H) {
                    LED2 = 1;
                    PTC_EN = 1;
                    PTC_GPIO_flat = 1;
                } else if ((Timer > FinshDingShi_8H) && (Timer <= DLU_FinshDingShi)) {
                    LED2 = 0;
                    PTC_EN = 0;
                    PTC_GPIO_flat = 0;
                } else if (Timer > DLU_FinshDingShi) {
                    Timer = 0; aa = 0;
                }
            } else if (Ptc_DingShi_flat == 2) {
                Start_flat = 1;
                LED2 = 0;
                LED3 = 0;
                if (Timer <= FinshDingShi_12H) {
                    LED1 = 1;
                    PTC_EN = 1;
                    PTC_GPIO_flat = 1;
                } else if ((Timer > FinshDingShi_12H) && (Timer <= DLU_FinshDingShi)) {
                    LED1 = 0;
                    PTC_EN = 0;
                    PTC_GPIO_flat = 0;
                } else if (Timer > DLU_FinshDingShi) {
                    Timer = 0; aa = 0;
                }
            } else if (Ptc_DingShi_flat == 3) { // 定时24小时=浅黄
                Start_flat = 1;
                LED2 = 0;
                LED1 = 0;
                LED3 = 1;
                PTC_EN = 1;
                PTC_GPIO_flat = 1;
            }
        }
    }
}
//```

757156737ed2f4a00a.png (430.63 KB )

757156737ed2f4a00a.png

964706737ecf530b55.png (430.63 KB )

964706737ecf530b55.png

466706737ace4169e1.png (101.89 KB )

466706737ace4169e1.png

使用特权

评论回复
11
xch| | 2024-11-26 17:57 | 只看该作者
在这个 Init_System() 函数里面启动一个定时器用作定时10mS中断源。
中断次数达到300次就调用 KEY_Ptc_DingShi_Scan 函。


另外文中  “flat”  是不是 flag 的意思?

使用特权

评论回复
12
曾小白|  楼主 | 2024-11-30 12:04 | 只看该作者
丙丁先生 发表于 2024-11-26 13:57
//好的,我会逐行注释代码并添加延时函数。
//```c
#include  // 芯片头文件,会根据工程选项自动寻找对应 ...

谢谢大佬的回复,最后的开发板和原理图是想表达什么呢?

使用特权

评论回复
13
曾小白|  楼主 | 2024-11-30 12:07 | 只看该作者
xch 发表于 2024-11-26 17:57
在这个 Init_System() 函数里面启动一个定时器用作定时10mS中断源。
中断次数达到300次就调用 KEY_Ptc_Din ...

应该是类似的意思,这个源码是上一个工程师遗留的

使用特权

评论回复
14
曾小白|  楼主 | 2024-11-30 12:08 | 只看该作者
chenczyaa 发表于 2024-11-26 13:07
这个要看你的晶振的啊,百度一下,直接用for就好了,放在main里的第一个运行就行了 ...

我知道要看晶振,其实我之前的意思是说如何根据单片机晶振,设定延时函数。因为我之前都是直接用串口生产的,目前这一款单片机,并没有这样的工具,我才发现好像真的要自己设置一个延时函数的话我还没有弄明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

36

帖子

0

粉丝