📄 rx.c
字号:
/*pic18f8680内置can控制器接收程序*/
#include<p18f8680.h>
#include<usart.h>
void InterruptHandlerHigh(void);
/***********************************************************************************
函数功能:初始化CAN模块
入口参数:无
出口参数:无
调用说明:无
***********************************************************************************/
void RS232_initial(void);
void RS232_send(int RS232_date);
void ini_can(void)
{
TRISG = 0x04;
ECANCON &=0X3F;
CANCON = 0x88;
while((CANSTAT&0X80)!=0X80);
RXB0CON=0X60;
CIOCON=0X3F;
RXB0DLC=0X08;
RXF0SIDH=0X00;
RXF0SIDL=0X00;
RXM0SIDH=0X00;
RXM0SIDL=0X00;
BRGCON1=0X01; //TQ=1us,Tsjw=1TQ
BRGCON2=0B11001011; //Tphase2 PROGRAMBLE,SAM THREE,Tpg=2TQ,Tphase1=4TQ
BRGCON3=0B10000011; //Tphase2=4TQ,do not use wake up
//Tpg+Tphase1>=Tphase2>=Tsjw
RCON |=0X80;
INTCON|=0X40;
PIE3|=0X01;
//INTCON &=0X07;
//PIR3=0X00;
//PIE3=0X00;
IPR3=0X01;
}
/***********************************************************************************
函数功能:启动CAN模块接收
入口参数:无
出口参数:无
调用说明:无
***********************************************************************************/
#pragma code InterruptVectorHigh=0x000018
void InterruptVectorHigh(void)
{
_asm
goto InterruptHandlerHigh
_endasm
}
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh()
{
//unsigned char i;
unsigned char data[8];
//if (PIR3bits.RXB0IF ==1)
//while((PIR3&0X01)==0X00);
PIR3bits.RXB0IF = 0;
data[0]=RXB0D0;
data[1]=RXB0D1;
data[2]=RXB0D2;
data[3]=RXB0D3;
data[4]=RXB0D4;
data[5]=RXB0D5;
data[6]=RXB0D6;
data[7]=RXB0D7;
//for (i=0;i<7;i++)
//{
//data[i]=RXB0M;
//}
RXB0CON=0X00; //RXFUL位清零,准备下一次接收消息;
RS232_send(data[7]);
}
/***********************************************************************************
函数功能:主函数
入口参数:无
出口参数:无
调用说明:无
***********************************************************************************/
void main(void)
{
RS232_initial();
ini_can();
INTCON|=0X80;
CANCON=0X00;
while((CANSTAT&0XE0)!=0X00);
//RCON |=0X80;
//INTCON |=0XC0;
//PIE3|=0X01;
while (1);
}
//-------------------串口初始化、发送----------------------------
void RS232_initial(void)
{
TRISC = 0X80;//c对应口input
TXSTA = 0X04;//设定TXSTA寄存器。高速
SPBRG = 64;//10MHZ, BRGH=1, 9600BPS.
PIE1 = 0X10;//清除PIE1所有中断使能。
RCSTA = 0X80;//禁止接收。
INTCON = 0XC0;//清中断
}
void RS232_send(int RS232_date)
{
TXREG = RS232_date;
TXSTAbits.TXEN=1;//启动发送,TSR开始移位操作。
while (PIR1bits.TXIF==0);//等待中断,在此为查询方式。
while (TXSTAbits.TRMT==0);//判断是否TSR发送完毕,未完等待。
TXSTAbits.TXEN=0;//关发送功能,防止TXREG空时,TXIF产生置位。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -