⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;for eat598
;************************************************************************
;*以下的定义用户要根据自己的微处理器同SJA1000的硬件连接,来修改SJA1000的*
;*片选地址 CONTROLLER_BASE ,暂且假定值0000H                             *
;************************************************************************
CONTROLLER_BASE   EQU   08F80H    ;SJA1000的片选地址
                                  ;是操作SJA1000内部寄存器的基址
;************************************************************************
;*以下的定义用户不可修改                                                *
;************************************************************************
;************************************************************************
;*以下的定义是SJA1000在BasicCAN工作方式下内部寄存器的定义               *
;************************************************************************
;*控制段寄存器(在内部地址0H---09H)                                     *
;************************************************************************
;控制寄存器;;;复位模式、工作模式均可进行读写                            *
REG_CONTROL EQU  CONTROLLER_BASE+0H ;内部控制寄存器地址;其内容可改变    *
                                  ;SJA1000  的状态                      * 

BIT_RR            EQU  01H        ;复位请求控制位,控制寄存器的第0位    *
                                  ;=1,;SJA1000进入复位状态              *
                                  ;=0,;SJA1000返回正常工作状态          *

BIT_RIE           EQU  02H        ;接收中断控制位,控制寄存器的第1位    *
                                  ;=1,;信息被无错接收时,SJA1000发出一个 *
                                      ;接收中断信号到微控制器           *
                                  ;=0,;SJA1000不发送接收中断信号        *

BIT_TIE           EQU  04H        ;发送中断控制位,控制寄存器的第2位    *
                                  ;=1,;当信息被成功发送或发送缓冲器又被 *
                                      ;访问时,(例如,中止发送命令后),    *
                                      ;SJA1000发出一个中断信号到微控制器*
                                  ;=0,;SJA1000不发送中断信号            *

BIT_EIE           EQU  08H        ;出错中断控制位,控制寄存器的第3位    *
                                  ;=1,;如果出错或总线状态改变           *
                                      ;SJA1000发出一个中断信号到微控制器*
                                  ;=0,;SJA1000不发送中断信号            *

BIT_OIE           EQU  10H        ;超载中断控制位,控制寄存器的第4位    *
                                  ;=1,;如果置位数据溢出位,              *
                                      ;SJA1000发出一个中断信号到微控制器*
                                  ;=0,;SJA1000不发送中断信号            *

;BIT_5                            ;系统保留位                           *
;BIT_6                            ;系统保留位                           *
;BIT_7                            ;系统保留位                           *

;命令寄存器;;;复位模式、工作模式 只可进行写  ;;读出值为0XFF             *
REG_COMMAND       EQU  CONTROLLER_BASE+01H ;内部命令寄存器地址;         *
                                  ;SJA1000  的状态                      * 

BIT_TR            EQU  01H        ;发送请求位,命令寄存器的第0位        *
                                  ;=1,;信息被发送                       *
                                  ;=0,;无发送动作                       *

BIT_AT            EQU  02H        ;中止发送位,命令寄存器的第1位        *
                                  ;=1,;如果不是在处理过程中,            *
                                      ;等待处理的发送请求将取消         *
                                  ;=0,;                                 *

BIT_RRB           EQU  04H        ;释放接收缓冲器位,命令寄存器的第2位  *
                                  ;=1,;接收缓冲器中存放信息的内存空间   *
                                      ;将被释放                         *
                                      ;SJA1000发出一个中断信号到微控制器*
                                  ;=0,;                                 *

BIT_COS           EQU  08H        ;清除超载状态位,命令寄存器的第3位    *
                                  ;=1,;清除超载状态                     *
                                  ;=0,;                                 *

BIT_GTS           EQU  10H        ;睡眠位;         命令寄存器的第4位    *    
                                  ;=1,;如果没有CAN中断等待和总线活动,   *
                                      ;SJA1000进入睡眠模式              *
                                  ;=0,;                                 *
;BIT_5                            ;系统保留位                           *
;BIT_6                            ;系统保留位                           *
;BIT_7                            ;系统保留位                           *

;状态寄存器;;;复位模式、工作模式 可进行读  ; 写操作无效                 *
REG_STATUS        EQU  CONTROLLER_BASE+02H ;内部状态寄存器地址;         *
                                  
BIT_RBS           EQU  01H        ;接收缓冲器状态位,状态寄存器的第0位  *
                                  ;=1,;RXFIFO中有可用信息               *
                                  ;=0,;无可用信息                       *

BIT_DOS           EQU  02H        ;超载状态位,状态寄存器的第1位        *
                                  ;=1,;信息丢失,因为RXFIFO中没有足够的  *
                                      ;空间来存储它                     *
                                  ;=0,;自从最后一次清除数据溢出命令执行,
                                      ;无数据溢出发生

BIT_TBS           EQU  04H        ;发送缓冲器状态位,状态寄存器的第2位  *
                                  ;=1,;CPU可以向发送缓冲器写信息        *
                                  ;=0,;CPU不能访问发送缓冲器;有信息正   *
                                      ;在等待发送或正在发送             *

BIT_TCS           EQU  08H        ;发送完毕状态位,状态寄存器的第3位    *
                                  ;=1,;最近一次发送请求被成功处理       *
                                  ;=0,;当前发送请求未处理完毕           *

BIT_RS            EQU  10H        ;接收状态位;     状态寄存器的第4位    *    
                                  ;=1,;SJA1000正在接收信息              *
                                  ;=0,;没有正在接收的信息               *
 
BIT_TS            EQU  20H        ;发送状态位;     状态寄存器的第4位    *    
                                  ;=1,;SJA1000正在发送信息              *
                                  ;=0,;没有正在发送的信息               *

BIT_ES            EQU  40H        ;出错状态位;     状态寄存器的第4位    *    
                                  ;=1,;至少出现一个错误计数器满或超过   *
                                      ;CPU报警限制                      *
                                  ;=0,;两个错误计数器都在报警限制以下   *

BIT_BS            EQU  80H        ;总线状态位;     状态寄存器的第4位    *    
                                  ;=1,;总线关闭;SJA1000退出总线活动     *
                                  ;=0,;总线开启;SJA1000加入总线活动     *

;中断寄存器允许中断源的识别;;; 只读                                     *
REG_INTERRUPT    EQU  CONTROLLER_BASE+03H   ;内部中断寄存器地址;        *
                                  
BIT_RI           EQU  01H        ;接收中断位,中断寄存器的第0位         *
                                  ;=1,;;当接收FIFO不空和接收中断        *
                                       ;使能时置位此位                  *
                                  ;=0,;无可用信息                       *

BIT_TI           EQU  02H        ;发送中断位,中断寄存器的第1位         *
                                  ;=1,;发送缓冲器状态从0变为1(释放)     *
                                      ;和发送中断使能时,置位此位        *
                                  ;=0,;微控制器的任何读访问将清除此位   *

BIT_EI           EQU  04H        ;错误中断位,      中断寄存器的第2位   *
                                  ;=1,;错误中断使能时,错误状态位或      *
                                      ;总线状态位的变化会置位此位       *
                                  ;=0,;微控制器的任何读访问将清除此位   *

BIT_DOI          EQU  08H        ;数据溢出中断位,中断寄存器的第3位     *
                                  ;=1,;当数据溢出中断使能位被置为1时向数*
                                      ;据溢出状态位'0-1'跳变,此位被置位*
                                  ;=0,;微控制器的任何读访问将清除此位   *

BIT_WUI          EQU  10H        ;唤醒中断;     中断寄存器的第4位       *    
                                  ;=1,;退出睡眠模式时此位被置位         *
                                  ;=0,; 微控制器的任何读访问将清除此位  *
 
;BIT_5                            ;系统保留位                           *
;BIT_6                            ;系统保留位                           *
;BIT_7                            ;系统保留位                           *

;验收代码寄存器;;;复位模式; 可读写                                      *
REG_ACR    EQU  CONTROLLER_BASE+04H   ;内部验收代码寄存器地址;          *
;BIT 7	BIT 6	BIT 5	BIT 4	BIT 3	BIT 2	BIT 1	BIT 0           *
;AC.7	AC.6	AC.5	AC.4	AC.3	AC.2	AC.1	AC.0            *
                                 ;验收代码位(AC.7-AC.0)和信息识别码的 *
                                 ;高8位(ID.10-ID.3)相等,且与验收屏蔽 *
                                 ;位(AM.7-AM.0)的相应位相或为1。即如果*
                                 ;满足以下方程的描述,则被接收:        *
                                 ;(ID.10-ID.3)≡(AC.7-AC.0)]∨(AM.7-AM.0)≡11111111

;验收屏蔽寄存器;;;复位模式; 可读写                                      *
REG_AMR    EQU  CONTROLLER_BASE+05H  ;内部验收屏蔽寄存器地址;           * 
;BIT 7	BIT 6	BIT 5	BIT 4	BIT 3	BIT 2	BIT 1	BIT 0           *
;AM.7	AM.6	AM.5	AM.4	AM.3	AM.2	AM.1	AM.0            *
                                 ;验收屏蔽寄存器定义验收代码寄存器的    *
                                 ;相应位对验收滤波器是"相关的"或"无影   *
                                 ;响的"(即可为任意值)。               *


;总线定时寄存器0;;复位模式; 可读写                                      *                                                     
REG_BTR0   EQU  CONTROLLER_BASE+06H              ;总线定时寄存器0       ;               * 
;BIT 7	BIT 6	BIT 5	BIT 4	BIT 3	BIT 2	BIT 1	BIT 0           *
;SJW.1	SJW.0	BRP.5	BRP.4	BRP.3	BRP.2	BRP.1	BRP.0           *
                                 ;总线定时寄存器0定义了波特率
                                 ;预设值(BRP)和同步跳转宽度(SJW)的值。
                                 ;CAN系统时钟由如下公式计算:
                                 ;tSCL=2×tCLK×(32×BRP.5+16×BRP.4+8×BRP.3+4×BRP.2+2×BRP.1+BRP.0+1)
                                 ;这里tCLK =XTAL的频率周期=1/fXTAL
                                 ;同步跳转宽度
                                 ;tSJW=tSCL×(2×SJW.1+SJW.0+1)

;总线定时寄存器1;;复位模式; 可读写                                      *                                                     
REG_BTR1   EQU  CONTROLLER_BASE+07H              ;总线定时寄存器1       ;               * 
;BIT 7	BIT 6	BIT 5	BIT 4	BIT 3	BIT 2	BIT 1	BIT 0           *
;SAM	TSEG2.2	TSEG2.1	TSEG2.0	TSEG1.3	TSEG1.2	TSEG1.1	TSEG1.0         *
                                 ;时间段1(TSEG1)和时间段(TSEG2)
                                 ;(TSEG1)和(TSEG2)决定了每一位的时钟数目和采样点的位置,这里:
                                 ;tSYNCSEG=1×tSCL
                                 ;tTSEG1=tSCL×(8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+TSEG1.0+1)
                                 ;tTSEG2=tSCL×(4×TSEG2.2+2×TSEG2.1+TSEG2.1+1)
BIT_SAM   EQU  80H               ;采样模式位
                                 ;1==总线被采样三次
                                 ;0==总线被采样一次


;输出控制寄存器(OCR);;复位模式; 可读写
REG_OCR   EQU  CONTROLLER_BASE+08H               ;输出控制寄存器                        *
;BIT 7	BIT 6	BIT 5	BIT 4	BIT 3	BIT 2	BIT 1	BIT 0           *  
;OCTP1	OCTN1	OCPOL1	OCTP0	OCTN0	OCPOL0	OCMODE1	OCMODE0         *
                                 ;具体的输出模式控制请参阅sja1000的数据手册
BIT_PhaseMode  EQU   00H         ;双相输出模式                          *
BIT_TestMode   EQU   01H         ;测试输出模式                          *
BIT_NormalMode EQU   02H         ;正常输出模式                          *
BIT_ClkOutMode EQU   03H         ;时钟输出模式                          *
;//
BIT_OCPOL1     EQU   20H         ;TX1输出极性控制位                     *
BIT_Tx1Float   EQU   00H         ;配置为悬空
BIT_Tx1PullDn  EQU   40H         ;配置为下拉
BIT_Tx1PullUp  EQU   80H         ;配置为上拉
BIT_Tx1PshPull EQU   0C0H        ;配置为推挽
;//
BIT_OCPOL0_Bit EQU   04H         ;TX0输出极性控制位  
BIT_Tx0Float   EQU   00H         ;配置为悬空
BIT_Tx0PullDn  EQU   40H         ;配置为下拉
BIT_Tx0PullUp  EQU   80H         ;配置为上拉
BIT_Tx0PshPull EQU   0C0H        ;配置为推挽
   


;测试寄存器(仅由于内部测试)
REG_TEST       EQU   CONTROLLER_BASE+09H

;************************************************************************
;*发送缓冲区(内部地址0AH--13H)                                          *
;************************************************************************
REG_TxBuffer1   EQU   CONTROLLER_BASE+0AH          ;发送缓冲区1
REG_TxBuffer2   EQU   CONTROLLER_BASE+0BH          ;发送缓冲区2
REG_TxBuffer3   EQU   CONTROLLER_BASE+0CH          ;发送缓冲区3
REG_TxBuffer4   EQU   CONTROLLER_BASE+0DH          ;发送缓冲区4
REG_TxBuffer5   EQU   CONTROLLER_BASE+0EH          ;发送缓冲区5
REG_TxBuffer6   EQU   CONTROLLER_BASE+0FH          ;发送缓冲区6
REG_TxBuffer7   EQU   CONTROLLER_BASE+010H         ;发送缓冲区7
REG_TxBuffer8   EQU   CONTROLLER_BASE+011H         ;发送缓冲区8
REG_TxBuffer9   EQU   CONTROLLER_BASE+012H         ;发送缓冲区9
REG_TxBuffer10  EQU   CONTROLLER_BASE+013H         ;发送缓冲区10

;************************************************************************
;*接收缓冲区(内部地址014H--01DH)                                        *
;************************************************************************
REG_RxBuffer1   EQU   CONTROLLER_BASE+014H          ;接收缓冲区1
REG_RxBuffer2   EQU   CONTROLLER_BASE+015H          ;接收缓冲区2
REG_RxBuffer3   EQU   CONTROLLER_BASE+016H          ;接收缓冲区3
REG_RxBuffer4   EQU   CONTROLLER_BASE+017H          ;接收缓冲区4
REG_RxBuffer5   EQU   CONTROLLER_BASE+018H          ;接收缓冲区5
REG_RxBuffer6   EQU   CONTROLLER_BASE+019H          ;接收缓冲区6
REG_RxBuffer7   EQU   CONTROLLER_BASE+01AH          ;接收缓冲区7
REG_RxBuffer8   EQU   CONTROLLER_BASE+01BH          ;接收缓冲区8
REG_RxBuffer9   EQU   CONTROLLER_BASE+01CH          ;接收缓冲区9
REG_RxBuffer10  EQU   CONTROLLER_BASE+01DH          ;接收缓冲区10

;************************************************************************
;*内部地址 01EH 备用                                                    *
;************************************************************************

;************************************************************************
;*时钟分频寄存器(内部地址01FH)                                          *
;************************************************************************
REG_CDR         EQU   CONTROLLER_BASE+01FH         ;时钟分频寄存器
;BIT 7	  BIT6	BIT 5	BIT 4	BIT 3	 BIT 2	BIT 1	BIT 0           *
;CAN模式  CBP	RXINTEN	(0)(1)	关闭时钟 CD.2	CD.1	CD.0            *
BIT_DivBy1      EQU   07H          ;时钟频率=fclk
BIT_DivBy2      EQU   00H          ;时钟频率=fclk/2
;//
BIT_CLKOff      EQU   08H          ;关闭时钟输出
BIT_RXINTEN     EQU   020H         ;管脚仅用于接收中断
BIT_CBP         EQU   040H         ;CAN比较器旁路控制位
BIT_CANMode     EQU   080H         ;CAN模式控制位
;************************************************************************
;*SJA1000的命令字                                                       *
;************************************************************************
TR_CMD          EQU   01h          ;//发送请求命令
AT_CMD          EQU   02h          ;//夭折发送命令
RRB_CMD         EQU   04h          ;//释放接收缓冲区
COS_CMD         EQU   08h          ;//清除超载状态
GTS_CMD         EQU   010h         ;//进入睡眠状态命令  
;************************************************************************
;*SJA1000操作的错误                                                       *
;************************************************************************
SJA_INTFACE_ERR EQU   0FFH
SJA_INIT_ERR    EQU   0FEH       
SJA_RCV_ERR     EQU   0FDH
SJA_SEND_ERR    EQU   0FCH

SJA_INITOBJ_ERR   EQU  0FBH
SJA_INITBTR_ERR   EQU  0FAH
SJA_INITOCLK_ERR  EQU  0F9H

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYLED_BUF      EQU    0F900H		;键盘显示缓冲区
KEYLED_MODE     EQU    0F901H		;键盘显示模式选择,0为并行模式
;;;;;;;;;;;;;;;;定义错误字
;
;使用前变量定义
RCV_GOOD		BIT	0FH	    ;成功的接收一帧标志
SEC_FLAG		BIT	010H	;一秒到标志
ERR_FLAG		BIT	011H	;监测到错误标志
OVER_FLAG		BIT	012H	;超载标志
DS_END_FLAG		BIT	013H	;SJA1000发送完成标志
WUI_FLAG		BIT 014H	;唤醒SJA1000标志 

TOIR            BIT 015H	;定时器T0标志 

;;;;;;;;;;;;;;;显示闪烁标志区;;;;;;;;;;;;;;;;;;;;
FLIGHDISP       DATA    02FH
FLIGHBIT0       BIT     07FH
FLIGHBIT1       BIT     07EH
FLIGHBIT2       BIT     07DH
FLIGHBIT3       BIT     07CH
FLIGHBIT4       BIT     07BH
FLIGHSYNC       BIT     07AH

;;;;;;;;;;;;;;显示位选选择;;;;;;;;;;;;;;;;;;
EN_DISPBIT0     BIT     P1.7
EN_DISPBIT1     BIT     P1.6
EN_DISPBIT2     BIT     P1.5
EN_DISPBIT3     BIT     P1.4
EN_DISPBIT4     BIT     P1.3

;;;;;;;;;;;;;;;显示闪烁频率计数;;;;;;;;;;;;;;;;;;;;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -