找回密码
 立即注册
查看: 60|回复: 7

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-15 18:48:24
已绑定手机

5

主题

19

回帖

67

积分

注册会员

积分
67
发表于 4 天前 | 显示全部楼层 |阅读模式
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;
}


21.png
22.png
23.png
24.png
25.jpg
26.jpg
STC8H4K32TL-48引脚图.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-15 18:48:24
已绑定手机

5

主题

19

回帖

67

积分

注册会员

积分
67
发表于 4 天前 来自手机 | 显示全部楼层
刚回来翻看论坛帖子好像下载工具里能自动生成配置代码,明天试试
092600yvpi3ouiv2om9555.jpg
aa4680fcbec1858b1202e99b07f35864.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:356
  • 最近打卡:2026-03-16 11:01:54

843

主题

1万

回帖

2万

积分

管理员

积分
22704
发表于 4 天前 | 显示全部楼层
截图202603132025436839.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-15 18:48:24
已绑定手机

5

主题

19

回帖

67

积分

注册会员

积分
67
发表于 4 天前 来自手机 | 显示全部楼层
神农鼎 发表于 2026-3-13 20:25

谢谢
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-15 18:48:24
已绑定手机

5

主题

19

回帖

67

积分

注册会员

积分
67
发表于 3 天前 | 显示全部楼层

现在还是一直读不到脉冲数,返回的都是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[6];
    unsigned char i = 0, j = 0;
    if(num == 0) { UART_Send('0'); return; }
    while(num > 0) { buf[i++] = num % 10 + '0'; num /= 10; }
    for(j = i; j > 0; j--) UART_Send(buf[j-1]);
}

//==============================
// ? 终极正确: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');
    }
}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:476
  • 最近打卡:2026-03-16 08:56:00
已绑定手机

104

主题

4175

回帖

9203

积分

荣誉版主

无情的代码机器

积分
9203
发表于 3 天前 | 显示全部楼层
T4_Test.zip (486.5 KB, 下载次数: 3)

截图202603141728275425.jpg
截图202603141728489655.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2026-03-15 18:48:24
已绑定手机

5

主题

19

回帖

67

积分

注册会员

积分
67
发表于 前天 18:48 来自手机 | 显示全部楼层
ercircle 发表于 2026-3-14 17:28

谢谢版主真是太厉害了,文件丢给元宝,立马可以了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2026-03-16 07:19:11

184

主题

247

回帖

623

积分

高级会员

积分
623
发表于 前天 21:22 | 显示全部楼层
彭*** 发表于 2026-3-14 14:05
现在还是一直读不到脉冲数,返回的都是63840,用程序读引脚状态一个一个计数可以,那样太占用主程序时间 ...

常用的洗衣机水位传感器是气压型的,它里面就是一个LC谐振回路,必须配合非门电路搭建的振荡器,通过测频率实现判断水位高低。选用其它传感器就另有一说了。
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-3-17 05:33 , Processed in 0.112188 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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