;步进电机控制试验
;试验准备:用连接线分别将CN4的P12,P13,P14,P15端子与CN1的LED1
;LED2,LED3,LED4相连.
;运行此程序,观察步进电机的转速和旋转方向,LED的变化情况.
$INCLUDE (C8051F020.INC)
CPTIME EQU 4
X DATA 07FH ;循环控制变量X,I,J和
;延时参数DELAYTT
I DATE 07EH
J DATA 07DH
DELAYTT DATA 07CH
COUNT1MS DATE 07BH
ORG 0000H
STRT:
AJMP MAIN
ORG 000BH
TIMER0_ISR: ;定时器0中断服务程序
PUSH ACC ;寄存器A入栈
MOV TH0,#0DCH ;定时器重新装入初值
MOV TL0,#66H
MOV A,COUNT1MS ;如果COUNT1MS不是0则减一
JZ RETURN1
DEC COUNT1MS
RETURN1:
POP ACC ;寄存器A出栈
RETI
MAIN: ;主程序
MOV WDTCN,#0DEH ;关看门狗
MOV WDTCN,#0ADH
LCALL SYSCLK_INIT ;初始化时钟
LCALL TIMER0_INIT ;初始化定时器
LCALL PORT_INIT ;初始化端口
LCALL SPI0_INIT ;初始化SPI0
ORL CPT1CN,#80H ;使能比较器1
MOV REF0CN,#03H ;使能片内参考电压
ORL DAC0CN,#80H ;使能DAC0
M0V DAC0H,#00H
MOV DAC0L,#00H
SETB EA ;开中断
LCALL TESTSTEPM
RET
DELAYXMS: ;延时(COUNT1MS)ms,输入参数在
;变量COUNT1MS,无返回值
MOV A,COUNT1MS
JNZ DELAYXMS
RET
DELAY1S: ;延时(DELAYTT)秒
MOV COUNT1MS,#200
LCALL DELAYXMS
MOV COUNT1MS,#200
LCALL DELAYXMS
MOV COUNT1MS,#200
LCALL DELAYXMS
MOV COUNT1MS,#200
LCALL DELAYXMS
MOV COUNT1MS,#200
LCALL DELAYXMS
DJNZ DELAYTT,DELAY1S
RET
SYSCLK_INIT: ;时钟初始化子程序,
;没有输入参数和返回值
M0V OSCXCN,#67H ;选择外部晶体振荡器方式11.0592MHz
CLR A
DJNZ ACC,$
DJNZ ACC,$
WAIT_OSC_SETTLE1: ;查询XTLVLD '0'->'1'?
MOV A,OSCXCN
JNB ACC.7,WAIT_OSC_SETTLE1
MOV OSCICN,#88H ;换到外部振荡器,允许时钟丢失检测
RET
PORT_INIT: ;端口初始化子程序,
;没有输入参数和返回值
MOV XBR0,#07H ;允许SMBus,SPIO和UART0
MOV XBR1,#00H
MOV XBR2,#44H ;允许交叉开关和端口I/O弱上拉
MOV EMI0CF,#27H ;EMIF在P4-P7,EMIF工作在
;数据/地址复用方式,
;不带块选择的分片方式
;ALE高和ALE低脉冲宽度是4个SYSCLK
MOV EMI0TC,#21H ;外部存储器时序控制
MOV P74OUT,#0FFH ;端口P7-P4为推挽方式
MOV P0MDOUT,#15H ;端口0输出方式设置
ORL P1MDOUT,#3CH ;端口1输出方式设置,
;P1.2-P1.5为推挽输出
ANL P1,#0C3H ;P1.2-P1.5置零
RET
SPI0_INIT: ;串行外设接口总线初始化子程序,
;没有输入参数和返回值
MOV SPI0CFG,#07H ;在SCK第一个上升沿采样,8位数据字
ORL SPI0CFG,#0C0H ;时钟极性:空闲状态是高电平
MOV SPI0CN,#03H ;主模式,SPI使能,清除标志位
MOV SPI0CKR,#5 ;SPI时钟 RET
TIMER0_INIT: ;定时器0初始化子程序,
;没有输入参数和返回值
ORL CKCON,#08H
ORL TMOD,#01H ;16位定时器
MOV COUNT1MS,#10
CLR TR0 ;停止定时器
MOV TH0,#0DCH ;1MS定时
MOV TL0,#66H
SETB TR0 ;启动定时器
ORL IE,#02H
RET
TESTSTEPM: ;子程序TESTSTEPM
;没有输入参数和返回值
MOV X,#0
LOOPX:
SETB P2.7
MOV I,#0
LOOPI:
MOV J,#0
LOOPJ:
MOV DPTR,#FTAB
MOV A,J
MOVC A,@A+DPTR
MOV P1,A
MOV A,I
MOV B,#10
DIV AB
MOV R0,A
M0V A,#20
SUBB A,R0
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJ
INC I
MOV A,I
CJNE A,#100,LOOPI
MOV I,#0
LOOPI2:
MOV J,#0
LOOPJ2:
MOV DPTR,#FTAB
MOV A,J
MOVC A,#A+DPTR
MOV P1,A
MOV A,#10
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJ2
INC I
MOV A,I
CJNE A,#100,LOOPI2
MOV I,#0
LOOPI3:
MOV J,#0
LOOPJ3:
MOV DPTR,#FTAB
MOV A,J
MOVC A,@A+DPTR
MOV P1,A
MOV A,I
MOV B,#10
DIV AB
MOV R0,A
MOV A,#10
ADD A,R0
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJ3
INC I
MOV A,I
CJNE A,#100,LOOPI3
CLR P2.7
MOV I,#0
LOOPII:
MOV J,#0
LOOPJJ:
MOV DPTR,#CTAB
MOV A,J
MOVC A,@A+DPTR
MOV P1,A
MOV A,I
MOV B,#10
DIV AB
MOV R0,A
MOV A,#20
SUBB A,R0
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJJ
INC I
MOV A,I
CJNE A,#100,LOOPII
MOV I,#0
LOOPII2:
MOV J,#0
LOOPJJ2:
MOV DPTR,#CTAB
MOV A,J
MOVC A,@A+DPTR
MOV P1,A
MOV A,#10
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJJ2
INC I
MOV A,I
CJNE A,#100,LOOPII2
MOV I,#0
LOOPII3:
MOV J,#0
LOOPJJ3:
MOV DPTR,#CTAB
MOV A,J
MOVC A,@A+DPTR
MOV P1,A
MOV A,I
MOV B,#10
DIV AB
MOV R0,A
MOV A,#10
ADD A,R0
MOV B,#CPTIME
MUL AB
MOV COUNT1MS,A
LCALL DELAYXMS
INC J
MOV A,J
CJNE A,#4,LOOPJJ3
INC I
MOV A,I
CJNE A,#100,LOOPII3
INC X
MOV A,X
CJNE A,#5,LOOPXX
SETB P2.7
SJMP RETURN0
LOOPXX:
LJMP LOOPX
RETURN0:
RET
FTAB:
DB 0C7H,0CBH,0D3H,0E3H ;正方向A-B-C-D-A-...
CTAB:
DB 0C7H,0E3H,0D3H,0CBH ;反方向A-D-C-B-A-...
END