[技术支持] HC18M121B1单片机编程问题

[复制链接]
361|4
poxiao0822 发表于 2025-10-21 22:28 | 显示全部楼层 |阅读模式
C语言编程,在主程序下方写了两个中断程序,INT0和Term1,用IDE软件编译报错,说是在同一优先级,请问什么原因,怎么解决 9278568f79877e33df.png
sunjd 发表于 2025-10-22 11:03 | 显示全部楼层
HC18M121B1单片机只有一个中断向量地址(0008H),这意味着所有中断都共享同一个入口点,不能像某些单片机那样为每个中断单独编写中断服务函数,从数据手册第11页可以看到:
复位向量是0000H
中断向量是0008H(只有一个!)
这意味着所有中断(INT0、INT1、Timer0、Timer1、Timer2、ADC等)都共用同一个中断入口地址。
你需要将两个中断服务程序合并为一个统一的中断服务函数,然后在其中判断具体是哪个中断源触发的。
为了更好地管理多个中断,建议采用以下结构
void interrupt ISR(void)
{
    // 按优先级检查各个中断标志
    if(INT1F) {
        INT1F = 0;
        INT1_Handler();
    }
    else if(T1IF) {
        T1IF = 0;
        Timer1_Handler();
    }
    else if(INT0F) {
        INT0F = 0;
        INT0_Handler();
    }
    // ... 其他中断
}

// 各个中断的具体处理函数
void INT1_Handler(void)
{
    intpwmcount++;
    // INT1具体处理代码
}

void Timer1_Handler(void)
{
    count++;
    // Timer1具体处理代码
}

评论

解释的很到位。  发表于 2025-10-22 13:25
 楼主| poxiao0822 发表于 2025-10-22 22:46 | 显示全部楼层
感谢回复,问题已解决
再请教下,我在做PWM信号检测,方法是外部中断设置边沿触发,通过计数到一定数量,判断有PWM信号输入,但是检测的PWM信号周期为1us,占空比可能很大,也可能很小,致使IO口无法检测到边沿触发,这个单片机FCU为4MHz,想问下需要怎么解决,或者有没更好的PWM检测方法
sunjd 发表于 2025-10-23 17:31 | 显示全部楼层
试试定时器输入捕捉功能
根据数据手册看,Timer1和Timer2都有外部时钟输入功能
// 使用Timer1作为PWM周期测量
void PWM_Detection_Init(void)
{
    // 配置Timer1为外部计数器模式
    T1CON = 0b00011000;  // T1CK[1:0]=10, T1CKI上升沿计数
    T1EN = 1;            // 使能Timer1
   
    // 配置Timer0作为时间基准
    OPTION = 0b00000111; // 预分频给Timer0,1:256
    T0IE = 1;            // 使能Timer0中断
}

// Timer0中断用于定期读取Timer1计数值
void interrupt ISR(void)
{
    if(T0IF)
    {
        T0IF = 0;
        static unsigned int last_count = 0;
        unsigned int current_count = T1;
        
        // 计算频率 = (current_count - last_count) / 定时时间
        unsigned int pulse_count = current_count - last_count;
        last_count = current_count;
        
        // 根据脉冲计数计算PWM频率
        if(pulse_count > 0) {
            // 检测到有效PWM信号
        }
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部