ORG 0000H
AJMP START
ORG 0040H
D0832 EQU 8000H
C8279 EQU 8701H
D8279 EQU 8700H
START:
MOV SP,#60H
MOV DPTR,#D0832
MOV A,#00H
MOVX @DPTR,A ;关直流电机
MOV DPTR,#C8279 ;初始化8279
MOV A,#00H
MOVX @DPTR,A
MOV A,#90H
MOVX @DPTR,A
MOV A,#34H
MOVX @DPTR,A
MOV A,#0D2H
MOVX @DPTR,A
WAIT0:
MOV TMOD,#51H ;T1计数,T0定时
MOV TH0,#3CH
MOV TL0,#0B0H
MOV TH1,#00H
MOV TL1,#00H
MOV R2,#04H ;中断次数
MOV R3,#00H ;测速值
MOV R5,#50H ;送入0832的值(启动电机初值)
MOV 30H,#00H ;存放输入的建值
MOV 33H,#00H
MAIN: LCALL RDKEY ;读按键
MOV A,R0
SWAP A
MOV 30H,A
LCALL RDKEY
MOV A,30H
ADD A,R0 ;??????????????????????????????????????????????????????????
MOV 30H,A
LCALL BCD_10
MOV 31H,A ;转换后的值放31H单元中
AAAA: MOV DPTR,#C8279 ;是否有下压键
MOVX A,@DPTR
PUSH DPH
PUSH DPL
PUSH ACC
LCALL DISPLAY ;显示键值
MOV DPTR,#D0832 ;驱动直流电机
MOV A,R5
MOVX @DPTR,A
ACALL DLY
ACALL DLY ; 调延时子程序,给电机留出反应的时间
LCALL SPEED
MOV A,32H ;R3
SUBB A,31H ;将电机的转速值与真实值相比较,若不等调整0832的输出电压值
JC CCC
DEC R5
AJMP L0
CCC:
INC R5
L0:
POP ACC
POP DPL
POP DPH
ANL A,#0FH
JZ BBBB
LJMP START
; 31H:输入的键值经BCD转换后 ;和十进制数比较
; 32H:电机实际转速值
BBBB:
LJMP AAAA
RDKEY: MOV DPTR,#C8279 ;是否有下压键
MOVX A,@DPTR
ANL A,#0FH
JZ RDKEY
MOV A,#40H ;读FIFO的RAM键码
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR
CHK: CJNE A,#0FH,NEXT ;是“F”键退出
JMP QUIT
NEXT:
SUBB A,#09H ;判是否在0~9范围内
JNC RDKEY
ADDC A,#09H
MOV R0,A
MOV DPTR,#C8279
MOV A,#0C2H ;清空FIFO RAM,同时传感器RAM的读出地址也被置零
MOVX @DPTR,A
RET
DISPLAY:
MOV A,30H
ANL A,#0FH
MOV DPTR,#LED
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
MOV A,30H
SWAP A
ANL A,#0FH
MOV DPTR,#LED
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
MOV A,R3
ANL A,#0FH
MOV DPTR,#LED
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
MOV A,R3
SWAP A
ANL A,#0FH
MOV DPTR,#LED
MOVC A,@A+DPTR
MOV DPTR,#D8279
MOVX @DPTR,A
MOV A,#00H
MOV DPTR,#D8279
MOVX @DPTR,A
MOV A,#00H
MOV DPTR,#D8279
MOVX @DPTR,A
RET
SPEED:
PUSH ACC ;保护现场
PUSH PSW
PUSH DPL
PUSH DPH
SETB TR0
SETB TR1
NIXT: CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
WAIT2: JBC TF0,LOOP ;查询T0是否溢出
AJMP WAIT2
LOOP: DJNZ R2,NIXT
CLR TR0
CLR TR1
MOV A,TL1 ;更新数值
MOV B,#05
MUL AB
MOV B,#12
DIV AB
MOV 32H,A ;实际电机转速值
ADD A,#00H
DA A
MOV R3,A ;将电机转速值变换,供给数码管显示。既R3测得的速度显示值
MOV R2,#04H
MOV TH1,#00H
MOV TL1,#00H
POP DPH
POP DPL
POP PSW
POP ACC
RET
BCD_10:
MOV 40H,A
ANL A,#0FH
MOV 41H,A ;高位×10, 加低位
MOV A,40H
SWAP A ;累加器内高,低字节
ANL A,#0FH
MOV B,#10
MUL AB
ADD A,41H ;????????????????????????????????????是否需要 DA 调整指令
RET
DLY:
MOV R6,#0FFH
LOOP5:
MOV R1,#0FFH
DJNZ R1,$
DJNZ R6,LOOP5
RET
QUIT: MOV DPTR,#D0832 ;计数时间取方便计算转/秒 (N:T1记的数 值)
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#C8279
MOV A,#0D2H
MOVX @DPTR,A
SJMP $
LED DB 3FH,06H,5BH,4FH,66H ;0~9显示值
DB 6DH,7DH,07H,7FH,6FH
END