完整的毕业设计下载:
按键设定步进马达正逆转,转数及转速.doc
(791.5 KB, 下载次数: 11)
今天无意中看到了我6年前的毕业设计,就像一个成年人在翻看童年时的照片,别有一番乐趣。那是2006年的最后一个学期,我在深圳的实习期间完成的。当时还没接触过仿真器,烧录器,也不知道有keil这个平台软件,更加不知道有汇编的编译器,我们在学校做实验,都是自己在编写汇编程序之后,通过自己对照汇编与机器码的指令表,先人工把汇编程序翻译成16进制的机器码。再把机器码一个个敲进设备里。出于对电子的疯狂热爱,我把第一个月的实习工资都拿去买了仿真器,烧录器,还有一些基本的工具与电子元器件,当时还没钱买电脑,有一个热心的同事就借了一台电脑给我,有了这些工具之后,我每天下班都在租房里练。我的毕业设计,现在看起来很简单,就是做一圈跑马灯,用按键来设定正转与反转,可以设定圈数与调速度,我当时错误的以为这样是在模拟步进电机,所以起的标题《按键设定步进马达正逆转,转数及转速》有点不恰当。现在贴出来跟大家分享,有兴趣的朋友可以下载看看。
以下是内容预览:
按键设定步进马达正逆转,转数及转速 指导老师: 管利锐 作者: 33103109 吴坚鸿 Keyword: Expand8255Chip External Interrupt Button Display Summary: Step-Motor is more and more important in industry today, especially in the field of computer outside equipment. The function of this design is how to use Chip89C51 to control the Step-Motor. It includes the knowledge of Expand8255Chip , External Interrupt INT0,INT1. Via this activity ,I practice the ability of doing by myself and comprehend more knowledge than before .
关键字: 扩展芯片8255 外部中断 按键 显示 摘要 步进马达在当今信息工业社会中所扮演的角色日趋重要,尤以计算机外围的一些装置更是不可缺少。本毕业设计利用89C51来实现对模拟步进马达的控制。其中涉及到扩展芯片8255,外部中断INT0,INT1的知识.在整个焊板,仿真,烧录过程中,锻炼了我们的动手能力,并且加深了对单片机的知识的理解。 第一章 基本原理 用24个发光二极管围成一个圆圈,每个发光二极管依次点亮,在外观上模拟步进马达的转动。在89C51外围扩展两片8255,一片用于驱动24个发光二极管,一片用于驱动红色数码显示管,用来显示马达的圈数。用一个指示灯表示马达的正逆转,亮则正转,灭则逆转。此外,本设计还充分地利用到89C51单片机的两个外部中断INT0,INT1,分别接到两个按键,用来设定转速,并在绿色的数码管显示转速档。与其它的设置不同的是,由于设置转速档是用到两个外部中断,所以,无论马达是停止还是运行都可以随时改变其速度。 第二章 实物制作过程(图片) 一.焊板二. 仿真 三.烧录 四.作品 第三章 功能说明 (一) 正逆转。矩形指示灯亮表示正转,灭表示逆转。指示灯下面对应的是按键K1,按一下指示灯灭,再按一下亮,依次循环,用来设置正逆转。 (二)调转速。绿色数码显示管能显示1(小)-----9(大)档的转速,下面是对应的两个按键K2,K3。K2用来加速,按一下加一档,并在绿色数码显示管上显示,当加速到第9档时,再按则又从第1档开始。K3用来减速,当减到第1档时,再按则又从第9挡开始。由于本功能是利用两个中断,所以无论马达是正在运行还是停止都可以调转速。 (三)设置转数。两个红色数码显示管可以显示00—99,表示设置的转数,步进马达每转一圈,其显示数值就会减1,一直到00为止马达才停止运行。下面对应的是两个按键K4,K5。 K4用来设置十位数,K5用来设置个位数,每按一次,则相应的数码显示管就加1,一直到9又从0开始。 (四)启动。只要转数不为零,按一下K6,马达就开始以所设定的参数运行,直到红色的数码显示管为00才停止。 第四章 硬件电路: 主要包括以下几部分 (一)1片单片机89C51,2片8255,3片7447。 (二)1个红色矩形发光二极管,24个发光二极管,2个共阳红色数码显示管,1个共阳绿色数码显示管。 (三)6个按键 (四)9伏---1安的交流转直流电源插口。 如图所指示:
第五章 控制程序 第一节程序说明 START 主要用于初始化 MIAN 用于主程序扫描按键 SET1 用于转数个位数加1 SET2 用于转数十位数加1 SET3 设定正逆转 LOOP1 正转 LOOP 逆转 DELAY 用来控制转速 DELAY1 用来消除抖动 EXT0 外部中断子程序INT0的中断入口 EXT1 外部中断子程序INT1的中断入口 R5 为转速的显示寄存器 30H,31H 为转数的显示地址 第二节程序流程图 第三节 程序清单。 - ORG 00H 主程序入口地址
- LJMP START
- ORG 03H 外部中断INT0子程序入口地址
- LJMP EXT0
- ORG 13H 外部中断INT1子程序入口地址
- LJMP EXT1
-
- START:CLR P2.6 正逆转指示灯亮,表示开机默认为正转
- MOV R5,#01H R5为转速显示寄存器,开机默认为第1档转速
- MOV IE,#85H INT0,INT1中断使能
- MOV IP,#00H 同级中断:先按先中断
- MOV TCON,#00H INT0,INT1为电平触发
- MOV SP,#70H 设定堆栈在70H地址
-
- SETB P2.5 不选8255(2):8255(1)用来控制显示转数
- CLR P2.4 片选8255(1):8255(1)用来驱动24个发光二极管
- CLR P2.2 8255(1)复位
- SETB P2.2
- CLR P2.2
- SETB P2.0 A0=1,A1=1,8255控制寄存器地址
- SETB P2.1
- MOV A,#80H 设8255(1)PA,PB,PC口为输出口
- MOVX @R0,A
- SETB P2.5 不选8255(2)
- CLR P2.4 选8255(1)
- CLR P2.0 选A口
- CLR P2.1
- MOV A,#0FFH 熄灭A口的8个发光二极管
- MOVX @R0,A
-
- SETB P2.0 选B口
- CLR P2.1
- MOV A,#0FFH 熄灭B口的8个发光二极管
- MOVX @R0,A
-
- CLR P2.0 选C口
- SETB P2.1
- MOV A,#0FFH 熄灭C口的8个发光二极管
- MOVX @R0,A
-
-
- SETB P2.4 不选8255(1)
- CLR P2.5 片选8255(2)
- CLR P2.3 8255(2)复位
- SETB P2.3
- CLR P2.3
- SETB P2.0 A0=1,A1=1 8255控制寄存器地址
- SETB P2.1
- MOV A,#88H PC0口---PC3,PB0口为输出口,PC4—PC7为输入口
- MOVX @R0,A
-
- MOV 30H,#01H 转数个位显示寄存器显示1,
- MOV 31H,#00H 转数十位显示寄存器显示0
-
- MIAN:JNB P3.4,SET2 是否按按键K4,是则跳到子程序SET2:转数十位数加1
- JNB P3.5,SET1 是否按按键K5,是则跳到子程序SET1:转数个位数加1
- JNB P2.7,SET3 是否按按键K1,是则跳到子程序SET3:设定正逆转
-
- CALL DISP 调用显示程序
- JNB P3.0,LOOP1 是否按启动按键K6,是则启动步进马达
- JMP MIAN
-
- SET3:CALL DELAY1 消除抖动
- JNB P2.7,[code]ORG 00H 主程序入口地址
- LJMP START
- ORG 03H 外部中断INT0子程序入口地址
- LJMP EXT0
- ORG 13H 外部中断INT1子程序入口地址
- LJMP EXT1
-
- START:CLR P2.6 正逆转指示灯亮,表示开机默认为正转
- MOV R5,#01H R5为转速显示寄存器,开机默认为第1档转速
- MOV IE,#85H INT0,INT1中断使能
- MOV IP,#00H 同级中断:先按先中断
- MOV TCON,#00H INT0,INT1为电平触发
- MOV SP,#70H 设定堆栈在70H地址
-
- SETB P2.5 不选8255(2):8255(1)用来控制显示转数
- CLR P2.4 片选8255(1):8255(1)用来驱动24个发光二极管
- CLR P2.2 8255(1)复位
- SETB P2.2
- CLR P2.2
- SETB P2.0 A0=1,A1=1,8255控制寄存器地址
- SETB P2.1
- MOV A,#80H 设8255(1)PA,PB,PC口为输出口
- MOVX @R0,A
- SETB P2.5 不选8255(2)
- CLR P2.4 选8255(1)
- CLR P2.0 选A口
- CLR P2.1
- MOV A,#0FFH 熄灭A口的8个发光二极管
- MOVX @R0,A
-
- SETB P2.0 选B口
- CLR P2.1
- MOV A,#0FFH 熄灭B口的8个发光二极管
- MOVX @R0,A
-
- CLR P2.0 选C口
- SETB P2.1
- MOV A,#0FFH 熄灭C口的8个发光二极管
- MOVX @R0,A
-
-
- SETB P2.4 不选8255(1)
- CLR P2.5 片选8255(2)
- CLR P2.3 8255(2)复位
- SETB P2.3
- CLR P2.3
- SETB P2.0 A0=1,A1=1 8255控制寄存器地址
- SETB P2.1
- MOV A,#88H PC0口---PC3,PB0口为输出口,PC4—PC7为输入口
- MOVX @R0,A
-
- MOV 30H,#01H 转数个位显示寄存器显示1,
- MOV 31H,#00H 转数十位显示寄存器显示0
-
- MIAN:JNB P3.4,SET2 是否按按键K4,是则跳到子程序SET2:转数十位数加1
- JNB P3.5,SET1 是否按按键K5,是则跳到子程序SET1:转数个位数加1
- JNB P2.7,SET3 是否按按键K1,是则跳到子程序SET3:设定正逆转
-
- CALL DISP 调用显示程序
- JNB P3.0,LOOP1 是否按启动按键K6,是则启动步进马达
- JMP MIAN
-
- SET3:CALL DELAY1 消除抖动
- JNB P2.7,[ DISCUZ_CODE_2 ]nbsp; 按键K1是否放开?是则往下执行
- CPL P2.6 设定正逆转
- JMP MIAN
-
- SET2:CALL DELAY1 消除抖动
- JNB P3.4,[ DISCUZ_CODE_2 ]nbsp; 按键K4是否放开?是则往下执行
- INC 31H 数十位显示加1
- MOV A,31H
- CJNE A,#0AH,D6 加1后是否超过9,不是则返回主程序
- MOV 31H,#00H 是则先把十位显示清0再返回
- D6:JMP MIAN
-
- SET1:CALL DELAY1 消除抖动
- JNB P3.5,[ DISCUZ_CODE_2 ]nbsp; 按键K5是否放开?是则往下执行
- INC 30H 转数个位加1
- MOV A,30H
- CJNE A,#0AH,D7 加1后是否超过9,不是则返回主程序
- MOV 30H,#00H 是则先把个位显示清0再返回
- D7:JMP MIAN
-
- DISP:MOV A,R5 显示转速
- MOV P1,A
- MOV A,31H 显示转数
- SWAP A
- ORL A,30H
-
- SETB P2.4 通过8255(2)显示转数
- CLR P2.5
- SETB P2.0
- CLR P2.1
-
- MOVX @R0,A
- RET
- D15:JMP LOOP2
- LOOP1:CALL DELAY1 消除抖动
- JNB P3.0,[ DISCUZ_CODE_2 ]nbsp; K6启动键是否放开
- JNB P2.6,D15 判断正逆转 LOOP1 为正转
- LOOP为逆转
- LOOP:CALL DISP 转完一圈后更新相关显示
-
- MOV A,30H 判断转数是否为0,是则停止运行,否则继续运行
- JZ D10
- DEC 30H
- JMP D14
- D10:MOV A,31H
- JZ D11 D11程序入口为JMP MIAN
- DEC 31H
- MOV 30H,#09H
-
- D14:SETB P2.5 片选8255(1)
- CLR P2.4
- CLR P2.0 选A口
- CLR P2.1
- MOV R4,#08H 依次显示
- MOV A,#0FEH
- D3:MOVX @R0,A
- CALL DELAY 控制转速
- RL A
- DJNZ R4,D3
- MOV A,#0FFH A口的8个发光二极管亮过后,把所有的A口等灭掉,为下一个亮B口做准备
- MOVX @R0,A
-
- SETB P2.0 选B口,以下的程序与A口相类似
- CLR P2.1
- MOV R4,#08H
- MOV A,#0FEH
- D4:MOVX @R0,A
- CALL DELAY
- RL A
- DJNZ R4,D4
- MOV A,#0FFH
- MOVX @R0,A
-
- CLR P2.0
- SETB P2.1
- MOV R4,#08H
- MOV A,#0FEH
- D5:MOVX @R0,A
- CALL DELAY
- RL A
- DJNZ R4,D5
- MOV A,#0FFH
- MOVX @R0,A
-
- JMP LOOP
- D11:JMP MIAN
-
- LOOP2:CALL DISP 正转,程序与逆转相类似。
-
- MOV A,30H
- JZ D16
- DEC 30H
- JMP D17
- D16:MOV A,31H
- JZ D11
- DEC 31H
- MOV 30H,#09H
-
- D17:SETB P2.5
- CLR P2.4
- CLR P2.0
- SETB P2.1
- MOV R4,#08H
- MOV A,#7FH
- D18:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D18
- MOV A,#0FFH
- MOVX @R0,A
-
- SETB P2.0
- CLR P2.1
- MOV R4,#08H
- MOV A,#7FH
- D19:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D19
- MOV A,#0FFH
- MOVX @R0,A
-
- CLR P2.0
- CLR P2.1
- MOV R4,#08H
- MOV A,#7FH
- D20:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D20
- MOV A,#0FFH
- MOVX @R0,A
-
- JMP LOOP2
-
- DELAY:MOV 33H,R6 该延时用于控制转速
- MOV R7,33H
- D1:MOV R2,#0FH
- D2:MOV R3,#0FFH
- DJNZ R3,$
- DJNZ R2,D2
- DJNZ R7,D1
- RET
- DELAY1:MOV R3,#02H 该延时用于消除抖动
- D9:MOV R1,#0FFH
- D8:MOV R2,#0FFH
- DJNZ R2,$
- DJNZ R1,D8
- DJNZ R3,D9
- RET
-
- EXT0:CALL DELAY1 中断INT0的入口,用于加速
- PUSH ACC
- PUSH PSW
-
- INC R5 R5为显示寄存器显示转速档
-
- DEC R6 R6是控制转速延时的参数。R5每加1档,则R6就减1,则延时就更短,速度更快
- MOV A,R5
- CJNE A,#0AH,D12
- MOV R5,#01H
- MOV R6,#09H
- D12:POP PSW
- POP ACC
- RETI
-
- EXT1:CALL DELAY1 中断INT1的入口,用于减速
- PUSH ACC
- PUSH PSW
-
- DEC R5
-
- INC R6
- MOV A,R5
- JNZ D13
- MOV R5,#09H
- MOV R6,#01H
-
- D13:POP PSW
- POP ACC
- RETI
- END
复制代码 nbsp; 按键K1是否放开?是则往下执行
CPL P2.6 设定正逆转
JMP MIAN
SET2:CALL DELAY1 消除抖动
JNB P3.4,- ORG 00H 主程序入口地址
- LJMP START
- ORG 03H 外部中断INT0子程序入口地址
- LJMP EXT0
- ORG 13H 外部中断INT1子程序入口地址
- LJMP EXT1
-
- START:CLR P2.6 正逆转指示灯亮,表示开机默认为正转
- MOV R5,#01H R5为转速显示寄存器,开机默认为第1档转速
- MOV IE,#85H INT0,INT1中断使能
- MOV IP,#00H 同级中断:先按先中断
- MOV TCON,#00H INT0,INT1为电平触发
- MOV SP,#70H 设定堆栈在70H地址
-
- SETB P2.5 不选8255(2):8255(1)用来控制显示转数
- CLR P2.4 片选8255(1):8255(1)用来驱动24个发光二极管
- CLR P2.2 8255(1)复位
- SETB P2.2
- CLR P2.2
- SETB P2.0 A0=1,A1=1,8255控制寄存器地址
- SETB P2.1
- MOV A,#80H 设8255(1)PA,PB,PC口为输出口
- MOVX @R0,A
- SETB P2.5 不选8255(2)
- CLR P2.4 选8255(1)
- CLR P2.0 选A口
- CLR P2.1
- MOV A,#0FFH 熄灭A口的8个发光二极管
- MOVX @R0,A
-
- SETB P2.0 选B口
- CLR P2.1
- MOV A,#0FFH 熄灭B口的8个发光二极管
- MOVX @R0,A
-
- CLR P2.0 选C口
- SETB P2.1
- MOV A,#0FFH 熄灭C口的8个发光二极管
- MOVX @R0,A
-
-
- SETB P2.4 不选8255(1)
- CLR P2.5 片选8255(2)
- CLR P2.3 8255(2)复位
- SETB P2.3
- CLR P2.3
- SETB P2.0 A0=1,A1=1 8255控制寄存器地址
- SETB P2.1
- MOV A,#88H PC0口---PC3,PB0口为输出口,PC4—PC7为输入口
- MOVX @R0,A
-
- MOV 30H,#01H 转数个位显示寄存器显示1,
- MOV 31H,#00H 转数十位显示寄存器显示0
-
- MIAN:JNB P3.4,SET2 是否按按键K4,是则跳到子程序SET2:转数十位数加1
- JNB P3.5,SET1 是否按按键K5,是则跳到子程序SET1:转数个位数加1
- JNB P2.7,SET3 是否按按键K1,是则跳到子程序SET3:设定正逆转
-
- CALL DISP 调用显示程序
- JNB P3.0,LOOP1 是否按启动按键K6,是则启动步进马达
- JMP MIAN
-
- SET3:CALL DELAY1 消除抖动
- JNB P2.7,[ DISCUZ_CODE_2 ]nbsp; 按键K1是否放开?是则往下执行
- CPL P2.6 设定正逆转
- JMP MIAN
-
- SET2:CALL DELAY1 消除抖动
- JNB P3.4,[ DISCUZ_CODE_2 ]nbsp; 按键K4是否放开?是则往下执行
- INC 31H 数十位显示加1
- MOV A,31H
- CJNE A,#0AH,D6 加1后是否超过9,不是则返回主程序
- MOV 31H,#00H 是则先把十位显示清0再返回
- D6:JMP MIAN
-
- SET1:CALL DELAY1 消除抖动
- JNB P3.5,[ DISCUZ_CODE_2 ]nbsp; 按键K5是否放开?是则往下执行
- INC 30H 转数个位加1
- MOV A,30H
- CJNE A,#0AH,D7 加1后是否超过9,不是则返回主程序
- MOV 30H,#00H 是则先把个位显示清0再返回
- D7:JMP MIAN
-
- DISP:MOV A,R5 显示转速
- MOV P1,A
- MOV A,31H 显示转数
- SWAP A
- ORL A,30H
-
- SETB P2.4 通过8255(2)显示转数
- CLR P2.5
- SETB P2.0
- CLR P2.1
-
- MOVX @R0,A
- RET
- D15:JMP LOOP2
- LOOP1:CALL DELAY1 消除抖动
- JNB P3.0,[ DISCUZ_CODE_2 ]nbsp; K6启动键是否放开
- JNB P2.6,D15 判断正逆转 LOOP1 为正转
- LOOP为逆转
- LOOP:CALL DISP 转完一圈后更新相关显示
-
- MOV A,30H 判断转数是否为0,是则停止运行,否则继续运行
- JZ D10
- DEC 30H
- JMP D14
- D10:MOV A,31H
- JZ D11 D11程序入口为JMP MIAN
- DEC 31H
- MOV 30H,#09H
-
- D14:SETB P2.5 片选8255(1)
- CLR P2.4
- CLR P2.0 选A口
- CLR P2.1
- MOV R4,#08H 依次显示
- MOV A,#0FEH
- D3:MOVX @R0,A
- CALL DELAY 控制转速
- RL A
- DJNZ R4,D3
- MOV A,#0FFH A口的8个发光二极管亮过后,把所有的A口等灭掉,为下一个亮B口做准备
- MOVX @R0,A
-
- SETB P2.0 选B口,以下的程序与A口相类似
- CLR P2.1
- MOV R4,#08H
- MOV A,#0FEH
- D4:MOVX @R0,A
- CALL DELAY
- RL A
- DJNZ R4,D4
- MOV A,#0FFH
- MOVX @R0,A
-
- CLR P2.0
- SETB P2.1
- MOV R4,#08H
- MOV A,#0FEH
- D5:MOVX @R0,A
- CALL DELAY
- RL A
- DJNZ R4,D5
- MOV A,#0FFH
- MOVX @R0,A
-
- JMP LOOP
- D11:JMP MIAN
-
- LOOP2:CALL DISP 正转,程序与逆转相类似。
-
- MOV A,30H
- JZ D16
- DEC 30H
- JMP D17
- D16:MOV A,31H
- JZ D11
- DEC 31H
- MOV 30H,#09H
-
- D17:SETB P2.5
- CLR P2.4
- CLR P2.0
- SETB P2.1
- MOV R4,#08H
- MOV A,#7FH
- D18:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D18
- MOV A,#0FFH
- MOVX @R0,A
-
- SETB P2.0
- CLR P2.1
- MOV R4,#08H
- MOV A,#7FH
- D19:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D19
- MOV A,#0FFH
- MOVX @R0,A
-
- CLR P2.0
- CLR P2.1
- MOV R4,#08H
- MOV A,#7FH
- D20:MOVX @R0,A
- CALL DELAY
- RR A
- DJNZ R4,D20
- MOV A,#0FFH
- MOVX @R0,A
-
- JMP LOOP2
-
- DELAY:MOV 33H,R6 该延时用于控制转速
- MOV R7,33H
- D1:MOV R2,#0FH
- D2:MOV R3,#0FFH
- DJNZ R3,$
- DJNZ R2,D2
- DJNZ R7,D1
- RET
- DELAY1:MOV R3,#02H 该延时用于消除抖动
- D9:MOV R1,#0FFH
- D8:MOV R2,#0FFH
- DJNZ R2,$
- DJNZ R1,D8
- DJNZ R3,D9
- RET
-
- EXT0:CALL DELAY1 中断INT0的入口,用于加速
- PUSH ACC
- PUSH PSW
-
- INC R5 R5为显示寄存器显示转速档
-
- DEC R6 R6是控制转速延时的参数。R5每加1档,则R6就减1,则延时就更短,速度更快
- MOV A,R5
- CJNE A,#0AH,D12
- MOV R5,#01H
- MOV R6,#09H
- D12:POP PSW
- POP ACC
- RETI
-
- EXT1:CALL DELAY1 中断INT1的入口,用于减速
- PUSH ACC
- PUSH PSW
-
- DEC R5
-
- INC R6
- MOV A,R5
- JNZ D13
- MOV R5,#09H
- MOV R6,#01H
-
- D13:POP PSW
- POP ACC
- RETI
- END
复制代码 nbsp; 按键K4是否放开?是则往下执行
INC 31H 数十位显示加1
MOV A,31H
CJNE A,#0AH,D6 加1后是否超过9,不是则返回主程序
MOV 31H,#00H 是则先把十位显示清0再返回
D6:JMP MIAN
SET1:CALL DELAY1 消除抖动
JNB P3.5,[ DISCUZ_CODE_2 ]nbsp; 按键K5是否放开?是则往下执行
INC 30H 转数个位加1
MOV A,30H
CJNE A,#0AH,D7 加1后是否超过9,不是则返回主程序
MOV 30H,#00H 是则先把个位显示清0再返回
D7:JMP MIAN
DISP:MOV A,R5 显示转速
MOV P1,A
MOV A,31H 显示转数
SWAP A
ORL A,30H
SETB P2.4 通过8255(2)显示转数
CLR P2.5
SETB P2.0
CLR P2.1
MOVX @R0,A
RET
D15:JMP LOOP2
LOOP1:CALL DELAY1 消除抖动
JNB P3.0,[ DISCUZ_CODE_2 ]nbsp; K6启动键是否放开
JNB P2.6,D15 判断正逆转 LOOP1 为正转
LOOP为逆转
LOOP:CALL DISP 转完一圈后更新相关显示
MOV A,30H 判断转数是否为0,是则停止运行,否则继续运行
JZ D10
DEC 30H
JMP D14
D10:MOV A,31H
JZ D11 D11程序入口为JMP MIAN
DEC 31H
MOV 30H,#09H
D14:SETB P2.5 片选8255(1)
CLR P2.4
CLR P2.0 选A口
CLR P2.1
MOV R4,#08H 依次显示
MOV A,#0FEH
D3:MOVX @R0,A
CALL DELAY 控制转速
RL A
DJNZ R4,D3
MOV A,#0FFH A口的8个发光二极管亮过后,把所有的A口等灭掉,为下一个亮B口做准备
MOVX @R0,A
SETB P2.0 选B口,以下的程序与A口相类似
CLR P2.1
MOV R4,#08H
MOV A,#0FEH
D4:MOVX @R0,A
CALL DELAY
RL A
DJNZ R4,D4
MOV A,#0FFH
MOVX @R0,A
CLR P2.0
SETB P2.1
MOV R4,#08H
MOV A,#0FEH
D5:MOVX @R0,A
CALL DELAY
RL A
DJNZ R4,D5
MOV A,#0FFH
MOVX @R0,A
JMP LOOP
D11:JMP MIAN
LOOP2:CALL DISP 正转,程序与逆转相类似。
MOV A,30H
JZ D16
DEC 30H
JMP D17
D16:MOV A,31H
JZ D11
DEC 31H
MOV 30H,#09H
D17:SETB P2.5
CLR P2.4
CLR P2.0
SETB P2.1
MOV R4,#08H
MOV A,#7FH
D18:MOVX @R0,A
CALL DELAY
RR A
DJNZ R4,D18
MOV A,#0FFH
MOVX @R0,A
SETB P2.0
CLR P2.1
MOV R4,#08H
MOV A,#7FH
D19:MOVX @R0,A
CALL DELAY
RR A
DJNZ R4,D19
MOV A,#0FFH
MOVX @R0,A
CLR P2.0
CLR P2.1
MOV R4,#08H
MOV A,#7FH
D20:MOVX @R0,A
CALL DELAY
RR A
DJNZ R4,D20
MOV A,#0FFH
MOVX @R0,A
JMP LOOP2
DELAY:MOV 33H,R6 该延时用于控制转速
MOV R7,33H
D1:MOV R2,#0FH
D2:MOV R3,#0FFH
DJNZ R3,$
DJNZ R2,D2
DJNZ R7,D1
RET
DELAY1:MOV R3,#02H 该延时用于消除抖动
D9:MOV R1,#0FFH
D8:MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D8
DJNZ R3,D9
RET
EXT0:CALL DELAY1 中断INT0的入口,用于加速
PUSH ACC
PUSH PSW
INC R5 R5为显示寄存器显示转速档
DEC R6 R6是控制转速延时的参数。R5每加1档,则R6就减1,则延时就更短,速度更快
MOV A,R5
CJNE A,#0AH,D12
MOV R5,#01H
MOV R6,#09H
D12:POP PSW
POP ACC
RETI
EXT1:CALL DELAY1 中断INT1的入口,用于减速
PUSH ACC
PUSH PSW
DEC R5
INC R6
MOV A,R5
JNZ D13
MOV R5,#09H
MOV R6,#01H
D13:POP PSW
POP ACC
RETI
END[/code]
第六章 实验结果与分析: 本作品刚开始的时候是用16键盘扫描输入的,但是后来发现16键盘扫描输入的稳定性很难保证,所以就改成6个独立按键输入。程序也是经过在仿真器上不断的调试,最终做出来。现在本作品能实现它的功能,但是还是有一些小缺陷需要改进,比如在步进马达正在运行时,按中断按键K2或者K3来加速时,会看到步进马达会略微停顿一下,是因为中断的按键子程序上加了一个用于消除抖动的延时程序。还有,如果在单片机上的复位电路上加一个手动复位按键,用来做急停开关则功能更强。 第七章 总结 本设计涉及的知识点很多,软件上主要有:输入按键的应用,数码显示管的应用,两个外部中断的应用,更具挑战性的是,本设计在89C51外围扩展了两片8255,如何在程序上处理好单片机与两片8255的工作,是本设计的难点所在。在硬件上,可以学到一些基本的焊接技术,如何使用仿真器进行在线仿真,如何使用烧录器把仿真好,编译好的可执行文件烧录到芯片89C51中,以前都没有接触到仿真器,烧录器,现在由于自己的兴趣,自己花钱把这些开发设备买回来并且已经学会使用。总之,通过这次毕业设计,获益甚丰。 参考资料: 1)李全利 主编. 单片机原理及应用技术. 北京.高等教育出版社, 2001 2)吴金戌 沈庆阳 郭庭古 主编. 8051单片机实践与应用. 北京. 清华大学出版社, 2002 3)陈明荧 主编. 8051单片机课程设计实训教材. 北京. 清华大学出版社, 2004 4)余孟尝 主编. 模拟,数字及电力电子技术. 北京. 机械工业出版社, 1999年 致谢: 感谢管利锐老师这一年多来的指导,让我不但掌握单片机的基本知识,而且对单片机产生浓重的兴趣,还要感谢陈慧敏老师,是她先教我们专业的汇编语言,让我在调程序时少走许多弯路。感谢我的同事李文化,余兴社,是他们提供电脑和相机让我完成这份毕业设计。
|