📄 dac-rs232.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 + -