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

📄 dac-rs232.asm

📁 汇编语言编写的用定时器写的ADC与DAC程序,并且ADC转化后的电压值通过串口输出,呵呵,很好的!
💻 ASM
字号:
;------------------------------------
;-  Generated Initialization File  --
;------------------------------------

$include (C8051F120.INC)

public  Init_Device

INIT SEGMENT CODE
    rseg INIT

		JISHU				EQU		30H	
		DIZHI				EQU		31H
		TIME				EQU		32H
		TIME100				EQU		33H
		ADCDZ				EQU		34H
		ADCDZ_TEMP			EQU		35H
		LED					BIT		P1.6
		
		ORG		0000H
		LJMP	START
		
		
		ORG		000BH
		LJMP	TIME0				;定时器0中断向量
				
		ORG		0023H
		LJMP	UART0				;串口中断向量
		
		
		ORG		007BH
		LJMP	ADC0				;ADC转换中断向量
		

		ORG		0100H
START:
		LCALL	Init_Device			;初始化调用
		MOV		TIME,#100			;1ms计数初值
		MOV		TIME100,#10			;100ms计数初值
		MOV		DIZHI,#40H			;DAC数值存放地址首地址
		MOV		JISHU,#04h			;串口接受数据个数计数器
		MOV		ADCDZ,#44H			;ADC转换数据存放首地址
		MOV		SP,	 #60H			;堆栈初值
		
		SETB	LED					;开led灯
		LJMP	$					;等待

UART0:								;串口中断程序
		MOV		SFRPAGE,#UART0_PAGE	;调用串口SFR页面
		MOV		R0,DIZHI			;DAC数据存放初值载入
		JNB		RI0,$				;判断中断标志位是否为1
		CLR		RI0					;清中断标志位
		MOV		A,SBUF0			 	;串口数据接受
		MOV		@R0,A			 	;存入DAC数据地址
		DJNZ	JISHU,UART0_1		;是否接受到4个数据
		LJMP	UART0_2			 	;跳转

UART0_1:		
		INC		DIZHI				;DAC数据地址加一
		
		LJMP	UART0_OVER			;跳转
UART0_2:
		MOV		A,#0FEH				;收满4个则发送FE作为接收完毕的返回信号
		MOV		SBUF0,A				;数据送暂存器发送
		JNB		TI0,$				;扫描是否发送完毕
		CLR		TI0					;完毕后清中断标志位
		MOV		DIZHI,#40H		 	;DAC数据地址重装
		MOV		JISHU,#04H		  	;数据接受个数重装
		LCALL	DAC					;调用DAC数据写入程序
UART0_OVER:
		MOV		SFRPAGE,#00H		;返回原始SFR页面
		RETI						;中断返回


DAC:
		MOV		SFRPAGE,#DAC0_PAGE	;调入DAC0的SFR页面
		MOV		R0,DIZHI			;DAC数据存放地址载入
		MOV		DAC0H,@R0			;DAC0高位数据写入
		INC		R0				 	;地址加一
		MOV		DAC0L,@R0			;DAC0低位数据写入
		INC		R0					;地址加一
		MOV		SFRPAGE,#DAC1_PAGE	;调入DAC1的SFR页面
		MOV		DAC1H,@R0			;DAC1高位数据写入
		INC		R0					;地址加一
		MOV		DAC1L,@R0			;DAC1低位数据写入
		MOV		SFRPAGE,#00H		;返回原始SFR页面
		RET							;程序返回


TIME0:								;定时器0中断程序
		MOV	  SFRPAGE,   #TIMER01_PAGE
		MOV		TL0,#0CCH		   	;定时器初值重装
		MOV		TH0,#0F8H
		DEC		TIME				;1ms计数器减一
		MOV		A,TIME				;
		JZ		TIME0_1				;是否已经中断了100次;是则跳转
		LJMP	TIME0_OVER			;否则跳转
TIME0_1:
		
		MOV		TIME,#100			;1MS计数器初值重装
		DEC		TIME100			 	;100ms计数器减一
		MOV		A,TIME100			;是否已经达到100ms初值次数
		JZ		TIME0_2				;是则跳转
		LJMP	TIME0_OVER			;否则跳转
TIME0_2:
		MOV		TIME100,#10			;100ms计数初值重装
		MOV		SFRPAGE,#ADC0_PAGE	;调入ADC0的SFR页面
		LCALL	UART_F				;调ADC数据串口发送程序
		JB		F0,TIME0_3			;用户标志位是否为1,是则跳转
		MOV		AMX0SL,#00H			;否则切换ADC通道为00
		LCALL	DELAY				;调延时
		CPL		F0					;F0标志位取反
		SETB	AD0BUSY				;启动ADC0
		LJMP	TIME0_OVER			;跳转
TIME0_3:
		
		MOV		AMX0SL,#01H			;切换ADC通道为01
		LCALL	DELAY				;调延时
		SETB	AD0BUSY				;启动ADC
		CPL		F0					;F0标志位取反
TIME0_OVER:
		MOV		SFRPAGE,#00H		;返回原始SFR页面
		RETI						;中断返回


UART_F:
		CLR		EA					;关中断
		mov  SFRPAGE,   #UART0_PAGE	;调串口SFR页面
		MOV		R0,ADCDZ			;调入ADC数据存放地址
		MOV		R2,#04H				;发送数据个数
		
UARTF_1:
		CLR		TI0					;清标志位
		MOV		A,@R0				;ADC数据发送
		MOV		SBUF0,A
		JNB		TI0,$			 	;等待发送完毕
		INC		R0					;地址加一
		DJNZ	R2,UARTF_1			;是否发送完4个数据
		CLR		TI0					;完毕清标志位
		SETB	EA					;开中断
		CPL		LED					;led灯状态取反
		RET							;返回


ADC0:							    ;ADC转换结束中断程序
		CLR			AD0INT			;清中断标志位
		JB			F0,ADC0_2	 	;判断ADC通道数
		MOV			R0,ADCDZ		;ADC数据存放地址载入
		LJMP		ADC0_1			;跳转
ADC0_2:
		MOV			R0,ADCDZ_TEMP	;ADC数据存放地址暂存
ADC0_1:
		
		MOV			@R0,ADC0H		;ADC高位数据存入
		INC			R0				;地址加一
		MOV			@R0,ADC0L		;ADC低位数据存入
		INC			R0				;地址加一
		MOV			ADCDZ_TEMP,R0	;地址暂存
		RETI					  	;中断返回


DELAY:								;延时
		MOV			R3,#00H
		DJNZ		R3,$
		RET











Reset_Sources_Init:
    mov  WDTCN,     #0DEh
    mov  WDTCN,     #0ADh
    ret

Timer_Init:
    mov  SFRPAGE,   #TIMER01_PAGE
    mov  TCON,      #010h
    mov  CKCON,     #002h
	mov  SFRPAGE,   #TIMER01_PAGE
    mov  TMOD,      #001h
    mov  TL0,       #02Fh
    mov  TH0,       #0F8h
    mov  SFRPAGE,   #TMR2_PAGE
    mov  TMR2CN,    #004h
    mov  TMR2CF,    #008h
    mov  RCAP2L,    #0A0h
    mov  RCAP2H,    #0FFh
    mov  SFRPAGE,   #TMR3_PAGE
    mov  TMR3CN,    #004h
    ret



UART_Init:
    mov  SFRPAGE,   #UART0_PAGE
    mov  SCON0,     #050h
    mov  SSTA0,     #005h
    ret


ADC_Init:
    mov  SFRPAGE,   #ADC0_PAGE
    mov  ADC0CN,    #080h
    ret

DAC_Init:
    mov  SFRPAGE,   #DAC0_PAGE
    mov  DAC0CN,    #098h
    mov  SFRPAGE,   #DAC1_PAGE
    mov  DAC1CN,    #098h
    ret

Voltage_Reference_Init:
    mov  SFRPAGE,   #ADC0_PAGE
    mov  REF0CN,    #003h
    ret

Port_IO_Init:
    ; P0.0  -  TX0 (UART0), Open-Drain, Digital
    ; P0.1  -  RX0 (UART0), Open-Drain, Digital
    ; P0.2  -  Unassigned,  Open-Drain, Digital
    ; P0.3  -  Unassigned,  Open-Drain, Digital
    ; P0.4  -  Unassigned,  Open-Drain, Digital
    ; P0.5  -  Unassigned,  Open-Drain, Digital
    ; P0.6  -  Unassigned,  Open-Drain, Digital
    ; P0.7  -  Unassigned,  Open-Drain, Digital

    ; P1.0  -  Unassigned,  Open-Drain, Digital
    ; P1.1  -  Unassigned,  Open-Drain, Digital
    ; P1.2  -  Unassigned,  Open-Drain, Digital
    ; P1.3  -  Unassigned,  Open-Drain, Digital
    ; P1.4  -  Unassigned,  Open-Drain, Digital
    ; P1.5  -  Unassigned,  Open-Drain, Digital
    ; P1.6  -  Unassigned,  Push-Pull,  Digital
    ; P1.7  -  Unassigned,  Open-Drain, Digital

    ; P2.0  -  Unassigned,  Open-Drain, Digital
    ; P2.1  -  Unassigned,  Open-Drain, Digital
    ; P2.2  -  Unassigned,  Open-Drain, Digital
    ; P2.3  -  Unassigned,  Open-Drain, Digital
    ; P2.4  -  Unassigned,  Open-Drain, Digital
    ; P2.5  -  Unassigned,  Open-Drain, Digital
    ; P2.6  -  Unassigned,  Open-Drain, Digital
    ; P2.7  -  Unassigned,  Open-Drain, Digital

    ; P3.0  -  Unassigned,  Open-Drain, Digital
    ; P3.1  -  Unassigned,  Open-Drain, Digital
    ; P3.2  -  Unassigned,  Open-Drain, Digital
    ; P3.3  -  Unassigned,  Open-Drain, Digital
    ; P3.4  -  Unassigned,  Open-Drain, Digital
    ; P3.5  -  Unassigned,  Open-Drain, Digital
    ; P3.6  -  Unassigned,  Open-Drain, Digital
    ; P3.7  -  Unassigned,  Open-Drain, Digital

    mov  SFRPAGE,   #CONFIG_PAGE
    mov  P1MDOUT,   #040h
    mov  XBR0,      #004h
    mov  XBR2,      #040h
    ret

Oscillator_Init:
    mov  SFRPAGE,   #CONFIG_PAGE
    mov  OSCXCN,    #067h
    mov  R0,        #030        ; Wait 1ms for initialization
Osc_Wait1:
    clr  A
    djnz ACC,       $
    djnz R0,        Osc_Wait1
Osc_Wait2:
    mov  A,         OSCXCN
    jnb  ACC.7,     Osc_Wait2
    mov  PLL0CN,    #004h
    mov  SFRPAGE,   #LEGACY_PAGE
    mov  FLSCL,     #0B0h
    mov  SFRPAGE,   #CONFIG_PAGE
    orl  PLL0CN,    #001h
    mov  PLL0DIV,   #001h
    mov  PLL0FLT,   #001h
    mov  PLL0MUL,   #004h
    clr  A                     ; Wait 5us for initialization
    djnz ACC, $
    orl  PLL0CN,    #002h
Pll_Wait:
    mov  A,         PLL0CN
    jnb  ACC.4,     Pll_Wait
    mov  CLKSEL,    #002h
    mov  OSCICN,    #003h
    ret


Interrupts_Init:
    mov  IE,        #092h
    ;mov  IP,        #010h
		mov  EIE2,      #006h
    ret

; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
    lcall Reset_Sources_Init
    lcall Timer_Init
    lcall UART_Init
    lcall ADC_Init
    lcall DAC_Init
    lcall Voltage_Reference_Init
    lcall Port_IO_Init
    lcall Oscillator_Init
    lcall Interrupts_Init
    ret

end 

⌨️ 快捷键说明

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