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

📄 can_self.lst

📁 CAN节点的自通信程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 177          
 178          ///////////////////////////////////////////////
 179          //函数:rxd_deal
C51 COMPILER V6.12  CAN_SELF                                                               06/20/2008 08:56:27 PAGE 4   

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    527    ----
   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 + -