📄 main.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 + -