📄 主程序软件.txt
字号:
;单片机控制下的基于DMA的高速数据采集系统
DMA EQU 0A000H
MEM EQU 0C000H
TIMER0 EQU 6000H
FLA BIT 20H.0
FLG BIT 20H.1 ;为低电平时DMA传送过程中,1时传送结束。
45G BIT P1.7
DIR BIT P1.6
HLDA BIT P1.5
HRQ BIT P1.4
BYTE1 DATA 30H ;转换次数缓冲区30H,31H
KEY DATA 32H ;键码存放单元
BUF1 DATA 33H ;33h34h35h36h分别为千百十个位缓冲区
BUF2 DATA 34H
BUF3 DATA 35H
BUF4 DATA 36H
ORG 0000H
LJMP MAIN
ORG 0013H
LCALL INT1
LJMP JUST
ORG 30H
MAIN:
MOV SP,#67H ;堆栈
MOV R0,#20H ;清除内存
CLR A
CLRS:
MOV @R0,A
INC R0
CJNE R0,#80H,CLRS
SETB EA
SETB EX1
CLR ET1
MOV P1,#00H ;将P1口输出低电平
SETB DIR ;A-B
JUST: ;判键
CALL KEYI
MOV KEY,A ;保存键码
JUST0:
CJNE A,#0,JUST1 ;0键?
CALL MOVBIT ;移位
CALL SHOW ;显示
JUMP JUST
JUST1:
CJNE A,#1,JUST2 ;1键?
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST2: ;2键?
CJNE A,#2,JUST3
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST3: ;3键?
CJNE A,#3,JUST4
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST4: ;4键?
CJNE A,#4,JUST5
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST5 ;5键?
CJNE A,#5,JUST6
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST6: ;6键?
CJNE A,#6,JUST7
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST7: ;7键?
CJNE A,#7,JUST8
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST8: ;8键?
CJNE A,#8,JUST9
CALL MOVBIT
CALL SHOW
JUMP JUST
JUST9: ;9键?
CJNE A,#9,JUSTA
CALL MOVBIT
CALL SHOW
JUMP JUST
JUSTA: ;A键?
CJNE A,#0AH,JUSTB ;是A键,空操作
JUMP JUST
JUSTB: ;B键?
CJNE A,#0BH,JUSTC ;是B键,结束主程序
JUMP STOP
JUSTC: ;C键
CJNE A,#0CH,JUSTD
MOV BUF1,#0 ;是C键,将缓冲区清0,准备接受键盘输入的数据
MOV BUF2,#0
MOV BUF3,#0
MOV BUF4,#0
CALL SHOW ;显示0
JUMP JUST
JUSTD: ;D键
CJNE A,#0DH,JUSTE
CALL TOHEX ;是D键,表示数据输入完毕,将其转换成16进制存放到缓冲区
;并且将数据写入到DMA基字节
;DMA初始化
MOV A,#4
MOV DPTR,#DMA+8
MOVX @DPTR,A ;命令字禁止8237A-5工作
MOV DPTR,#DMA+11 ;DMA方式设置
MOV A,#10100101B ;连续方式,地址加1,非自动预置,写,通道1
MOVX @DPTR,A
MOV DPTR,#DMA+8
MOV A,#0 ;写命令寄存器
MOVX @DPTR,A ;禁止mem到mem,正常时序,滞后写,固定优先级,允
;许8237工作,DREQ高有效,DACK低有效
MOV DPTR,#DMA+12
MOVX @DPTR,A ;写入先后触发器使其清0
MOV DPTR,#DMA+2 ;写基地址
MOV A,00H
MOVX @DPTR,A
MOV A,40H
MOVX @DPTR,A
MOV DPTR,#DMA+12
MOVX @DPTR,A ;写入先后触发器使其清0
MOV DPTR,#DMA+3 ;写基字节
MOV A,BYTE1+1
DEC A
MOVX @DPTR,A
MOV A,BYTE1
MOVX @DPTR,A
MOV A,#00001101B
MOV DPTR,#DMA+15
MOVX @DPTR,A ;写四个通道屏蔽寄存器,打开通道1
;8237初始化完毕
JUMP JUST
JUSTE:
CJNE A,#0EH,JUSTF
CALL CAIJI
JUMP JUST
JUSTF:
CJNE A,#0FH,JUSTG
CLR P1.4
CLR DIR
CLR 45G
CALL CUN ;调通信程序,设置波特率等
JUMP JUST 待定
JUSTG:
JUMP JUST
CAIJI:
MOV DPTR,#TIMER0+3
MOV A,00110100B ;8253计数器0,方式2,2进制
MOVX @DPTR,A
MOV DPTR,#TIMER0 ;送计数初值
MOV A,#18H
MOVX @DPTR,A
MOV A,#01H
MOVX @DPTR,A
CLR HRQ
CLR HLDA
AA:
JNB HRQ,AA ;HRQ为0?
SETB HLDA ;产生一个低电平应答DMA的请求
SETB 45G ;断开总线
RET
CUN:
MOV SCON,#50H ;串口方式1工作,8位数据位,1位停止位无奇偶校验
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV TMOD,#20H ;波特率设置,fOSC=12MHz,波特率=2* 2400, ;N=0F3H
MOV TH1,#0F3H
MOV TL1,#0F3H
RS232:
MOV DPTR,#0C000H;内存首址
MOV A, DPL ;BYTE1+1、BYTE1用来判断数据传输完成否
ADD A,BYTE1+1
MOV BYTE1+1,A ;先加低字节
MOV A,DPH
ADDC A,BYTE1
MOV BYTE1,A ;后加高字节
LOOP:
MOVX A,@DPTR ;取数据→A
MOV SBUF,A ;数据→SBUF
WAIT:
JBC TI,CONT ;判断发送中断标志,是1则转到CONT,并清TI
SJMP WAIT
CONT:
INC DPTR ;存储区加1
MOV A,DPH ;判断是否传输完
CJNE A,BYTE1,LOOP
MOV A,DPL
CJNE A,BYTE1+1,LOOP
RET
MOVBIT: ;数据移位
MOV BUF1,BUF2
MOV BUF2,BUF3
MOV BUF3,BUF4
MOV BUF4,A
RET
TOHEX: ;将输入的数据转换成16进制并存放到缓冲区
push A
PUSH R1
PUSH R2
PUSH R3
MOV A,BUF1 ;千位乘十
MOV B,#10
MUL AB
ADD A,BUF2 ;加上百位
MOV B,#10 ;乘以十
MUL AB
ADD A,BUF3 ;加上十位
MOV R3,A
MOV A,B
ADDC A,#0 ;加上进位位
MOV R2,A ;再乘以十即(R2)(R3)*10
MOV A,R3 ;R3*10
MOV B,#10
MUL AB
MOV R3,A
MOV R1,B ; R1R3=R1*10
MOV A,R2 ;R2*10
MOV B,#10
MUL AB ;BA=R2*10
ADD A,R1 ;由于数据<=9999故B中一定为0
MOV BYTE1,A ;转换结果存到缓冲区
MOV BYTE1+1,R3
POP R3
POP R2
POP R1
POP A
RET
INT1:
CLR P1.7 ;开总线
CLR P1.6 ;数据总线方向由6264到8051
SETB FLG
reti
keyI:
MOV P2,#0FH
MOV A,P2
ANL A,#0FH
MOV B,A
MOV P2,#0F0H
MOV A,P2
ANL A,#0F0H
ORL A,B
CJNE A,#0FFH,KEYI1
RET
KEYI1:
MOV B,A
MOV DPTR,#KEYCD
MOV R3,#0FFH
KEYI2:
INC R3
MOV A,R3
MOVC A,A+@DPTR
CJNE A,B,KEYI3
MOV A,R3
RET
KEYI3:
CJNE A,#0FFH,KEYI2
MOV A,#0FFH
RET
KEYCD:
DB 0E7H,0EBH,0EDH,0EEH
DB 0D7H,0DBH,0DDH,0DEH
DB 0B7H,0BBH,0BDH,0BEH
DB 77H,7BH,7DH,07EH
DB 0FFH
SHOW:
MOV A,BUF1
CJNE A,#0,SHOW1 ; 千位为0?
MOV BUF1,#0AH ;千位为0,熄灭
MOV A,BUF2
CJNE A,#0,SHOW1
MOV BUF2,#0AH
MOV A,BUF3
CJNE A,#0,SHOW1
MOV BUF3,#0AH
SHOW1:
MOV A,BUF4 ;取个位数据
LCALL OUT0 ;输出个位数据的笔型码
MOV A,BUF3 ;取十位数据
LCALL OUT0 ;输出十位数据的笔型码
MOV A,BUF2 ;取百位数据
LCALL OUT0 ;输出百位数据的笔型码
MOV A,BUF1 ;取千位数据
OUT0:
MOV B,#8 ;准备移位8位
OUT1:
RRC A ;移出一位(低位)
MOV P1.0,C ;置于数据端口上
DB 0,0,0 ;空操作,延时
CLR P1.1 ;发出移位脉冲
DB 0,0,0 ;空操作,延时
SETB P1.1 ;复位移位脉冲
DJNZ B,OUT1 ;移完8位?
SETB P1.0 ;恢复空闲状态
BXL:
DB 09H,0EBH,98H,8AH ;笔型码表
DB 6AH,0EH,0CH,0CBH
DB 08H,0AH,00H,00H
RET
STOP:
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -