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

📄 bjdj.asm

📁 单片机控制步进电机源程序例子文件,需要的可以
💻 ASM
字号:
;**************************************************
;    平凡单片机工作室
;  http://www.mcustudio.com
;    Copyright 2003 pingfan's McuStudio
;    All rights Reserved
;作者:周坚   
;测速实验
;**************************************************

StartEnd bit  01H ;起动及停止标志
MinSpd	 EQU	25  ;起始转动速度
MaxSpd   EQU	100 ;最高转动速度
Speed	 DATA	23H ;流动速度计数
DjCount	 DATA	24H ;控制电机输出的一个值,初始为1110 1111
Hidden	EQU		10H	;消隐码
Counter	DATA	57H	;显示计数器
DISPBUF DATA	58H	;显示缓冲区

   	ORG     0000H
   	AJMP    MAIN
	ORG		000BH
	JMP		DISP
	ORG		001BH
	JMP		DJZD

    ORG     30H
MAIN:   
    MOV     SP,#5FH
    MOV     P1,#0FFH
	MOV		A,#Hidden
	MOV		DispBuf,A
	MOV		DispBuf+1,A
	MOV		DispBuf+2,A

	MOV		DjCount,#11110111B	
    MOV     SPEED,#MinSpd   ;起始转动速度送入计数器
    CLR     StartEnd        ;启动时处于停止状态
	MOV		TMOD,#00010001B	;
	MOV		TH0,#HIGH(65536-3000)
	MOV		TL0,#LOW(65536-3000)
	MOV		TH1,#0FFH;
	MOV		TL1,#0FFH
	SETB	TR0
	SETB	EA
	SETB	ET0
	SETB	ET1

LOOP: ACALL   KEY     ;键盘程序
    JNB     F0,m_NEXT1    	;无键按下继续
    ACALL   KEYPROC 		;否则调用键盘处理程序
m_NEXT1:
	MOV		A,Speed
	MOV		B,#10
	DIV		AB
	MOV		DispBuf+5,B	;最低位
	MOV		B,#10
	DIV		AB
	MOV		DispBuf+4,B
	MOV		DispBuf+3,A
	JB		StartEnd,m_Next2
	CLR		TR1		;关闭电机
	JMP		LOOP
	ORL		P1,#11110000B
m_Next2:
	SETB	TR1			;启动电机
    AJMP    LOOP 		;反复循环,主程序到此结束
;---------------------------------------
D10ms:  
    PUSH    PSW
    SETB    RS0
    MOV     R7,#10
D1: MOV     R6,#100
    DJNZ    R6,$
    DJNZ    R7,D1
    POP     PSW
    RET
;---------延时程序,键盘处理中调用
KEYPROC:
    MOV     A,B         ;从B寄存器中获取键值
    JB      ACC.2,StartStop  ;分析键的代码,某位被按下,则该位为1
    JB      ACC.3,KeySty
    JB      ACC.4,UpSpd
    JB      ACC.5,DowSpd
    AJMP    KEY_RET
StartStop:
    SETB	StartEnd    ;启动
    AJMP    KEY_RET
KeySty:  
	CLR		StartEnd;	;停止
    AJMP    KEY_RET
UpSpd:
    INC	    SPEED;
    MOV     A,SPEED
    CJNE    A,#MaxSpd,K1	;是否到了最多的次数
    DEC     SPEED	;否则减去1,保证下次仍为该值	
K1:
    AJMP    KEY_RET
DowSpd:
    DEC	    SPEED
    MOV     A,SPEED
    CJNE    A,#MAXSPD,KEY_RET ;不等(未到最大值),返回
	MOV		SPEED,#MinSpd;		
KEY_RET:
    RET

KEY:    
    CLR     F0          ;清F0,表示无键按下。
    ORL     P3,#00111100B   ;将P3口的接有键的四位置1
    MOV     A,P3        ;取P3的值
    ORL     A,#11000011B ;将其余4位置1
    CPL     A           ;取反
    JZ      K_RET       ;如果为0则一定无键按下
    CALL    D10ms       ;否则延时去键抖
    ORL     P3,#00111100B
    MOV     A,P3
    ORL     A,#11000011B
    CPL     A
    JZ      K_RET
    MOV     B,A         ;确实有键按下,将键值存入B中
    SETB    F0          ;设置有键按下的标志
K_RET:
    ORL     P3,#00111100B   ;此处循环等待键的释放
    MOV     A,P3
    ORL     A,#11000011B
    CPL     A
    JZ      K_RET1      ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回
    AJMP    K_RET
K_RET1: 
    RET

DjZd:	;定时器T1用于电机转速控制
	PUSH	ACC
	PUSH	PSW
	MOV		A,Speed
	SUBB	A,#MinSpd	;减基准数
	MOV		DPTR,#DjH
	MOVC	A,@A+DPTR
	MOV		TH1,A
	MOV		A,Speed
	SUBB	A,#MinSpd
	MOV		DPTR,#DjL
	MOVC	A,@A+DPTR
	MOV		TL1,A	
	MOV		A,DjCount
	CPL		A
	ORL		P1,A
	MOV		A,DjCount
	JNB		ACC.7,d_Next1
	JMP		d_Next2
d_Next1:
	MOV		DjCount,#11110111B
d_Next2:
	MOV		A,DjCount
	RL		A
	MOV		DjCount,A	;回存
	ANL		P1,A
	POP		PSW
	POP		ACC
	RETI

DjH:	DB	76,82,89,95,100,106,110,115,119,123,127,131,134,137,140,143,146,148,151
		DB	153,155,158,160,162,165,166,167,169,171,172,174,175,177,178,179,181,182
		DB	183,184,185,186,187,188,189,190,191,192,193,194,195,196,196,197,198,199
		DB  199,200,201,201,202,203,203,204,204,205,206,206,207,207,208,208,209,209
		DB	210,210,211

DjL:	DB	0,236,86,73,212,0,214,96,163,165,110,0,97,148,158,128,62,219,89,186,0
		DB	44,65,64,42,0,196,119,24,171,47,165,13,106,187,0,59,108,147,176,197,210,214
		DB	211,200,183,158,128,91,48,0,202,143,78,10,192,114,31,201,110,15,173,70,221
		DB	112,0,141,22,157,33,162,32,155,21,140,0

DISP:
;定时器T0做显示用
	PUSH	ACC		;ACC入栈
	PUSH	PSW		;PSW入栈
	MOV		TH0,#HIGH(65536-3000);定时时间为3000个周期
	MOV		TL0,#LOW(65536-3000)
	MOV		A,#DISPBUF	;显示缓冲区首地址
	ADD		A,Counter 
	MOV		R0,A
	MOV		A,@R0		;根据计数器的值取相应的显示缓冲区的值
	MOV		DPTR,#DISPTAB	;字形表首地址
	MOVC	A,@A+DPTR	;取字形码
	MOV		P0,A		;将字形码送P0位(段口)
	MOV		A,Counter	;取计数器的值
	MOV		R0,A
	MOV		DPTR,#BitTab
	MOVC	A,@A+DPTR		;取位
	ORL		P2,#11111100B
	ANL		P2,A
	INC		Counter		;计数器加1
	MOV		A,Counter
	CJNE	A,#6,DISPEXIT	
	MOV		Counter,#0	;如果计数器计到6,则让它回0
DISPEXIT:	
	POP		PSW
	POP		ACC
	RETI
BitTab:	DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -