📄 pic18f4580_mcp2515_rs232_picc8.35.c
字号:
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void InitUSART(void)
{
TRISC6 = 0; //RC6-TX
TRISC7 = 1; //RC7-RX
BAUDCON=0x00; //8位波特率发生器
SPBRG = ((Fosc/BAUDRATE)/64)-1; //8位,异步,低速
TXSTA = 0b00100010; //异步模式,8位发送,发送使能,低速
RCSTA = 0b10010000; //使能串口,8位接收,使能连续接收
RCIF = 0; //串口接收中断标志清零
RCIE = 1; //使能串口接收中断
RCIP = 0; //低优先级
NOP();
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):InitTMR0 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):用于确定串口数据流的长度 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void InitTMR0(void)
{
//禁止TMR0,8位定时器/计数器,内部指令周期时钟,使用前分频器,1:128分频
T0CON = 0b01010110;
TMR0IF = 0; //TMR0中断标志位清零
TMR0IE = 1; //TMR0中断使能
TMR0IP = 1; //TMR0中断优先级高
TMR0 = TMR0data; //延时3个串口接收到的字节
NOP();
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):InitSPI //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):SPI接口初始化 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void InitSPI(void)
{
TRISC5 = 0; //RC5/SDO输出
TRISC4 = 1; //RC4/SDI输入
TRISC3 = 0; //RC3/SCK输出
TRISA5 = 0; //RA5/SS输出
SSPCON1 = 0b00100000; //使能SPI,时钟低电平为空闲状态,时钟为Fosc/4
SSPSTAT = 0b01000000; //中间采样,时钟上升沿发送数据
SSPIF = 0; //清除SSPIF标志
NOP();
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):InitINT0 //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):外部中断0初始化,用于产生CAN数据接收中断 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void InitINT0(void)
{
TRISB0 = 1; //外部中断0输入
INT0IE = 1; //开放外部INT0中断
INT0IF = 0; //外部INT0中断标志位清零
INTEDG0 = 0; //外部中断0下降沿中断
NOP();
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 主程序 //
//////////////////////////////////////////////////////////////////////////
void main(void)
{
unsigned char sendnum;
NOP();
Initial(); //IO口初始化
InitUSART(); //串口初始化
InitTMR0(); //定时器0初始化
InitSPI(); //SPI接口初始化
Init_MCP2515(); //MCP2515初始化
InitINT0 (); //外部中断0初始化
IPEN = 1; //使能中断优先级
INTCON |= 0xC0; //开放所有高低优先级中断
while(1)
{
if(RD0 == 0) //如有S1按键按下,发送标准帧
{
while(RD0 == 0); //等待S1按键释放
write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
write_MCP2515(TXB0SIDH,0xFF);//SID10--SID3
write_MCP2515(TXB0SIDL,0xE0);//SID2--SID0
write_MCP2515(TXB0DLC,0x08); //发送数据长度为8字节
write_MCP2515(TXB0D0,0x00); //发送的数据
write_MCP2515(TXB0D1,0x11);
write_MCP2515(TXB0D2,0x22);
write_MCP2515(TXB0D3,0x33);
write_MCP2515(TXB0D4,0x44);
write_MCP2515(TXB0D5,0x55);
write_MCP2515(TXB0D6,0x66);
write_MCP2515(TXB0D7,0x77);
send_TXB0(); //请求发送
while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08); //等待发送完毕
RD1 = 1; //发送成功,则点亮RD1
DelayNmSec(100); //延时0.1s
RD1 = 0; //熄灭RD1
}
if(RC0 == 0) //如有S2按键按下,发送扩展帧
{
while(RC0 == 0); //等待S2按键释放
write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
write_MCP2515(TXB0SIDH,0xFF);//EID28--21
write_MCP2515(TXB0SIDL,0xEB);//EID20--EID18,扩展帧使能,EID17--EID16
write_MCP2515(TXB0EID8,0xFF);//EID15--EID8
write_MCP2515(TXB0EID0,0xFF);//EID7--EID0
write_MCP2515(TXB0DLC,0x08);//发送数据长度为8字节
write_MCP2515(TXB0D0,0x00); //发送的数据
write_MCP2515(TXB0D1,0x11);
write_MCP2515(TXB0D2,0x22);
write_MCP2515(TXB0D3,0x33);
write_MCP2515(TXB0D4,0x44);
write_MCP2515(TXB0D5,0x55);
write_MCP2515(TXB0D6,0x66);
write_MCP2515(TXB0D7,0x77);
send_TXB0(); //请求发送
while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08); //等待发送完毕
RC1 = 1; //发送成功,则点亮RC1
DelayNmSec(100); //延时0.1s
RC1 = 0; //熄灭RC1
}
if(USARTreceive_flag == 1) //接收到符合要求的串口数据流
{
USARTreceive_flag = 0; //串口转发再允许
pointer = &receive232[1];
write_MCP2515(TXB0CTRL,0x03);//设置为发送最高优先级
write_MCP2515(TXB0SIDH,*pointer++);//EID28--21
write_MCP2515(TXB0SIDL,*pointer++);//EID20--EID18,扩展帧使能,EID17--EID16
write_MCP2515(TXB0EID8,*pointer++);//EID15--EID8
write_MCP2515(TXB0EID0,*pointer++);//EID7--EID0
write_MCP2515(TXB0DLC,*pointer++);//发送数据长度为8字节
write_MCP2515(TXB0D0,*pointer++); //发送的数据
write_MCP2515(TXB0D1,*pointer++);
write_MCP2515(TXB0D2,*pointer++);
write_MCP2515(TXB0D3,*pointer++);
write_MCP2515(TXB0D4,*pointer++);
write_MCP2515(TXB0D5,*pointer++);
write_MCP2515(TXB0D6,*pointer++);
write_MCP2515(TXB0D7,*pointer++);
send_TXB0(); //请求发送
while((read_MCP2515(TXB0CTRL) & 0x08) == 0x08); //等待发送完毕
if((receive232[2]&0x08) == 0x00) //如果是标准帧
{
RD1 = 1; //发送成功,则点亮RD1
DelayNmSec(100); //延时0.1s
RD1 = 0; //熄灭RD1
}
if((receive232[2]&0x08) == 0x08) //如果是扩展帧
{
RC1 = 1; //发送成功,则点亮RC1
DelayNmSec(100); //延时0.1s
RC1 = 0; //熄灭RC1
}
}
if(CANreceive_flag == 1) //接收到来自CAN总线的数据
{
CANreceive_flag = 0; //接收标志位清零
bit_modify_MCP2515(CANINTF, 0x01,0x00);//接收缓冲器0满中断标志位清零
send232[0] = read_MCP2515(RXB0SIDH); //接收到的标准标识符高字节
send232[1] = read_MCP2515(RXB0SIDL); //接收到的标准标识符低字节
send232[2] = read_MCP2515(RXB0EID8); //接收到的扩展标识符高字节(看RXB0EXID而定)
send232[3] = read_MCP2515(RXB0EID0); //接收到的扩展标识符低字节(看RXB0EXID而定)
send232[4] = read_MCP2515(RXB0DLC); //接收到的数据长度
send232[5] = read_MCP2515(RXB0D0); //接收到的数据
send232[6] = read_MCP2515(RXB0D1);
send232[7] = read_MCP2515(RXB0D2);
send232[8] = read_MCP2515(RXB0D3);
send232[9] = read_MCP2515(RXB0D4);
send232[10] = read_MCP2515(RXB0D5);
send232[11] = read_MCP2515(RXB0D6);
send232[12] = read_MCP2515(RXB0D7);
if((send232[1]&0x08) == 0x00) //标准帧的话
{
RD1 = 1; //接收成功,则点亮RD1
DelayNmSec(100); //延时0.1s
RD1 = 0; //熄灭RD1
}
if((send232[1]&0x08) == 0x08) //扩展帧的话
{
RC1 = 1; //接收成功,则点亮RC1
DelayNmSec(100); //延时0.1s
RC1 = 0; //熄灭RC1
}
send_count=13; //串口转发13字节
for(sendnum=0;sendnum<send_count;sendnum++) //转发到串口
{
TXREG = send232[sendnum];
while(TRMT == 0); //等待串口发送完一字节
}
}
}
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):DelayNmSec //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 延时N*1ms,最大65.5秒 //
//Input(输入参数类型):unsigned int N //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void DelayNmSec(unsigned int N)
{
unsigned int j;
while(N--)
for(j=0;j<MILLISEC;j++);
}
//************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -