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

📄 can_z.c

📁 单片机和GPS接收机构成的车载卫星定位系统
💻 C
📖 第 1 页 / 共 2 页
字号:
#pragma   large
#include  <reg52.h>
#include  <SJA_BCANCONF.H>
#include  <absacc.h>
#include  <string.h>
#include  <intrins.h>
#define   uchar  unsigned char
#define   uint   unsigned int
/*----------------------------lcd---------------------------------*/
#define clear   0x01  //清屏幕,约1.6ms
#define home    0x02   //光标回零(左上角)
#define f_set   0x30  //并行、基本指令
#define dis_on  0x0f  //打开显示,光标,闪烁功能
#define in_mode 0x06  //输入方式,地址增1,光标右移
#define panel_num 10

sbit P_RS=P1^3;   //P0^1; P1.5  片选CS高电平选中即有效
sbit P_RW=P1^4;   //P0^2;  SID
sbit P_E=P1^5;    // P0^3;   CLK
bdata uchar ab,d;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
//idata uchar teleph0[17]={0x08,0xfd,0x04,0x0d,0,0,0,0,0,0,0,0,0,0,0,0,0};//0x38,0x36,0x31,0x33,0x38,0x34,0x35,0x31,0x32,
                        //0x34,0x36,0x34,0x32};
idata uchar str[10];
data uchar start;
//data uchar plat_data;
//uchar i;
/******************/
 /*---------------------------------------------------------*/
void delay(uint j)    //  time=j*10+7 (us)延时函数/
{
    data uchar ch;
    while(j--)
    {
    ch++; ch--;
    }
}
/*---------------------------------------------------------*/
/****************************************************************
CAN总线数据协议:

       0          "1" to "20"          目标ID
       1            "0x08"             特定
       2          "m" or "p" or  "d"   关节的选择
       3          "1" to "3"           自身ID
       4          "C" or "D"           命令口or数据口的选择
       5          "R" or "A"            命令字
       6-9          ......             数据

******************************************************************/

sbit SJA_reset=P2^1;
sbit green=P1^1;
sbit red=P1^2;
unsigned char request_flag,interrupt_flag;   //是否为查询
unsigned char data SystemBuf[10];   //系统设置的接收数据缓冲区
unsigned char data SendBuf[10];   //系统设置的发送数据缓冲区




/************************************************************************
 *以下为基本的函数说明(BasicCAN)                                       *
 ************************************************************************/

/************************************************************************
 *函数原型:  bit   BCAN_CREATE_COMMUNATION(void)                        *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示SJA1000接口正常                                    *
 *           1 ; 表示SJA1000与处理器接口不正常                          *
 *                                                                      *
 *说明:该函数用于检测CAN控制器的接口是否正常                            *
 ************************************************************************/
 bit   BCAN_CREATE_COMMUNATION(void)
 {
    SJA_BCANAdr=REG_TEST;                     //访问测试寄存器

    *SJA_BCANAdr   =0xaa;                     //写入测试值
    if(*SJA_BCANAdr == 0xaa)
    {
        return    0;                          //读测试正确
    }
    else
    {
       return    1;
    }
 }

/************************************************************************
 *函数原型:      bit   BCAN_ENTER_RETMODEL(void)                        *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功进入复位工作模式                               *
 *           1 ; 表示不能进入复位工作模式                               *
 *                                                                      *
 *说明:      CAN控制器进入复位工作模式                                  *
 ************************************************************************/
 bit   BCAN_ENTER_RETMODEL(void)
 {
    unsigned   char   TempData;
    SJA_BCANAdr  = REG_CONTROL;                   //访问地址指向控制寄存器
    TempData=  *SJA_BCANAdr;                      //保存原始值
    *SJA_BCANAdr=(TempData|0x01);                 //置位复位请求
    if((*SJA_BCANAdr&0x01) == 1)
    {
       return   0;
    }
    else
    {
       return   1;
    }

 }

/************************************************************************
 *函数原型:      bit   BCAN_QUIT_RETMODEL(void)                         *
 *参数说明:  无                                                         *
 *返回值:                                                               *
 *           0 ; 表示成功退出复位工作模式                               *
 *           1 ; 表示不能退出复位工作模式                               *
 *                                                                      *
 *说明:      CAN控制器退出复位工作模式                                  *
 ************************************************************************/
 bit   BCAN_QUIT_RETMODEL(void)
 {
    unsigned   char   TempData;
    SJA_BCANAdr = REG_CONTROL;                   //访问地址指向控制寄存器
    TempData    = *SJA_BCANAdr;                  //保存原始值
    *SJA_BCANAdr=(TempData&0xfe);       		 //清除复位请求
    if((*SJA_BCANAdr&0x01) == 0)
    {
       return   0;                               //退出成功
    }
    else
    {
       return   1;                              //
    }

 }

/************************************************************************
;*函数原型:   bit   BCAN_SET_BANDRATE(unsigned char CAN_ByteRate)       *
;*参数说明:    R7            波特率(Kbit/s) BTR0     BTR1             *
                                    500K
;*返回值:                                                               *
;*           0 ;波特率设置成功                                          *
;*           1 ;波特率设置失败                                          *
;*                                                                      *                                                        *
;************************************************************************/
bit   BCAN_SET_BANDRATE()
{
   unsigned char BTR0_num=0x00;  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   unsigned char BTR1_num=0x1c;  //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  //将波特率的的预设值装入sja1000的总线定时器
  SJA_BCANAdr=REG_BTR0;          		//访问地址指向总线定时寄存器0
  *SJA_BCANAdr=BTR0_num;      			//写入参数
  if(*SJA_BCANAdr != BTR0_num)			//校验写入值
  {
    return  1;
  }
  SJA_BCANAdr=REG_BTR1;         		//访问地址指向总线定时寄存器
  *SJA_BCANAdr=BTR1_num;      			//写入参数
  if(*SJA_BCANAdr != BTR1_num)			//校验写入值
  {
    return  1;
  }

  return    0;
}


/************************************************************************
;*函数原型:    BCAN_SET_OBJECT                                          *
*参数说明:                                                              *
 *    BCAN_ACR:存放验收代码寄存器(ACR)的参数设置                      *
 *    BCAN_AMR:存放接收屏蔽寄存器(AMR)的参数设置                      *
;*返回值:                                                               *
;*           0 ;通信对象设置成功                                        *
;*           1 ;通信对象设置失败                                        *
;*                                                                      *
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
;*     允许接收的报文,是由AMR和ACR共同决定的.                           *
;*    满足以下条件的ID号的报文才可以被接收                              *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
;*    该子程序只能用于复位模式                                          *                                                                                                                     *
;************************************************************************/
bit    BCAN_SET_OBJECT(unsigned char  BCAN_ACR,unsigned char  BCAN_AMR)
{
   SJA_BCANAdr=REG_ACR;          		//访问地址指向验收代码寄存器(ACR)
  *SJA_BCANAdr=BCAN_ACR;        		//写入参数
  if(*SJA_BCANAdr != BCAN_ACR)  		//校验写入值
  {
    return  1;
  }
  SJA_BCANAdr=REG_AMR;          		//访问地址指向验收屏蔽寄存器(AMR)
  *SJA_BCANAdr=BCAN_AMR;        		//写入参数
  if(*SJA_BCANAdr != BCAN_AMR)  		//校验写入值
  {
    return  1;
  }

  return    0;
}

/************************************************************************
;*函数原型: bit  BCAN_SET_OUTCLK (unsigned char Out_Control, 	        *
                                  unsigned char  Clock_Out);            *
;*参数说明:										      					*
 *    Out_Control:存放输出控制寄存器 (OC)  的参数设置                   *
 *    Clock_Out:存放时钟分频寄存器 (CDR) 的参数设置                     *
 *                                                                      *
;*返回值:                                                               *
;*           0 ;设置成功                                                *
;*           1 ;设置失败                                                *
;*                                                                      *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                                                                                                     *
;************************************************************************/
bit  BCAN_SET_OUTCLK (unsigned char Out_Control,
                     unsigned char  Clock_Out)
{
  SJA_BCANAdr=REG_OCR ;          		//访问地址指向输出控制寄存器
  *SJA_BCANAdr=Out_Control;      		//写入参数
  if(*SJA_BCANAdr != Out_Control)		//校验写入值
  {
    return  1;
  }
  SJA_BCANAdr=REG_CDR;          		//访问地址指向输出控制寄存器
  *SJA_BCANAdr=Clock_Out;        		//写入参数
  return    0;
}
/************************************************************************
 *函数原型:  bit   BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
 *参数说明:  特定帧各式的数据?                                         *
 *返回值:                                                               *
 *           0    ; 表示将数据成功的送至发送缓冲区                      *
 *           1	  ; 表示上一次的数据正在发送,                          *
 *                ; 表示发送缓冲区被锁定,不能写入数据                  *
 *                ; 表示写入数据错误                                    *
 *说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
 *        SJA1000发送。                                                 *
 *   特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据             *
 *   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
 *                                                                      *
 *注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
 *    不指示SJA1000将该数据正确发送到CAN总线上完毕与否                  *
 ************************************************************************/
 bit   BCAN_DATA_WRITE(unsigned char data *SendDataBuf)
 {
   unsigned  char  TempCount;
   SJA_BCANAdr = REG_STATUS;            //访问地址指向状态寄存器
   if((*SJA_BCANAdr&0x08) == 0)         //判断上次发送是否完成
   {
    return	1;
   }

   if((*SJA_BCANAdr&0x04)==0)          //判断发送缓冲区是否锁定
   {
     return	1;
   }

   SJA_BCANAdr = REG_TxBuffer1;        //访问地址指向发送缓冲区1
   if((SendDataBuf[1]&0x10)==0)        //判断RTR,从而得出是数据帧还是远程帧
   {
     TempCount =(SendDataBuf[1]&0x0f)+2; //输入数据帧
   }

   else
   {
     TempCount =2;                     //远程帧
   }

  memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
   return 0;
}

/************************************************************************
 *函数原型:  bit    BCAN_DATA_RECEIVE(unsigned char *RcvDataBuf);       *
 *参数说明:  RcvDataBuf,存放微处理器保存数据缓冲区                      *
 *返回值:    0;接收成功                                                 *
 *           1;接收失败                                                 *
 *说明:CAN控制器接收数据,仅限于接收数据                                 *
 ************************************************************************/
bit BCAN_DATA_RECEIVE(unsigned char data *RvcDataBuf)
 {
   unsigned  char  TempCount;
   SJA_BCANAdr = REG_STATUS;                //访问地址指向状态寄存器
   if((*SJA_BCANAdr&0x01)==0)               //判断报文是否有效
   {
     return 1;
   }

   SJA_BCANAdr = REG_RxBuffer2;             //访问地址指向接收缓冲区2
   if((*SJA_BCANAdr&0x10)==0)               //如果是数据帧
   {
     TempCount=(*SJA_BCANAdr&0x0f)+2;       //计算报文中数据的个数
   }

   else
   {
    TempCount=2;
   }
   SJA_BCANAdr = REG_RxBuffer1;             //访问地址指向接收缓冲区1
   SystemBuf[0]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer2;
   SystemBuf[1]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer3;
   SystemBuf[2]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer4;
   SystemBuf[3]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer5;
   SystemBuf[4]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer6;
   SystemBuf[5]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer7;
   SystemBuf[6]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer8;
   SystemBuf[7]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer9;
   SystemBuf[8]=*SJA_BCANAdr;
   SJA_BCANAdr = REG_RxBuffer10;
   SystemBuf[9]=*SJA_BCANAdr;
   //memcpy(RvcDataBuf,SJA_BCANAdr,TempCount);//读取接收缓冲区的报文

⌨️ 快捷键说明

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