我用PROTEUS仿真PIC18F6722串口中断程序,可是串口老是收不到数据。
原理图如下:
程序如下:
/***************************************************
**
** MCU:PIC18f8772
** 功能:串口接收
** 说明:中断方式
** 时间:2012-5-29 Lzy
**
*****************************************************/
#include <p18cxxx.h>
/*
串口初始化
设置异步接收操作的步骤如下:
1. 初始化SPBRGHx:SPBRGx寄存器,设置合适的
波特率。按需要将BRGH 和BRG16 位置1 或清
零,以获得目标波特率。
2. 通过将SYNC 位清零并将SPEN 位置1 使能异步串口。
3. 如果需要中断,将允许位RCxIE 置1。
4. 若需要接收9 位数据,将RX9 位置1。
5. 通过将CREN 位置1,使能接收。
6. 当接收完成时标志位RCxIF 将被置1,此时如果
允许位RCxIE 已置1,还会产生一个中断。
7. 读RCSTAx 寄存器以获取第9 位数据(如果已
使能),并判断是否在接收过程中发生了错误。
8. 通过读RCREGx 寄存器来读取接收到的8 位数据。
9. 如果发生错误,通过将使能位CREN 清零来清除错误。
10. 若想使用中断,请确保将INTCON 寄存器中
GIE 和PEIE 位(INTCON<7:6>)置1。
*/
void UartInit(void)
{
RCSTA1bits.SPEN = 1; // 串口使能
TRISCbits.TRISC7 = 1; // 异步串行接收数据输入
TRISCbits.TRISC6 = 0;// 异步和同步主模式,TRISC<6> 零(= 0)
// TXSTA1:发送状态和控制寄存器
TXSTA1bits.SYNC = 0; // 异步模式
TXSTA1bits.TX9 = 0; // 选择8 位发送
TXSTA1bits.TXEN = 0; // 禁止发送
TXSTA1bits.BRGH = 1; // 高速
TXSTA1bits.TXEN = 1; // 使能发送
// RCSTA1:接收状态和控制寄存器
RCSTA1bits.RX9 = 0; // 选择8 位接收
RCSTA1bits.CREN = 1; // 使能接收器
// BAUDCON1:波特率控制寄存器
BAUDCON1bits.BRG16 = 0; // 8位波特率发生器——SPBRGHx 和SPBRGx
SPBRG1 = 25;
// 外设中断允许寄存器1
PIE1bits.RC1IE = 1; // 允许EUSART 接收中断
INTCONbits.GIE = INTCONbits.PEIE = 1; // 中断控制寄存器
TRISF = 0;
}
void InterruptHandlerHigh(void);
//高优先级中断向量
#pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //跳到中断程
_endasm
}
//高优先级中断服务程序
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if(PIR1bits.RC1IF) // 已接收数据
{
PIR1bits.RC1IF = 0;
PORTF = RCREG1; // 读取接收到的数据
}
}
void main()
{
UartInit();
while(1);
}
高手指教,问题出在哪里?谢谢
|