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

📄 can_self.lst

📁 CAN总线上挂接两个节点
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  CAN_SELF                                                               06/19/2008 15:31:11 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE CAN_SELF
OBJECT MODULE PLACED IN .\can_self.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\can_self.c DEBUG OBJECTEXTEND

stmt level    source

   1          /**************************************************************************************
   2          项	目:基于CAN总线的收发通信(节点1)
   3          说	明:主程序部分
   4          功	能:CAN总线上挂接两个节点,当其中一个节点(节点1)的按键按下时,除了自身的数码管1、2
   5          		显示加一,还向节点2发送一个远程帧;节点2接收到远程帧后想总线发送一个数据帧,如果
   6          		节点2的按键被按下时,除了自身的数码管1、2显示加一,还会向总线发送数据帧,使得节点
   7          		2的数码管3、4显示与其保持一致。
   8          //      CAN主要参数:       PeliCAN模式,扩展帧EFF模式                         
   9          //      29位标示码结构:发送一个远程帧                          
  10          //      本节点的接收代码寄存器值: 0x55,0x22,0x33,0x44
  11          //		本节点的屏蔽代码寄存器值:0x00,0xff,0x00,0xff;可以接收节点2的数据               
  12          //      目的节点地址:0x11,0x22,0x33,0x44;可以被节点1接收   
  13          模	块:can_self.c
  14          作	者:特	权
  15          时	间:08.6.17.
  16          **************************************************************************************/
  17          /***感谢PIAE工作组提供的源码,这里特权根据自己的编程习惯做了一些修改并添加详细注释***/
  18          
  19          #include <reg52.h>
  20          #include <intrins.h>
  21          #include "define.h"
  22          
  23          ///////////////////////////////////////////////
  24          //函数:inter0_key  (外部中断INT0)
  25          //说明:INT0按键为计数按键
  26          //		每按下一次键,计数值加一
  27          //入口:按键中断
  28          //返回:按键加一
  29          ///////////////////////////////////////////////
  30          void inter0_key(void) interrupt 0
  31          {
  32   1          EA = 0;		//关闭中断
  33   1          Txd_data++;		//计数结果增1,即待发送的数据增1
  34   1          TXD_flag = 1;	//发送数据标志位置位,即重新发送数据以更新数码管的显示数值
  35   1          EA = 1;		//重新开启中断
  36   1      }
  37          
  38          ///////////////////////////////////////////////
  39          //函数:inter1_can_rxd  (外部中断INT1)
  40          //说明:接收数据函数,在中断服务程序中调用
  41          //入口:无
  42          //返回:无
  43          ///////////////////////////////////////////////
  44          void inter1_can_rxd( void ) interrupt 2
  45          {
  46   1          uchar state;
  47   1      
  48   1          EA = 0;		//关CPU中断
  49   1          IE1 = 0;	//由于是中断INT1是电平触发方式,所以需要软件将INT1的中断请求标志IE0清零
  50   1      
  51   1          state = IR;	//IR为SJA1000的中断寄存器
  52   1          if( state & 0x01)	//若IR.0=1--接收中断
  53   1          {	//接收数据帧
  54   2              RX_buffer[0] =  RBSR0;
  55   2              RX_buffer[1] =  RBSR1;
C51 COMPILER V6.12  CAN_SELF                                                               06/19/2008 15:31:11 PAGE 2   

  56   2              RX_buffer[2] =  RBSR2;
  57   2              RX_buffer[3] =  RBSR3;
  58   2              RX_buffer[4] =  RBSR4;
  59   2              RX_buffer[5] =  RBSR5;
  60   2              RX_buffer[6] =  RBSR6;
  61   2              RX_buffer[7] =  RBSR7;
  62   2              RX_buffer[8] =  RBSR8;
  63   2              RX_buffer[9] =  RBSR9;
  64   2              RX_buffer[10] =  RBSR10;
  65   2              RX_buffer[11] =  RBSR11;
  66   2              RX_buffer[12] =  RBSR12;
  67   2              RXD_flag = 1;	//接收标志置位,以便进入接收处理程序
  68   2              CMR = 0x04;		//CMR.2=1--接收完毕,释放接收缓冲器
  69   2              state = ALC;	//释放仲裁随时捕捉寄存器(读该寄存器即可)
  70   2              state = ECC;	//释放错误代码捕捉寄存器(读该寄存器即可)
  71   2          }
  72   1      
  73   1          IER = 0x01;		// IER.0=1--接收中断使能
  74   1          EA = 1;			//重新开启CPU中断
  75   1      }
  76          
  77          ///////////////////////////////////////////////
  78          //函数:main
  79          //说明:主函数
  80          //入口:无
  81          //返回:无
  82          ///////////////////////////////////////////////
  83          void main(void)
  84          {
  85   1      	init_mcu();
  86   1      	init_sja1000();
  87   1      	while(1)
  88   1      	{
  89   2              rxd_deal();		//接收处理程序
  90   2              txd_deal();		//发送处理程序
  91   2              led_show(0,Txd_data);	//数码管1-2显示发送数据子程序
  92   2              led_show(1,Rxd_data);	//数码管3-4显示接收数据子程序		
  93   2      	}	
  94   1      }
  95          
  96          ///////////////////////////////////////////////
  97          //函数:init_mcu
  98          //说明:单片机I/O口初始化
  99          //		主要是各中断寄存器的初始化
 100          //入口:无
 101          //返回:无
 102          ///////////////////////////////////////////////
 103          void init_mcu(void)
 104          {
 105   1          SJA_RST = 1;	//CAN总线复位管脚复位无效
 106   1          SJA_CS = 0;		//CAN总线片选有效
 107   1          EX1 = 1;	//开MCU外部中断INT1
 108   1          IT1 = 0;	//MCU外部中断INT1设置为电平触发,该中断口连接CAN总线接收中断口
 109   1          IT0 = 1;	//MCU外部中断INT0设置为下降沿触发
 110   1          EX0 = 1;	//开MCU外部中断INT0
 111   1          EA = 1; 	//开MCU总中断
 112   1          SJA_CS = 1;		//CAN总线片选无效,使得对数据总线的操作不会影响SJA1000。	
 113   1      }
 114          
 115          ///////////////////////////////////////////////
 116          //函数:init_sja1000
 117          //说明:独立CAN控制器SJA1000的初始化
C51 COMPILER V6.12  CAN_SELF                                                               06/19/2008 15:31:11 PAGE 3   

 118          //入口:无
 119          //返回:无
 120          ///////////////////////////////////////////////
 121          void init_sja1000(void)
 122          {
 123   1          uchar state;
 124   1          uchar ACRR[4];
 125   1          uchar AMRR[4];
 126   1      
 127   1      // 接收代码寄存器
 128   1          ACRR[0] = 0x55;
 129   1          ACRR[1] = 0x22;
 130   1          ACRR[2] = 0x33;
 131   1          ACRR[3] = 0x44;	
 132   1      
 133   1      // 接收屏蔽寄存器
 134   1          AMRR[0] = 0x00;
 135   1          AMRR[1] = 0Xff;
 136   1          AMRR[2] = 0x00;
 137   1          AMRR[3] = 0xff;	
 138   1      
 139   1      // 使用do--while语句确保进入复位模式
 140   1          do
 141   1          {
 142   2              MODR  = 0x09;	// 设置MOD.0=1--进入复位模式,以便设置相应的寄存器
 143   2      		state = MODR;	
 144   2          }
 145   1          while( !(state & 0x01) );
 146   1      
 147   1      // 对SJA1000部分寄存器进行初始化设置
 148   1          CDR  = 0x88;	// CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
 149   1          BTR0 = 0x31;	// 总线定时寄存器0 ;总线波特率设定
 150   1          BTR1 = 0x1c;	// 总线定时寄存器1 ;总线波特率设定
 151   1          IER  = 0x01;	// IER.0=1--接收中断使能;  IER.1=0--关闭发送中断使能
 152   1          OCR  = 0xaa;	// 配置输出控制寄存器
 153   1          CMR  = 0x04;	// 释放接收缓冲器
 154   1      
 155   1      // 初始化接收代码寄存器
 156   1          ACR0 = ACRR[0];
 157   1          ACR1 = ACRR[1];
 158   1          ACR2 = ACRR[2];
 159   1          ACR3 = ACRR[3]; 
 160   1      
 161   1      // 初始化接收屏蔽寄存器
 162   1          AMR0 = AMRR[0];
 163   1          AMR1 = AMRR[1];
 164   1          AMR2 = AMRR[2];
 165   1          AMR3 = AMRR[3]; 
 166   1      
 167   1      // 使用do--while语句确保退出复位模式
 168   1          do
 169   1          {
 170   2      		MODR   = 0x08;	//MOD.3=0--双滤波器模式
 171   2      		state  = MODR;
 172   2           }
 173   1          while( state & 0x01 );
 174   1      }
 175          

⌨️ 快捷键说明

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