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

📄 pic18f458_can_rs232_picc8.35.c

📁 使用微芯公司的PIC18F458单片机
💻 C
📖 第 1 页 / 共 2 页
字号:
//////////////////////////////////////////////////////////////////////////
//                               文件说明                               // 
//Project code(项目代号或名称):PIC18F458_CAN_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个数据通过  //
//                      PIC内部CAN控制器,以标准帧或扩展帧的格式发送到  //
//                      CAN总线上。同时L0(标准帧)或L1(扩展帧)灯闪一下。 //
//                      第1个字节为0x72                                 //
//		                pointer = &receive232[1];                       //
//		                TXB0SIDH = *pointer++;        //第2个字节       //
//		                TXB0SIDL = *pointer++;        //第3个字节       //
//		                TXB0EIDH = *pointer++;        //第4个字节       //
//		                TXB0EIDL = *pointer++;        //第5个字节       //
//		                TXB0DLC = *pointer++;         //第6个字节       //
//		                TXB0D0 = *pointer++;		  //第7个字节       //
//		                TXB0D1 = *pointer++;          //第8个字节       //
//		                TXB0D2 = *pointer++;          //第9个字节       //
//		                TXB0D3 = *pointer++;          //第10个字节      //
//		                TXB0D4 = *pointer++;          //第11个字节      //
//		                TXB0D5 = *pointer++;          //第12个字节      //
//	                    TXB0D6 = *pointer++;          //第13个字节      //
//		                TXB0D7 = *pointer++;          //第14个字节      //
//                   2. 通过查询,当S1按键按下时,则相应的把预先写好的8 //
//                      个数据,通过PIC内部CAN控制器,以标准帧的格式发送//
//                      到CAN总线上。同时L0灯闪一下。                   //
//              		TXB0SIDH = 0xFF;    //SID10--SID3               //
//          		    TXB0SIDL = 0xE0;    //SID2--SID0                //
//		                TXB0DLC = 0x08;     //发送数据长度为8字节       //
//		                TXB0D0 = 0x00;	    //发送的数据                //
//		                TXB0D1 = 0x11;                                  //
//		                TXB0D2 = 0x22;                                  //
//		                TXB0D3 = 0x33;                                  //
//		                TXB0D4 = 0x44;                                  //
//		                TXB0D5 = 0x55;                                  //
//		                TXB0D6 = 0x66;                                  //
//		                TXB0D7 = 0x77;                                  //
//                   3. 通过查询,当S2按键按下时,则相应的把预先写好的8 //
//                      个数据,通过PIC内部CAN控制器,以扩展帧的格式发送//
//                      到CAN总线上。同时L1灯闪一下。                   //
// 		                TXB0SIDH = 0xFF;    //EID28--21                 //
//		                TXB0SIDL = 0xEB;    //EID20--EID18,EID17--EID16 //
//		                TXB0EIDH = 0xFF;    //EID15--EID8               //
//		                TXB0EIDL = 0xFF;    //EID7--EID0                //
//		                TXB0DLC = 0x08;     //发送数据长度为8字节       //
//		                TXB0D0 = 0x00;	    //发送的数据                //
//		                TXB0D1 = 0x11;                                  //
//		                TXB0D2 = 0x22;                                  //
//		                TXB0D3 = 0x33;                                  //
//		                TXB0D4 = 0x44;                                  //
//		                TXB0D5 = 0x55;                                  //
//		                TXB0D6 = 0x66;                                  //
//		                TXB0D7 = 0x77;                                  //
//                   4. 利用PIC内部CAN控制器,如果从CAN总线接收到标准帧 //
//                      数据时,则L0灯闪一下;如果接收到扩展帧数据的话,//
//                      则L1灯闪一下。同时把接收数据发送到串口,通过电脑//
//                      端显示出来。                                    //
//                      send232[0] = RXB0SIDH;       //接收到的标准标识符高字节                //
//                      send232[1] = RXB0SIDL;       //接收到的标准标识符低字节                //
//                      send232[2] = RXB0EIDH;       //接收到的扩展标识符高字节(看RXB0EXID而定)//
//                      send232[3] = RXB0EIDL;       //接收到的扩展标识符低字节(看RXB0EXID而定)//
//                      send232[4] = RXB0DLC;        //接收到的数据长度                        //
//                      send232[5] = RXB0D0;         //接收到的数据                            //
//		                send232[6] = RXB0D1;                            //
//		                send232[7] = RXB0D2;                            //
//		                send232[8] = RXB0D3;                            //
//		                send232[9] = RXB0D4;                            //
//		                send232[10] = RXB0D5;                           //
//		                send232[11] = RXB0D6;                           //
//		                send232[12] = RXB0D7;                           //
//hardware configure(硬件配置):PIC18F458+MCP2551+MAX232                //
//Document(参考文档):                                                  //
//Others(说明):                                                        //
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
//                           头文件定义                                 //
//说明:根据安装文件位置不同,路径有所不同,请注意。                    //
//////////////////////////////////////////////////////////////////////////
#include "pic18.h"
#include "pic18fxx8.h"
//************************************************************************

//////////////////////////////////////////////////////////////////////////
//                           配置字配置                                 //
//////////////////////////////////////////////////////////////////////////
//振荡器为HS(20M),系统振荡器时钟转换选择禁止
__CONFIG(1,0xFAFF); 
//监视定时器WDT禁止,掉电锁定复位硬件使能,复位电压为2.7V,上电定时器使能
__CONFIG(2,0xFEFA); 
//使能RB6、RB7为专用调试器接口,堆栈溢出复位使能,低压编程禁止
__CONFIG(4,0xFF7B);
//程序存储区、数据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 InitCAN(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((RXB0IF == 1)&&(RXB0IE == 1)) //接收到从CAN总线发送过来的数据
   {
  	CANreceive_flag = 1;	      //置接收到CAN数据
	RXB0IF = 0;				      //清接收中断标志
	RXB0FUL = 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 = 0x07;			     //关闭模拟通道,使之为数字通道
 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 + -