?? canprogramme.txt
字號:
這是一個自發收程序,采用at89s51+sja1000,分離晶體,at89s51晶體11.0592
sja1000外部晶體為12M,通過串口進行監控
******************************************************
以下為頭文件定義
copyright by alloy
******************************************************
#define SJA_REG_BaseADD 0x7800
#define REG_MODE XBYTE[SJA_REG_BaseADD + 0x00]
#define REG_CMD XBYTE[SJA_REG_BaseADD + 0x01]
#define REG_SR XBYTE[SJA_REG_BaseADD + 0x02]
#define REG_IR XBYTE[SJA_REG_BaseADD + 0x03]
#define REG_IR_ABLE XBYTE[SJA_REG_BaseADD + 0x04]
#define REG_BTR0 XBYTE[SJA_REG_BaseADD + 0x06] //05保留
#define REG_BTR1 XBYTE[SJA_REG_BaseADD + 0x07]
#define REG_OCR XBYTE[SJA_REG_BaseADD + 0x08]
#define REG_TEST XBYTE[SJA_REG_BaseADD + 0x09]
#define REG_ALC XBYTE[SJA_REG_BaseADD + 0x0b] //0a保留
#define REG_ECC XBYTE[SJA_REG_BaseADD + 0x0c]
#define REG_EMLR XBYTE[SJA_REG_BaseADD + 0x0d]
#define REG_RXERR XBYTE[SJA_REG_BaseADD + 0x0e]
#define REG_TXERR XBYTE[SJA_REG_BaseADD + 0x0f]
#define REG_ACR0 XBYTE[SJA_REG_BaseADD + 0x10] //它和ACR0地址能重疊嗎
#define REG_ACR1 XBYTE[SJA_REG_BaseADD + 0x11] //不他們都是映射地址,并且ACR0在復位下才能訪問
#define REG_ACR2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_ACR3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_AMR0 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_AMR1 XBYTE[SJA_REG_BaseADD + 0x15]
#define REG_AMR2 XBYTE[SJA_REG_BaseADD + 0x16]
#define REG_AMR3 XBYTE[SJA_REG_BaseADD + 0x17]
#define REG_RxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_RxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_RxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_RxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_RxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_TxBuffer0 XBYTE[SJA_REG_BaseADD + 0x10]
#define REG_TxBuffer1 XBYTE[SJA_REG_BaseADD + 0x11]
#define REG_TxBuffer2 XBYTE[SJA_REG_BaseADD + 0x12]
#define REG_TxBuffer3 XBYTE[SJA_REG_BaseADD + 0x13]
#define REG_TxBuffer4 XBYTE[SJA_REG_BaseADD + 0x14]
#define REG_DataBuffer1 XBYTE[SJA_REG_BaseADD + 0x15] //同上
#define REG_DataBuffer2 XBYTE[SJA_REG_BaseADD + 0x16] //這個是該程序用來發送和接收的地址啊
發送和接收地址實際是影射到不同的地址如發送影射到96-108
#define REG_DataBuffer3 XBYTE[SJA_REG_BaseADD + 0x17]
#define REG_DataBuffer4 XBYTE[SJA_REG_BaseADD + 0x18]
#define REG_DataBuffer5 XBYTE[SJA_REG_BaseADD + 0x19] //映射到不同的地址
//就是說發送接收實際的物理地址是不同的
#define REG_DataBuffer6 XBYTE[SJA_REG_BaseADD + 0x1a]
#define REG_DataBuffer7 XBYTE[SJA_REG_BaseADD + 0x1b]
#define REG_DataBuffer8 XBYTE[SJA_REG_BaseADD + 0x1c]
#define REG_RBSA XBYTE[SJA_REG_BaseADD + 0x1e]
#define REG_CDR XBYTE[SJA_REG_BaseADD + 0x1f]
#define REG_Receive_Counter XBYTE[SJA_REG_BaseADD + 0x1d]
#define OK 1
#define Fail 0
#define ON 1
#define OFF 0
#define True 1
#define False 0
sbit SJARst = P2 ^ 6; //復位控制
sbit LED0 = P1 ^ 0;
sbit LED1 = P1 ^ 1;
sbit Key0 = P1 ^ 2;
sbit Key1 = P1 ^ 3;
sbit Key2 = P1 ^ 4;
sbit Key3 = P1 ^ 5;
bit step_flg;
bit Tx_flg;
bit Rx_flg;
unsigned char step_counter;
unsigned char Tx_counter;
unsigned char PC_RX_Buffer;
unsigned char temp_data1;
unsigned char Rx_Buffer[6];
void MCU_Init(void);
void SJA_Init(void);
void send(unsigned char S_Data);
void Serial(void);
void Delay(unsigned char Delay_time);
void step(void);
*******************************************************
以下為c的主程序
copyright by alloy
*******************************************************
#include <stdio.h>
#include <string.h>
#include <REG51.h>
#include <TxMCU.h>
#include <absacc.h>
main()
{
unsigned char i;
MCU_Init();
SJA_Init();
REG_MODE = 0x01; //進入復位模式
temp_data1 = REG_MODE;
temp_data1 = temp_data1 & 0x01;
if(temp_data1 == 0x01) //在復位模式中
{
REG_BTR0 = 0x85;
REG_BTR1 = 0xb4; //100k
REG_OCR = 0x1a;
REG_CDR = 0xc0; //Peli模式獨立精鎮最好為0xc8
REG_RBSA = 0x00;
REG_ACR0 = 0xff;
REG_ACR1 = 0xff;
REG_ACR2 = 0xff;
REG_ACR3 = 0xff;
REG_AMR0 = 0xff;
REG_AMR1 = 0xff;
REG_AMR2 = 0xff;
REG_AMR3 = 0xff;
REG_IR_ABLE = 0xff;
}
REG_MODE = 0x0c; //進入自接收模式
REG_MODE = 0x0c;指示
for(i = 0;i<100;i++);
temp_data1 = REG_Receive_Counter; //是報文計數器嗎 //報文接收計數器作用接受+1釋放-1復位為0
send(temp_data1); //這條語句什么用途.特別關注/ //反映有效報文數目
for(;;)
{
while(Tx_flg == False);
Tx_flg = False;
Tx_counter++;
send(Tx_counter);
temp_data1 = REG_SR;
while((temp_data1 & 0x10) == 0x10);
temp_data1 = REG_SR;
if((temp_data1 & 0x04) == 0x04)
{
REG_RxBuffer0 = 0x08; //標準幀,長度為8
REG_RxBuffer1 = 0xff; /////定義報文頭和標識符
REG_RxBuffer2 = 0xff; //賦這個值的原因是什么,
REG_RxBuffer3 = 0x01;
REG_RxBuffer4 = 0x02;
REG_DataBuffer1 = 0x03;
REG_DataBuffer2 = 0x04;
REG_DataBuffer3 = 0x05;
//一般前兩個為接收數據的地址和數據發送兩的設置
REG_DataBuffer4 = 0x06;
REG_DataBuffer5 = 0x07;
REG_DataBuffer6 = 0x08; ////送8個字節數據到發送緩沖區
REG_DataBuffer7 = 0x09; //并非擴展幀這兩條沒有用
REG_DataBuffer8 = 0x0a;
}
REG_CMD = 0x10; //自收發命令
temp_data1 = REG_SR;
temp_data1 = temp_data1 & 0x20;
while(temp_data1 == 0x20) //檢查是否發送完成
{
//send(0xaa); //這段程序什么作用.
temp_data1 = REG_ECC; //這個是作者通過串口觀察REG_ECC和REG_SR
send(temp_data1);
temp_data1 = REG_SR;
temp_data1 = temp_data1 & 0x20; //查看發送狀態TS位是否位1
//send(temp_data1);
}
send(0x66); //我想就是當串口顯示0x66證明程序執行到這里著和斷點有點象但他不停罷了
temp_data1 = REG_ALC;
send(temp_data1);
temp_data1 = REG_ECC;
send(temp_data1);
temp_data1 = REG_SR;
send(temp_data1);
temp_data1 = REG_Receive_Counter;
send(temp_data1);
PC_RX_Buffer = 0x77;
LED0 = ~LED0;
// Tx_counter = 0x00;
}
}
void MCU_Init(void)
{
SJARst = 1;
LED0 = OFF;
LED1 = OFF;
PC_RX_Buffer = 0x77;
step_counter = 0x00;
step_flg = False;
Tx_flg = False;
temp_data1 = 0x00;
TMOD = 0x20;
TH1 = 0xff;
TL1 = 0xff;
TR1 = 1;
SCON = 0x50;
PCON = 0x80;
EA = 1;
ES = 1;
Tx_counter = 0x00;
}
void SJA_Init(void)
{
unsigned char i;
for(i = 0;i < 125;i++);
SJARst = 0;
for(i = 0;i < 125;i++);
SJARst = 1;
for(i = 0;i < 125;i++);
}
void send(unsigned char S_Data)
{
SBUF = S_Data;
while(TI == 0);
TI =0;
}
void Serial() interrupt 4 using 2
{
if(RI == 1)
{
PC_RX_Buffer = SBUF;
RI = 0;
if(PC_RX_Buffer == 0xaa)
{
send(0x13);
Tx_flg = True;
PC_RX_Buffer = 0x77;
}
else if(PC_RX_Buffer == 0x55)
{
send(0x14);
Rx_flg = True;
PC_RX_Buffer = 0x77;
}
else
{
send(0x15);
PC_RX_Buffer = 0x77;
}
}` //就是一個節點自發自收
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -