;======================
; 设置波特率
;======================
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP ADZD
MAIN:
MOV TMOD,#20H ;令定时器1工作于模式2
MOV TH1,#0FDH
MOV TL1,#0FDH ;设定计数值,令波特率为9600
SETB TR1 ;启动定时器1
SETB IT0 ;为边沿触发方式
SETB EA ;开中断
SETB EX0 ;允许中断
;======================
; 接收数据
;======================
MOV SCON,#70H ;设定串行端口为模式1
LOOP: CLR RI ;清除接收中断标志位(开始接收数据)
JNB RI,$ ;等待数据接收完毕
;======================
; 判断哪个按钮被按下
;======================
MOV A,SBUF ;接收到的数据(即代码)存入A内
NEXT1: CJNE A,#'1',NEXT0 ;若代码为1(即“开始”按钮被按下)
AJMP ADZH ;则调用AD转换模块
NEXT0: CJNE A,#'0',DONT ;若代码为0(即“复位”按钮被按下)
AJMP ALLOFF ;则跳去执行ALLOFF
DONT: AJMP LOOP ;重复执行程序
;====================================================
; 执行相应的程序
;====================================================
;AD转换模块
ADZH:
MOV R0,#30H ;存数据首地址
SETB P3.7 ;经与非门后使R/C=0
CLR P3.6 ;经与非门后使CE=1
MOV DPTR,#3FFFH ;使AO=0,CS=0,启动12位转换
MOVX @DPTR,A ;启动AD转换
HERE: AJMP HERE ;等待中断
ADZD:
PUSH PSW
PUSH DPH
PUSH DPL
PUSH ACC ;保护现场
CLR P3.7 ;经与非门后使R/C=1
MOV DPTR,#3FFFH ;允许高8位并行输出(CS=0,R/C=1,AO=0)
MOVX A,@DPTR ;读高8位
MOV @R0,A ;高8位存入RAM单元
MOV DPTR,#7FFFH ;允许低4位加上4个0输出(CS=0,R/C=1,AO=1)
MOVX A,@DPTR ;读低4位
ANL A,#0FH ;屏蔽高4位随机数据
INC R0 ;数据地址加1
MOV @R0,A ;存低4位
POP ACC ;恢复现场
POP DPL
POP DPH
POP PSW
RETI
AJMP SENDON
;复位按钮的相应程序
ALLOFF: MOV P0,#00H ;数据清零
AJMP SENDALL ;发送代码1
;====================================================
; 发送数据
;====================================================
;发送代码0
SENDALL:
CLR TI ;清除发送中断标志位(准备发送数据)
MOV SBUF,#'0' ;发送代码2
JNB TI,$ ;等待数据发送完毕
AJMP LOOP ;重复执行程序
;发送代码1
SENDON:
CLR TI
MOV SBUF,#'1'
JNB TI,$
AJMP LOOP
END |