日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040

發布時間:2024/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

調試好的can(匯編及C語言)程序,與大家分享!

//************************************程序功能***************************************************

//節點1向CAN節點2發送數據,數據的頭兩個字節分別是:節點1的ID和要求節點2回復的數據長度

//節點2收到節點1的信息后,立即按照節點1的要求回復數據

//************************************************************************************************

#include

#include ???????????????????????????//SJA存儲器定義頭文件

#include ???????????????????????????//SJA子程序文件

#include ??????????????????????????????//顯示頭文件

#include?????????//字符串函數

//***************************頭文件***************************************************//

void Init_Cpu(void);????????????????????????????????//初始化單片機

void Sja_1000_Init(void);???????????????????????????//初始化SIA

//************************************************************************************

bit s;??????????????????????????????????????????????//配置sja標志

bit flag_send;??????????????????????????????????????//發送命令標志

unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05}; //顯示"5"

unsigned char b[5]={0x12,0x12,0x12,0x12,0x12};??????//顯示"p"

unsigned char c[5]={0x01,0x01,0x01,0x01,0x01};??????//顯示"1"

unsigned char data??send_data[10],rcv_data[10];?????//發送和接收數組

unsigned char bdata flag_init;??????????????????????//保存中斷寄存器值

unsigned int count_k;???????????????????????????????//延時記數用

sbit rcv_flag=flag_init^0;??????????????????????????//接收中斷標志

sbit err_flag=flag_init^2;??????????????????????????//錯誤中斷標志

//***********************************************************************************//

void main(void)

{

s=0;????????????????????????????????????????????//配置sja1000出現錯誤時,重新初始化

do{

Sja_1000_Init();

}while(s!=0);

Init_Cpu();????????????????????????????????????????//initialize mcu

flag_init=0x00;?????????????????????????????????//保存中斷寄存器值清零

while(1)

{

if(rcv_flag)????????????????????????????????//if there is receive interrupt

{

rcv_flag=0;?????????????????????????????//接收標志位清零

BCAN_DATA_RECEIVE(rcv_data);????????????//接收數據

BCAN_CMD_PRG(RRB_CMD);??????????????????//釋放接收緩沖區

flag_send=1;????????????????????????????//發送命令置位

}

if(flag_send)

{

flag_send=0;????????????????????????????//發送位清零

send_data[0]=rcv_data[2];????????????????//接收到的"發送方ID10~ID3"

send_data[1]=rcv_data[3];???????????????//接收到的"發送方ID2~ID0"和要求的數據長度

send_data[2]=0x88;

send_data[3]=0x89;

BCAN_DATA_WRITE(send_data);?????????????//發送數據

BCAN_CMD_PRG(TR_CMD);???????????????????//置位發送請求位

for(count_k=0;count_k<200;count_k++)

display(a);?????????????????????????????//延時顯示"5"

}

if (err_flag)???????????????????????????????//錯誤中斷

{

for(count_k=0;count_k<280;count_k++)

display(c);?????????????????????????????//錯誤顯示"1"

err_flag=0;?????????????????????????????//錯誤標志位清零

Sja_1000_Init();????????????????????????//初始化SJA

}

display(b);?????????????????????????????????//顯示"p"

}

}

void ex0_int(void) interrupt 0 using 1??????????????//外部中斷0

{

SJA_BCANAdr=REG_INTERRUPT;??????????????????????//指針指向中斷寄存器

flag_init=*SJA_BCANAdr;?????????????????????????//保持中斷寄存器值

}

void Init_Cpu(void)?????????????????????????????????//單片機初始化,開放外部中斷0

{

PX0=1;

EX0=1;

EA=1;

}

void Sja_1000_Init(void)

{

s=BCAN_CREATE_COMMUNATION();??//SJA自測

s=BCAN_ENTER_RETMODEL();??????//進入復位

s=BCAN_SET_BANDRATE(0x04);????//設置波特率100K/S

s=BCAN_SET_OBJECT(0xaa,0x00); //設置地址ID:550

s=BCAN_SET_OUTCLK(0xaa,0x48); //設置輸出方式,禁止COLOCKOUT輸出

s=BCAN_QUIT_RETMODEL();???????//退出復位模式

SJA_BCANAdr=REG_CONTROL;??????//地址指針指向控制寄存器

*SJA_BCANAdr|=0x1e;???????????//開放錯誤\接收\發送中斷

}

******************以下為匯編程序*********************************************************************

系統can地址為550,用于can系統測試,應用T0定時器每隔1s向can總線發送一組數據:數據長度為8個字節,

首字節為05H,第二個字節為累加變量,每秒鐘數值增加1,

*********************************************************************************************************

CONTROLLER_BASE???EQU???7E00H?????;SJA1000的片選地址

RCV_GOOD????????BIT????0FH????;成功的接收一幀標志

SEC_FLAG????????BIT????010H????;一秒到標志

ERR_FLAG????????BIT????011H????;監測到錯誤標志

SAVE_INT_INFO???DATA????032H????;保存SJA1000中斷寄存器的內容

SEND_DATA_BUF1????DATA?????040H????;發送緩沖區

SEND_DATA_BUF2????DATA????041H

SEND_DATA_BUF3????DATA????042H

SEND_DATA_BUF4????DATA????043H

SEND_DATA_BUF5????DATA????044H

SEND_DATA_BUF6????DATA????045H

SEND_DATA_BUF7????DATA????046H

SEND_DATA_BUF8????DATA????047H

SEND_DATA_BUF9????DATA????048H

SEND_DATA_BUF10???DATA????049H

RCV_DATA_BUF1?????DATA????050H????;接收緩沖區

RCV_DATA_BUF2?????DATA????051H

RCV_DATA_BUF3?????DATA????052H

RCV_DATA_BUF4?????DATA????053H

RCV_DATA_BUF5?????DATA????054H

RCV_DATA_BUF6?????DATA????055H

RCV_DATA_BUF7?????DATA????056H

RCV_DATA_BUF8?????DATA????057H

RCV_DATA_BUF9?????DATA????058H

RCV_DATA_BUF10????DATA????059H

ERROR_STATUS??????DATA??07CH????;錯誤狀態表示

TEST_DATA?????????DATA????07FH????;測試發送數據

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序開始

ORG?????????0000H

LJMP????????MAIN?????????;運行主程序

ORG????????0003H

LJMP????????BCAN_INT0????;中斷方式訪問SJA1000程序

ORG????????000BH

LJMP????????T0_INTERRUPT?????;定時器0中斷

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG???????????????0100H???;程序開始

MAIN:

MOV????????R0,#07fH

CLR?????A

MOV?????@R0,A

DJNZ????R0,$-1

MOV?????@R0,A

MOV?????SP,#60H????????;設置SP

CLR?????P2.0????????????????;SJA1000退出硬件復位模式

LCALL???SJA1000_INT0????;初始化SJA1000

LCALL???T0_INIT

CLR?????P3.4????????????????;點亮指示燈

SETB????PX0

SETB????IT0

SETB????EX0

SETB????ET0

SETB????TR0

SETB????EA

LOOPER:

JNB????????RCV_GOOD,LOOPER2????;sja1000成功接收一幀,通知CPU處理

CLR?????????RCV_GOOD

LCALL???????RCVDATA_PRG

LOOPER2:

JNB????????SEC_FLAG,LOOPER3????;一秒時間到,每秒發送一次

CLR?????????SEC_FLAG

CLR?????????P3.5????????????????;點亮指示燈

LCALL???????SENDDATA_PRG

LOOPER3:

JNB????????ERR_FLAG,LOOPER4???????????????;錯誤標志,錯誤處理

CLR?????????ERR_FLAG

LCALL???????ERR_PRG

LOOPER4:

AJMP????????LOOPER

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化SJA1000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SJA1000_INT0:

LCALL?????????BCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數

MOV???????????R7,???????????#04

LCALL?????????BCAN_SET_BANDRATE???;設置波特率為100k

MOV???????????R7,?????????#0A8H??;設置接收報文ID

MOV???????????R6,?????????#0FFH

LCALL?????????BCAN_SET_OBJECT

MOV???????????R7,?????????#0AAH???;設置輸出控制、時鐘分頻;正常輸出模式

MOV???????????R6,?????????#048H???;使能內部比較器、禁止CLKOUT

LCALL?????????BCAN_SET_OUTCLK?????;

LCALL?????????BCAN_QUIT_RETMODEL??;退出復位狀態

MOV??????????????DPTR,#REG_CONTROL???;開放SJA1000內部功能中斷

MOV??????????????A,#01EH??????????;中斷開放

MOVX??????@DPTR,A

CLR???????????F0

RET

;;;;;;;;;;;;;;;;;;;;;;錯誤信息處理;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ERR_PRG:

LCALL?????BCAN_ENTER_RETMODEL?????????????????;進入復位模式

LCALL???????SJA1000_INT0 ;

MOV???????ERROR_STATUS,#0FCH

RET

;;;;;;;;;;;;;;;;;;;;;;;接收數據處理部分;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RCVDATA_PRG:

MOV????R0,# RCV_DATA_BUF1?????;微處理器接收首地址

LCALL????BCAN_DATA_RECEIVE??????????????;調用接收數據子程序

MOV????R7,#04H??????????????????;釋放接收緩沖區

LCALL????BCAN_CMD_PRG????????;

RET

;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發送數據處理部分;;;;;;;;;;;;;;;

SENDDATA_PRG:

MOV???????????R0,??????????#SEND_DATA_BUF1

MOV???????????@R0,?????????#02H

INC???????????R0

MOV???????????@R0,?????????#08H

INC???????????R0

MOV???????????@R0,?????????#05H

MOV??????????????A,???????????TEST_DATA

INC???????????R0

MOV???????????@R0,?????????A

MOV???????????R0,??????????#SEND_DATA_BUF1

LCALL?????????BCAN_DATA_WRITE???????;將要發送的數據送入發送緩沖區

MOV???????????R7,??????????#01

LCALL?????????BCAN_CMD_PRG

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

T0_INIT:

MOV?????A,TMOD

ANL?????A,#0F0H

ORL?????A,#01H

MOV????????TMOD,A;T0工作在方式1

MOV????????TH0,#0FCH????????;定時周期1MS

MOV????????TL0,#066H

MOV?????3AH,#00H

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;外部中斷0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BCAN_INT0:

push????DPH

PUSH????DPL

PUSH????PSW????????????;PSW,ACC入棧

PUSH????ACC

USING????3????????????;應用寄存器第3組

MOV????DPTR,#REG_INTERRUPT????;讀中斷寄存器

MOVX????A,@DPTR??????????;

MOV????SAVE_INT_INFO,A????????;保存中斷寄存器的內容

JNB?????ACC.0,BCAN_INT1????????;接收中斷

SETB????RCV_GOOD????????;置位接收標志

BCAN_INT1:

MOV????A,SAVE_INT_INFO

JNB????ACC.2,BCAN_INT2????????;錯誤中斷

SETB????ERR_FLAG????????;置位錯誤標志

BCAN_INT2:

POP????ACC

POP????PSW

POP?????DPL

POP?????DPH

RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器0中斷;;;;;;;;;;;;;;;;

T0_INTERRUPT:

push????DPH

PUSH????DPL

PUSH????PSW?????????????;PSW、ACC入棧

PUSH????ACC

USING???2

MOV????TH0,#80H?????????;設置定時周期0.3S

MOV????TL0,#26H

INC?????3AH

MOV?????A,3AH

CJNE????A,#23H,T0_QUIT???????;判斷1秒時間是否到

MOV?????3AH,#00H

INC????TEST_DATA????????????;測試發送的數據,每1秒加1

SETB????SEC_FLAG?????????????;置位1秒到標志

T0_QUIT:

POP????ACC

POP????PSW

POP?????DPL

POP?????DPH

RETI

*********************************************************************

本人同時提供can實驗開發板給初學者

1???CAN控制器為SJA1000,驅動器為TJA1050,電源隔離;

2???提供詳盡的源程序,可根據用戶需求編寫程序

聯系我:13671387011(短信聯系,QQ詳談)

QQ: 531706356

總結

以上是生活随笔為你收集整理的sja1000 c语言,调试好的can(汇编及C语言)程序,sja1000+tja1040的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。