彭彭 发表于 2026-3-13 18:34:06

STC8H4K32TL-48引脚单片机,T4口接了一个脉冲信号(洗衣机水位传感器),怎么用T4的计

STC8H4K32TL-48引脚单片机,T4口接了一个脉冲信号(洗衣机水位传感器),怎么用T4的数器功能。

一直返回4079,好像是分频值。


----------------------------------------------------------------------------------------------------------------------
【豆包和原版上折腾两天了,还没有搞定,这是返回4079】
时器4初始化 - 关键修正:确保XSFR访问

void Timer4_Init(void) {
    unsigned char t4t3m_readback;
   
    // 1. 使能对扩展特殊功能寄存器(XSFR)的访问 (必须!)
    P_SW2 |= 0x80;// Set EAXFR bit to access XSFR area
   
    // 2. 配置P0.6为高阻输入
    P0M0 &= ~0x40;
    P0M1 |= 0x40;
   
    // 3. 尝试配置T3/T4引脚选择寄存器 (地址可能为0xFEDC或0xFE9E)
    // 先尝试 0xFEDC
    *(unsigned char xdata *)0xFEDC = 0x00;
    // 也可尝试 0xFE9E
    // *(unsigned char xdata *)0xFE9E = 0x00;
   
    // 4. 停止定时器4
    T4T3M &= ~0x80;// TR4 = 0
   
    // 5. 读取并打印T4T3M的初始值 (调试用)
    t4t3m_readback = T4T3M;
   
    // 6. 配置T4T3M: 外部计数模式(1), 12T模式(0), 禁止时钟输出(0)
    T4T3M = 0x00;    // 完全清零
    T4T3M = 0x08;    // 设置 T4_C/T = 1 (计数器模式)
    // 也可尝试直接赋值:T4T3M = 0x88; // 同时启动TR4
   
    // 7. 设置计数器初值
    T4L = 0x00;
    T4H = 0x00;
   
    // 8. 启动定时器4
    T4T3M |= 0x80;   // TR4 = 1
   
    // 9. 再次读取并存储配置后的T4T3M值
    t4t3m_readback = T4T3M;
}


彭彭 发表于 2026-3-13 19:42:10

刚回来翻看论坛帖子好像下载工具里能自动生成配置代码,明天试试

神农鼎 发表于 2026-3-13 20:25:48


彭彭 发表于 2026-3-13 23:29:27

神农鼎 发表于 2026-3-13 20:25


{:4_166:}谢谢

彭彭 发表于 2026-3-14 14:05:33

神农鼎 发表于 2026-3-13 20:25


现在还是一直读不到脉冲数,返回的都是63840,用程序读引脚状态一个一个计数可以,那样太占用主程序时间了,我想用定时器4当计数器用,不占用主程序,因为电路板已经做好在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');
    }
}

ercircle 发表于 2026-3-14 17:28:52





彭彭 发表于 2026-3-15 18:48:24

ercircle 发表于 2026-3-14 17:28


谢谢版主真是太厉害了,文件丢给元宝,立马可以了{:4_196:}{:4_196:}

cjtdz 发表于 2026-3-15 21:22:36

彭彭 发表于 2026-3-14 14:05
现在还是一直读不到脉冲数,返回的都是63840,用程序读引脚状态一个一个计数可以,那样太占用主程序时间 ...
常用的洗衣机水位传感器是气压型的,它里面就是一个LC谐振回路,必须配合非门电路搭建的振荡器,通过测频率实现判断水位高低。选用其它传感器就另有一说了。
页: [1]
查看完整版本: STC8H4K32TL-48引脚单片机,T4口接了一个脉冲信号(洗衣机水位传感器),怎么用T4的计