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

📄 basiccan_final1.lst

📁 设计了一个基于51单片机的CAN节点
💻 LST
📖 第 1 页 / 共 4 页
字号:
 600   1        SJA_BCANAdr=REG_CONTROL;//设置控制寄存器,在操作模式进行
 601   1        *SJA_BCANAdr=0X1E;//开启溢出中断、错误中断、发生和接收中断
 602   1        
 603   1        return  status; 
 604   1      }
 605          
 606          
 607                
 608          void main()
 609          {       
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 11  

 610   1          delay(100);
 611   1          
 612   1              IT0=0;//外中断0为电平触发方式
 613   1                    
 614   1          TMOD=0x60;//计数器1以工作方式2工作,以TR1启动定时器
 615   1              TH1=0xFF;
 616   1              TL1=0xFF;//一次计数则中断(T1负跳变时计一次)
 617   1              TR1=1;//启动计数
 618   1              
 619   1              ET1=1;//允许计数器1中断
 620   1              
 621   1              EX0=1;//允许外中断0中断
 622   1      
 623   1              EA=1;//中断总允许
 624   1          
 625   1          if(SJA_1000_Init()==0)
 626   1              dispbuf=0;//表示初始化成功
 627   1          else
 628   1              dispbuf=1;
 629   1               
 630   1              while(1)
 631   1              {
 632   2                      display(dispbuf);
 633   2              }        
 634   1                                                 
 635   1      }
 636          
 637          
 638          
 639          //该函数现实键盘扫描,去抖动,实现要求功能
 640          void keyboard() interrupt 3 using 0
 641          {
 642   1              static uchar num_send=0;//定义一个静态变量,并初始化为0,用于计算S1键按下的次数,即要发送的数据
 643   1              static uchar ADC_send=0;
 644   1              static uchar num_rate=0x0D;//用于记录S3按下的次数,从而智能的选择波特率
 645   1              uchar key_code;//用于存储所按下的键值
 646   1              ET1=0;//关闭计数器1中断
 647   1              delay(20);//去抖动,等待20ms
 648   1              if(!T1)
 649   1              {
 650   2                      key_code=P1&0x0F;//读取P1口的前4位,即P10-P13
 651   2                      switch(key_code)
 652   2                      {
 653   3                              case 0x0E://按下S1键的情况:设置发送数据,每按一次加1
 654   3      //                              EX0=0;//关闭外中断0
 655   3                                      num_send++;                             
 656   3                                      dispbuf=num_send;//将num_send转化为可以显示的十进制数,并存入SetSystemBuf中
 657   3                                      break;
 658   3      
 659   3                                      case 0x0D://按下S2键的情况:将设置好的数据发送出去
 660   3                                      //EX1=0;//关闭外中断1
 661   3                                      send_data[0]=0x01;//标识符为1010 1010 000
 662   3                                      send_data[1]=0x04;
 663   3                                      send_data[2]=num_send;
 664   3                                      BCAN_DATA_WRITE(send_data);//将数据存放到REG_TxBuffer
 665   3                                      delay(10);
 666   3                                      BCAN_CMD_PRG(TR_CMD);//发送数据到CAN总线上,成功是否在中断判断
 667   3                                      dispbuf=num_send;
 668   3                                      num_send=0;//复位发送的数据
 669   3      //                              EX0=1;//开外中断0
 670   3                                      break;
 671   3      
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 12  

 672   3                                      case 0x0B://按下S3键的情况:设置波特率
 673   3                                      //EX1=0;//关闭外中断1
 674   3                                      num_rate--;
 675   3                                      BCAN_ENTER_RETMODEL();//使CAN控制器进入复位工作模式
 676   3                                      BCAN_SET_BANDRATE(num_rate);//设置波特率
 677   3                                      dispbuf=band_rate[num_rate];
 678   3                                      BCAN_QUIT_RETMODEL();//使CAN控制器退出复位工作模式                              
 679   3                                      if(!num_rate)
 680   3                                      num_rate=0x0D;
 681   3                                      break;
 682   3                                      
 683   3                                      case 0x07://按下S4的情况:开始接收AD的数据并显示
 684   3                                      OE=0;
 685   3                                      ST=0;
 686   3                                      ST=1;
 687   3                                      ST=0;
 688   3                                      OE=1;
 689   3                                      dispbuf=P0;
 690   3                                      ADC_send=P0;
 691   3                                      OE=0;
 692   3      
 693   3                                      send_data[0]=0x01;//标识符为1010 1010 000
 694   3                                      send_data[1]=0x21;
 695   3                                      send_data[2]=ADC_send;
 696   3                                      BCAN_DATA_WRITE(send_data);//将数据存放到REG_TxBuffer
 697   3                                      delay(10);
 698   3                                      BCAN_CMD_PRG(TR_CMD);//发送数据到CAN总线上,成功是否在中断判断
 699   3      
 700   3      //                              dispbuf=7;//显示P,表示推出复位
 701   3                                      //EX1=1;//开外中断1
 702   3                                      break;
 703   3                              default:
 704   3                                      break;                                                  
 705   3                      }       
 706   2              }
 707   1              ET1=1;//开计数器中断                                    
 708   1      }
 709          
 710          //该中断实现接收显示,并当出现错误是给予显示:
 711          void SJA_int() interrupt 0 using 3
 712          {
 713   1              uchar reg_int; //存放中断寄存器的数据
 714   1              uchar rcv_buf[10];//接收数据存储
 715   1              EX0=0;//关闭外中断0
 716   1              SJA_BCANAdr=REG_INTERRUPT;//读取中断寄存器的数据
 717   1              reg_int=*SJA_BCANAdr;
 718   1      
 719   1              if(reg_int&0x01) //接收中断处理
 720   1              {
 721   2                      BCAN_DATA_RECEIVE(rcv_buf);
 722   2                      
 723   2                      dispbuf=rcv_buf[2];//显示数据
 724   2      //              display();
 725   2                      //SetSystemBuf[1]=rcv_buf[3];
 726   2                      //SetSystemBuf[2]=rcv_buf[4];
 727   2                      //SetSystemBuf[3]=rcv_buf[5];
 728   2                      BCAN_CMD_PRG(RRB_CMD);//释放接收缓存区
 729   2                      P14=1;
 730   2                      P15=1;
 731   2                      P17=1;
 732   2                      P0=~dispbitcode[10];
 733   2              P17=0;
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 13  

 734   2              delay(500);
 735   2              }
 736   1          else if(reg_int & 0x02)
 737   1          {
 738   2          P14=1;
 739   2              P15=1;
 740   2              P17=1;
 741   2              P0=~dispbitcode[17];
 742   2          P17=0;
 743   2          delay(500);
 744   2      //      dispbuf=17;//若是发送中断,则显示H,表示发送成功
 745   2          }
 746   1      
 747   1          else if(reg_int & 0x04)
 748   1          {
 749   2              P14=1;
 750   2                      P15=1;
 751   2                      P17=1;
 752   2                      P0=~dispbitcode[16];
 753   2                      P17=0;
 754   2              delay(500);   
 755   2                      //dispbuf=16;//若是错误中断,则显示-,表示有错误产生
 756   2          }
 757   1      
 758   1          else if(reg_int & 0x08)
 759   1          {
 760   2              P14=1;
 761   2                      P15=1;
 762   2                      P17=1;
 763   2                      P0=~dispbitcode[19];
 764   2              P17=0;
 765   2              delay(500);
 766   2              
 767   2                      //dispbuf=19;//若是数据溢出中断,则显示L,表示有数据溢出中断
 768   2          }
 769   1      
 770   1              else
 771   1              {
 772   2                      P14=1;
 773   2                      P15=1;
 774   2                      P17=1;
 775   2                      P0=~dispbitcode[18];
 776   2              P17=0;
 777   2              delay(500);
 778   2              
 779   2              //dispbuf=18;//表示唤醒中断,显示P
 780   2              }
 781   1      
 782   1      
 783   1              EX0=1;//开外中断0
 784   1      }
 785          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1238    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     28      18
   IDATA SIZE       =     36    ----
   BIT SIZE         =   ----    ----
C51 COMPILER V6.23a  BASICCAN_FINAL1                                                       09/20/2008 12:27:03 PAGE 14  

END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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