首先芯片的RB7脚是TX, RB5脚是RX.手册里面却有如下设置描述:
In order to configure pin RB6/SCK/SCL and RB7/TX/CK as the universal synchronous asynchronous receiver transmitter.
SPEN bit must be set 1
TRISB6 set 1
TRISB7 set 1.
我是觉得应该是TRISB5和TRISB7设置在1.
因此考虑这种情况,我将TRISB4~TRISB7都设置成1.初始化程序如下:
void InitSFR(void)
//初始化特殊功能寄存器
{
OSCCON = 0x61; //内部振荡器用于系统时钟,且是4MHZ
TRISA = 0x04; //设置RA0和RA1输入,RA2输出
TRISB = 0xf0; //RB7输出.RB6,RB5,RB4输入,
TRISC = 0x20; //RC5输入,其他输出
//定时器0初始化
OPTION_REG = 0x04; //预分频32,
T0CS = 0; //选择内部时钟
T0IE = 1; //允许定时器中断
/////串口设置
SPBRG = 25; //波特率设置成9600
SPEN = 1; //串口允许
CREN = 1; //接收允许
//RCSTA = 0x90;
TXEN = 1; //发送允许
BRGH = 1; //高速模式
//TXSTA = 0x24;
//////////
TXIE = 0; //不做发送中断
RCIE = 1; //接收中断设置
PEIE = 1; //允许所有的位屏蔽的外设中断
GIE = 1; //打开总中断
}
之后我发送数据正常,发送程序如下,
while (!TXIF) ;
TXREG = 0x55;
波特率是9600正常的。
但是我上位机发送0x55,在RB5脚上面测的有正常的数据接收到,但是没有中断产生。
程序如下
void SerialReceiveInterrupt(void)
//串口通迅接收中断
{
receivedata = RCREG;
receivenum++;
IO_LED1 = 0; //test
}
void interrupt com(void)
{
if (RCIF && RCIE)
{
SerialReceiveInterrupt();
}
if (TXIF && TXIE)
{
SerialSendInterrupt();
}
if (T0IF && T0IE)
{
Timer0Interrupt();
//中断标志清零
T0IF = 0;
}
}
或者我在主程序里面直接判断RCIF标志一直不会为1.
请教哪位大侠有用过款单片机做过串口通讯。我的问题会出在什么地方?
谢谢! |