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 20:25
{:4_166:}谢谢 神农鼎 发表于 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
谢谢版主真是太厉害了,文件丢给元宝,立马可以了{:4_196:}{:4_196:} 彭彭 发表于 2026-3-14 14:05
现在还是一直读不到脉冲数,返回的都是63840,用程序读引脚状态一个一个计数可以,那样太占用主程序时间 ...
常用的洗衣机水位传感器是气压型的,它里面就是一个LC谐振回路,必须配合非门电路搭建的振荡器,通过测频率实现判断水位高低。选用其它传感器就另有一说了。
页:
[1]