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

📄 basicmainl.asm

📁 ,片选接到p1.5 复位端 p1.4 中断端接到 int0 82c250工作在斜率模式下
💻 ASM
📖 第 1 页 / 共 4 页
字号:

BCAN_CMD4:
     CJNE          A,      #10H,    BCAN_CMD5
     ;进入睡眠状态命令
     MOV           R0,   #REG_COMMAND; 地址指向命令寄存器
     MOVX          @R0,  A           ;写入命令字
     CLR           F0
BCAN_CMD5:
     RET




;***************************************************************
;* 子程序:   INIT_AT89S52                                     *
;* 应用资源: R0  R2                                           *
;* 参数说明:  无                                               *
;* 返回值:    F0=0      ;函数执行成功                          *
;*            F0=1      ;函数执行失败                          *
;* 说明:      完成和AT89S52相关的程序初始化工作,包括使用的RAM *
;*            清零、中断使能、中断优先级设置、 中断标志位初始化*
;*                                                             *
;***************************************************************
;*子程序调用示例:                                              *
;* USER_CODE:                          ;;用户代码              *
;*    -----   -----                                            *
;*    CALL   INIT_AT89S52              ;;调用子程序            *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码    *
;*    JMP    ERROR_PRG                 ;;失败,跳到错误处理    *
;*                                                             *
;* USER_CODE1:                                                 *
;*    -----   -----                    ;;用户代码              *
;***************************************************************
INIT_AT89S52:

	CLR	F0

;//清零中断标志位
	CLR	EI_FLAG
	CLR	TI_FLAG
	CLR	RI_FLAG
	CLR	DOI_FLAG

;//串行口初始化
;//定时器1产生波特率,方式2
            ;MOV         TMOD , #00100000B

;//串口方式1,10位 无奇偶校验位
            ;MOV         SCON , #01000000B
            ;ANL         PCON , #01111111B             ;SMOD=0
            ;MOV         TL1 , #0E8H                   ;波特率9600
            ;MOV         TH1 , #0E8H                   ;自动装载值


;//中断系统初始化
	;SETB       EA	                  ;开发总中断
	;SETB       EX0	                  ;外部中断0使能

;//函数返回
	;SETB	F0
	RET

;***************************************************************
;* 子程序:   HARD_RESET_SJA1000                               *
;* 应用资源: A , R0 , R2                                      *
;* 参数说明:  无                                               *
;* 返回值:    F0=0      ;函数执行成功                          *
;*            F0=1      ;函数执行失败                          *
;* 说明:      通过单片机的P1.4口将SJA1000硬件复位              *
;*                                                             *
;***************************************************************
;*子程序调用示例:                                              *
;* USER_CODE:                          ;;用户代码              *
;*    -----   -----                                            *
;*    CALL   RESET_SJA1000             ;;调用子程序            *
;*    JNB    F0,      USER_CODE1       ;;成功,继续用户代码    *
;*    JMP    ERROR_PRG                 ;;失败,跳到错误处理    *
;*                                                             *
;* USER_CODE1:                                                 *
;*    -----   -----                    ;;用户代码              *
;***************************************************************
HARD_RESET_SJA1000:
            CLR	SJA1000_RESET                       ;低电平复位

            MOV         R4,#60
            CALL        DELAYNMS                            ;延时60MS  1UF电容 50K电阻 RC=50ms
            SETB        SJA1000_RESET

            MOV         R2,#50
HARD_RESET_SJA1000_LOOP1:
	NOP
	DJNZ	R2 , HARD_RESET_SJA1000_LOOP1

;//检测SJA1000控制寄存器的CR.0位
	MOV	R0 , #REG_CONTROL
	MOVX        A , @R0
	JB	ACC.0 , RESET_OK
RESET_FAILURE:
	CLR	F0
	RET
RESET_OK:
	SETB	F0
	RET

;***************************************************************
;* 子程序:   INIT_SJA1000                                     *
;* 应用资源: A , R0 , R2                                      *
;* 参数说明:  无                                               *
;* 返回值:    F0=0      ;函数执行成功                          *
;*            F0=1      ;函数执行失败                          *
;* 说明:      对SJA1000进行通信设置。包括:                    *
;*            (1)测试SJA1000和AT89S52之间的通信端口测试        *
;*            (2)设置验收滤波器和验收屏蔽寄存器                *
;*            (3)设置总线时序寄存器0以决定波特率               *
;*            (4)设置总线时序寄存器1以决定采样点               *
;*            (5)设置时钟分频寄存器以确定SJA1000的工作模式、旁 *
;*               路和时钟输出端口关闭                          *
;*            (6)配置输出控制寄存器                            *
;* 初始化完成后程序自动将SJA1000退出复位模式                   *
;***************************************************************
;*子程序调用示例:                                              *
;* USER_CODE:                          ;;用户代码              *
;*    -----   -----                                            *
;*    CALL   INIT_SJA1000              ;;调用子程序            *
;*    JNB    F0,      USER_CODE1       ;;成功,继续用户代码    *
;*    JMP    ERROR_PRG                 ;;失败,跳到错误处理    *
;*                                                             *
;* USER_CODE1:                                                 *
;*    -----   -----                    ;;用户代码              *
;***************************************************************
INIT_SJA1000:
;测试SJA1000接口是否正常
	MOV	ERRORCOUNT , #05H                   ;5次,报错
INIT_SJA1000_LOOP1:
    	CALL	BCAN_CREATE_COMMUNATION             ;调用SJA1000接口测试函数
            JNB	F0,INIT_SJA1000_FILTER              ;接口正常,初始化SJA1000
            DJNZ	ERRORCOUNT , INIT_SJA1000_LOOP1     ;接口不正常,再检测
    	MOV	ERROR_STATUS , #SJA_INTFACE_ERR
    	JMP	SUB_ERROR_HANDLE                    ;错误处理

INIT_SJA1000_FILTER:
;设置验收滤波器和验收屏蔽寄存器
	MOV     ERRORCOUNT , #05H         ;5次,报错
INIT_SJA1000_LOOP2:

	MOV     R7 , #0AAH                              ;;只允许接收ID号高8位为'10101010'
    	MOV     R6 , #00H                               ;;

    	CALL    BCAN_SET_OBJECT                         ;;调用子程序
    	JNB     F0 , INIT_SJA1000_BAUD                  ;;成功,继续用户代码
    	DJNZ    ERRORCOUNT , INIT_SJA1000_LOOP2         ;接口不正常,再检测
    	MOV     ERROR_STATUS , SJA_INITFILTER_ERR
    	JMP     SUB_ERROR_HANDLE                        ;;失败,跳到错误处理

INIT_SJA1000_BAUD:
;设置波特率
	MOV     ERRORCOUNT , #05H                       ;5次,报错
INIT_SJA1000_LOOP3:
            MOV     R7 , #4	                        ;12MHz 100K
    	CALL    BCAN_SET_BANDRATE                       ;设置波特率为100k
    	JNB     F0 , INIT_SJA1000_CLOCK                 ;判断设置是否成功
	DJNZ    ERRORCOUNT , INIT_SJA1000_LOOP3         ;接口不正常,再检测
	MOV     ERROR_STATUS , #SJA_INITBTR_ERR
    	JMP     SUB_ERROR_HANDLE

INIT_SJA1000_CLOCK:
;设置输出控制、时钟分频
    	MOV     ERRORCOUNT , #05H                       ;5次,报错
INIT_SJA1000_LOOP4:
    	MOV     R7 , #0BAH                              ;正常输出模式 OCR 推挽 极性正常
    	                                                ;SJA1000的TX0 接到82C250的TXD
    	MOV     R6 , #48H                               ;BASIC CAN,禁止内部比较器、禁止CLKOUT
    	CALL    BCAN_SET_OUTCLK                         ;
    	JNB     F0 , EXIT_RESET_MODE                    ;判断设置是否成功
	DJNZ    ERRORCOUNT , INIT_SJA1000_LOOP4
	MOV     ERROR_STATUS , #SJA_INITOCLK_ERR
    	JMP     SUB_ERROR_HANDLE

EXIT_RESET_MODE:
;SJA1000退出复位模式,进入工作模式
    	MOV     ERRORCOUNT ,   #005H                    ;5次,报错
INIT_SJA1000_LOOP5:
    	CALL    BCAN_QUIT_RETMODEL                      ;退出复位状态
    	JNB     F0 , SJA1000_INIT_END                   ;判断设置是否成功
    	DJNZ    ERRORCOUNT , INIT_SJA1000_LOOP5
	MOV     ERROR_STATUS , #0FEH                    ;#SJA_INIT_ERR
    	JMP     SUB_ERROR_HANDLE

SJA1000_INIT_END:
	RET
SUB_ERROR_HANDLE:
	SETB	F0
	RET

;**************************************************************
;**************************************************************
;功    能:                                                   *
;        串口数据发送子程序                                   *
;入口条件:                                                   *
;        将要发送的数据缓冲区首地址放入R0中                   *
;**************************************************************
SEND_UART:
             MOV    A , @R0
             CLR    TI
             MOV    SBUF , A
             JNB    TI , $
             CLR    TI
             RET


;2004.12.19调通
;****************DELAYNMS.ASM***************************************
;程序功能:本程序实现延时Nms.
;入口参数:R4存放延时的毫秒数.
;出口参数:无.
;占用资源:R3
;占用堆栈:0字节.
;占用标号:DELAYNMS,DELAYNMS_LOOP.
;子程序调用:无.
;说明:1,本程序适用于晶振频率为12MHZ时,即单周期指令用时1us的模式,
;       时间计算公式为(249*4+1+1+2)*(R4)+2=1000*(R4)+2
;     2,未加上调用该子程序的指令执行的时间,如 LCALL DELAYNMS
;     3,使用该子程序前需定义符号DELAYMS_NUM,例DELAYMS_NUM DATA 55H

DELAYNMS:   MOV	R3,#0F9H                 ;1us
DELAYNMS_LOOP:
            NOP
            NOP
            DJNZ	R3,DELAYNMS_LOOP         ;2us
            NOP
	DJNZ	R4,DELAYNMS              ;2us
	RET
                                                 ;2us

;*************************************************************

        END

⌨️ 快捷键说明

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