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

📄 f350_ad_show.asm

📁 c8051f350单片机的AD采集
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;-----------------------------------------------------------------------------
; 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 + -