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

📄 can_self.lst

📁 CAN总线上挂接两个节点
💻 LST
📖 第 1 页 / 共 2 页
字号:
 180          //说明:接收处理程序;检测接收标志状态位,
 181          //		如果置位则进行接收处理
 182          //入口:无
 183          //返回:无
 184          ///////////////////////////////////////////////
 185          /****************************************************/
 186          void rxd_deal(void)
 187          {
 188   1          if( RXD_flag )	//RXD_flag=0说明无数据可以接收,RXD_flag=1说明有数据可以接收	
 189   1          {
 190   2              EA = 0;		//关闭CPU中断
 191   2              RXD_flag = 0;	//RXD_flag清零,以便下次查询
 192   2      		if( RX_buffer[0] && 0x40 )	//接收到远程帧
 193   2      		{
 194   3      			TXD_flag = 1;		//置位发送数据帧
 195   3      		}
 196   2      		else		//接收到数据帧
 197   2      		{		//CAN总线要接收的数据,也是要在数码管3-4位置显示的数据
 198   3      	        Rxd_data = RX_buffer[5];				
 199   3      		}
 200   2      
 201   2              EA = 1;		//重新开启CPU中断
 202   2           }
 203   1      }
 204          
 205          
 206          ///////////////////////////////////////////////
 207          //函数:txd_deal
 208          //说明:发送处理程序;检测发送标志状态位,
 209          //		如果置位则进行发送数据处理
 210          //入口:无
 211          //返回:无
 212          ///////////////////////////////////////////////
 213          void txd_deal(void)
 214          {
 215   1          if( TXD_flag )	//若TXD_flag=1,要求进行数据的发送处理
 216   1          {
 217   2              _nop_();
 218   2              TXD_flag = 0;	//RXD_flag清零,以便下次查询
 219   2              can_txd();		//发送数据帧
 220   2              _nop_();
 221   2              _nop_();
 222   2          }	//发送数据帧后,SJA1000将产生接收中断
 223   1      }
 224          
 225          
 226          
 227          ///////////////////////////////////////////////
 228          //函数:can_txd
 229          //说明:发送扩展数据帧
 230          //入口:无
 231          //返回:无
 232          ///////////////////////////////////////////////
 233          void can_txd(void)
 234          {
 235   1          uchar state;
 236   1          uchar TX_buffer[ N_can ] ;	//N_can=13,TX_buffer数组为待传送的数据帧
 237   1      
 238   1      	//初始化标示码头信息
 239   1          TX_buffer[0] = 0x88;	//.7=0--扩展帧;.6=0--数据帧; .0-.3=100--数据长度为8字节
 240   1          TX_buffer[1] = 0x55;	//本帧信息的ID
 241   1          TX_buffer[2] = 0x22;
C51 COMPILER V6.12  CAN_SELF                                                               06/19/2008 15:29:09 PAGE 5   

 242   1          TX_buffer[3] = 0x33;
 243   1          TX_buffer[4] = 0x44;
 244   1      
 245   1      	//初始化发送数据单元
 246   1          TX_buffer[5]  = Txd_data;	//发送的第1个字节数据,也是数码管要显示的数据(计数结果)
 247   1          TX_buffer[6]  = 0x22;	//2
 248   1          TX_buffer[7]  = 0x33;	//3
 249   1          TX_buffer[8]  = 0x44;	//4
 250   1          TX_buffer[9]  = 0x55;	//5
 251   1          TX_buffer[10] = 0x66;	//6
 252   1          TX_buffer[11] = 0x77;	//7
 253   1          TX_buffer[12] = 0x88;	//8
 254   1      
 255   1      	//初始化数据信息
 256   1          EA = 0; //关中断
 257   1      
 258   1      	//查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行
 259   1          do
 260   1          {
 261   2              state = SR;		//SR为SJA1000的状态寄存器
 262   2              LED_RED = 0;	//点亮LED1
 263   2          }
 264   1          while( state & 0x10 );  //SR.4=1 正在接收,等待
 265   1          
 266   1      	//查询SJA1000是否处于发送完毕状态
 267   1          do
 268   1          {
 269   2              state = SR;		
 270   2              LED_RED = 0;	//点亮LED1
 271   2          }
 272   1          while(!(state & 0x08)); //SR.3=0,发送请求未处理完,等待直到SR.3=1
 273   1      
 274   1      	//查询发送缓冲器状态
 275   1          do
 276   1          {
 277   2              state = SR;		
 278   2              LED_RED = 0;	//点亮LED1
 279   2          }
 280   1          while(!(state & 0x04)); //SR.2=0,发送缓冲器被锁。等待直到SR.2=1
 281   1      
 282   1          LED_RED = !LED_RED;	//熄灭LED1
 283   1          LED_GRE = !LED_GRE;	//点亮LED2
 284   1      
 285   1      	//将待发送的一帧数据信息存入SJA1000的相应寄存器中
 286   1          TBSR0  = TX_buffer[0];
 287   1          TBSR1  = TX_buffer[1];
 288   1          TBSR2  = TX_buffer[2];
 289   1          TBSR3  = TX_buffer[3];
 290   1          TBSR4  = TX_buffer[4];
 291   1          TBSR5  = TX_buffer[5];
 292   1          TBSR6  = TX_buffer[6];
 293   1          TBSR7  = TX_buffer[7];
 294   1          TBSR8  = TX_buffer[8];
 295   1          TBSR9  = TX_buffer[9];
 296   1          TBSR10 = TX_buffer[10];
 297   1          TBSR11 = TX_buffer[11];
 298   1          TBSR12  = TX_buffer[12];
 299   1      
 300   1          CMR = 0x01;	//置位发送请求
 301   1          EA  = 1; 	//重新开启中断
 302   1      }
 303          
C51 COMPILER V6.12  CAN_SELF                                                               06/19/2008 15:29:09 PAGE 6   

 304          ///////////////////////////////////////////////
 305          //函数:delay
 306          //说明:延时子函数
 307          //入口:uchar time:延时时间time us
 308          //返回:无
 309          ///////////////////////////////////////////////
 310          void delay(uchar time)
 311          {
 312   1          while(time--);
 313   1      }
 314          
 315          ///////////////////////////////////////////////
 316          //函数:led_show
 317          //说明:数码管显示函数
 318          //		注意控制P2口的高4位时,不要影响P2口的低4位值
 319          //入口:uchar wela:		wela=1--高两位显示发送数据
 320          //						wela=0--低两位显示接收数据
 321          //		uchar number:	要显示的数据
 322          //返回:无
 323          ///////////////////////////////////////////////
 324          void led_show(uchar wela,uchar number)  
 325          {
 326   1          uchar digit;
 327   1          uchar temp;
 328   1      
 329   1      	if(wela)	//高位显示,即数码管1-2
 330   1      	{
 331   2      		temp = 0x7b;	//temp=01111011B
 332   2      	}
 333   1      	else		//低位显示,即数码管3-4
 334   1      	{
 335   2      		temp = 0xde;	//temp=11011110B
 336   2      	}
 337   1      
 338   1      //数码管个位显示
 339   1      	digit = number%10;
 340   1          P0 = led[digit];
 341   1      	P2 = (temp | 0x0f) & P2;			//开个位
 342   1      	delay(5);
 343   1      	P2 = 0xff;	
 344   1      	P0 = 0xff;			//关闭个位
 345   1      //数码管十位显示
 346   1      	number /= 10;
 347   1      	digit = number%10;
 348   1          P2 = ((temp << 4) | 0x0f) & P2;		//开十位
 349   1      	P0 = led[digit];
 350   1      	delay(5);
 351   1      	P2 = 0xff;		//关闭十位
 352   1          P0 = 0xff;
 353   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    534    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     28      21
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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