⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pic18f4580_mcp2515_rs232_picc8.35.c

📁 采用PIC18F4580和MCP2512实现can通信。
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////
//                               文件说明                               // 
//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 + -