彭彭 发表于 2026-3-14 14:14:47

用定时器4当计数器用该怎么设置

我想用定时器4当计数器用读取洗衣机水位传感器信号,该信号的频率是20-30khz,这样不占用主程序,现在不管怎么设置一直读不到脉冲数,返回的都是63840或其他固定值,我想知道该怎么设置相关寄存器,我排查了硬件电路用程序读引脚状态一个一个下降沿计数可以,就是那样太占用主程序时间了,,因为电路板已经做好在p0.6口了不能改到其他定时器了。下面是测试不成功的程序,主要是用的豆包和元宝该的程序,他们两个一直配置计数器好像都不对。
#include <STC8H.H>


void UART1_Init(void)
{
    P3M0 |= 0x03;
    P3M1 &= ~0x03;
    SCON = 0x50;
    AUXR &= 0xBF;
    AUXR &= 0xFE;
    TMOD &= 0x0F;
    TMOD |= 0x20;
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1;
    TI = 1;
}

void UART_Send(unsigned char dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}

void Send_Num(unsigned int num)
{
    char buf;
    unsigned char i = 0, j = 0;
    if(num == 0) { UART_Send('0'); return; }
    while(num > 0) { buf = num % 10 + '0'; num /= 10; }
    for(j = i; j > 0; j--) UART_Send(buf);
}

//==============================
// ? 终极正确:STC8H4K32TL 定时器4 外部计数 P0.6
//==============================
void Timer4_Init(void)
{
    // 1. P0.6 高阻输入
    P0M0 |= 0x40;
    P0M1 |= 0x40;

    // 2. 官方标准:外部计数模式
    T4T3M = 0x88;   // <-- 这是唯一正确的启动方式
   
    // 3. 清零
    T4H = 0;
    T4L = 0;
}

//==============================
// 只读计数器
//==============================
unsigned int Read_Count(void)
{
    unsigned int val;
    val = T4H;
    val <<= 8;
    val |= T4L;
    return val;
}

//==============================
// 主函数(每秒输出差值)
//==============================
void main(void)
{
    unsigned int now, last=0, diff;

    UART1_Init();
    Timer4_Init();

    while(1)
    {
      // 1秒延时
      unsigned long i;
      for(i=0; i<400000L; i++);

      now = Read_Count();
      diff = now - last;// 每秒真实脉冲数
      last = now;

      Send_Num(diff);   // 输出波动数值
      UART_Send('\r');
      UART_Send('\n');
    }
}

页: [1]
查看完整版本: 用定时器4当计数器用该怎么设置