?? main.c
字號:
/**********************************************************************************************************************************/
/*
Name : check.c
Editor : wangguiquan
Latest edit time : 2006.12.23
Notice : No.1
Function: :檔位控制
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(void)
{
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(void)
{
//設置發送郵箱0標識符:10011001010=0x04CA
CAN_TX_Address_L=0x55; //CAN低地址標識符
CAN_TX_Address_L=CAN_TX_Address_L&0xe0;
CAN_TX_Address_H=0x99; //CAN高地址標識符,應與接收方標識符相同
//設置接收郵箱0標識符:00110011111=0x019F
CAN_RX_Address_L=0xE0;
CAN_RX_Address_L=CAN_RX_Address_L&0xE0;
CAN_RX_Address_H=0x33;
//設置對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(void)
{
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 + -