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

📄 main.lst

📁 can通讯程序
💻 LST
字号:
     1: /**********************************************************************************************************************************/
     2: /*
     3: Name : check.c
     4: Editor : wangguiquan
     5: Latest edit time : 2006.07.13
     6: Notice : No.1
     7: Function:            :CAN通信自检程序
     8: CAN_Ini()            :CAN初始化程序
     9: CAN_Receive()      :CAN接收子程序
    10: CAN_Send()            :CAN发送子程序
    11: */
    12: /**********************************************************************************************************************************/
    13: //#include "pic18.h"
    14: #include "pic18fxx8x.h"
    15: #define  right  0x01
    16: #define  back   0x02
    17: /**********************************************************************************************************************************/
    18: //static volatile near unsigned char    CMCON           @ 0xFB4;
    19: char CAN_TX_Address_H,CAN_TX_Address_L;               //CAN发送邮箱标识符高低字节
    20: char CAN_RX_Address_H,CAN_RX_Address_L;               //CAN接收邮箱标识符高低字节
    21: char CAN_FLAG;
    22: //char Direction_FLAG                                         //=1收到CAN数据;=0未收到数据
    23: //char TXArray[8]={0,0,0,0,0,0,0,0};
    24: //char RXArray[8]={0,0,0,0,0,0,0,0};                     
    25: /**********************************************************************************************************************************/
    26: //函数名:sysinit()
    27: //功能描述:系统初始化
    28: /**********************************************************************************************************************************/
    29: void sysinit(void)
    30: {
    31:   CMCON=0X07;
    32:   TRISC=0X0F;
    33:   PORTC=0XF0;
    34:   INTCON=0X00;                                           //设置INTCON七位均为零:关总中断
    35:   ADCON1=0X07;                                           //设置数字量输入、输出口
    36:   PIE1=0;                                                //PIE1的中断禁止
    37:   PIE2=0;                                                //PIE2的中断禁止
    38:   PIE3=0;                                                //PIE3的中断禁止
    39: }
    40: /*****************************************************************************************************************/
    41: //Function:To delay some time
    42: //Parameters:None
    43: /*****************************************************************************************************************/
    44: void Delay(void)
    45: {
    46:   unsigned int i;
    47:   for(i=6553;i>0;i--)
    48:     i=i;
    49: }
    50: /**********************************************************************************************************************************/
    51: //函数名:initcan()
    52: //功能描述:CAN 初始化子程序,采用标准标识符,正常工作模式
    53: 
    54: /**********************************************************************************************************************************/
    55: void initcan(void)
    56: {
    57: //设置发送邮箱0标识符:10011001010=0x04CA
    58:   CAN_TX_Address_L=0x55;                                 //CAN低地址标识符
    59:   CAN_TX_Address_L=CAN_TX_Address_L&0xe0;
    60:   CAN_TX_Address_H=0x99;                                 //CAN高地址标识符,应与接收方标识符相同
    61: 
    62: //设置接收邮箱0标识符:00110011111=0x019F
    63:   CAN_RX_Address_L=0xE0;
    64:   CAN_RX_Address_L=CAN_RX_Address_L&0xE0;
    65:   CAN_RX_Address_H=0x33;
    66: 
    67: //设置对CAN进行配置
    68:   TRISB=(TRISB|0x08)&0xFB;
    69:   CANCON=0x80;
    70:   while((CANSTAT&0x80)==0)
    71:    {
    72:     ;                                                       //等待进入CAN配置模式OPMODE=100
    73:    }
    74: 
    75: //波特率设置
    76:   BRGCON1=0x01;
    77:   BRGCON2=0x90;
    78:   BRGCON3=0x42;
    79: 
    80: //设置发送邮箱0和初始发送的数据
    81:   TXB0CON=0x03;
    82:   TXB0SIDL=CAN_TX_Address_L&0xe0;
    83:   TXB0SIDH=CAN_TX_Address_H;
    84:   TXB0DLC=0x08;
    85:   TXB0D0=0x00;
    86:   TXB0D1=0x01;
    87:   TXB0D2=0x02;
    88:   TXB0D3=0x03;
    89:   TXB0D4=0x04;
    90:   TXB0D5=0x05;
    91:   TXB0D6=0x06;
    92:   TXB0D7=0x07;
    93: 
    94:   //RXB0SIDL=CAN_RX_Address_L&0xe0;
    95:   //RXB0SIDH=CAN_RX_Address_H;
    96:   RXB0CON=0x20;
    97:   RXB0DLC=0x08;
    98:   RXB0D0=0x02;
    99:   RXB0D1=0x03;
   100:   RXB0D2=0x04;
   101:   RXB0D3=0x05;
   102:   RXB0D4=0x00;
   103:   RXB0D5=0x00;
   104:   RXB0D6=0x00;
   105:   RXB0D7=0x00;
   106: 
   107: //初始化接收滤波器0和接收屏弊
   108:   RXF0SIDH=CAN_RX_Address_H;
   109:   RXF0SIDL=CAN_RX_Address_L&0xe0;
   110:   RXM0SIDH=0xFF;
   111:   RXM0SIDL=0xE0;
   112: 
   113: //设置CAN工作模式
   114:   CANCON=0x00;
   115:   while((CANSTAT&0xE0)!=0)
   116:    {
   117:     ;
   118:    }
   119: 
   120: //初始化CAN的中断源,PIR3为CAN的外围中断标志寄存器
   121:   PIR3=0x00;
   122:   PIE3=PIE3|0x01;
   123:   IPR3=IPR3|0x01;
   124: }
   125: 
   126: 
   127: 
   128: 
   129: /******************************************************************************************************************/
   130: //Function:To let motor1 back run
   131: //Parameters:None
   132: /******************************************************************************************************************/ 
   133: void Motor1Run(void)
   134: {
   135:   RC7=0;
   136:   RC6=1;
   137: }
   138: /******************************************************************************************************************/
   139: //Function:To let motor1 back run
   140: //Parameters:None
   141: /******************************************************************************************************************/ 
   142: void Motor1BackRun(void)
   143: {
   144:   RC7=1;
   145:   RC6=0;
   146: }
   147: /*****************************************************************************************************************/
   148: //Function:To let motor2 right run
   149: //Parameters:None
   150: /******************************************************************************************************************/ 
   151: void Motor2Run(void)
   152: {
   153:   RC5=0;
   154:   RC4=1;
   155: }/*******************************************************************************************************************/
   156: //Function:To let motor2 back run
   157: //Parameters:None
   158: /********************************************************************************************************************/ 
   159: void Motor2BackRun(void)
   160: {
   161:   RC5=1;
   162:   RC4=0;
   163: }
   164: 
   165: 
   166: 
   167: /******************************************************************************************************************/
   168: //Function:To send right run data
   169: //Parameters:None
   170: /******************************************************************************************************************/ 
   171: void Transfer1(void)
   172: {
   173:  
   174:    
   175:         TXB0CON=TXB0CON&0xF7;
   176:         TXB0D0=0x01;
   177:         TXB0D1=0x01;
   178:         TXB0D2=0x01;
   179:         TXB0D3=0x01;
   180:         TXB0D4=0x01;
   181:         TXB0D5=0x01;
   182:         TXB0D6=0x01;
   183:         TXB0D7=0x01;
   184:        // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
   185:        //    MotorRun();
   186:        // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
   187:        //    MotorBackRun();
   188:         TXB0CON=TXB0CON|0x08;
   189:        
   190: }
   191: /******************************************************************************************************************/
   192: //Function:To send back run data
   193: //Parameters:None
   194: /******************************************************************************************************************/ 
   195: void Transfer2(void)
   196: {
   197:  
   198:  
   199:         TXB0CON=TXB0CON&0xF7;
   200:         TXB0D0=0x02;
   201:         TXB0D1=0x02;
   202:         TXB0D2=0x02;
   203:         TXB0D3=0x02;
   204:         TXB0D4=0x02;
   205:         TXB0D5=0x02;
   206:         TXB0D6=0x02;
   207:         TXB0D7=0x02;
   208:        // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
   209:        //    MotorRun();
   210:        // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
   211:        //    MotorBackRun();
   212:         TXB0CON=TXB0CON|0x08;
   213:        
   214: }
   215: 
   216: 
   217: 
   218: 
   219: /********************************************************************************************************************/
   220: //Function:To scan the key
   221: //Parameters:None
   222: /********************************************************************************************************************/
   223: void KeyServe(void)
   224: {
   225:  if((PORTC&0X0F)!=0X0F)
   226:  {
   227:    Delay();
   228:    if((PORTC&0X0F)!=0X0F)
   229:    {
   230:      if((PORTC&0X0F)==0X0E)               //if the first key is pressed
   231:      Transfer1();
   232:      if((PORTC&0X0F)==0X0D)               //if the second key is pressed
   233:       Transfer2();
   234:      if((PORTC&0X0F)==0X0B)               //if the third key is pressed
   235:      Motor2Run();
   236:      if((PORTC&0X0F)==0X07)               //if the fourth key is pressed
   237:      Motor2BackRun();
   238:    }
   239:    while((PORTC&0X0F)!=0X0F)
   240:     {
   241:      ;
   242:     }
   243:    Delay();
   244: 
   245:  }
   246: }
   247: 
   248: 
   249: 
   250: 
   251: 
   252: 
   253: 
   254: 
   255: 
   256: 
   257: /**********************************************************************************************************************************/
   258: //函数名:interrupt HI_iISR()
   259: //功能描述:高优先级中断子程序:BXB0接收邮箱0接收中断子程序 
   260: /**********************************************************************************************************************************/
   261: void interrupt HI_ISR(void)
   262: {
   263:   if(RXB0IF=1);
   264:    {
   265:     CAN_FLAG=1;
   266:     if(RXB0D0==1)
   267:        Motor1Run();
   268:     if(RXB0D0==2)
   269:        Motor1BackRun();
   270:     RXB0IF=0;
   271:     RXB0FUL=0;
   272:    }
   273: }
   274: 
   275: 
   276: 
   277: 
   278: 
   279: 
   280: //主程序
   281: main()
   282: {
   283:   sysinit();
   284:   initcan();
   285:   IPEN=1;
   286:   INTCON=INTCON|0xc0;
   287:   TXB0REQ=0;
   288: Motor2Run();
   289:   while(1)
   290:    {
   291:      KeyServe();
   292:    }
   293: }

⌨️ 快捷键说明

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