打印
[其他产品]

关于pic18f452单片机串口中断的问题

[复制链接]
1567|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2025-2-8 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用pic18f452单片机进行uart中断,但是不知道是哪里错了就是进不去中断,求大神指点。是不是初始化的时候错误了
void Uart_Init(void)
{

    RCSTAbits.SPEN = 1;    // 串口使能
    PIR1bits.RCIF =0;  //初始化,接受后产生中断

    TRISCbits.TRISC7 = 0;    // 异步串行接收数据输入
    TRISCbits.TRISC6 = 0;// 异步和同步主模式,TRISC<6> 零(= 0)

    // TXSTA:发送状态和控制寄存器
    TXSTAbits.SYNC = 0;    // 异步模式
    TXSTAbits.TX9 = 0;     // 选择8 位发送
     TXSTAbits.TXEN = 1;     // 禁止发送
    TXSTAbits.BRGH = 1;     // 高速
  //  TXSTAbits.TXEN = 1; // 使能发送

    // RCSTA:接收状态和控制寄存器
    RCSTAbits.RX9 = 0; // 选择8 位接收
    RCSTAbits.CREN = 1; // 使能接收器

    // BAUDCON1:波特率控制寄存器
    // BAUDCON1bits.BRG16 = 0; // 8位波特率发生器——SPBRGHx 和SPBRGx
     SPBRG = 25;  //波特率为9600

    // 外设中断允许寄存器1


    INTCONbits.GIE = 1;
    INTCONbits.PEIE = 1; // 中断控制寄存器
    PIE1bits.RCIE = 1; // 允许EUSART 接收中断
}

void    InterruptHandlerHigh(void);
//高优先级中断向量
#pragma code InterruptVectorHigh=0x08

void    InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh         //跳到中断程序
  _endasm
}

//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh

//中断函数
//功能:接收数据时点亮小灯
void InterruptHandlerHigh ()
{
        uchar ch;        
        int num = 0;
        PORTCbits.RC0=0;   //点亮小灯
        //        PIR1bits.RCIF=0;
                INTCONbits.GIE = INTCONbits.PEIE = 1;        

}

使用特权

评论回复
沙发
捉虫天师| | 2025-2-9 19:57 | 只看该作者
#include <p18cxxx.h>

void Uart_Init(void)
{
    // 串口初始化
    RCSTAbits.SPEN = 1;    // 使能串口

    // 配置 TRISC
    TRISCbits.TRISC6 = 0;  // TX 设为输出
    TRISCbits.TRISC7 = 1;  // RX 设为输入 !!修正!!

    // TXSTA:发送状态和控制寄存器
    TXSTAbits.SYNC = 0;    // 异步模式
    TXSTAbits.TX9 = 0;     // 8 位发送
    TXSTAbits.BRGH = 1;    // 高速
    TXSTAbits.TXEN = 1;    // 使能发送 !!修正!!

    // RCSTA:接收状态和控制寄存器
    RCSTAbits.RX9 = 0;     // 8 位接收
    RCSTAbits.CREN = 1;    // 使能连续接收

    // 波特率设定(Fosc = 4MHz,目标波特率 = 9600)
    SPBRG = 25;  // 对应 9600bps

    // 清除接收中断标志位
    PIR1bits.RCIF = 0;

    // 使能中断
    INTCONbits.GIE = 1;    // 总中断
    INTCONbits.PEIE = 1;   // 允许外设中断
    PIE1bits.RCIE = 1;     // 允许 EUSART 接收中断
}

// 高优先级中断向量
void InterruptHandlerHigh(void);
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh  // 跳到中断程序
  _endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh

// 串口接收中断函数
void InterruptHandlerHigh()
{
    if (PIR1bits.RCIF)  // 串口接收中断
    {
        char receivedData = RCREG;  // 读取数据,同时清除 RCIF 标志
        PORTCbits.RC0 = ~PORTCbits.RC0;  // 翻转小灯状态(调试用)
    }
}

使用特权

评论回复
板凳
捉虫天师| | 2025-2-9 19:58 | 只看该作者
试试上面修改后的代码。

使用特权

评论回复
地板
捉虫天师| | 2025-2-9 19:59 | 只看该作者
✅ 修正 TRISC7 设为输入(接收需要输入模式)
✅ 修正 TXEN = 1; 以确保发送使能
✅ 正确读取 RCREG,清除 RCIF,保证能进入中断
✅ 在中断中读取数据,并翻转 LED 作为调试

使用特权

评论回复
5
mxkw0514| | 2025-2-11 09:52 | 只看该作者
现在还在用这么老的单片机呀

使用特权

评论回复
6
huahuagg| | 2025-2-21 18:34 | 只看该作者
单片机的串口其实不难,在中断里接收吧?

使用特权

评论回复
7
wang6623| | 2025-2-22 17:19 | 只看该作者
需要在初始化代码中确保UART接收中断使能位(RCIE)和全局中断使能位(GIE 和 PEIE)被正确设置。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

605

主题

3147

帖子

4

粉丝