微机原理及接口技术实验指导_第1页
微机原理及接口技术实验指导_第2页
微机原理及接口技术实验指导_第3页
微机原理及接口技术实验指导_第4页
微机原理及接口技术实验指导_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-PAGE.z."微机原理及接口技术"实验指导书杨霞周林英编长安大学电子与控制工程学院2009年9月-.z.前言本实验指导是为适应各大、中专院校开设微机原理及应用方面的课程需做大量软硬件实验的需要而编写的,供学生编程用。完本钱实验指导中的实验,可使学生根本掌握8086/8088的构造原理、接口技术、程序设计技巧。手册中详细表达了各实验的目的、内容,列出了接线图、程序框图和实验步骤。主要学习内容为80*86语言实验环境配置、汇编源语言格式、输出字符、循环构造、子程序调用,以及加减乘除等指令操作、通用接口芯片的接口编程与使用。所有实验都是相互独立的,次序上也没有固定的先后关系,在使用本书进展教学时,教师可根据教学要求,选择相应实验。学习完毕后,要求学生能够独立编写出综合加减乘除等指令,以及循环构造、子程序调用等程序控制程序、看懂一般接口芯片电路图。目录实验一清零程序4实验二拆字程序6实验三数据区移动8实验四多分支程序设计10实验五多字节减法运算13实验六显示程序16实验七8251串口实验25实验八步进电机控制29附录一汇编语言的存储模型36附录二8279键值显示程序37实验一清零程序一、实验目的掌握8088汇编语言程序设计和调试方法。二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容把RAM区内4000H-40FFH单元的内容清零。四、程序框图五、源程序清单.MODEL TINY.STACK100.DATA.CODE ORG0100HSTART: MOVB*,4000H MOVA*,0000H MOVC*,80HL1:MOV[B*],A*INCB* INCB* LOOPL1JMP$ ENDSTART六、实验步骤手动修改RAM区内4000H-40FFH的内容,连续或单步方式运行程序,检查4000-40FFH内容执行程序前后的变化。

七、思考1、把4000H-40FFH中的内容改成FF,如何修改程序。2、把4000H-40FFH中的内容改成00~FF,如何修改程序。-.z.实验二拆字程序一、实验目的掌握汇编语言设计和调试方法。

二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容把4000H单元的内容拆开,高位送4001H低位,低位送4002H低位,4001H、4002H的高位清零,一般本程序用于把数据送显示缓冲区时用。四、程序框图五、源程序.MODEL TINY.STACK.DATA.CODESTART: MOVB*,4000HMOVAL,[B*]MOVAH,ALMOVCL,4SHRAH,CLINCB*MOV[B*],AHANDAL,0FHINCB*MOV[B*],ALJMP$六、实验步骤手动修改4000H的内容,用连续或单步方式运行程序,检查4000H-4002H中内容变化情况。七、思考1.如何用断点方式调试本程序。2.把4000H、4001H单元低位的内容合成一字送4002H单元。-.z.实验三数据区移动一、实验目的掌握RAM中的数据操作。二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容把4100H源RAM区首址内的16字节数据传送到4200H目标RAM区。四、设计思想程序要求把内存中*一数据区(称为源数据块)传送到另一存储区(称为目的数据块)。源数据块和目的数据块在存储器中可能有三种情况,如下列图:对于两个数据块别离的情况,如图(a),数据的传送从数据块的首址开场,或者从数据块的末址开场均可。但对于有局部重叠的情况,则要加以分析,否则重叠局部会因"搬移〞而遭破坏。

可以得出以下结论:当源数据首址>目的块首址时,从数据块首址开场传送数据。当源数据块首址<目的块首址时,从数据块末地址开场传送数据。五、程序框图六、源程序清单.MODEL TINY.STACK.DATA.CODEORG0100HSTART0:MOVC*,0010H MOVSI,4100HMOVDI,4200H CMPSI,DIJAA42ADDSI,C* ADDDI,C*A41:DECSI DECDI MOVAL,[SI] MOV[DI],AL LOOPA41 JMP$A42:MOVAL,[SI] MOV[DI],AL INCSIINCDI LOOPA42 JMP$ENDSTART0七、实验步骤调试运行3060程序,检查4100-410FH中内容是否和4200-420FH中内容完全一致。八、思考1.把4200H源RAM区首址内的16字节数据传送到4100H目标RAM区。2.把4100H源RAM区首址内的16字节数据传送到410AH目标RAM区。实验四多分支程序设计一、实验目的掌握汇编语言的编程,熟悉程序散转的设计方法。二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容 编写程序,根据接收到的键值,作不同的处理。四、设计思想多分支构造相当于一个多路开关,在程序设计中通常是根据*存放器或*单元的内容进展程序转移。在设计多分支转移程序时,如果分支太多,则平均转移速度太慢,本实验采用转移地址表实现多分支转移,可以提高平均转移速度。五、程序框图六、实验步骤 1、连线说明:E5区:CLK——B2区:2ME5区:CS——A3区:CS5E5区:A0——A3区:A0E5区:A、B、C、D——G5区:A、B、C、D2、在G5区的键盘上输入1位数3、使用各种手段调试程序3、结果显示在G5区的数码管上-.z.七、源程序清单;调用GetKeyB返回键值,根据键值执行相应的程序.MODEL TINYE*TRNDisplay8:NEAR,GetKeyB:NEAR.STACK100.DATABUFFERDB8DUP(").CODESTART:MOVA*,DATAMOVDS,A*MOVES,A*NOPSTART1:CALLGetKeyB;键值存放在AL中CMP AL,8JB START2*ORAL,AL;大于7,作0处理START2:*ORAH,AHMOVB*,A*SHLB*,1LEADI,Table_1JMPCS:[DI][B*]Table_1: DWKey0,Key1,Key2,Key3,Key4,Key5,Key6,Key7Key0:MOVAL,1JMP KeyKey1:MOVAL,2JMPKeyKey2:MOV AL,3JMP KeyKey3:MOVAL,4JMPKeyKey4:MOV AL,5JMP KeyKey5:MOVAL,6JMP KeyKey6:MOVAL,7JMPKeyKey7:MOVAL,8JMPKeyKey: MOV C*,8LEA DI,BUFFERREPSTOSBLEASI,BUFFERCALL Display8MOVC*,60000LOOP$;延时JMPSTART1END START-.z.实验五多字节减法运算一、实验目的掌握BCD码、补码,熟悉多文件、多模块汇编语言程序设计的方法。二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容从键盘上输入4位被减数、减数,实现双字节BCD码(四位数)的减法,结果显示在数码管上;进一步熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;熟悉查看特殊功能存放器、CS段、DS段存贮器的各种方法。四、程序框图五、实验步骤 1、连线说明:E5区:CLK——B2区:2ME5区:CS——A3区:CS5E5区:A0——A3区:A0E5区:A、B、C、D——G5区:A、B、C、D2、在G5区的键盘上输入4位被减数、减数3、结果显示在G5区的数码管上六、源程序清单 .MODEL TINY .STACK 100 .DATA Result DB 5DUP(") minuend DW 88H,44H,66H,00H,99H ;被减数N1 = $-minuend ;被减数长度subtrahend DW 22H,55H,88H ;减数N2 = $-subtrahend ;减数长度 .CODE START: MOV A*,DATA MOV DS,A* MOV ES,A* PUSHDS*ORA*,A*PUSHA*STD ;清方向标志 ;显示被减数;LEASI,minuend;ADDSI,N1-1;MOVC*,N1;CALLE*21;CALLPP2; ;显示减数;LEASI,subtrahend;ADDSI,N2-1;MOVC*,N2;CALLE*21;CALLPP2 ;计算结果CALLE*22 ;显示结果LEASI,minuendADDSI,N1-1MOVC*,N1CALLE*21jmp$;模块名称:E*21;功能:显示运算结果;入口参数:;出口参数:E*21PROCnearPUSHA*PUSHD*F:LODSB LEAB*,Result ADDB*,C* MOV[B*],AL ;用十六进制数显示一个字节的内容;MOVDL,'' ;显示一个空格符;MOVAH,2 ;;INT21H ;LOOPFPOPD*POPA*RETE*21ENDP;模块名称:E*22;功能:进展多字节减法运算;入口参数:;出口参数:相减的那结果存在E*22PROCnearLEASI,minuendLEADI,subtrahendMOVB*,N1MOVC*,N2CLCMM:MOVAL,[DI]SBB[SI],ALINCDIINCSIDECB*LOOPMMM1:JZE*IT22 ;因LOOP指令对标志位无影响,所以此处的转移是对DECB*而言。;处理被减数的位数多于减数的位数的情况JNCE*IT22 ;无借位则直接退出 SBBBYTEPTR[SI],0 ;影响CF标志位 INCSI ;不影响CF标志位DECB* ;不影响CF标志位,影响ZF标志位JMPM1E*IT22:RETE*22ENDPENDstart.MODELTINYE*TRNDisplay8:NEAR,GetBCDKey:NEARE*TRNF1:BYTE.STACK100.DATABUFFERDB8DUP(")minuendDW1DUP(") ;被减数subtrahendDW1DUP(");减数.CODESTART:MOVA*,DATAMOVDS,A*MOV ES,A*NOPMOV F1,0 ;先去除显示,再接收键输入START1:LEADI,minuendMOVC*,4 ;按键次数CALLGetBCDKey;得到双字节十进制数(被减数)MOV F1,1 ;接收到第一个键,才去除显示LEADI,subtrahendMOVC*,4 ;按键次数CALL GetBCDKey;得到双字节十进制数(减数)MOV A*,minuendMOVB*,subtrahendMOVDL,10HCMP A*,B*JNBSTART2*CHGA*,B*MOV DL,11H;负数START2:SUBAL,BL;低位DAS*CHGAL,AHSBBAL,BH;高位DAS*CHGAL,AHCLDLEADI,BUFFER;存放显示结果CALL B1toB2;低位MOVAL,AHCALL B1toB2;高位MOVAL,10H;最高三位消隐STOSBSTOSBSTOSBSTOSBLEASI,BUFFER+3MOVC*,3CALL BlackDisplay;将高位0消隐LEASI,BUFFERCALLDisplay8JMPSTART1;将一个字节压缩BCD码转换成二个字节非压缩BCD码B1toB2PROC NEARPUSH A*AND AL,0FHSTOSBPOPA*ANDAL,0F0HROR AL,4STOSBRETB1toB2ENDPBlackDisplay PROC NEAR;将高位0消隐BlackDisplay1:MOVAL,[SI] CMPAL,0JNZ E*itMOV AL,10HMOV[SI],ALDEC SILOOPBlackDisplay1E*it:CLDMOV[SI+1],DLRETBlackDisplay ENDPEND START七、思考从键盘上输入4位被加数、加数,实现双字节BCD码(四位数)的加法,结果显示在数码管上。-.z.实验六显示程序一、实验目的1、熟悉8255的功能,理解LED显示原理及控制方法;2、学会使用LED点阵液晶显示字体和图形;3、认真预习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告。二、实验设备STAR系列实验仪一套、PC机一台。三、实验内容1、编写程序,用8255的PA、PB口控制LED的位选和段选,〔1〕编写程序,控制8位数码管跑马灯形式显示0;〔2〕编写程序,控制8位数码管静态显示指定字符1-8;〔3〕编写程序,控制8位数码管动态循环显示8位字符;2、按图连接线路,运行程序,观察实验结果。四、实验原理图五、实验步骤1、主机连线说明:B4区:CS〔8255〕——A3区:CS1B4区:A0、A1——A3区:A0、A1B4区:JP56、JP53——G5区:JP41、JP422、运行程序,验证显示结果。六:源程序(1)控制8位数码管依次显示0;.MODEL TINY.STACK 100.DATAIO8255_Con EQU 0F003H ;CS3IO8255_A EQU 0F000H ;AIO8255_B EQU 0F001H ;BLED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71H .CODESTART: MOV A*,DATA MOV DS,A* MOV ES,A* MOV D*,IO8255_Con MOV AL,80H ;方式0,A,B,C均为输出 OUT D*,AL MOV AL,0FEH ;8255PC输出 MOV C*,8GOON: MOV D*,IO8255_A ;位选 OUT D*,AL ROL AL,1 MOV AH,AL MOV D*,IO8255_B MOV AL,03FH OUT D*,AL MOV AL,AH ;0FFH->8255PA CALL Delay JMP GOONDelay PROC NEAR PUSH C* MOV C*,20000Delay1: LOOP Delay1 POP C* RET ENDP END START(2)编写程序,控制8位数码管依次显示任意指定字符〔0-F〕;.MODEL TINY.STACK 100.MODEL TINY.STACK 100.DATAIO8255_Con EQU 0F003H ;CS3IO8255_A EQU 0F000H ;AIO8255_B EQU 0F001H ;BF1 DB0LED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71H .CODESTART: MOV A*,DATA MOV DS,A* MOV ES,A*; MOV F1,0 MOV D*,IO8255_Con MOV AL,80H ;方式0,A,B,C均为输出 OUT D*,AL MOV AL,0FEH ;8255PC输出 MOV C*,8GOON: MOV D*,IO8255_B;段选 MOV B*,LED_TAB;装入表头 PUSH A* MOV AL,F1 *LAT ;AL放字形码 OUT D*,AL POP A* MOV AL,AH MOV D*,IO8255_A ;位选 OUT D*,AL ROL AL,1 MOV AH,AL INC F1 ;0FFH->8255PA CALL Delay JMP GOONDelay PROC NEAR PUSH C* MOV C*,800Delay1: LOOP Delay1 POP C* RET ENDP END START(3)编写程序,控制8位数码管同时显示0、1、……F:.MODEL TINY.STACK 100.MODEL TINY.STACK 100.DATAIO8255_Con EQU 0F003H ;CS3IO8255_A EQU 0F000H ;AIO8255_B EQU 0F001H ;BLED_TAB: DB 03FH,06H,05BH,04FH,66H,6DH,7DH,07H DB 07FH,6FH,77H,7CH,39H,05EH,79H,71HF1 DB 0 .CODESTART: MOV A*,DATA MOV DS,A* MOV ES,A* MOV D*,IO8255_Con MOV AL,80H ;方式0,A,B,C均为输出 OUT D*,AL MOV A*,0FEFEH ;8255PC输出 MOV C*,1600 LEA B*,LED_TABGOON: MOV AL,F1 *LAT MOV D*,IO8255_B ;段选 OUT D*,AL MOV AL,AH MOV D*,IO8255_A ;位选 OUT D*,AL ROL AL,1 MOV AH,AL CALL DL500ms LOOP GOON ;8段数码管显示当前值 MOV C*,1600 ;8段数码管显示完成,则显示下个字符 MOV AL,AH ;; CALL DL3S INC F1 CMP F1,10H ;是否显示完了 JZ E*IT JMP GOONDL500ms PROC NEAR PUSH C* MOV C*,400DL500ms1: LOOP DL500ms1 POP C* RETDL500ms ENDPE*IT: END START七、思考〔4〕编写程序,控制8位数码管显示当前日期以及时间;-.z.实验七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个数据位,一个停顿位,偶校验返回接收10个字节数据子程序:开场开场读入状态有数据读数据->缓冲区接收了10个字节数据返回NNYY发送了10个字节数据子程序:开场开场读入状态有数据发送发送了10个字节数据NNYY返回五、实验原理图六、实验步骤1、连线说明:C5区:CS〔8253〕、A0、A1——A3区:CS5、A0、A1C5区:CLK0——B2区:2MC5区:GATE0——C1区的VCCC5区:OUT0——C5区:R*C、T*CC5区:CS〔8251〕、C/D——A3区:CS1、A0C5区:CLK——B2区:4MC5区:R*D、T*D——E7区:R*D、T*D2、运行程序3、运行"串口助手(ComPort.E*E)〞,设置串口(波特率4800,8个数据位,一个停顿位,偶校验),翻开串口,选择"HE*发送〞、"HE*显示〞,向8251发送10个字节数据(输入数据之间用空格分隔),是否能接收到10个字节数据,接收到的数据是否与发送数据一致。4、改变传输数据的数目,重复实验,观察结果。七、演示程序 .MODELTINY;使用8253的计数器0,外接2Mhz,经26分频后,送给8251,产生4800bpsCTL_ADDREQU0FF01H;控制字或状态字DATA_ADDREQU0FF00H ;读写数据W_8253_T0EQU0BF00H ;计数器0地址W_8253_CEQU0BF03H;控制字.STACK100.DATAReceive_BufferDB10DUP(0);承受缓冲器Send_BufferEQUReceive_Buffer;发送缓冲器.CODESTART:MOVA*,DATAMOV DS,A*MOVES,A*NOPCALL INIT_8253CALLINIT_8251START1:MOV C*,10CALL Receive_GroupMOVC*,10CALLSend_GroupJMPSTART1INIT_8253PROCNEARMOVD*,W_8253_CMOVAL,37H;定时器0,方式3OUTD*,ALMOVD*,W_8253_T0MOVAL,26H;BCD码26(2000000/26)=16*4800OUTD*,ALMOVAL,0OUT D*,ALRETINIT_8253ENDPINIT_8251PROCNEARCALLRESET_8251MOV D*,CTL_ADDRMOVAL,7EH;波特率系数为16,8个数据位OUTD*,AL;一个停顿位,偶校验CALLDLTIME;延时MOV AL,15H ;允许接收和发送发送数据,清错误标志OUTD*,ALCALL DLTIMERETINIT_8251ENDPReset_8251PROCNEARMOVD*,CTL_ADDRMOVAL,0OUTD*,AL;向控制口写入"0"CALLDLTIME;延时,等待写操作完成OUTD*,AL;向控制口写入"0"CALLDLTIME;延时OUTD*,AL;向控制口写入"0"CALL DLTIME;延时MOVAL,40H;向控制口写入复位字40HOUTD*,ALCALLDLTIMERETReset_8251ENDP;承受一组数据,C*--承受数目Receive_GroupPROCNEARLEA DI,Receive_BufferReceive_Group1:CALL Receive_ByteSTOSBLOOPReceive_Group1RETReceive_GroupENDP;承受一个字节Receive_BytePROCNEARMOVD*,CTL_ADDRReceive_Byte1:INAL,D*;读入状态TEST AL,2JZReceive_Byte1;有数据吗?MOVD*,DATA_ADDR ;有IN AL,D*RETReceive_ByteENDP;发送一组数据,C*--发送数目Send_GroupPROCNEARLEASI,Send_BufferSend_Group1:LODSBCALLSendByteLOOPSend_Group1RETSend_GroupENDP;发送一个字节SendbytePROCNEARPUSH A*MOVD*,CTL_ADDR;读入状态Sendbyte1:INAL,D*TEST AL,1JZSendbyte1;允许数据发送吗?POPA*;发送MOVD*,DATA_ADDROUTD*,ALRETSendbyte ENDP;延时DLTIMEPROCNEARMOV C*,10LOOP $RETDLTIMEENDPENDSTART八、实验扩展及思考请读者思考,如何修改程序实现8251的自发自收功能?实验八步进电机控制一、实验目的与要求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〕.五、程序框图-.z.NNYNYNNNN0->需要刷新显示标志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,表示连续转动,其他值表示需要转动的步数)调用显示子程序有键按下需要刷新显示标志=10->需要刷新显示标志调用步数调整子程序关中断(终止步进电机转动)数码管的1、2、3位->2、3、4位键值送给数码管的第一位调用改变转向子程序键值>9键值=0AH调用增速子程序调用减速子程序调用启动步进电机子程序Y键值=0BH键值=0CH键值=0DH开场YYY改变方向子程序:YYYNNY开场转动方向标志=091H->下次送给步进电机值下次送给步进电机值循环右移二次1->转动方向标志0->送给数码管的第7位步进电机未转动过标志33H->下次送给步进电机值下次送给步进电机值循环左移二次0->转动方向标志1->送给数码管的第7位步进电机未转动过标志返回启动步进电机子程序:YYNY开场0->步进电机未转动过标志取转动步数取转速对应的延时值(转速延时)初始转速延时1=初始转速延时转速延时<50初始转速延时=50返回开中断初始转速延时=转速延时增速子程序:YYN开场转速=11转速+1转速送给数码管第5位返回减速子程序:NNY开场转速=0转速-1转速送给数码管第5位返回定时中断程序:NNNYNNNYYNY初始转速延时1=转速延时初始转速延时-1=0时初始转速延时1-1初始转速延时=初始转速延时11-1转动方向标志=0时下次送给步进电机值循环右移一次1-1转动步数=0时1->需要刷新显示标志转动步数减一1-1转动步数=0时关中断清中断标志开场下次送给步进电机值循环左移一次1-1返回下次送给步进电机值->8255的PC口〔控制步进电机转动一步〕Y六、实验原理图七、实验步骤1、主机连线说明:E1区:A、B、C、D——B4区:PC0、PC1、PC2、PC3E5区:CLK——B2区:2ME5区:CS、A0——A3区:CS5、A0E5区:A、B、C、D——G5区:A、B、C、DB3区:CS、A0——A3区:CS1、A0B3区:INT、INTA——ES8688:INTR、INTAC5区:CS(8253)、A0、A1——A3区:CS2、A0、A1C5区:GATE0——C1区:VCCC5区:CLK0——B2区:1MC5区:OUT0——B3区:IR0B4区:CS(8255)、A0、A1——A3区:CS3、A0、A12、调试程序,查看运行结果是否正确八、演示程序.MODELTINYE*TRNDisplay8:NEAR,SCAN_KEY:NEARIO8259_0EQU0F000HIO8259_1EQU 0F001HCon_8253 EQU 0E003HT0_8253EQU 0E000HIO8255_ConEQU 0D003H;CS3IO8255_PCEQU0D002H.STACK100.DATAStepControlDB0;下一次送给步进电机的值bufferDB8DUP(0);显示缓冲区,8个字节buffer1DB8DUP(0);显示缓冲区,8个字节SpeedNoDB0;选择哪一级速度StepDelayDB0 ;转动一步后,延时常数StartStepDelayDB0;假设选择速度过快,延时由长到短,最终使用对应延时常数StartStepDelay1DB0 ;StartStepDelaybFirstDB0;有没有转动过步进电机bClockwiseDB0 ;=1顺时针方向=0逆时针方向转动bNeedDisplayDB0;已转动一步,需要显示新步数StepCountDW0 ;需要转动的步数StepDelayTab:DB250,125,83,62,50,42,36,32,28,25,22,21.CODESTART:MOVA*,DATAMOVDS,A*MOVES,A*NOPMOVbFirst,1;有没有转动过步进电机MOVbClockwise,1 ;顺时针方向MOVStepControl,33H;下一次送给步进电机的值MOVSpeedNo,5;第五级速度CALLInit8255CALLInit8253CALLInit8259CALLWriIntverMOVbuffer,0;显示缓冲器初始化MOVbuffer+1,0MOVbuffer+2,0MOVbuffer+3,0MOVbuffer+4,10HMOV AL,SpeedNoMOVbuffer+5,ALMOVbuffer+6,10HMOV buffer+7,0STAR2:LEASI,bufferLEA DI,buffer1MOVC*,8REPMOVSBLEA SI,buffer1CALLDisplay8STAR3:CALLScan_KeyJBSTAR5CMP bNeedDisplay,0JZSTAR3MOVbNeedDisplay,0CALLStep_SUB_1JMP STAR2STAR5:CLI;终止步进电机转动CMP AL,10JNBSTAR1MOVAH,buffer+2MOV buffer+3,AHMOVAH,buffer+1MOV buffer+2,AHMOVAH,bufferMOVbuffer+1,AHMOVbuffer,ALJMP STAR2STAR1:CMPAL,14JNBSTAR3LEA SI,DriverTabSUB AL,10SHLAL,1*OR AH,AHMOVB*,A*JMPCS:[SI+B*]DriverTab:DWDirection;转动方向DWSpeed_up ;提高转速DWSpeed_Down;降低转速DWE*ec ;步进电机根据方向、转速、步数开场转动Direction:CMP bClockwise,0JZClockwiseMOV bClockwise,0MOVbuffer+7,1AntiClockwise:CMPbFirst,0JZAntiClockwise1MOVStepControl,91HJMPDirection1AntiClockwise1:MOVAL,StepControlRORAL,2MOV StepControl,ALJMP Direction1Clockwise:MOVbClockwise,1MOV buffer+7,0CMPbFirst,0JZClockwise1MOV StepControl,33HJMPDirection1Clockwise1:MOV AL,StepControlROL AL,2MOVStepControl,ALDirection1:JMP STAR2Speed_up:MOVAL,SpeedNoCMP AL,11JZ Speed_up2Speed_up1:INCALMOVSpeedNo,ALMOV buffer+5,ALSpeed_up2:JMPSTAR2Speed_Down:MOV AL,SpeedNoCMP AL,0JZ Speed_Down1DECALMOV SpeedNo,ALMOVbuffer+5,ALSpeed_Down1:JMPSTAR2E*ec:MOVbFirst,0CALLTakeStepCountLEAB*,StepDelayTabMOV AL,SpeedNo*LATMOV StepDelay,ALCMPAL,50JNB E*ec1MOV AL,50E*ec1:MOVStartStepDelay,ALMOV StartStepDelay1,ALSTIJMPSTAR2TIMER0:PUSHA*PUSHD*DECStartStepDelayJNZTIMER0_1MOVAL,StartStepDelay1CMP AL,StepDelayJZTIMER0_2DEC ALMOV StartStepDelay1,ALTIMER0_2:MOVStartStepDelay,ALMOVAL,StepControlMOVD*,IO8255_PCOUTD*,ALCMPbClockwise,0JNZ TIMER0_3ROR AL,1JMPTIMER0_4TIMER0_3:ROL AL,1TIMER0_4:MOVStepControl,ALCMPStepCount,0JZ TIMER0_1MOV bNeedDisplay,1DECStepCountJNZTIMER0_1addsp,8;小写局部不允许使用单步、单步进入命令popfclipushfsubsp,8nopTIMER0_1:MOVD*,IO8259_0MOV AL,20HOUTD*,ALPOP D*POPA*IRETStep_SUB_1PROCNEARMOV C*,4LEA B*,bufferStep_SUB_1_1:DECBYTEPTR[B*]CMPBYTEPTR[B*],0FFHJNZStep_SUB_1_2MOVBYTEPTR[B*],9INCB*LOOPStep_SUB_1_1Step_SUB_1_2:RETStep_SUB_1ENDPTakeStepCountPROCNEARMOV AL,buffer+3;转动步数送入StepCountMOVB*,10MUL BLADD AL,buffer+2MULBLADD AL,buffer+1ADC AH,0MULB*ADDAL,bufferADCAH,0MOVStepCount,A*RETTakeStepCountENDPInit8255 PROCNEARMOVD*,IO8255_ConMOV AL,80HOUTD*,AL;8255PC输出DECD*MOV AL,0FFHOUTD*,AL;0FFH->8255PCRETInit8255 ENDPInit8253 PROCNEARMOVD*,Con_8253MOVAL,35HOUTD*,AL;计数器T0设置在模式2状态,BCD码计数MOVD*,T0_8253MOVAL,10HOUTD*,ALMOVAL,02HOUTD*,AL;CLK0/210RETInit8253ENDPInit8259PROCNEARMOVD*,IO8259_0MOVAL,13HOUTD*,ALMOVD*,IO8259_1MOV AL,08HOUTD*,ALMOVAL,09HOUTD*,ALMOVAL,0FEHOUTD*,ALRETInit8259ENDPWriIntverPROCNEARPUSHESMOV A*,0MOV ES,A*MOVDI,20HLEAA*,TIMER0STOSWMOVA*,CSSTOSWPOP ESRETWriIntverENDPEND START九、实验扩展及思考1、怎样改变电机的转速?2、通过实验找出电机转速的上限,如何能进一步提高最大转速? 3、怎样能使电机反转?-.z.附录一汇编语言的存储模型模型说明TINY(微)所有数据及代码装入同一个代码段内,此模型的程序按.COM文件格式编写,要求程序从地址0100H处开场SMALL(小)这种模型包含两个段:一个64KB的数据段和一个64KB的代码段MEDIUM(中)这种模型包含一个64KB的数据段和任意多个代码段,以供大程序使用COMPACT(压缩)包含一个代码段和任意多个数据段LARGE(大)LARGE模型允许多个代码段和数据段HUGE〔巨型〕允许数据段大于64KB,其他与LARGE模型一样FLAT〔平展〕仅限于MASM6.*版本。FLAT模型使用一个512KB的段来存储所有的代码和数据,应注意的是该模型主要用于WindowsNT中-.z.附录二8279键值显示程序;8279键盘显示器接口芯片;1.查询控制方式2.输入时钟2MHZ3.8279内部20分频〔100KHZ〕;4.扫描计数器采用编码工作方式〔通过外部138译码〕;5.显示按键值,第九次按键,去除显示; 8279查询工作方式 .MODEL TINYCMD_8279EQU0BF01H ;8279命令字、状态字地址DATA_8279EQU0BF00H ;8279读写数据口的地址PUBLIC GetKey,GetKeyA,GetKeyB,GetBCDKey,DisPlay8,SCAN_KEYPUBLIC F1 .STACK 100 .DATAF1 DB"LED_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH DB 0FFH,0BFH .CODEGetKey PROC NEAR CMP C*,0 JZ GetKey5 CMP C*,9 JNB GetKey5 PUSH A*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论