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

📄 can.c

📁 一些用于电话管理的pc机下位机程序
💻 C
字号:
//该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式,发送采用查//该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式
//发送采用查询方式
 
#include <p18cxxx.h>
#include <stdio.h> 
int     CAN_FLAG;               //定义标志寄存器
 
//**************初始化子程序***************
void  initcan(void)
{
         TRISB=(TRISB|0X08)&0XFB;              //设置CANRX/RB3为输入,CANTX/RB2为输出
 
//设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h
//则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。
//NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog 
//_Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ
         CANCON=0X80;                                    //请求进入CAN配置模式REQOP=100  
     
         while(CANSTAT&0X80==0){;}            //等待进入CAN配置模式OPMODE=100
         BRGCON1=0X01;                                  
//设置SJW和BRP,SJW=1TQ,BRP=01H
         BRGCON2=0X90;              //设置Phase_Seg1=3TQ和Prog _Seg=1TQ
         BRGCON3=0X42;                                  //设置Phase_Seg2=3TQ
 
//设置发送邮箱0标识符号和发送的数据
         TXB0CON=0X03;               //发送优先级为最高优先级,TXPRI=11
         TXB0SIDH=0XFF;              //设置发送缓冲器0的标准标识符,本程序采用标准识符
         TXB0SIDL=0XE0;
         TXB0DLC=0X08;                //设置数据长度为8个字节
         TXB0D0=0X00;                   //写发送缓冲器数据区的数据
         TXB0D1=0X01;
         TXB0D2=0X02;
         TXB0D3=0X03;
         TXB0D4=0X04;
         TXB0D5=0X05;
         TXB0D6=0X06;
         TXB0D7=0X07;
 
//设置接收邮箱0的标识符和初始化数据
         RXB0SIDH=0XFF;              //设置接收缓冲器0的标识符      
         RXB0SIDL=0XE0;
         RXB0CON=0X20;               //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0
         RXB0DLC=0X08;                //设置接收缓冲器0的数据区长度
         RXB0D0=0X00;                   //初始化接收缓冲器0的数据区数据
         RXB0D1=0X00;
         RXB0D2=0X00;
         RXB0D3=0X00;
         RXB0D4=0X00;
         RXB0D5=0X00;
         RXB0D6=0X00;
         RXB0D7=0X00;
 
//初始化接收滤波器0和接收屏蔽,
         RXF0SIDH=0XFF;
         RXF0SIDL=0XE0;
         RXM0SIDH=0X00;
         RXM0SIDL=0X00;
 
//初始化CAN模块的I/O控制寄存器
         //CIOCON=0X00;
 
//使CAN进入某种工作模式模式
         CANCON=0X00;                          //=0X40,进入自测试模式;=0x00,正常操作模式
         while(CANSTAT&0XE0!=0){;}
         //while(CANSTAT&0X40==0){;}
 
//初始化CAN的中断
         PIR3=0X00;                          //清所有中断标志
         PIE3=0X01;                          //使能接收缓冲器0的接收中断
         IPR3=0X01;                          //接收缓冲器0的接收中断为最高优先级
}
 
//*********接收缓冲器0接收中断服务程序***********
#pragma     interrupt    can_isr       
#pragma     code low_ISR=0x18
void low_ISR()
{
         _asm
         goto can_isr         
         _endasm
}
#pragma     code
 
void can_isr()
{
         if(PIR3bits.RXB0IF==1)      CAN_FLAG=1;
         PIR3bits.RXB0IF=0;                     //清接收中断标志
         RXB0CONbits.RXFUL=0;           //打开接收缓冲器来接收新信息
}
 
//****************主程序******************  
void main(void)
{
         INTCON=0x00;                    //禁止所有中断  
         initcan();
         WDTCON=0;                                 //=1,看门狗使能;=0,禁止看门狗
         INTCON=0xc0;                              //使能中断
         while(1)
         {
                   TXB0CONbits.TXREQ=1;                    //请求发送,TXREQ=1
                   while(PIR3bits.TXB0IF!=1){;}              //等待发送完成
                   while(CAN_FLAG==0){;}                     //等待接收数据
                   CAN_FLAG=0;                             //清接收到标志
                   TXB0CONbits.TXREQ=0;                    //禁止发送
                   TXB0D0=RXB0D0+1;                           //用接收数据加1来更新发送数据
                   TXB0D1=RXB0D1+1;
                   TXB0D2=RXB0D2+1;
                   TXB0D3=RXB0D3+1;
                   TXB0D4=RXB0D4+1;
                   TXB0D5=RXB0D5+1;
                   TXB0D6=RXB0D6+1;
                   TXB0D7=RXB0D7+1;
 
         }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -