?? can_gps.c
字號:
#pragma /*small*/ large /*large*/
#include <reg52.h>
#include <SJA_BCANCONF.H>
#include <absacc.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
/*
#define machine_NUM 0x02 //機器號
#define function_code 0x04 //功能碼
#define data_NUMER 0x10 //數據個數
*/
idata uchar machine_NUM; //機器號
idata uchar function_code; //功能碼
idata uchar data_NUMER; //數據個數
/*----------------------------------------------------------*/
bdata uchar ab,d;
sbit abit0=ab^0;sbit abit1=ab^1;sbit abit2=ab^2;sbit abit3=ab^3;
sbit abit4=ab^4;sbit abit5=ab^5;sbit abit6=ab^6;sbit abit7=ab^7;
/*************************************************************/
/********************** GPS **********************************/
/*************************************************************/
/*----------------------------------------------------------*/
code uchar NO_GPS[]={2,4,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xC3,0xDF};
code uchar NO_position[]={2,4,16,'*','*','*','*','*','*','*','*','*','*','*','*','*','*',0xFA,0x0D};
/*GGA的4個數據*/
/*RMC的6個數據*/
//xdata directe[7];
/*可選數據*/
//uchar satellites_state1,satellites_state2,HDOP;
//GPS數據存儲數組
xdata uchar GPSdata[50]; //全部GPS數據串
xdata uchar GPSdataCount; //GPSdata計數器
xdata uchar date[7]; //日期
xdata uchar cmd[5]; //命令類型存儲數組 /*$GPGGA 或 $GPRMC*/
xdata uchar JD[15]; //經度
xdata uchar JD_a[2]; //經度方向
xdata uchar WD[15]; //緯度
xdata uchar WD_a[2]; //緯度方向
xdata uchar time[12]; //時間
xdata uchar speed[8]; //速度
xdata uchar high[8]; //高度
xdata uchar angle[7]; //方位角
xdata uchar use_sat[2]; //使用的衛星數
xdata uchar total_sat[2]; //天空中總衛星數
xdata uchar altitude[8]; //海拔高度
idata uchar lock; //定位狀態
//串口中斷需要的變量
idata uchar seg_count; //逗號計數器
idata uchar dot_count; //小數點計數器
idata uchar byte_count; //位數計數器
idata uchar cmd_number; //命令類型,數據類型:1、GGA 2、GSV 3、RMC
idata uchar mode; //0:結束模式,1:命令模式(判斷數據類型)2:數據模式(數據接受和處理)
idata uchar buf_full; //1:整句接收完成,相應數據有效。0:緩存數據無效。
//顯示需要的變量
idata unsigned int dsp_count; //刷新次數計數器
idata unsigned char time_count;
/*************************************************************/
/********************** LCD **********************************/
/*************************************************************/
#define clear 0x01 //清屏幕,約1.6ms
#define home 0x02 //光標回零(左上角)
#define in_mode 0x06 //輸入方式:0x06 地址增1,光標右移;0x04地址減1,光標左移;
//#define dis_on 0x0f //開關:bit2顯示、bit1光標、bit0閃爍功能
#define dis_on 0x0C //開關:bit2顯示、bit1光標、bit0閃爍功能
#define dis_cur 0x1f //光標位置設定和反白是指
#define f_set 0x30 // 8位基本指令 bit4:8位或四位;bit2:基本指令或擴展指令; bit1:圖形顯示開關
#define f_set_E 0x36 // 8位擴展指令圖形顯示 先送8位垂直地址,再送4位水平地址
sbit P_RS=P1^3; //4
sbit P_RW=P1^4; //5
sbit P_E =P1^5; //6
/*************************************************************/
/********************** 24c256 *******************************/
/*************************************************************/
sbit SDA24=P2^3; //24C256的5腳
sbit SCL24=P2^2; //24C256的6腳
idata uchar cnop24;
bit ACK24;
idata uchar save_point;
/*---------------------------------------------------------*/
/****************************************************************
CAN總線數據協議:
0 "1" to "20" 目標ID
1 "0x08" 特定
2 "m" or "p" or "d" 關節的選擇
3 "1" to "3" 自身ID
4 "C" or "D" 命令口or數據口的選擇
5 "R" or "A" 命令字
6-9 ...... 數據
******************************************************************/
idata uchar str[10];
data uchar start;
//data uchar plat_data;
//uchar i;
/******************/
sbit SJA_reset=P2^1;
sbit green =P1^1;
sbit red =P1^2;
long real_position_m,real_position_p,real_position_d;
unsigned char request_flag,interrupt_flag; //是否為查詢
data uchar SystemBuf[10]; //系統設置的接收數據緩沖區
data uchar SendBuf[10]; //系統設置的發送數據緩沖區
//idata uchar CanRecBuf[50];
//xdata uchar CanSendBuf[50];
/*************************************************************/
/********************** 函數 *********************************/
/*************************************************************/
/*---------------------------------------------------------*/
void delay(uint j) // time=j*10+7 (us)延時函數/
{
data uchar ch;
while(j--)
{
ch++; ch--;
}
}
/*----------------------- 延時 ------------------------------*/
void delay_us(uint j) // time=j*10+7 (us)延時函數/
{
idata uchar ch;
while(j--)
{
ch++; ch--;
}
}
/*************************************************************/
/********************** can **********************************/
/*************************************************************/
/************************************************************************
*以下為基本的函數說明(BasicCAN) *
************************************************************************/
/************************************************************************
*函數原型: bit BCAN_CREATE_COMMUNATION(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示SJA1000接口正常 *
* 1 ; 表示SJA1000與處理器接口不正常 *
* *
*說明:該函數用于檢測CAN控制器的接口是否正常 *
************************************************************************/
bit BCAN_CREATE_COMMUNATION(void)
{
SJA_BCANAdr=REG_TEST; //訪問測試寄存器
*SJA_BCANAdr =0xaa; //寫入測試值
if(*SJA_BCANAdr == 0xaa)
{
return 0; //讀測試正確
}
else
{
return 1;
}
}
/************************************************************************
*函數原型: bit BCAN_ENTER_RETMODEL(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示成功進入復位工作模式 *
* 1 ; 表示不能進入復位工作模式 *
* *
*說明: CAN控制器進入復位工作模式 *
************************************************************************/
bit BCAN_ENTER_RETMODEL(void)
{
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //訪問地址指向控制寄存器
TempData= *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData|0x01); //置位復位請求
if((*SJA_BCANAdr&0x01) == 1)
{
return 0;
}
else
{
return 1;
}
}
/************************************************************************
*函數原型: bit BCAN_QUIT_RETMODEL(void) *
*參數說明: 無 *
*返回值: *
* 0 ; 表示成功退出復位工作模式 *
* 1 ; 表示不能退出復位工作模式 *
* *
*說明: CAN控制器退出復位工作模式 *
************************************************************************/
bit BCAN_QUIT_RETMODEL(void)
{
unsigned char TempData;
SJA_BCANAdr = REG_CONTROL; //訪問地址指向控制寄存器
TempData = *SJA_BCANAdr; //保存原始值
*SJA_BCANAdr=(TempData&0xfe); //清除復位請求
if((*SJA_BCANAdr&0x01) == 0)
{
return 0; //
}
else
{
return 1; //退出成功
}
}
/************************************************************************
;*函數原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) *
;*參數說明: R7 波特率(Kbit/s) BTR0 BTR1 *
500K
;*返回值: *
;* 0 ;波特率設置成功 *
;* 1 ;波特率設置失敗 *
;* * *
;************************************************************************/
bit BCAN_SET_BANDRATE(void)
{
unsigned char BTR0_num=0x00; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned char BTR1_num=0x1c; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//將波特率的的預設值裝入sja1000的總線定時器
SJA_BCANAdr=REG_BTR0; //訪問地址指向總線定時寄存器0
*SJA_BCANAdr=BTR0_num; //寫入參數
if(*SJA_BCANAdr != BTR0_num) //校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_BTR1; //訪問地址指向總線定時寄存器
*SJA_BCANAdr=BTR1_num; //寫入參數
if(*SJA_BCANAdr != BTR1_num) //校驗寫入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函數原型: BCAN_SET_OBJECT *
*參數說明: *
* BCAN_ACR:存放驗收代碼寄存器(ACR)的參數設置 *
* BCAN_AMR:存放接收屏蔽寄存器(AMR)的參數設置 *
;*返回值: *
;* 0 ;通信對象設置成功 *
;* 1 ;通信對象設置失敗 *
;* *
;*說明:設置CAN節點的通訊對象,允許接收的報文ID號的高8位(D10--D3) 。 *
;* 允許接收的報文,是由AMR和ACR共同決定的. *
;* 滿足以下條件的ID號的報文才可以被接收 *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111 *
;* 該子程序只能用于復位模式 * *
;************************************************************************/
bit BCAN_SET_OBJECT(unsigned char BCAN_ACR,unsigned char BCAN_AMR)
{
SJA_BCANAdr=REG_ACR; //訪問地址指向驗收代碼寄存器(ACR)
*SJA_BCANAdr=BCAN_ACR; //寫入參數
if(*SJA_BCANAdr != BCAN_ACR) //校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_AMR; //訪問地址指向驗收屏蔽寄存器(AMR)
*SJA_BCANAdr=BCAN_AMR; //寫入參數
if(*SJA_BCANAdr != BCAN_AMR) //校驗寫入值
{
return 1;
}
return 0;
}
/************************************************************************
;*函數原型: bit BCAN_SET_OUTCLK (unsigned char Out_Control, *
unsigned char Clock_Out); *
;*參數說明: *
* Out_Control:存放輸出控制寄存器 (OC) 的參數設置 *
* Clock_Out:存放時鐘分頻寄存器 (CDR) 的參數設置 *
* *
;*返回值: *
;* 0 ;設置成功 *
;* 1 ;設置失敗 *
;* *
;*說明:設置SJA1000的輸出模式和時鐘分頻 。該子程序只能用于復位模式 * *
;************************************************************************/
bit BCAN_SET_OUTCLK (unsigned char Out_Control,
unsigned char Clock_Out)
{
SJA_BCANAdr=REG_OCR ; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Out_Control; //寫入參數
if(*SJA_BCANAdr != Out_Control) //校驗寫入值
{
return 1;
}
SJA_BCANAdr=REG_CDR; //訪問地址指向輸出控制寄存器
*SJA_BCANAdr=Clock_Out; //寫入參數
return 0;
}
/************************************************************************
*函數原型: bit BCAN_DATA_WRITE(unsigned char *SendDataBuf)*
*參數說明: 特定幀各式的數據? *
*返回值: *
* 0 ; 表示將數據成功的送至發送緩沖區 *
* 1 ; 表示上一次的數據正在發送, *
* ; 表示發送緩沖區被鎖定,不能寫入數據 *
* ; 表示寫入數據錯誤 *
*說明: 將待發送特定幀各式的數據,送入SJA1000發送緩存區中,然后啟動 *
* SJA1000發送。 *
* 特定幀格式為:開始的兩個字節存放 '描述符' ,以后的為數據 *
* 描述符包括11位長的ID(標志符)\1位RTR\4位描述數據長度的DLC共16位 *
* *
*注:本函數的返回值僅指示,將數據正確寫入SJA1000發送緩存區中與否。 *
* 不指示SJA1000將該數據正確發送到CAN總線上完畢與否 *
************************************************************************/
bit BCAN_DATA_WRITE(unsigned char data *SendDataBuf)
{
unsigned char TempCount;
SJA_BCANAdr = REG_STATUS; //訪問地址指向狀態寄存器
if((*SJA_BCANAdr&0x08) == 0) //判斷上次發送是否完成
{
return 1;
}
if((*SJA_BCANAdr&0x04)==0) //判斷發送緩沖區是否鎖定
{
return 1;
}
SJA_BCANAdr = REG_TxBuffer1; //訪問地址指向發送緩沖區1
if((SendDataBuf[1]&0x10)==0) //判斷RTR,從而得出是數據幀還是遠程幀
{
TempCount =(SendDataBuf[1]&0x0f)+2; //輸入數據幀
}
else
{
TempCount =2; //遠程幀
}
memcpy(SJA_BCANAdr,SendDataBuf,TempCount);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -