《微机原理及接口技术》
实 验 指 导 书
杨霞 周林英 编
长安大学电子与控制工程学院
2009年9月
i
前 言
本实验指导是为适应各大、中专院校开设微机原理及应用方面的课程需做大量软硬件实验的需要而编写的,供学生编程用。完成本实验指导中的实验,可使学生基本掌握8086/8088的结构原理、接口技术、程序设计技巧。手册中详细叙述了各实验的目的、内容,列出了接线图、程序框图和实验步骤。
主要学习内容为80X86语言实验环境配置、汇编源语言格式、输出字符、循环结构、子程序调用,以及加减乘除等指令操作、通用接口芯片的接口编程与使用。所有实验都是相互的,次序上也没有固定的先后关系,在使用本书进行教学时,教师可根据教学要求,选择相应实验。学习结束后,要求学生能够编写出综合加减乘除等指令,以及循环结构、子程序调用等程序控制程序、看懂一般接口芯片电路图。
2
目 录
实验一 清零程序 ..................................................... 4 实验二 拆字程序 .................................................... 6 实验三 数据区移动 ................................................... 8 实验四 多分支程序设计 .............................................. 10 实验五 多字节减法运算 .............................................. 13 实验六 显示程序 .................................................... 16 实验七 8251串口实验 ............................................... 20 实验八 步进电机控制 ................................................ 26 附录一 汇编语言的存储模型 ......................................... 36 附录二 8279键值显示程序 .......................................... 37
3
实验一 清零程序
一、实验目的
掌握8088汇编语言程序设计和调试方法。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
把RAM区内4000H-40FFH单元的内容清零 。 四、程序框图
五、源程序清单
.MODEL TINY .STACK 100 .DATA .CODE
ORG 0100H START:
MOV BX,4000H MOV AX,0000H MOV CX,80H L1: MOV [BX],AX INC BX INC BX LOOP L1 JMP $ END START
六、实验步骤
4
手动修改RAM区内4000H-40FFH的内容,连续或单步方式运行程序,检查4000-40FFH内容 执行程序前后的变化。 七、思考
1、把4000H-40FFH中的内容改成FF,如何修改程序。 2、把4000H-40FFH中的内容改成00~FF,如何修改程序。
5
实验二 拆字程序
一、实验目的
掌握汇编语言设计和调试方法。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
把4000H单元的内容拆开,高位送4001H低位,低位送4002H低位,4001H、4002H 的高位清零,一般本程序用于把数据送显示缓冲区时用。 四、程序框图
五、源程序
.MODEL TINY .STACK .DATA .CODE START: MOV BX,4000H MOV AL,[BX] MOV AH,AL MOV CL,4 SHR AH,CL INC BX
MOV [BX],AH AND AL,0FH INC BX
MOV [BX],AL JMP $
六、实验步骤
手动修改4000H的内容,用连续或单步方式运行程序,检查4000H-4002H中内容变化情况。 七、思考
1.如何用断点方式调试本程序。
6
2.把4000H、4001H单元低位的内容合成一字送4002H单元。
7
实验三 数据区移动
一、实验目的
掌握RAM中的数据操作。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
把4100H源RAM区首址内的16字节数据传送到4200H目标RAM区。 四、设计思想
程序要求把内存中某一数据区(称为源数据块)传送到另一存储区(称为目的数据块)。源数据块和目的数据块在存储器中可能有三种情况,如下图:
对于两个数据块分离的情况,如图(a),数据的传送从数据块的首址开始,或者从数据块的末址开始均可。但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据首址>目的块首址时,从数据块首址开始传送数据。 当源数据块首址<目的块首址时,从数据块末地址开始传送数据。 五、程序框图
8
六、源程序清单
.MODEL TINY .STACK .DATA .CODE ORG 0100H START0:
MOV CX,0010H MOV SI,4100H MOV DI,4200H CMP SI,DI JA A42 ADD SI,CX ADD DI,CX A41: DEC SI DEC DI
MOV AL,[SI] MOV [DI],AL LOOP A41 JMP $
A42: MOV AL,[SI] MOV [DI],AL INC SI INC DI LOOP A42 JMP $ END START0
七、实验步骤
调试运行3060程序,检查4100-410FH中内容是否和4200-420FH中内容完全一致。 八、思考
1.把4200H源RAM区首址内的16字节数据传送到4100H目标RAM区。
2.把4100H源RAM区首址内的16字节数据传送到410AH目标RAM区。
9
实验四 多分支程序设计
一、实验目的
掌握汇编语言的编程,熟悉程序散转的设计方法。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
编写程序,根据接收到的键值,作不同的处理。
四、设计思想
多分支结构相当于一个多路开关,在程序设计中通常是根据某寄存器或某单元的内容进行程序转移。在设计多分支转移程序时,如果分支太多,则平均转移速度太慢,本实验采用转移地址表实现多分支转移,可以提高平均转移速度。 五、程序框图
开始键盘扫描直到有一个按键输入(值存于AL中)AL<8?N0-->ALAH=0, AX--> BXBX * 2 --> BX散转表地址-->DIJMP CS:[DI][BX]Y0号键:1号键:2号键:3号键:4号键:5号键:6号键:7号键:显示8个1显示8个2显示8个3显示8个4显示8个5显示8个6显示8个7显示8个8散转程序流程框图
六、实验步骤
1、连线说明: E5区 :CLK E5区 :CS E5区 :A0 E5区 :A、B、C、D —— —— —— —— B2区:2M A3区:CS5 A3区:A0 G5区:A、B、C、D 2、在G5区的键盘上输入1位数 3、使用各种手段调试程序
3、结果显示在G5区的数码管上
10
七、源程序清单
;调用GetKeyB返回键值,根据键值执行相应的程序
EXTRN .MODEL TINY Display8:NEAR, GetKeyB:NEAR
BUFFER START: START1: START2: Table_1: Key0: Key1: Key2: Key3: Key4: Key5: Key6: Key7: Key:
.STACK .DATA DB .CODE MOV MOV MOV NOP CALL CMP JB XOR XOR MOV SHL LEA JMP MOV JMP MOV JMP MOV JMP MOV JMP MOV AL,5 JMP MOV JMP MOV JMP MOV JMP MOV LEA REP LEA CALL MOV
100
8 DUP(?)
AX,@DATA DS,AX ES,AX
GetKeyB ;键值存放在AL中 AL,8 START2
AL,AL ;大于7,作0处理 AH,AH BX,AX BX,1 DI,Table_1 CS:[DI][BX] Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7
AL,1 Key AL,2 Key AL,3 Key AL,4 Key Key AL,6 Key AL,7 Key AL,8 Key CX,8 DI,BUFFER STOSB SI,BUFFER Display8 CX,60000
11
DW
LOOP JMP END
$ START1 START
;延时
12
实验五 多字节减法运算
一、实验目的
掌握BCD码、补码,熟悉多文件、多模块汇编语言程序设计的方法。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
从键盘上输入4位被减数、减数,实现双字节BCD码(四位数)的减法,结果显示在数码管上;进一步熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;熟悉查看特殊功能寄存器、CS段、DS段存贮器的各种方法。 四、程序框图
开始设定\"先清LED再接收键输入\"标志通过键盘获得双字节十进制被减数(压缩BCD码)设定\"接收到第一个键后才清除LED\"标志通过键盘获得双字节十进制减数(压缩BCD码)被减数>=减数 ?N10H-->被减数与减数符号位交换,11H-->符号位(负数)Y压缩缩被减数与减数低位字节不带进位相减十进制调整被减数与减数高位字节带进位相减十进制调整码转换为非压码高位0消隐,若结果为负,前面加上\"-\"显示结果双字节十进制减法程序框图
五、实验步骤 1、连线说明: E5区 :CLK E5区 :CS E5区 :A0 E5区 :A、B、C、D —— —— —— —— B2区:2M A3区:CS5 A3区:A0 G5区:A、B、C、D 2、在G5区的键盘上输入4位被减数、减数 3、结果显示在G5区的数码管上 六、源程序清单
EXTRN EXTRN
.MODEL F1:BYTE .STACK
TINY 100
13
Display8:NEAR, GetBCDKey:NEAR
BUFFER minuend subtrahend START: START1: START2:
.DATA DB 8 DUP(?) DW 1 DUP(?) DW 1 DUP(?) .CODE
MOV AX,@DATA MOV DS,AX MOV
ES,AX NOP MOV F1,0 LEA DI,minuend MOV CX,4
CALL GetBCDKey
MOV F1,1 LEA DI,subtrahend MOV CX,4
CALL GetBCDKey MOV AX,minuend MOV BX,subtrahend MOV DL,10H CMP AX,BX JNB START2 XCHG AX,BX MOV DL,11H SUB AL,BL DAS XCHG AL,AH SBB AL,BH DAS XCHG AL,AH CLD
LEA DI,BUFFER CALL B1toB2 MOV AL,AH CALL B1toB2 MOV AL,10H STOSB STOSB STOSB STOSB
LEA SI,BUFFER+3 MOV CX,3 CALL BlackDisplay LEA
SI,BUFFER
14
;被减数 ;减数
;先清除显示,再接收键输入
;按键次数
;得到双字节十进制数(被减数) ;接收到第一个键,才清除显示
;按键次数
;得到双字节十进制数(减数) ;负数 ;低位 ;高位
;存放显示结果 ;低位 ;高位
;最高三位消隐
;将高位0消隐
B1toB2 B1toB2 BlackDisplay BlackDisplay1: Exit:
BlackDisplay
CALL JMP PROC PUSH AND STOSB POP AND ROR STOSB RET ENDP PROC MOV CMP JNZ MOV MOV DEC LOOP CLD MOV RET ENDP END
Display8 START1 NEAR AX AL,0FH AX AL,0F0H AL,4 NEAR AL,[SI] AL,0 Exit AL,10H [SI],AL SI
BlackDisplay1
[SI+1],DL START
;将高位0消隐
;将一个字节压缩BCD码转换成二个字节非压缩BCD码
七、思考
从键盘上输入4位被加数、加数,实现双字节BCD码(四位数)的加法,结果显示在数码管上。
15
实验六 显示程序
一、实验目的
1、熟悉8255的功能,理解LED显示原理及控制方法;
2、学会使用LED点阵液晶显示字体和图形;
3、认真预习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告。 二、实验设备
STAR系列实验仪一套、PC机一台。
三、实验内容
1、编写程序,用8255的PA、PB口控制LED的位选和段选,
(1)控制8位数码管依次显示0;
(2)编写程序,控制8位数码管依次显示任意指定字符(0-F); (3)编写程序,控制8位数码管同时显示0、1、……F; 2、按图连接线路,运行程序,观察实验结果。 四、实验原理图
接8255 PB接8255 PA
五、实验步骤
1、主机连线说明: B4区:CS(8255) B4区:A0、A1 B4区:JP56、JP53 —— —— —— A3区:CS1 A3区:A0、A1 G5区:JP 41、 JP 42 2、运行程序,验证显示结果。 六:源程序
(1) 控制8位数码管依次显示0;
.MODEL TINY .STACK 100 .DATA
IO8255_Con EQU IO8255_A EQU IO8255_B EQU
0F003H 0F000H 0F001H ;CS3控制字端口地址 ;A数据口 ;B数据口
16
LED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71H ;存储要显示的数码管的值,B口的8位分别对应7位数码管的abcdefg .CODE
START: MOV AX,@DATA; 单片机寻址方式,地址怎样传到DATA中的 MOV DS,AX ;初始化数据段寄存器 MOV ES,AX ;初始化附加段,这一句不需要 MOV DX,IO8255_Con ;控制字地址送DX MOV AL,80H ;方式0,A,B,C均为输出 OUT DX,AL MOV AL,0FEH ; 8255 PC输出,输出0FEH到A口 MOV CX,8
GOON: MOV DX,IO8255_A ;位选,就是片选,选择哪一个LED组 OUT DX,AL ;1111 1110输出到A口 ROL AL,1 ;循环左移1位,最低位的0移动1位到高位,进行片选用 MOV AH,AL ;AL当前值送AH暂存,因为AL还要用于B口数据送DX。 MOV DX,IO8255_B ;选择B口, MOV AL,03FH OUT DX,AL ;送入要显示的字符03FH,对照实验原理图可知,B口选择的是相应的abcdefg7段数码管的位置,所以现在显示的是数字0 MOV AL,AH ;0FFH->8255 PA CALL Delay;调用延时 ;这里可以加入一行指令,让CX减1,以使得程序运行一次,即8个LED都显示一次0就结束。 JMP GOON循环
Delay PROC NEAR PUSH CX MOV CX,20000 Delay1: LOOP Delay1 POP CX RET ENDP END START (2) 编写程序,控制8位数码管依次显示任意指定字符(0-F); .MODEL TINY .STACK 100 .MODEL TINY .STACK 100 .DATA
17
IO8255_Con EQU 0F003H ;CS3 IO8255_A EQU 0F000H ;A IO8255_B EQU 0F001H ;B
LED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71H;这些数值控制LED7段数码管的显示位置 .CODE
START: MOV AX,@DATA MOV DS,AX MOV ES,AX MOV DX,IO8255_Con MOV AL,80H ;方式0,A,B,C均为输出 OUT DX,AL MOV AL,0FEH ;8255 PC输出 MOV CX,8
GOON: MOV DX,IO8255_B MOV AL,05BH OUT DX,AL MOV AL,AH MOV DX,IO8255_A ;位选 OUT DX,AL ROL AL,1 MOV AH,AL ;0FFH->8255 PA CALL Delay JMP GOON
Delay PROC NEAR PUSH CX MOV CX,800 Delay1: LOOP Delay1 POP CX RET ENDP END START (3) 编写程序,控制8位数码管同时显示0、1、……F: .MODEL TINY .STACK 100 .MODEL TINY .STACK 100 .DATA
IO8255_Con EQU 0F003H ;CS3 IO8255_A EQU 0F000H ;A
18
IO8255_B EQU 0F001H ;B
LED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71H F1 DB 0 .CODE
START: MOV AX,@DATA MOV DS,AX MOV ES,AX MOV DX,IO8255_Con MOV AL,80H ;方式0,A,B,C均为输出 OUT DX,AL MOV AX,0FEFEH ;8255 PC输出 MOV CX,1600 LEA BX,LED_TAB GOON: MOV AL,F1 XLAT MOV DX,IO8255_B ;段选 OUT DX,AL MOV AL,AH MOV DX,IO8255_A ;位选 OUT DX,AL ROL AL,1 MOV AH,AL CALL DL500ms LOOP GOON ;8段数码管显示当前值 MOV CX,1600 ;8段数码管显示完成,则显示下个字符 MOV AL,AH ; ; CALL DL3S INC F1 CMP F1,10H ;是否显示完了 JZ EXIT JMP GOON
DL500ms PROC NEAR PUSH CX MOV CX,400
DL500ms1: LOOP DL500ms1 POP CX RET DL500ms ENDP
EXIT: END START
19
七、思考
(4)编写程序,控制8位数码管显示当前日期以及时间;
20
实验七 8251串口实验
一、实验目的与要求
了解8251的内部结构、工作原理;了解8251与8088的接口逻辑;掌握对8251的初始化编程方法,学会使用8251实现设备之间的串行通信。
复习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告。 二、实验设备
STAR系列实验仪一套、PC机一台
三、实验内容
1、编制程序:实现8251A与PC机的串行通讯,使用8253作分频器提供8251的收发时钟。
2、连接线路,从微机接收一批数据,接收完毕,再将它们回送给微机。
四、程序框图
开始 初始化8253(定时器0,方式3,BCD码计数,CLK0/26) 初始化8251 接收10个字节数据子程序 将接收到的10个字节数据通过8251发送给微机
初始化8251:
开始 复位8251 波特率系数为16,8个数据位,一个停止位,偶校验 允许接收和发送数据 清错误标志 返回
21
接收10个字节数据子程序: 开始 读入状态 发送了10个字节数据子程序: 开始 读入状态 N 有数据 N 有数据 Y 读数据->缓冲区 Y 发送 N 接收了10个字节数据 N 发送了10个字节数据 Y 返回 Y 返回 五、实验原理图 U38D2D3RXD(E7)RXDD4D5D6D7WRC/DTxC(8253)OUT0(0F000H)CS1A0RxRDYCSRD12345671011121314D2D3RxDGNDD4D5D6D7TxCWRCSC/DRDRxRDY8251D1D0VCCRxCDTRRTSDSRRESETCLKTxDTxEMPTYCTSSYNDETTxRDY28D127D026VCC25OUT0(8253)24RxC232221RSTCLK204M(B2)19TXD(E7)18TXD171615TxRDY 六、实验步骤 1、连线说明: C5区:CS(8253)、A0、A1 C5区:CLK0 C5区:GATE0 C5区:OUT0 C5区:CS(8251)、C/D C5区:CLK C5区:RXD、TXD —— A3区:CS5、A0、A1 —— B2区:2M —— C1区的VCC —— C5区:RxC、TxC —— A3区:CS1、A0 —— B2区:4M —— E7区:RXD、TXD 2、运行程序 3、运行“串口助手(ComPort.EXE)”,设置串口(波特率4800,8个数据位,一个停止位,偶校验),打开串口,选择“HEX发送”、“HEX显示”,向8251发送10个字节数据(输入数据之间用空格分隔),是否能接收到10个字节数据,接收到的数据是否与发送数据一致。 4、改变传输数据的数目,重复实验,观察结果。 七、演示程序 22 .MODEL TINY
;使用8253的计数器0,外接2Mhz,经26分频后,送给8251,产生4800bps CTL_ADDR DATA_ADDR W_8253_T0 W_8253_C Receive_Buffer Send_Buffer START: START1: INIT_8253 INIT_8253 INIT_8251 INIT_8251 EQU 0FF01H ;控制字或状态字 EQU 0FF00H ;读写数据 EQU 0BF00H ;计数器0地址 EQU 0BF03H ;控制字 .STACK 100 .DATA DB 10 DUP(0) ;接受缓冲器 EQU Receive_Buffer ;发送缓冲器 .CODE MOV AX,@DATA MOV DS,AX MOV ES,AX NOP CALL INIT_8253 CALL INIT_8251 MOV CX,10 CALL Receive_Group MOV CX,10 CALL Send_Group JMP START1 PROC NEAR MOV DX,W_8253_C MOV AL,37H ;定时器0,方式3 OUT DX,AL MOV DX,W_8253_T0 MOV AL,26H ;BCD码26(2000000/26)=16*4800 OUT DX,AL MOV AL,0 OUT DX,AL RET ENDP PROC NEAR CALL RESET_8251 MOV DX,CTL_ADDR MOV AL,7EH ;波特率系数为16,8个数据位 OUT DX,AL ;一个停止位,偶校验 CALL DLTIME ;延时 MOV AL,15H ;允许接收和发送发送数据,清错误标志OUT DX,AL CALL DLTIME RET ENDP
23
Reset_8251 PROC MOV MOV OUT CALL OUT CALL OUT CALL MOV OUT CALL RET Reset_8251 ENDP
;接受一组数据,CX--接受数目 Receive_Group PROC LEA Receive_Group1: CALL STOSB LOOP RET Receive_Group ENDP ;接受一个字节 Receive_Byte PROC MOV Receive_Byte1: IN TEST JZ MOV IN RET Receive_Byte ENDP
;发送一组数据,CX--发送数目 Send_Group PROC LEA Send_Group1: LODSB CALL LOOP RET Send_Group ENDP ;发送一个字节 Sendbyte PROC PUSH MOV
NEAR
DX,CTL_ADDR AL,0
DX,AL ;向控制口写入\"0\"
DLTIME ;延时,等待写操作完成 DX,AL ;向控制口写入\"0\" DLTIME ;延时
DX,AL ;向控制口写入\"0\" DLTIME ;延时
AL,40H ;向控制口写入复位字40H DX,AL DLTIME
NEAR DI,Receive_Buffer Receive_Byte Receive_Group1
NEAR DX,CTL_ADDR AL,DX ;读入状态 AL,2 Receive_Byte1 ;有数据吗? DX,DATA_ADDR ;有 AL,DX NEAR
SI,Send_Buffer
SendByte Send_Group1
NEAR AX
DX,CTL_ADDR
;读入状态
24
Sendbyte1:
Sendbyte ;延时 DLTIME
DLTIME
IN TEST JZ POP MOV OUT RET ENDP PROC MOV LOOP RET ENDP END
AL,DX AL,1
Sendbyte1 AX
DX,DATA_ADDR DX,AL NEAR CX,10 $
START
;允许数据发送吗? ;发送
八、实验扩展及思考
请读者思考,如何修改程序实现8251的自发自收功能?
25
实验八 步进电机控制
一、实验目的与要求
1、了解步进电机的基本原理,掌握步进电机的转动编程方法 2、了解影响电机转速的因素有那些 二、实验设备
STAR系列实验仪一套、PC机一台。 三、实验内容
编写程序:使用G5区的键盘控制步进电机的正反转、调节转速,连续转动或转动指定步数;将相应的数据显示在G5区的数码管上。 四、控制原理
步进电机的驱动原理是通过它每相线圈的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲来控制,所以调节脉冲的频率便可改变步进电机的转速,微控制器最适合控制步进电机。另外,由于电机的转动惯量的存在,其转动速度还受驱动功率的影响,当脉冲的频率大于某一值(本实验为f.>100hz)时,电机便不再转动。
实验电机共有四个相位(A,B,C,D),按转动步骤可分单4拍(A->B->C->D->A),双4拍(AB->BC->CD->DA->AB)和单双8拍(A->AB->B->BC->C->CD->D->DA->A). 五、程序框图
26
开始 0->需要刷新显示标志 1->步进电机未转动过标志 1->转动方向标志(1:表示顺时针方向) 33H->下次送给步进电机值 5->步进电机转速 初始化8255(PC口输出) 初始化8253(计数器T0设置在模式2状态,BCD码计数,CLK0/210) 初始化8259(允许8253中断) 初始化8253中断向量 初始化显示缓冲区: (数码管第8位:0,顺时针方向;5、7位消隐;6位:转速; 1、2、3、4位:0,表示连续转动,其他值表示需要转动的步数) 调用显示子程序 有键按下 N 需要刷新显示标志=1 Y 0->需要刷新显示标志 调用步数调整子程序 关中断(终止步进电机转动) 键值>9 N Y Y Y Y 数码管的1、2、3位->2、3、4位 键值送给数码管的第一位 调用改变转向子程序 Y 键值=0AH N 键值=0BH 调用增速子程序 N 键值=0CH 调用减速子程序 N 键值=0DH 调用启动步进电机子程序 N
27
改变方向子程序:
开始 Y 转动方向标志=0 N 0->转动方向标志 1->送给数码管的第7位 步进电机未转动过标志 91H->下次送给步进电机值 下次送给步进电机值循环右移二次 Y 1->转动方向标志 0->送给数码管的第7位 N 步进电机未转动过标志 Y 33H->下次送给步进电机值 下次送给步进电机值循环左移二次 返回 增速子程序:
开始 Y 转速=11 N 转速+1 转速送给数码管第5位 返回
启动步进电机子程序:
开始 0->步进电机未转动过标志Y 取转动步数 取转速对应的延时值(转速延时) 转速延时< 50 N Y 初始转速延时=50 初始转速延时=转速延时 初始转速延时1=初始转速延时 开中断 返回 减速子程序:
开始 转速=0 Y N 转速-1 转速送给数码管第5位 返回
28
定时中断程序:
开始 N Y 初始转速延时 -1=0 Y 初始转速延时1=转速延时 N 初始转速延时1 - 1 初始转速延时=初始转速延时1 下次送给步进电机值->8255的PC口(控制步进电机转动一步) 转动方向标志=0 23Y 下次送给步进电机值循环右移一次 N 下次送给步进电机值循环左移一次 Y 转动步数=0 N 1->需要刷新显示标志转动步数减一 N 转动步数=0 Y 关中断 N 清中断标志 返回 六、实验原理图 DS3R7U68D(8255)PC3(8255)PC0AB(8255)PC1(8255)PC2CULN2003A1234567GNDI1I2I3I4I5I6I7470VCCO1O2O3O4O5O6O7916151413121110Motor StepVCCJP312M 七、实验步骤 1、主机连线说明: 29 E1区:A、B、C、D E5区:CLK E5区:CS、A0 E5区:A、B、C、D B3区:CS、A0 B3区:INT、INTA C5区:CS(8253)、A0、A1 C5区:GATE0 C5区:CLK0 C5区:OUT0 B4区:CS(8255)、A0、A1 —— B4区:PC0、PC1、PC2、PC3 —— B2区:2M —— A3区:CS5、A0 —— G5区:A、B、C、D —— A3区:CS1、A0 —— ES8688:INTR、INTA —— A3区:CS2、A0、A1 —— C1区:VCC —— B2区:1M —— B3区:IR0 —— A3区:CS3、A0、A1 2、调试程序,查看运行结果是否正确 八、演示程序
.MODEL TINY EXTRN Display8:NEAR, SCAN_KEY:NEAR IO8259_0 EQU 0F000H IO8259_1 EQU 0F001H Con_8253 EQU 0E003H T0_8253 EQU 0E000H IO8255_Con EQU 0D003H ;CS3 IO8255_PC EQU 0D002H .STACK 100 .DATA StepControl DB 0 ;下一次送给步进电机的值 buffer DB 8 DUP(0) ;显示缓冲区,8个字节 buffer1 DB 8 DUP(0) ;显示缓冲区,8个字节 SpeedNo DB 0 ;选择哪一级速度 StepDelay DB 0 ;转动一步后,延时常数 StartStepDelay DB 0;若选择速度过快,延时由长到短,最终使用对应延时常数 StartStepDelay1 DB 0 ;StartStepDelay bFirst DB 0 ;有没有转动过步进电机 bClockwise DB 0 ; =1 顺时针方向 =0 逆时针方向转动 bNeedDisplay DB 0 ;已转动一步,需要显示新步数 StepCount DW 0 ;需要转动的步数 StepDelayTab: DB 250,125,83,62,50,42,36,32,28,25,22,21 .CODE START: MOV AX,@DATA MOV DS,AX MOV ES,AX NOP MOV bFirst,1 ;有没有转动过步进电机 MOV bClockwise,1 ;顺时针方向 MOV StepControl,33H ;下一次送给步进电机的值 MOV SpeedNo,5 ;第五级速度
30
CALL CALL CALL CALL MOV MOV MOV MOV MOV MOV MOV MOV
MOV STAR2: LEA LEA MOV REP LEA
CALL STAR3: CALL JB CMP JZ MOV CALL
JMP STAR5: CLI CMP JNB MOV MOV MOV MOV MOV MOV MOV
JMP STAR1: CMP JNB LEA SUB SHL XOR MOV Init8255 Init8253 Init8259 WriIntver buffer,0 buffer+1,0 buffer+2,0 buffer+3,0 buffer+4,10H AL,SpeedNo buffer+5,AL buffer+6,10H buffer+7,0 SI,buffer DI,buffer1 CX,8 MOVSB
SI,buffer1 Display8 Scan_Key STAR5
bNeedDisplay,0 STAR3
bNeedDisplay,0 Step_SUB_1 STAR2
AL,10 STAR1
AH,buffer+2 buffer+3,AH AH,buffer+1 buffer+2,AH AH,buffer buffer+1,AH buffer,AL STAR2 AL,14 STAR3
SI,DriverTab AL,10 AL,1 AH,AH BX,AX
;显示缓冲器初始化
;终止步进电机转动
31
DriverTab:
Direction:
AntiClockwise:
AntiClockwise1:
Clockwise:
Clockwise1:
Direction1: Speed_up:
Speed_up1:
Speed_up2: Speed_Down:
Speed_Down1: Exec: JMP CS:[SI+BX]
DW Direction ;转动方向 DW Speed_up ;提高转速 DW Speed_Down ;降低转速
DW Exec ;步进电机根据方向、转速、步数开始转动
CMP bClockwise,0 JZ Clockwise MOV bClockwise,0 MOV buffer+7,1 CMP bFirst,0
JZ AntiClockwise1 MOV StepControl,91H JMP Direction1 MOV AL,StepControl ROR AL,2
MOV StepControl,AL JMP Direction1 MOV bClockwise,1 MOV buffer+7,0 CMP bFirst,0 JZ Clockwise1
MOV StepControl,33H JMP Direction1 MOV AL,StepControl ROL AL,2
MOV StepControl,AL JMP STAR2
MOV AL,SpeedNo CMP AL,11 JZ Speed_up2 INC AL
MOV SpeedNo,AL MOV buffer+5,AL JMP STAR2
MOV AL,SpeedNo CMP AL,0
JZ Speed_Down1 DEC AL
MOV SpeedNo,AL MOV buffer+5,AL JMP STAR2 MOV bFirst,0
CALL TakeStepCount LEA BX,StepDelayTab
32
Exec1:
TIMER0:
TIMER0_2:
TIMER0_3: TIMER0_4:
TIMER0_1: MOV AL,SpeedNo XLAT MOV StepDelay,AL CMP AL,50 JNB Exec1 MOV AL,50 MOV StartStepDelay,AL MOV StartStepDelay1,AL STI JMP STAR2 PUSH AX PUSH DX DEC StartStepDelay JNZ TIMER0_1 MOV AL,StartStepDelay1 CMP AL,StepDelay JZ TIMER0_2 DEC AL MOV StartStepDelay1,AL MOV StartStepDelay,AL MOV AL,StepControl MOV DX,IO8255_PC OUT DX,AL CMP bClockwise,0 JNZ TIMER0_3 ROR AL,1 JMP TIMER0_4 ROL AL,1 MOV StepControl,AL CMP StepCount,0 JZ TIMER0_1 MOV bNeedDisplay,1 DEC StepCount JNZ TIMER0_1
add sp,8 ;小写部分不允许使用单步、单步进入命令popf cli pushf sub sp,8 nop MOV DX,IO8259_0 MOV AL,20H OUT DX,AL POP DX
33
Step_SUB_1
Step_SUB_1_1: POP IRET PROC MOV LEA DEC CMP JNZ MOV AX NEAR CX,4 BX,buffer BYTE PTR [BX] BYTE PTR [BX],0FFH Step_SUB_1_2 BYTE PTR [BX],9
Step_SUB_1_2: Step_SUB_1 TakeStepCount
TakeStepCount Init8255
Init8255 Init8253 INC BX LOOP Step_SUB_1_1 RET ENDP PROC NEAR MOV AL,buffer+3 MOV BX,10 MUL BL ADD AL,buffer+2 MUL BL ADD AL,buffer+1 ADC AH,0 MUL BX ADD AL,buffer ADC AH,0 MOV StepCount,AX RET ENDP PROC NEAR MOV DX,IO8255_Con MOV AL,80H OUT DX,AL DEC DX MOV AL,0FFH OUT DX,AL RET ENDP PROC NEAR MOV DX,Con_8253 MOV AL,35H OUT DX,AL ;MOV DX,T0_8253 MOV AL,10H OUT DX,AL MOV AL,02H ;转动步数送入StepCount ;8255 PC输出 ;0FFH->8255 PC
计数器T0设置在模式2状态,BCD码计数
34
Init8253 Init8259
Init8259 WriIntver
WriIntver
OUT RET ENDP PROC MOV MOV OUT MOV MOV OUT MOV OUT MOV OUT RET ENDP PROC PUSH MOV MOV MOV LEA STOSW MOV STOSW POP RET ENDP END DX,AL NEAR
DX,IO8259_0 AL,13H DX,AL
DX,IO8259_1 AL,08H DX,AL AL,09H DX,AL AL,0FEH DX,AL NEAR ES AX,0 ES,AX DI,20H AX,TIMER0
AX,CS ES
START ;CLK0/210
九、实验扩展及思考
1、怎样改变电机的转速?
2、通过实验找出电机转速的上限,如何能进一步提高最大转速? 3、怎样能使电机反转?
35
附录一 汇编语言的存储模型
模型 TINY(微) 说明 所有数据及代码装入同一个代码段内,此模型的程序按.COM文件格式编写,要求程序从地址0100H处开始 这种模型包含两个段:一个KB的数据段和一个KB的代码段 这种模型包含一个KB的数据段和任意多个代码段,以供大程序使用 包含一个代码段和任意多个数据段 LARGE模型允许多个代码段和数据段 允许数据段大于KB,其他与LARGE模型相同 仅限于MASM6.X版本。FLAT模型使用一个512KB的段来存储所有的代码和数据,应注意的是该模型主要用于Windows NT中 SMALL(小) MEDIUM(中) COMPACT(压缩) LARGE(大) HUGE(巨型) FLAT(平展) 36
附录二 8279键值显示程序
;8279 键盘显示器接口芯片
;1.查询控制方式 2.输入时钟2MHZ 3.8279内部20分频(100KHZ) ;4.扫描计数器采用编码工作方式(通过外部138译码) ;5.显示按键值,第九次按键,清除显示 ;
8279 查询工作方式
.MODEL TINY
;8279命令字、状态字地址 ;8279读写数据口的地址
CMD_8279 EQU 0BF01H DATA_8279 EQU 0BF00H
PUBLIC GetKey, GetKeyA, GetKeyB, GetBCDKey, DisPlay8, SCAN_KEY PUBLIC F1
.STACK 100 .DATA
F1 DB ? LED_TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH DB 0FFH,0BFH
.CODE
PROC
NEAR
GetKey
CMP CX,0 JZ GetKey5 CMP CX,9 JNB GetKey5 PUSH PUSH PUSH PUSHF MOV AX,CX CLC RCR AX,1 DEC AX ADD DI,AX STD MOV AH,0 CMP F1,0
37
AX BX DX
JZ GetKey1
CALL
KeyScan
GetKey1: PUSH
AX
MOV AL,8 CLC SUB AL,CL CALL INIT8279_1 ;8279初始化
POP AX CMP F1,0
JNZ GetKey3
GetKey2: CALL KeyScan
;扫描
GetKey3: NOT AH
PUSH
AX
CMP AH,0 JZ GetKey4 ROR AL,4 MOV ES:[DI],AL
JMP GetKey6
GetKey4: OR AL,ES:[DI]
STOSB
GetKey6: POP AX
LEA BX,LED_TAB
XLAT
CALL WRITE_DATA ;显示输入值 LOOP GetKey2
POPF POP DX POP BX
POP AX
GetKey5: RET
GetKey
ENDP
;键值在AL中 KeyScan PROC
NEAR
CALL SCAN_KEY
JNB KeyScan
38
RET
KeyScan
ENDP
;CY =1,有键,键值在AL中;CY=0,没有按键 GetKeyA PROC
NEAR
CALL SCAN_KEY
RET
GetKeyA ENDP
;键值在AL中 GetKeyB PROC
NEAR
CALL SCAN_KEY
JNB GetKeyB
RET
GetKeyB
ENDP
;BCD码 ;F1是否需要先清除显示 GetBCDKey PROC NEAR
CMP CX,0 JZ GetBCDKey5 CMP CX,9 JNB GetBCDKey5 PUSH AX PUSH BX PUSH DX
PUSHF MOV AX,CX CLC RCR AX,1 DEC AX ADD DI,AX STD MOV AH,0 CMP F1,0 JZ GetBCDKey1
CALL
KeyScan
GetBCDKey1: PUSH AX
MOV AL,8
39
CLC SUB AL,CL CALL INIT8279_1 ;8279初始化
POP AX CMP F1,0
JNZ GetBCDKey3
GetBCDKey2: CALL
KeyScan
;扫描
GetBCDKey3: CMP AL,10 JNB GetBCDKey2 NOT AH PUSH
AX
CMP AH,0 JZ GetBCDKey4 ROR AL,4 MOV ES:[DI],AL
JMP GetBCDKey6
GetBCDKey4: OR AL,ES:[DI]
STOSB
GetBCDKey6: POP AX LEA BX,LED_TAB
XLAT
CALL WRITE_DATA ;显示输入值 LOOP GetBCDKey2
POPF POP DX POP BX
POP AX
GetBCDKey5: RET GetBCDKey ENDP
;显示以SI开始的8个数字(0~F) DisPlay8 PROC
NEAR
PUSH AX PUSH BX PUSH CX
PUSH
DX
40
MOV CX,8 ;计数用
LEA BX,LED_TAB
DisPlay81: MOV AL,[SI] ;不用显示的位调整
AND AL,7FH CMP AL,11H
JZ DisPlay82 ;负号
Display84: CMP AL,16
JB DisPlay82 MOV AL,10H
;显示段码中10H位对应的是暗码
DisPlay82: XLAT
XCHG TEST
AL,[SI] AL,80H
JZ Display83 XCHG
AL,[SI]
AND AL,7FH MOV [SI],AL
Display83: INC SI
LOOP
DisPlay81
MOV AL,0 CALL
INIT8279_1
MOV CX,8
Display85: DEC SI
MOV AL,[SI] CALL LOOP POP DX POP CX POP BX POP AX RET
ENDP
WRITE_DATA Display85
DisPlay8
;8279初始化
INIT8279 PROC NEAR
MOV DX,CMD_8279 ;CMD_8279为写命令地址、读状地址
MOV AL,34H ;可编程时钟设置,设置分频系数(20分频)
41
OUT DX,AL MOV AL,0 OUT DX,AL MOV AL,90H OUT DX,AL RET
;从第一个数码管开始移位显示
;8*8字符显示,左边输入,外部译码键扫描方式
INIT8279 ENDP INIT8279_1 PROC NEAR
PUSH
AX
MOV DX,CMD_8279 ;CMD_8279为写命令地址、读状地址
MOV AL,34H ;可编程时钟设置,设置分频系数(20分频) OUT DX,AL MOV AL,0 OUT DX,AL
CLEAR
;清显示
;8*8字符显示,左边输入,外部译码键扫描方式
CALL
POP AX OR AL,90H OUT DX,AL RET
INIT8279_1 ENDP CLEAR WAIT1: CLEAR
PROC NEAR MOV DX,CMD_8279
MOV AL,0DEH ; 清除命令 OUT DX,AL IN AL,DX TEST AL,80H JNZ WAIT1 RET ENDP
; 显示RAM清除完毕吗?
SCAN_KEY PROC NEAR
MOV DX,CMD_8279
IN AL,DX
;读状态
READ_FIFO: AND AL,7 READ:
JZ NO_KEY ;是否有键按下 MOV AL,40H
42
OUT DX,AL ;读FIFO RAM
MOV DX,DATA_8279 IN AL,DX AND AL,3FH
STC
;有键
SCAN_KEY1: RET NO_KEY:
SCAN_KEY ENDP KEY_NUM KEY_NUM
WRITE_DATA PROC NEAR
WRITE_DATA ENDP
CLC
;无键按下,清CY
JMP SCAN_KEY1
PROC NEAR AND AL,3FH RET ENDP
MOV DX,DATA_8279 OUT DX,AL RET
END
43
附录三 8279命令功能一览表
44
45
因篇幅问题不能全部显示,请点此查看更多更全内容