- 打卡等级:初来乍到
- 打卡总天数:7
- 最近打卡:2026-03-15 18:48:24
已绑定手机
注册会员
- 积分
- 67
|
我想用定时器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[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');
}
}
|
|