📄 pic18f4580_mcp2515_rs232_picc8.35.c
字号:
//////////////////////////////////////////////////////////////////////////
// 文件说明 //
//Project code(项目代号或名称):PIC18F4580_MCP2515_RS232_PICC8.35.c //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(模块功能): 该程序可以实现以下功能: //
// 1. 通过串口接收中断,如果接收到的数据流为14个数据,//
// 同时第一个数据为0x72,则把收到的后13个数据通过 //
// CAN控制器MCP2515,以标准帧或扩展帧的格式发送到 //
// CAN总线上。同时L0(标准帧)或L1(扩展帧)灯闪一下。 //
// 第1个字节为0x72 //
// pointer = &receive232[1]; //
// write_MCP2515(TXB0SIDH,*pointer++);//第2个字节 //
// write_MCP2515(TXB0SIDL,*pointer++);//第3个字节 //
// write_MCP2515(TXB0EID8,*pointer++);//第4个字节 //
// write_MCP2515(TXB0EID0,*pointer++);//第5个字节 //
// write_MCP2515(TXB0DLC,*pointer++); //第6个字节 //
// write_MCP2515(TXB0D0,*pointer++); //第7个字节 //
// write_MCP2515(TXB0D1,*pointer++); //第8个字节 //
// write_MCP2515(TXB0D2,*pointer++); //第9个字节 //
// write_MCP2515(TXB0D3,*pointer++); //第10个字节 //
// write_MCP2515(TXB0D4,*pointer++); //第11个字节 //
// write_MCP2515(TXB0D5,*pointer++); //第12个字节 //
// write_MCP2515(TXB0D6,*pointer++); //第13个字节 //
// write_MCP2515(TXB0D7,*pointer++); //第14个字节 //
// 2. 通过查询,当S1按键按下时,则相应的把预先写好的8 //
// 个数据,通过CAN控制器MCP2515,以标准帧的格式发送//
// 到CAN总线上。同时L0灯闪一下。 //
// 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); //
// 3. 通过查询,当S2按键按下时,则相应的把预先写好的8 //
// 个数据,通过CAN控制器MCP2515,以扩展帧的格式发送//
// 到CAN总线上。同时L1灯闪一下。 //
// write_MCP2515(TXB0SIDH,0xFF);//EID28--21 //
// write_MCP2515(TXB0SIDL,0xEB);//EID20--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); //
// 4. 利用CAN控制器MCP2515,如果从CAN总线接收到标准帧 //
// 数据时,则L0灯闪一下;如果接收到扩展帧数据的话,//
// 则L1灯闪一下。同时把接收数据发送到串口,通过电脑//
// 端显示出来。 //
// send232[0] = read_MCP2515(RXB0SIDH); //
// send232[1] = read_MCP2515(RXB0SIDL); //
// send232[2] = read_MCP2515(RXB0EID8); //
// send232[3] = read_MCP2515(RXB0EID0); //
// 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); //
//hardware configure(硬件配置):PIC18F4580+MCP2515+MCP2551+MAX232 //
//Document(参考文档): //
//Others(说明): //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 头文件定义 //
//说明:根据安装文件位置不同,路径有所不同,请注意。 //
//////////////////////////////////////////////////////////////////////////
#include "pic18.h"
#include "pic18f4580.h"
#include "MCP2515.h"
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 配置字配置 //
//////////////////////////////////////////////////////////////////////////
//振荡器为HS(20M),系统振荡器时钟转换选择禁止,故障保护时钟监视器禁止
__CONFIG(1,0x32FF);
//监视定时器WDT禁止,掉电锁定复位硬件使能,复位电压为2.7V,上电定时器使能
__CONFIG(2,0xFEF6);
//选定B口为数字通道,低电压定时器1振荡禁止,MCLR使能
__CONFIG(3,0xF9FF);
//使能RB6、RB7为专用调试器接口,堆栈溢出复位使能,低压编程禁止
__CONFIG(4,0xFF2B); //调试不使能
//__CONFIG(4,0xFFAB); //调试使能
//程序存储区、数据EEPROM,引导区都无代码保护
__CONFIG(5,0xFFFF);
//程序存储区、数据EEPROM,引导区、配置寄存器都无写保护
__CONFIG(6,0xFFFF);
//程序存储区、引导区都无表读保护
__CONFIG(7,0xFFFF);
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 用户标识符定义 //
//////////////////////////////////////////////////////////////////////////
#define Fosc 20000000 //晶振为20MHZ
#define FCY 5000000 //晶振为20MHZ,FCY=20M/4=5M
#define BAUDRATE 9600 //波特率为9600
#define MILLISEC FCY/10000 //1 mSec delay constant
#define TMR0data 122 //(1/BAUDRATE)*10*3*FCY/128
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数定义 //
//////////////////////////////////////////////////////////////////////////
void interrupt HI_ISR(void);
void interrupt low_priority LOW_ISR(void);
void Initial(void);
void InitUSART(void);
void InitTMR0(void);
void InitSPI(void);
void InitINT0(void);
void DelayNmSec(unsigned int N);
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 全局变量定义 //
//////////////////////////////////////////////////////////////////////////
static bit CANreceive_flag = 0; //=1接收到CAN 数据,=0未接收到数据
static bit USARTreceive_flag = 0; //=1串口收到数据,=0未收到数据
unsigned char receive_count = 0; //串口接收数据个数寄存器
unsigned char send_count = 0; //串口发送数据个数寄存器
unsigned char *pointer; //串口发送指针
unsigned char receive232[20]; //串口接收数据数组
unsigned char send232[20]; //串口发送数据数组
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 中断函数 //
//Function name(函数名称):HI_ISR //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):高优先级中断入口 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void interrupt HI_ISR(void)
{
if((INT0IE == 1)&&(INT0IF == 1)) //外部中断,通过MCP2515接收到CAN数据
{
CANreceive_flag = 1; //置接收到ECAN数据
INT0IF = 0; //清外部中断0中断标志位
}
if((TMR0IE == 1)&&(TMR0IF == 1)) //TMR0中断进入,说明串口数据流接收完毕
{
TMR0IF = 0; //TMR0中断标志位清零
TMR0ON = 0; //禁止TMR0
//如果接收到的数据流为14个数据,同时第一个数据为0x72
if((receive_count == 14)&&(receive232[0] == 0x72))
USARTreceive_flag = 1; //置接收到数据标志位
receive_count = 0; //接收计数器清0
}
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 中断函数 //
//Function name(函数名称):LOW_ISR //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能):低优先级中断入口 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void interrupt low_priority LOW_ISR(void)
{
if((RCIF == 1)&&(RCIE == 1)) //如果串口接收到数据
{
TMR0ON = 1; //使能TMR0
TMR0 = TMR0data; //初始值重新赋值
receive232[receive_count] = RCREG; //接收数据并存储后,RCIF自动清零
receive_count++; //接收计数器加1
}
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):Initial //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): IO口及其他寄存器初始化 //
//Input(输入参数类型):void //
//Output(输出参考类型):void //
//Return(返回信息):无 //
//////////////////////////////////////////////////////////////////////////
void Initial(void)
{
PORTA = 0x00;
LATA = 0x00;
ADCON1 = 0x0F; //关闭模拟通道,使之为数字通道
PORTB = 0x00;
LATB = 0x00;
PORTC = 0x00;
LATC = 0x00;
TRISC0 = 1; //S2按键输入
TRISC1 = 0; //L2发光管输出
PORTD = 0x00;
LATD = 0x00;
CMCON =0x07; //关闭比较器
TRISD0 = 1; //S1按键输入
TRISD1 = 0; //L1发光管输出
//测试程序是否在运行用...
RD1 = 1; //点亮L0
DelayNmSec(500); //延时500ms
RD1 = 0; //熄灭L0
RC1 = 1; //点亮L1
DelayNmSec(500); //延时500ms
RC1 = 0; //熄灭L1
NOP();
}
//************************************************************************
//////////////////////////////////////////////////////////////////////////
// 子函数 //
//Function name(函数名称):InitUSART //
//Create date(创建日期):2007.8.1 //
//created by(创建人):夏红峰 //
//E-mail:master_0722@sina.com/master_0722@yahoo.com //
//Function(函数功能): 串口初始化,波特率:9600bps //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -