📄 jiance.asm
字号:
/* BYTE Registers */
sfr PCON = 0x87; /* POWER CONTROL */
sfr TCON = 0x88; /* TIMER CONTROL */
sfr TMOD = 0x89; /* TIMER MODE */
sfr TL0 = 0x8A; /* TIMER 0 - LOW BYTE */
sfr TL1 = 0x8B; /* TIMER 1 - LOW BYTE */
sfr TH0 = 0x8C; /* TIMER 0 - HIGH BYTE */
sfr TH1 = 0x8D; /* TIMER 1 - HIGH BYTE */
sfr CKCON = 0x8E; /* CLOCK CONTROL */
sfr PSCTL = 0x8F; /* PROGRAM STORE R/W CONTROL
sfr SCON = 0x98; */
sfr PRT0CF = 0xA4;
sfr IE = 0xA8; /* INTERRUPT ENABLE */
sfr OSCXCN = 0xB1; /* EXTERNAL OSCILLATOR CONTROL */
sfr OSCICN = 0xB2; /* INTERNAL OSCILLATOR CONTROL */
sfr AMX0CF = 0xBA; /* ADC 0 MUX CONFIGURATION */
sfr AMX0SL = 0xBB; /* ADC 0 MUX CHANNEL SELECTION */
sfr ADC0CF = 0xBC; /* ADC 0 CONFIGURATION */
sfr ADC0L = 0xBE; /* ADC 0 DATA - LOW BYTE */
sfr ADC0H = 0xBF; /* ADC 0 DATA - HIGH BYTE */
sfr PSW = 0xD0; /* PROGRAM STATUS WORD */
sfr REF0CN = 0xD1; /* VOLTAGE REFERENCE 0 CONTROL
sfr DAC0L = 0xD2;
sfr DAC0H = 0xD3;
sfr DAC0CN = 0xD4; /* DAC0CN ADDRESS*/ */
sfr ACC = 0xE0; /* ACCUMULATOR */
sfr XBR0 = 0xE1; /* DIGITAL CROSSBAR CONFIGURATION REGISTER 0 */
sfr XBR1 = 0xE2; /* DIGITAL CROSSBAR CONFIGURATION REGISTER 1 */
sfr XBR2 = 0xE3; /* DIGITAL CROSSBAR CONFIGURATION REGISTER 2 */
sfr EIE1 = 0xE6; /* EXTERNAL INTERRUPT ENABLE 1 */
sfr EIE2 = 0xE7; /* EXTERNAL INTERRUPT ENABLE 2 */
sfr ADC0CN = 0xE8; /* ADC 0 CONTROL */
sfr B = 0xF0; /* B REGISTER */
sfr EIP1 = 0xF6; /* EXTERNAL INTERRUPT PRIORITY REGISTER 1 */
sfr EIP2 = 0xF7; /* EXTERNAL INTERRUPT PRIORITY REGISTER 2 */
sfr SPI0CN = 0xF8; /* SERIAL PERIPHERAL INTERFACE 0 CONTROL */
sfr WDTCN = 0xFF; /* WATCHDOG TIMER CONTROL */
sfr SBUF = 0X99;
/* BIT Registers */
/* TCON 0x88 */
sbit TF1 = TCON ^ 7; /* TIMER 1 OVERFLOW FLAG */
sbit TR1 = TCON ^ 6; /* TIMER 1 ON/OFF CONTROL */
sbit TF0 = TCON ^ 5; /* TIMER 0 OVERFLOW FLAG */
sbit TR0 = TCON ^ 4; /* TIMER 0 ON/OFF CONTROL */
sbit IE1 = TCON ^ 3; /* EXT. INTERRUPT 1 EDGE FLAG */
sbit IT1 = TCON ^ 2; /* EXT. INTERRUPT 1 TYPE */
sbit IE0 = TCON ^ 1; /* EXT. INTERRUPT 0 EDGE FLAG */
sbit IT0 = TCON ^ 0; /* EXT. INTERRUPT 0 TYPE */
/* SCON 0x98 */
sbit SM0 = SCON ^ 7; /* SERIAL MODE CONTROL BIT 0 */
sbit SM1 = SCON ^ 6; /* SERIAL MODE CONTROL BIT 1 */
sbit SM2 = SCON ^ 5; /* MULTIPROCESSOR COMMUNICATION ENABLE */
sbit REN = SCON ^ 4; /* RECEIVE ENABLE */
sbit TB8 = SCON ^ 3; /* TRANSMIT BIT 8 */
sbit RB8 = SCON ^ 2; /* RECEIVE BIT 8 */
sbit TI = SCON ^ 1; /* TRANSMIT INTERRUPT FLAG */
sbit RI = SCON ^ 0; /* RECEIVE INTERRUPT FLAG */
/* IE 0xA8 */
sbit EA = IE ^ 7; /* GLOBAL INTERRUPT ENABLE */
sbit ET2 = IE ^ 5; /* TIMER 2 INTERRUPT ENABLE */
sbit ES = IE ^ 4; /* SERIAL PORT INTERRUPT ENABLE */
sbit ET1 = IE ^ 3; /* TIMER 1 INTERRUPT ENABLE */
sbit EX1 = IE ^ 2; /* EXTERNAL INTERRUPT 1 ENABLE */
sbit ET0 = IE ^ 1; /* TIMER 0 INTERRUPT ENABLE */
sbit EX0 = IE ^ 0; /* EXTERNAL INTERRUPT 0 ENABLE */
/* IP 0xB8 */
//sbit PT2 = IP ^ 5; /* TIMER 2 PRIORITY */
//sbit PS = IP ^ 4; /* SERIAL PORT PRIORITY */
//sbit PT1 = IP ^ 3; /* TIMER 1 PRIORITY */
//sbit PX1 = IP ^ 2; /* EXTERNAL INTERRUPT 1 PRIORITY */
//sbit PT0 = IP ^ 1; /* TIMER 0 PRIORITY */
//sbit PX0 = IP ^ 0; /* EXTERNAL INTERRUPT 0 PRIORITY */
/* ADC0CN E8H */
sbit ADCEN = ADC0CN ^ 7; /* ADC 0 ENABLE */
sbit ADCTM = ADC0CN ^ 6; /* ADC 0 TRACK MODE */
sbit ADCINT = ADC0CN ^ 5; /* ADC 0 CONVERISION COMPLETE INTERRUPT FLAG */
sbit ADCBUSY = ADC0CN ^ 4; /* ADC 0 BUSY FLAG */
sbit ADCSTM1 = ADC0CN ^ 3; /* ADC 0 START OF CONVERSION MODE BIT 1 */
sbit ADCSTM0 = ADC0CN ^ 2; /* ADC 0 START OF CONVERSION MODE BIT 0 */
sbit ADCWINT = ADC0CN ^ 1; /* ADC 0 WINDOW COMPARE INTERRUPT FLAG */
sbit ADCLJST = ADC0CN ^ 0; /* ADC 0 RIGHT JUSTIFY DATA BIT */
///* DAC0CN */
//sbit DAC0EN = DAC0CN ^ 7; /* */
ORG 0000h
AJMP MAIN
// ORG 0023h
// AJMP INT_SERIAL
ORG 007BH
AJMP INT_ADC0
ORG 0100H
MAIN:
ACALL CLK_INIT
ACALL IE_INIT
ACALL AMUX_INIT
ACALL T1_INIT
ACALL SERIAL_INIT
ACALL ADC_INIT
//端口设置寄存器设置,确定串口的输出和输入
ACALL DAC_INIT
ACALL PORT_INIT
ACALL REF_INIT
AJMP RUN_HER
CLK_INIT: MOV OSCICN,#97H
MOV OSCXCN,#00H //内部的振荡器,选用16M,禁止外部的振荡器
RET
IE_INIT: MOV IE,#00H //关中断
RET
//使能IE,但是要屏蔽相应的中断,等到相应的程序中触发
//通道的选择
AMUX_INIT: MOV AMX0CF,#00H //配置AMUX模式寄存器,控制单端输入或是差分输入。
MOV AMX0SL,#01H //选择通道AIN0.1
RET //配置通道选择寄存器,选择第一通道,为水平传感器
//配置串口,工作在波特率可变的工作方式1,首先配置定时器1,使其工作于自动重装的模式2,
//然后配置串口控制寄存器
T1_INIT:
MOV TCON,#00H
MOV TMOD,#20H
MOV CKCON,#10H
MOV TL1,#0FBH //达到115200波特率
MOV TH1,#0FBH
RET
SERIAL_INIT:
MOV SCON,#40H
RET //配置串口控制寄存器
//配置ADC,开始AD转换
ADC_INIT:
MOV ADC0CF,#20H //配置转换时钟,1个系统周期,内部增益1。
MOV ADC0CN,#00H //配置控制寄存器
RET
DAC_INIT: MOV DAC0CN,#80H
RET
PORT_INIT: MOV XBR2,#40H //使能交叉开关
MOV XBR0,#04H //
MOV PRT0CF,#0FFH
RET
REF_INIT: MOV REF0CN,#03H
RET
//开始正式运行ADC转换和串口通信
//MOV R0,#02h //计算转换的次数
//BEGIN: MOV DPTR,#0000H
RUN_HER: SETB ADCEN //使能ADC0
SETB ADCBUSY //启动AD转换
MOV EIE2,#02H
SETB EA
mov A,#30H //使能ADC0中断
LOOP1: nop
nop
DJNZ ACC,LOOP1
CLR ADCEN //使ADC进入休眠状态
// AJMP RAM_INPUT
//RAM_INPUT:
// MOV A,ADC0L
// MOVX @DPTR,A
// INC DPTR
// MOV A,ADC0H
// MOVX @DPTR,A
// INC DPTR
// MOV R1,#020H
//LOOP: MOV R2,#02H
//LOOP_SERIAL: NOP
// NOP
// DJNZ R2,LOOP_SERIAL
// DJNZ R1,LOOP
//
// AJMP RUN_HER
DAC_EX: MOV DAC0L,ADC0L
MOV DAC0H,ADC0H
MOV A,#01H
LOOP: NOP
DJNZ ACC,LOOP
AJMP RUN_HER
//SERIAL_OUT:
// SETB TR1 //使能定时器
// SETB ES
// SETB EA
// MOV A,ADC0L
// MOV SBUF,A //需要等到发送完成以后才能够再次写入SBUF
//WAIT_SERIAL: MOV A,#0ffH
//LOOP_SERIAL: NOP
// NOP
// DJNZ ACC,LOOP_SERIAL
// SETB TR1
// SETB ES
// SETB EA
// MOV A,ADC0H
// MOV SBUF,A //需要等到发送完成以后才能够再次写入SBUF
//WAIT2_SERIAL: MOV A,#0ffH
//LOOP2_SERIAL: NOP
// NOP
// DJNZ ACC,LOOP2_SERIAL
// AJMP RUN_HER
//串口发送中断程序
//INT_SERIAL:
// PUSH PSW
// PUSH ACC
// CLR TR1
// CLR TI
// CLR ES //清除串口的发送中断
// CLR EA //中断定时器1的运行
// POP ACC
// POP PSW
// reti
INT_ADC0:
PUSH PSW
PUSH ACC
CLR EA
MOV EIE2,#00H
CLR ADCINT
POP ACC
POP PSW
reti
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -