DebugLab 发表于 2024-9-25 18:43:34

初始化不能放在主循环里

王昱顺 发表于 2024-9-25 19:42:04

DHBT2023 发表于 2024-9-25 18:15
其实,程序满简单:检测温度,温度到 ,P20=0 驱动负载放水。 500ms后, 释放负载P20=1 。温度降低,继续检 ...

#include "stc32g.h"

// 包含基础C支持代码
#include "intrins.h"
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

// 变量类型重定义
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
// 多线程功能定义
#define Task_Max 10             // 最大线程数
u8 Task = 0;                  // 全局线程指针
u8 Task_This = {0};   // 线程状态表
u16 Task_Timer = {0}; // 线程私有定时器
void Core_Init(void);         // 函数声明
void Delay(unsigned int Time);
void Get_Delay(void);
void main(void)
{
    Core_Init();
    while (1)
    {
      Task = 1; // 线程1开始
      switch (Task_This)
      {
      case 0:
            if(温度标志位)
            {
                P20 = 0;
                Delay(500);
            }
            break;
      case 2:
            P20 = 1;               
            Task_This = 0; // 回到最初的状态
            break;
      default:
            Get_Delay();
            break;
      }
    }
}

// 初始化定时及核心功能
void Core_Init(void)
{
    AUXR |= 0x80; // 定时器时钟1T模式
    TMOD &= 0xF0; // 设置定时器模式
    TL0 = 0x40;   // 设置定时初始值@24MHz,1ms
    TH0 = 0xA2;   // 设置定时初始值
    TF0 = 0;      // 清除TF0标志
    TR0 = 1;      // 定时器0开始计时
    ET0 = 1;      // 使能定时器0中断
    EA = 1;
    // IO初始化
    P0M0 = P0M1 = P1M0 = P1M1 = P2M0 = P2M1 = P3M0 = P3M1 = P4M0 = P4M1 = P5M0 = P5M1 = 0x00;
    P_SW2 |= 0x80; // 允许操作寄存器
}

void Timer0_Isr(void) interrupt 1
{
    u8 xdata i;
    // 遍历所有线程定时器
    for (i = 0; i < Task_Max; i++)
    {
      if (Task_Timer > 0)
      {
            Task_Timer--;
      }
    }
}

// 设置非堵塞定时,刻度1ms
void Delay(unsigned int Time)
{
    Task_Timer = Time;
    Task_This++;
}

// 获取当前定时器状态
void Get_Delay(void)
{
    if (Task_Timer == 0)
    {
      Task_This++;
    }
}早说功能不就行了

DHBT2023 发表于 2024-9-25 20:40:29

王昱顺 发表于 2024-9-25 19:42
早说功能不就行了

谢谢

DHBT2023 发表于 2024-9-25 20:43:29

王昱顺 发表于 2024-9-25 19:42
早说功能不就行了

大师,还有一个问题。500ms 是一个设定的值。大概是50~500ms 之间。怎么实现?

王昱顺 发表于 2024-9-25 20:51:00

DHBT2023 发表于 2024-9-25 20:43
大师,还有一个问题。500ms 是一个设定的值。大概是50~500ms 之间。怎么实现? ...

你改一下Delay(500);这一句里面的值就行了

小飞侠 发表于 2024-9-26 07:40:42

硬件仿真看一下,应该还是程序问题

Matrix 发表于 2024-11-11 10:51:25

一直初始化肯定不行啊
页: 1 2 [3]
查看完整版本: 屠龙刀AI32G12K128定时器问题