本文使用 Zhihu On VSCode 创作并发布
姓名: 张 政
学号: 21180615
实验目的和要求
初步学习和掌握MCS-51的体系结构和汇编语言,了解Keil编程环境和程序下载工具的使用方法。
了解步进电机的工作原理,学习用单片机的步进电机控制系统的硬件设计方法,掌握定时器和中断系统的应用,熟悉单片机应用系统的设计与调试方法。了解数码管输出的原理及编程方式。
实验内容
编制MCS-51程序使步进电机按照规定的转速和方向进行旋转,并将已转动的步数显示在数码管上。
步进电机的转速分为两档,当按下S1开关时,进行快速旋转,速度为60转/分。当松开开关时,进行慢速旋转,速度为10转/分。当按下S2开关时,按照顺时针旋转;当松开时,按照逆时针旋转。
本程序要求使用定时器中断来实现,不准使用程序延时的方式。
实验原理
1、本实验采用定时器中断实现,使用定时器时,首先应由外部条件得到要定时的时间长度t,如本实验中,就是根据要求的速度计算出的每一步之间的间隔。然后选择适当的定时器工作方式,去计算想要设定的计数器初值 s,使用如下方程。
定时周期 = 12/CPU 晶振频率
得到的 s 需要分成高 8 位和低 8 位,分别放入计数器 THx 和 TLx 中(x 为 0 或 1)。如果 s为负数,说明需要的定时时间太长,即使定时器的最大时间也无法满足要求。这种情况下, 需要加入软件循环才能实现。我们可以将需要的定时时间分成 n 份,利用定时器达到 t/n 的时间长度,然后在定时器处理程序中,累计某一变量,如果到达 n,说明总的时间 t 已经达到。
要想使用定时器中断,除了上面的定时器初值设定外,还需要将其他相关的特殊功能寄存器也都设置好。如果使用方式 0 和方式 1,不要忘记在计数结束后重新恢复计数器初值。
2、我们使用的单片机系统的频率是 12M;步进电机转动一周需要 24 步。
本步进电机实验板,使用 FAN8200 作为驱动芯片。CPU 通过如下 4 个引脚与 FAN8200 相连,即:
3、本实验使用简单的双四拍工作模式即可,这也是 FAN8200 比较方便的工作方式。只要将CE1 和 CE2 分别置为高,然后 IN1 和 IN2 按照预定的脉冲输出,即 01->11->10->00->01 这个循环构成一个方向旋转的输出脉冲,将此序列翻转,就是相反方向的输出脉冲。
4、数码管显示:
本开发平台有 3 个数码管,使用串行方式连接在一起,具体电路参见实验原理。要想输
出一个字形码,就需要从高位到低位依次向移位寄存器输出 8 个比特。移位寄存器的数据线和时钟线分别接到单片机的 P4.5 和 P4.4 管脚,可以使用 MCS-51 里面的位操作指令进行输出。连续输出 3 个字形,24 个 bit 之后,欲显示的字形将稳定地显示在数码管上,程序可以转而执行其他工作。
七段字形的编码方式需要通过实验获得。这些编码作为程序中的常数,使用 DB 命令存放。在程序中,需要将数值转换为相应的字形编码,可以使用 MOVC 指令来完成。
5、74HC164 是高速 CMOS 器件。74HC164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(A 或 B)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
6、时钟 (CLK) 每次由低变高时,数据右移一位,输入到 Q0,Q0 是两个数据输入端(A 和
B)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
7、主复位(CLR)输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
8、采用 3 个 74HC164 级联控制三个数码管的显示,具体实验原理如下图所示。其中使用单片机P4.5 作为模拟串口数据,使用P4.4 模拟串口时钟,CLR 端接高电平。使用上一个74HC164的 Q7 作为下一个 74HC164 的输入端。
实验步骤
流程图
汇编代码如下
ORG 0000H ;复位起始地址
LJMP START
ORG 000BH ;中间地址保留给中断向量表
LJMP EINT0 ;定时器0中断程序入口地址
ORG 0040H ;程序实际起始地址
START: ;初始化
P4 EQU 0C0H ;P4 地址
P4SW EQU 0BBH ;P4 方式控制字地址
MOV P4SW,#70H
CLK EQU P4.4 ;时钟线
DAT EQU P4.5 ;数据线
SW EQU P3.6
MOV DPTR,#TAB ;TAB为--5D3E
LP:
MOV R3,#0 ;计数
MOV R4,#0
MOV R5,#0
;TMOD 方式寄存器
I1:
MOV TMOD,#01H ;选择工作方式,即对TMOD赋初值.T0工作在方式1,16位的计数器
;GATE(GATE-门控位,控制定时器的两种启动方式,) 等于0,不受外部控制
MOV IE,#82H ;允许中断,T0中断允许 中断控制字;直接对中断寄存器IE 和优先级寄存器 IP设置
ORL IP,#2H ;逻辑或,T0中断的优先级高
SETB P1.1 ;CE1 置1
SETB P1.4 ;CE2 置1
NEXT: ;判断S2
JB P3.7,OPP ;若 P3.7=1,s2没有按下 ,逆时针
MOV R0,#01111000B ;按下为顺时针 --78
MOV 20H,R0
LJMP SS1
OPP:
MOV R0,#00101101B ;松开为逆时针 --2D
MOV 20H,R0
SS1: ;判断S1
JB P3.6,SPD ;若 P3.6=1,s1没有按下,慢速
MOV R2,#0H ;快速,(5D3E #TAB)
LJMP L0
SPD:
MOV R2,#1H ;慢速
L0:
MOV R1,#4 ;相位四次变换
MOV R0,20H
L1:
MOV A,R0
RLC A ;循环左移
MOV P3.2,C ;INT1
RLC A
MOV P1.0,C ;INT2
MOV R0,A
LCALL NUM
LCALL TIME
DJNZ R1,L1 ;R1 -1,结果不为0继续循环
LJMP NEXT
TIME:
CJNE R2,#1,QUICK
MOV R6,#6 ;慢速六次计时
TIM2:
MOV TH0,#5DH
MOV TL0,#3EH
SETB TR0 ;允许计数
MOV R7,#0H
TIM3:
CJNE R7,#1H,TIM3 ;空循环,等待
DJNZ R6,TIM2 ;R6 -1,结果不为0继续循环
LJMP OUT
QUICK:
MOV TH0,#5DH ;定时器0启动,快速状态60转/分
MOV TL0,#3EH
SETB TR0
MOV R7,#0H
TIM1:
CJNE R7,#1H,TIM1
OUT:
RET
EINT0: ;中断程序
MOV R7,#1
RETI
NUM: ;显示转数,每转一次显示一个数
S0:
MOV A,R3
CALL EXP
MOV A,R4
CALL EXP
MOV A,R5
CALL EXP
CJNE R3,#9,S1
MOV R3,#0
CJNE R4,#9,S2
MOV R4,#0
CJNE R5,#9,S3
MOV R5,#0
S1:
INC R3
LJMP STOP
S2:
INC R4
LJMP STOP
S3:
INC R5
LJMP STOP
STOP:
RET
EXP: ;显示数码管
MOV 21H,R0
MOVC A,@A+DPTR ;查询 TAB 表
MOV R0,#8
CLY:
CLR CLK ;时钟线低电平
RLC A ;累加器A的逻辑操作指令
MOV DAT,C ;8位数据按位输出
SETB CLK ;P4.4 时钟线高电平
DJNZ R0,CLY
MOV R0,21H
RET
TAB: ;5D3E
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
思考题
- 如果采用单四拍工作模式,每次步进角度为15度,程序如何修改?
单四拍: A -- B -- ~A -- ~B -- A …
修改相位值即可。
- 如果采用单双八拍工作模式,每次步进角度为7.5度,程序如何修改?
八拍: A -- AB -- B -- BC -- C -- CD -- D -- DA -- A
修改定时初始值,相位和循环次数也要改变。
- 步进电机的转速取决于哪些因素?上下限如何?
取决于脉冲频率和工作模式
步进电机的转速有上下限;受物理因素(摩擦,机械惯性,响应时间)影响,上限根据电机不同而不同,下限为0
- 如何改变步进电机的转向?
改变转动脉冲。
步进电机有那些规格参数,如何根据需要选择型号?
功率,马力,电流,转速,效率,功率因数,额定转矩,额定电流,重量,空起频率等
根据需要
a) 选定需要的额定转矩,通常根据需要的转矩大小(所要带动物体的扭力大小),来选择哪种型号的电机。大致来说,扭力越大,所需选择的电机的额定转矩越大,电机尺寸越大。
b) 选择合适的转速,电机的转速和输出转矩成反比。步进电机在低速时输出转矩较大,高速时输出转矩较小。如果高速的时候希望获得较大转矩,需要选择电感稍小的电机,低速大力度时候,选择电感和电阻大的电机。
c) 使用环境,特种步进电机需要防水,防油,可用于某些特殊场合。比如水下机器人就需要防水电机。
d) 空起频率的选择,步进电机空载启动频率通常称为“空起频率”,如果要求频繁在瞬间启动,停止,高转速,就要加速启动。如果需要直接启动并高速运转,最好选用永磁电机。
MCS51中有哪些可存取的单元,存取方式如何?它们之间的区别和联系有哪些?
a. 工作寄存器组(00H——1FH)
内部RAM的0-1FH为四组工作寄存器区,每个区有 8 个工作寄存器(R0 -R7)。在同一时刻,只能使用一组工作寄存器,这是通过程序状态字 PSW 的地 3,4 位来控制的。例如当此两位为 00 时,使用第 0 组工作寄存器,对应于 00H 到 07H 的内部 RAM 空间。也就是说,这时指令中使用 R0 与直接使用 00 单元是 等价的,不过使用工作寄存器的指令简单,且执行快。
b. 可定位寻址RAM区(20H——2FH)
内部 RAM 的 20H-2FH 为位寻址区域,这 16 个单元的每一位都对应一个位地址,占据位地址空间的 0-7FH,每一位都可以独立置位、清除、取反等操作。
c. 通用的RAM区(30H——7FH)
在中断和子程序调用中都需要堆栈。MCS-51 的堆栈理论上可以设置在内部 RAM 的任意区域,但由于 0-1FH 和 20-2FH 区域有上面说的特殊功能,因此一般设置在 30H 以后。
在内部 RAM 中,所有的单元都可以作为通用的数据存储器使用,存放输入 的数据或计算的中间结果等,也可以作为条件转移的条件使用。
- 说明MOVC指令的使用方法。
MOVC是c51单片机汇编中断查表指令,在汇编中,MOVC指令是用来表示程序存储器中的内容和别的存储单元进行传送的。主要是用在累加器A和程序存储器的数据传送。
以16位程序计数器PC或者数据指针DPTR作为基寄存器,以8位的累加器A作为变址寄存器,基址寄存器和变址寄存器的内容相加为16位的地址访问程序存储器。
如MOVC A,@A+PC ; MOVC A.@A+DPTR ;
- MCS51的指令时序是什么样的,哪类指令的执行时间较长?
MCS51的时序是用定时单位来描述的,MCS51的时序单位有四个,分别为节拍,状态,机器周期和指令周期。
乘除法指令执行时间较长
- 在本实验环境下,能否控制显示数码的亮度?如何实现?可以,通过修改刷新频率。
可以,改变刷新频率即可。
实验心得
中断中执行的程序太多,但由于使用的是定时器中断,不能保证程序在定时周期内执行完毕。