📄 f350_ad_show.asm
字号:
;-----------------------------------------------------------------------------
; Include register definition file.
;-----------------------------------------------------------------------------
$include (c8051f350.inc)
$include (MCP2515.inc)
$include (LCD.inc)
$include (AD.inc)
;-----------------------------------------------------------------------------
;---------------------
cseg AT 0
ljmp Main ; Locate a jump to the start of code at the reset vector.
;---------------------
ORG 0003H
ljmp MCP2515_intrupt
;---------------------
ORG 0053H
;ljmp AD_intrupt
;---------------------
;-----------------------------------------------------------------------------
; 主程序代码
;-----------------------------------------------------------------------------
ORG 0080H;看过C80510说明书84页知道这里从80H开始是极限了
Main:
;----------------------------
; 以下部分是对单片机的初始化
;----------------------------
anl PCA0MD , #00H ;关闭看门狗
mov SP,#0c0H ;注意堆栈起始地址可以变化
; mov psw , #00h
mov REF0CN , #0FFh
mov PFE0CN , #20H ;使能指令预取引擎,软件FLASH写操作的每个字节都被单独写入
lcall CPU_Init
;----------------------------
; 以上部分是对单片机的初始化
;----------------------------
;------------------------------
; 以下部分是对AD转换器的初始化
;------------------------------
mov MDCLKH,#25H ;设置AD调制时钟参数,可以改的
mov MDCLKM,#80H
mov MDCLKL,#00H ;注意MDCLK不可以超过26M,否则计算出错,实际最多只能设到16M
mov SYSCLKH ,#00H ;设定系统时钟参数,根据系统设定来选
mov SYSCLKM ,#25H
mov SYSCLKL ,#80H
mov SYSCLKLL,#00H
mov ADOWR,#60 ;设定AD输出速率
lcall ADC0_Init
lcall ADC_calibration;AD标定的时间次数需要考虑
;------------------------------
; 以上部分是对AD转换器的初始化
;------------------------------
;---------------------------
; 以下部分是对LCD的初始化
;---------------------------
;mov DPTR ,#CODETOSHOW
lcall LCD_INT
;---------------------------
; 以上部分是对LCD的初始化
;---------------------------
;---------------------------
;以下是对mcp2515的初始化
;---------------------------
lcall MCP2515_REGpreconfig;在CPU外存中设置MCP2515的各个寄存器参数
;---------------------------
;以下是对MCP2515的初始化
;---------------------------
;---------------------------
;以下是对MCP2515的初始化
;---------------------------
lcall MCP2515_reset
lcall MCP2515_receiveREGset
lcall MCP2515_intruptset
lcall MCP2515_modeset
;---------------------------
;以上是对mcp2515的初始化
;---------------------------
;-----------------------------
;CPU开放中断
;----------------------------
lcall CPUINT_Init ;这一步CPU中断开放,位置可以根据情况考虑
;----------------------------
;=============================================================================
; 主程序
;=============================================================================
;---------------------------------发送远程数据请求帧--------------------------
CLEARTXEQ1:
mov Bitmodifyaddress, #MCP2515TXB0CTRL
mov Bitmodifymask , #08h
mov Bitmodifydata , #00h
lcall BitmodifyCOMMAND_to_MCP2515
;载入发送缓冲器前,清零TXEQ发送请求位
;-------------------------------------------
;*********************************
;CAN总线标识符设置
mov TXBsidhdata , #00H
mov TXBsidldata , #40H
mov TXBeid8data , #00H
mov TXBeid0data , #00H
;*********************************
;发送数据设置
mov TXBdlcdata , #42H
;**********************************
mov operateTXBorRXBcommmand , #MCP2515LOADTXBfromTXB0SIDH
lcall LOADdatato_TXB_and_READdatafrom_RXB
;----------------------------------------------------
;mov operateTXBorRXBcommmand , # 90h
;lcall LOADdatato_TXB_and_READdatafrom_RXB
RequstADdata:
;***************************************
mov Nonfeedbackcommmand, #CMD_RTSTXB0
lcall NonfeedbackCOMMAND_to_MCP2515
;***************************************
mov DelaytimesetIN, #10
mov DelaytimesetOUT, #255
lcall delayshorterthan255mul255osc
mov MCP2515readaddress,#MCP2515CANINTF
lcall READDATA_from_MCP2515
mov A , SPI0DAT
jnb ACC.2, RequstADdata
RECLEARSEND0FLAG:
mov Bitmodifyaddress, #MCP2515CANINTF
mov Bitmodifymask , #04h
mov Bitmodifydata , #00h
lcall BitmodifyCOMMAND_to_MCP2515
mov MCP2515readaddress,#MCP2515CANINTF
lcall READDATA_from_MCP2515
mov A , SPI0DAT
jb ACC.2, RECLEARSEND0FLAG
clr ADshowcomplete
WaitforADdata: jnb ADshowcomplete, WaitforADdata
ljmp CLEARTXEQ1
;
DIGL: clr C ;|X(N)-Y(N-1)|< set value 1.0 JMP DIGM
xch A ,B
subb A ,#40
xch A ,B ;LASTHLASTL - SMPHSMPL - 40 ->AB
subb A ,#0
jc DIGM
mov LASTH, SMPH ;|X(N)-Y(N-1)|> set value,X(N)-->Y(N-1)
mov LASTL, SMPL
RET
DIGM: mov R2, LASTH ;Y(N)=[X(N)+(K-1)*Y(N-1)]/K
mov R3, LASTL
mov R6, #0
mov R7, #19
call TWOBYTE_MUL ;实现(K-1)*Y(N-1)
clr C
mov A, SMPL
add A, R7
mov R7, A
mov A, SMPH
addc A, R6
mov R6, A
mov A, #0
addc A, R5
mov R5, A
mov A, #0
addc A, R4
mov R4, A ;实现 X(N)+(K-1)*Y(N-1)
mov R2, #0
mov R3, #20
call FOURBYTE_DIV_TWOBYTE ;[X(N)+(K-1)*Y(N-1)]/K
mov LASTH, R6 ;Y(N)-->Y(N-1)
mov LASTL, R7
mov SMPH, R6
mov SMPL, R7
RET
;---------------------------------------------------------------------------
;两字节乘法子程序:功能R2R3*R6R7->R4R5R6R7;入口R2.R3.R6.R7; 出口R4.R5.R6.R7
;---------------------------------------------------------------------------
TWOBYTE_MUL:;
mov R4, #00H
mov R5, #00H
mov R1, #16
mulrotate:
clr C
mov A, R4
RRC A
mov R4, A
mov A, R5
RRC A
mov R5, A
mov A, R6
RRC A
mov R6, A
mov A, R7
RRC A
mov R7, A
jnc multime
clr C
mov A , R3
ADD A , R5
mov R5, A
mov A , R2
ADDC A , R4
mov R4, A
multime: djnz R1, mulrotate
;==================
;==================
mov A, R4
RRC A
mov R4, A
mov A, R5
RRC A
mov R5, A
mov A, R6
RRC A
mov R6, A
mov A, R7
RRC A
mov R7, A ;第一次移位移出的一个0,在16次移位后刚好到最低位,需要再右移一次
;==================
;==================
RET
;--------------------------------------------------------------------------------------------
;四字节除以二字节除法程序:功能 R4R5R6R7/R2R3->R6R7 入口 R4R5R6R7 R2R3 出口 R6R7 占用资源R0R1
;--------------------------------------------------------------------------------------------
FOURBYTE_DIV_TWOBYTE:
clr C
mov A , R5
subb A , R3
mov A , R4
subb A , R2
jnc DIVOVERFLOW ;
mov R0 ,#16 ;累减次数计数器
DIVOPERATE: clr C ;如果R2R3<R4R5,那么第一次累减必须要左移
mov A, R7
RLC A
mov R7, A
mov A, R6
RLC A
mov R6, A
mov A, R5
RLC A
mov R5, A
XCH A, R4
RLC A
XCH A, R4
mov PSW.0 , C
clr C
subb A , R3
mov R1, A
mov A , R4
subb A , R2
jb PSW.5, FOURBYTE_DIV_TWOBYTESHANGONE
jc FOURBYTE_DIV_TWOBYTENOSHANGONE
FOURBYTE_DIV_TWOBYTESHANGONE:
mov R4 , A
mov A ,R1
mov R5 ,A
inc R7
FOURBYTE_DIV_TWOBYTENOSHANGONE:
djnz R0, DIVOPERATE
DIVOVERFLOW: ;报错怎么办?报错怎么办?报错怎么办?
RET
;*****************************************************************************
;SPI口各类操作函数
;*****************************************************************************
;-----------------------------------------------------------------------------
;向mcp2515寄存器写数据(参数 MCP2515writeaddress,MCP2515writedata)
;-----------------------------------------------------------------------------
WRITEDATA_to_MCP2515:
setb NSSMD0
mov DelaytimesetIN , #5
mov DelaytimesetOUT , #10
lcall delayshorterthan255mul255osc
clr NSSMD0
clr SPIF
mov SPI0DAT, #CMD_WRITE
writestep1:jnb SPIF, writestep1
clr SPIF
mov SPI0DAT, MCP2515writeaddress
writestep2:jnb SPIF, writestep2
clr SPIF
mov SPI0DAT, MCP2515writedata
writestep3:jnb SPIF, writestep3
setb NSSMD0
RET
;-----------------------------------------------------------------------------
;读取mcp2515寄存器数据(参数 MCP2515readaddress,出口SPI0DAT)
;-----------------------------------------------------------------------------
READDATA_from_MCP2515:
setb NSSMD0
mov DelaytimesetIN , #5
mov DelaytimesetOUT , #10
lcall delayshorterthan255mul255osc
clr NSSMD0
clr SPIF
mov SPI0DAT, #CMD_READ
readstep1:jnb SPIF, readstep1
clr SPIF
mov SPI0DAT, MCP2515readaddress
readstep2:jnb SPIF, readstep2
clr SPIF
mov SPI0DAT, MCP2515readaddress
readstep3:jnb SPIF, readstep3
setb NSSMD0
RET
clr SPIF
mov SPI0DAT, #CMD_BITMODIFY
Bitmodifystep1:jnb SPIF, Bitmodifystep1
clr SPIF
mov SPI0DAT, Bitmodifyaddress
Bitmodifystep2:jnb SPIF, Bitmodifystep2
clr SPIF
mov SPI0DAT, Bitmodifymask;
Bitmodifystep3:jnb SPIF, Bitmodifystep3
clr SPIF
mov SPI0DAT, Bitmodifydata
Bitmodifystep4:jnb SPIF, Bitmodifystep4
setb NSSMD0
RET
;***************************************************************************************
;以上是SPI口操作函数集
;***************************************************************************************
;---------------------------------------------------------------------------
;MCP2515子函数
;-----------------------------------------------------------------------------
MCP2515_rxbshow:
mov DPTR , #CODETOSHOW
mov MCP2515readaddress,#MCP2515RXB0D1
lcall READDATA_from_MCP2515
mov A , SPI0DAT
anl A , #0FH
movc A , @A+DPTR
mov LCDSECONDBUF,A
mov A , SPI0DAT
anl A,#0F0H
RR A
RR A
RR A
RR A
movc A,@A+DPTR
mov LCDFIRSTBUF,A
mov MCP2515readaddress,#MCP2515RXB0D0
lcall READDATA_from_MCP2515
mov A , SPI0DAT
anl A , #0FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -