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

📄 main.c

📁 另一个小板的控制程序
💻 C
字号:
/**********************************************************************************************************************************/
/*
Name : check.c
Editor : wangguiquan
Latest edit time : 2006.07.13
Notice : No.1
Function:            :CAN通信自检程序
CAN_Ini()            :CAN初始化程序
CAN_Receive()      :CAN接收子程序
CAN_Send()            :CAN发送子程序
*/
/**********************************************************************************************************************************/
//#include "pic18.h"
#include "pic18fxx8x.h"
#define  right  0x01
#define  back   0x02
/**********************************************************************************************************************************/
//static volatile near unsigned char	CMCON		@ 0xFB4;
char CAN_TX_Address_H,CAN_TX_Address_L;               //CAN发送邮箱标识符高低字节
char CAN_RX_Address_H,CAN_RX_Address_L;               //CAN接收邮箱标识符高低字节
char CAN_FLAG;
//char Direction_FLAG                                         //=1收到CAN数据;=0未收到数据
//char TXArray[8]={0,0,0,0,0,0,0,0};
//char RXArray[8]={0,0,0,0,0,0,0,0};                     
/**********************************************************************************************************************************/
//函数名:sysinit()
//功能描述:系统初始化
/**********************************************************************************************************************************/
void sysinit()
{
  CMCON=0X07;
  TRISC=0X0F;
  PORTC=0XF0;
  INTCON=0X00;                                           //设置INTCON七位均为零:关总中断
  ADCON1=0X07;                                           //设置数字量输入、输出口
  PIE1=0;                                                //PIE1的中断禁止
  PIE2=0;                                                //PIE2的中断禁止
  PIE3=0;                                                //PIE3的中断禁止
}
/*****************************************************************************************************************/
//Function:To delay some time
//Parameters:None
/*****************************************************************************************************************/
void Delay(void)
{
  unsigned int i;
  for(i=6553;i>0;i--)
    i=i;
}
/**********************************************************************************************************************************/
//函数名:initcan()
//功能描述:CAN 初始化子程序,采用标准标识符,正常工作模式

/**********************************************************************************************************************************/
void initcan()
{
//设置发送邮箱0标识符:00110011111=0x019F
  CAN_TX_Address_L=0xE0;                                 //CAN低地址标识符
  CAN_TX_Address_L=CAN_TX_Address_L&0xe0;
  CAN_TX_Address_H=0x33;                                 //CAN高地址标识符,应与接收方标识符相同

//设置接收邮箱0标识符:10011001010=0x04CA
  CAN_RX_Address_L=0x55;
  CAN_RX_Address_L=CAN_RX_Address_L&0xE0;
  CAN_RX_Address_H=0x99;

//设置对CAN进行配置
  TRISB=(TRISB|0x08)&0xFB;
  CANCON=0x80;
  while((CANSTAT&0x80)==0)
   {
    ;                                                       //等待进入CAN配置模式OPMODE=100
   }

//波特率设置
  BRGCON1=0x01;
  BRGCON2=0x90;
  BRGCON3=0x42;

//设置发送邮箱0和初始发送的数据
  TXB0CON=0x03;
  TXB0SIDL=CAN_TX_Address_L&0xe0;
  TXB0SIDH=CAN_TX_Address_H;
  TXB0DLC=0x08;
  TXB0D0=0x00;
  TXB0D1=0x01;
  TXB0D2=0x02;
  TXB0D3=0x03;
  TXB0D4=0x04;
  TXB0D5=0x05;
  TXB0D6=0x06;
  TXB0D7=0x07;

  //RXB0SIDL=CAN_RX_Address_L&0xe0;
  //RXB0SIDH=CAN_RX_Address_H;
  RXB0CON=0x20;
  RXB0DLC=0x08;
  RXB0D0=0x02;
  RXB0D1=0x03;
  RXB0D2=0x04;
  RXB0D3=0x05;
  RXB0D4=0x00;
  RXB0D5=0x00;
  RXB0D6=0x00;
  RXB0D7=0x00;

//初始化接收滤波器0和接收屏弊
  RXF0SIDH=CAN_RX_Address_H;
  RXF0SIDL=CAN_RX_Address_L&0xe0;
  RXM0SIDH=0xFF;
  RXM0SIDL=0xE0;

//设置CAN工作模式
  CANCON=0x00;
  while((CANSTAT&0xE0)!=0)
   {
    ;
   }

//初始化CAN的中断源,PIR3为CAN的外围中断标志寄存器
  PIR3=0x00;
  PIE3=PIE3|0x01;
  IPR3=IPR3|0x01;
}




/******************************************************************************************************************/
//Function:To let motor1 back run
//Parameters:None
/******************************************************************************************************************/ 
void Motor1Run(void)
{
  RC7=0;
  RC6=1;
}
/******************************************************************************************************************/
//Function:To let motor1 back run
//Parameters:None
/******************************************************************************************************************/ 
void Motor1BackRun(void)
{
  RC7=1;
  RC6=0;
}
/*****************************************************************************************************************/
//Function:To let motor2 right run
//Parameters:None
/******************************************************************************************************************/ 
void Motor2Run(void)
{
  RC5=0;
  RC4=1;
}/*******************************************************************************************************************/
//Function:To let motor2 back run
//Parameters:None
/********************************************************************************************************************/ 
void Motor2BackRun(void)
{
  RC5=1;
  RC4=0;
}



/******************************************************************************************************************/
//Function:To send right run data
//Parameters:None
/******************************************************************************************************************/ 
void Transfer1(void)
{
 
   
        TXB0CON=TXB0CON&0xF7;
        TXB0D0=0x01;
        TXB0D1=0x01;
        TXB0D2=0x01;
        TXB0D3=0x01;
        TXB0D4=0x01;
        TXB0D5=0x01;
        TXB0D6=0x01;
        TXB0D7=0x01;
       // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
       //    MotorRun();
       // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
       //    MotorBackRun();
        TXB0CON=TXB0CON|0x08;
       
}
/******************************************************************************************************************/
//Function:To send back run data
//Parameters:None
/******************************************************************************************************************/ 
void Transfer2(void)
{
 
 
        TXB0CON=TXB0CON&0xF7;
        TXB0D0=0x02;
        TXB0D1=0x02;
        TXB0D2=0x02;
        TXB0D3=0x02;
        TXB0D4=0x02;
        TXB0D5=0x02;
        TXB0D6=0x02;
        TXB0D7=0x02;
       // if((RXB0D0=1)&&(RXB0D4=RXB0D0))
       //    MotorRun();
       // if((RXB0D1=1)&&(RXB0D5=RXB0D1))
       //    MotorBackRun();
        TXB0CON=TXB0CON|0x08;
       
}




/********************************************************************************************************************/
//Function:To scan the key
//Parameters:None
/********************************************************************************************************************/
void KeyServe(void)
{
 if((PORTC&0X0F)!=0X0F)
 {
   Delay();
   if((PORTC&0X0F)!=0X0F)
   {
     if((PORTC&0X0F)==0X0E)               //if the first key is pressed
     Transfer1();
     if((PORTC&0X0F)==0X0D)               //if the second key is pressed
      Transfer2();
     if((PORTC&0X0F)==0X0B)               //if the third key is pressed
     Motor2Run();
     if((PORTC&0X0F)==0X07)               //if the fourth key is pressed
     Motor2BackRun();
   }
   while((PORTC&0X0F)!=0X0F)
    {
     ;
    }
   Delay();

 }
}










/**********************************************************************************************************************************/
//函数名:interrupt HI_iISR()
//功能描述:高优先级中断子程序:BXB0接收邮箱0接收中断子程序 
/**********************************************************************************************************************************/
void interrupt HI_ISR()
{
  if(RXB0IF=1);
   {
    CAN_FLAG=1;
    if(RXB0D0==1)
       Motor1Run();
    if(RXB0D0==2)
       Motor1BackRun();
    RXB0IF=0;
    RXB0FUL=0;
   }
}






//主程序
main()
{
  sysinit();
  initcan();
  IPEN=1;
  INTCON=INTCON|0xc0;
  TXB0REQ=0;
  Motor2Run();
  while(1)
   {
     KeyServe();
   }
}

⌨️ 快捷键说明

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