[其他产品] 关于pic18f452单片机串口中断的问题

[复制链接]
 楼主| 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 | 显示全部楼层
  1. #include <p18cxxx.h>

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

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

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

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

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

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

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

  26. // 高优先级中断向量
  27. void InterruptHandlerHigh(void);
  28. #pragma code InterruptVectorHigh=0x08
  29. void InterruptVectorHigh (void)
  30. {
  31.   _asm
  32.     goto InterruptHandlerHigh  // 跳到中断程序
  33.   _endasm
  34. }
  35. #pragma code
  36. #pragma interrupt InterruptHandlerHigh

  37. // 串口接收中断函数
  38. void InterruptHandlerHigh()
  39. {
  40.     if (PIR1bits.RCIF)  // 串口接收中断
  41.     {
  42.         char receivedData = RCREG;  // 读取数据,同时清除 RCIF 标志
  43.         PORTCbits.RC0 = ~PORTCbits.RC0;  // 翻转小灯状态(调试用)
  44.     }
  45. }
捉虫天师 发表于 2025-2-9 19:58 | 显示全部楼层
试试上面修改后的代码。
捉虫天师 发表于 2025-2-9 19:59 | 显示全部楼层
✅ 修正 TRISC7 设为输入(接收需要输入模式)
✅ 修正 TXEN = 1; 以确保发送使能
✅ 正确读取 RCREG,清除 RCIF,保证能进入中断
✅ 在中断中读取数据,并翻转 LED 作为调试
mxkw0514 发表于 2025-2-11 09:52 | 显示全部楼层
现在还在用这么老的单片机呀
huahuagg 发表于 2025-2-21 18:34 | 显示全部楼层
单片机的串口其实不难,在中断里接收吧?
wang6623 发表于 2025-2-22 17:19 | 显示全部楼层
需要在初始化代码中确保UART接收中断使能位(RCIE)和全局中断使能位(GIE 和 PEIE)被正确设置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

676

主题

3894

帖子

4

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