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

📄 主程序软件.txt

📁 单片机控制下的基于DMA的高速数据采集系统
💻 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 + -