还剩45页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《微机原理及接口技术》实验指导书杨霞周林英编长安大学电子与控制工程学院2009年9月前言本实验指导是为适应各大、中专院校开设微机原理及应用方面的课程需做大量软硬件实验的需要而编写的,供学生编程用完成本实验指导中的实验,可使学生基本掌握8086/8088的结构原理、接口技术、程序设计技巧手册中详细叙述了各实验的目的、内容,列出了接线图、程序框图和实验步骤主要学习内容为80X86语言实验环境配置、汇编源语言格式、输出字符、循环结构、子程序调用,以及加减乘除等指令操作、通用接口芯片的接口编程与使用所有实验都是相互__的,次序上也没有固定的先后关系,在使用本书进行教学时,教师可根据教学要求,选择相应实验学习结束后,要求学生能够__编写出综合加减乘除等指令,以及循环结构、子程序调用等程序控制程序、看懂一般接口芯片电路图目录TOC\o1-3\h\z\u实验一清零程序4实验二拆字程序6实验三数据区__8实验四多分支程序设计10实验五多字节减法运算13实验六显示程序16实验七8251串口实验25实验八步进电机控制29附录一汇编语言的存储模型36附录二8279键值显示程序37实验一清零程序
一、实验目的 掌握8088汇编语言程序设计和调试方法
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容 把RAM区内4000H-40FFH单元的内容清零
四、程序框图
五、源程序清单.MODELTINY.STACK
100.DATA.CODEORG0100HSTART:MOVBX4000HMOVAX0000HMOVCX80HL1:MOV[BX]AXINCBXINCBXLOOPL1JMP$ENDSTART
六、实验步骤 手动修改RAM区内4000H-40FFH的内容,连续或单步方式运行程序,检查4000-40FFH内容执行程序前后的变化
七、思考
1、把4000H-40FFH中的内容改成FF,如何修改程序
2、把4000H-40FFH中的内容改成00~FF,如何修改程序实验二拆字程序
一、实验目的 掌握汇编语言设计和调试方法
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容 把4000H单元的内容拆开,高位送4001H低位,低位送4002H低位,4001H、4002H的高位清零,一般本程序用于把数据送显示缓冲区时用
四、程序框图
五、源程序.MODELTINY.STACK.DATA.CODESTART:MOVBX4000HMOVAL[BX]MOVAHALMOVCL4SHRAHCLINCBXMOV[BX]AHANDAL0FHINCBXMOV[BX]ALJMP$
六、实验步骤 手动修改4000H的内容,用连续或单步方式运行程序,检查4000H-4002H中内容变化情况
七、思考
1.如何用断点方式调试本程序
2.把4000H、4001H单元低位的内容合成一字送4002H单元实验三数据区__
一、实验目的 掌握RAM中的数据操作
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容 把4100H源RAM区首址内的16字节数据传送到4200H目标RAM区
四、设计思想 程序要求把内存中某一数据区称为源数据块传送到另一存储区称为目的数据块源数据块和目的数据块在存储器中可能有三种情况,如下图 对于两个数据块分离的情况,如图a,数据的传送从数据块的首址开始,或者从数据块的末址开始均可但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏 可以得出以下结论当源数据首址>目的块首址时,从数据块首址开始传送数据当源数据块首址<目的块首址时,从数据块末地址开始传送数据
五、程序框图
六、源程序清单.MODELTINY.STACK.DATA.CODEORG0100HSTART0:MOVCX0010HMOVSI4100HMOVDI4200HCMPSIDIJAA42ADDSICXADDDICXA41:DECSIDECDIMOVAL[SI]MOV[DI]ALLOOPA41JMP$A42:MOVAL[SI]MOV[DI]ALINCSIINCDILOOPA42JMP$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、D
2、在G5区的键盘上输入1位数
3、使用各种手段调试程序
3、结果显示在G5区的数码管上
七、源程序清单;调用GetKeyB返回键值根据键值执行相应的程序.MODELTINYEXTRNDisplay8:NEARGetKeyB:NEAR.STACK
100.DATABUFFERDB8DUP.CODESTART:MOVAX@DATAMOVDSAXMOVESAXNOPSTART1:CALLGetKeyB;键值存放在AL中CMPAL8JBSTART2XORALAL;大于7,作0处理START2:XORAHAHMOVBXAXSHLBX1LEADITable_1JMPCS:[DI][BX]Table_1:DWKey0Key1Key2Key3Key4Key5Key6Key7Key0:MOVAL1JMPKeyKey1:MOVAL2JMPKeyKey2:MOVAL3JMPKeyKey3:MOVAL4JMPKeyKey4:MOVAL5JMPKeyKey5:MOVAL6JMPKeyKey6:MOVAL7JMPKeyKey7:MOVAL8JMPKeyKey:MOVCX8LEADIBUFFERREPSTO__LEASIBUFFERCALLDisplay8MOVCX60000LOOP$;延时JMPSTART1ENDSTART实验五多字节减法运算
一、实验目的 掌握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、D
2、在G5区的键盘上输入4位被减数、减数
3、结果显示在G5区的数码管上
六、源程序清单.MODELTINY.STACK
100.DATAResultDB5DUPminuendDW88H44H66H00H99H;被减数N1=$-minuend;被减数长度subtrahendDW22H55H88H;减数N2=$-subtrahend;减数长度.CODESTART:MOVAX@DATAMOVDSAXMOVESAXPUSHDSXORAXAXPUSHAXSTD;清方向标志;显示被减数;LEASIminuend;ADDSIN1-1;MOVCXN1;CALLEX21;CALLPP2;;显示减数;LEASIsubtrahend;ADDSIN2-1;MOVCXN2;CALLEX21;CALLPP2;计算结果CALLEX22;显示结果LEASIminuendADDSIN1-1MOVCXN1CALLEX21jmp$;模块名称EX21;功能显示运算结果;入口参数:;出口参数:EX21PROCnearPUSHAXPUSHDXF:LOD__LEABXResultADDBXCXMOV[BX]AL;用十六进制数显示一个字节的内容;MOVDL;显示一个空格符;MOVAH2;;INT21H;LOOPFPOPDXPOPAXRETEX21ENDP;模块名称EX22;功能进行多字节减法运算;入口参数:;出口参数:相减的那结果存在EX22PROCnearLEASIminuendLEADIsubtrahendMOVBXN1MOVCXN2CLCMM:MOVAL[DI]__B[SI]ALINCDIINCSIDECBXLOOPMMM1:JZEXIT22;因LOOP指令对标志位无影响,所以此处的转移是对DECBX而言;处理被减数的位数多于减数的位数的情况JNCEXIT22;无借位则直接退出__BBYTEPTR[SI]0;影响CF标志位INCSI;不影响CF标志位DECBX;不影响CF标志位,影响__标志位JMPM1EXIT22:RETEX22ENDPENDstart.MODELTINYEXTRNDisplay8:NEARGetBCDKey:NEAREXTRNF1:BYTE.STACK
100.DATABUFFERDB8DUPminuendDW1DUP;被减数subtrahendDW1DUP;减数.CODESTART:MOVAX@DATAMOVDSAXMOVESAXNOPMOVF10;先清除显示,再接收键输入START1:LEADIminuendMOVCX4;按键次数CALLGetBCDKey;得到双字节十进制数被减数MOVF11;接收到第一个键,才清除显示LEADIsubtrahendMOVCX4;按键次数CALLGetBCDKey;得到双字节十进制数减数MOVAXminuendMOVBXsubtrahendMOVDL10HCMPAXBXJNBSTART2XCHGAXBXMOVDL11H;负数START2:SUBALBL;低位DASXCHGALAH__BALBH;高位DASXCHGALAHCLDLEADIBUFFER;存放显示结果CALLB1toB2;低位MOVALAHCALLB1toB2;高位MOVAL10H;最高三位消隐STO__STO__STO__STO__LEASIBUFFER+3MOVCX3CALLBlackDisplay;将高位0消隐LEASIBUFFERCALLDisplay8JMPSTART1;将一个字节压缩BCD码转换成二个字节非压缩BCD码B1toB2PROCNEARPUSHAXANDAL0FHSTO__POPAXANDAL0F0HRORAL4STO__RETB1toB2ENDPBlackDisplayPROCNEAR;将高位0消隐BlackDisplay1:MOVAL[SI]CMPAL0JNZExitMOVAL10HMOV[SI]ALDECSILOOPBlackDisplay1Exit:CLDMOV[SI+1]DLRETBlackDisplayENDPENDSTART
七、思考从键盘上输入4位被加数、加数,实现双字节BCD码四位数的加法,结果显示在数码管上实验六显示程序
一、实验目的
1、熟悉8255的功能,理解LED显示原理及控制方法;
2、学会使用LED点阵液晶显示字体和图形;
3、认真预习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容
1、编写程序,用8255的PA、PB口控制LED的位选和段选,
(1)编写程序,控制8位数码管跑马灯形式显示0;
(2)编写程序,控制8位数码管静态显示指定字符1-8;
(3)编写程序,控制8位数码管动态循环显示8位字符;
2、按图连接线路,运行程序,观察实验结果
四、实验原理图接8255PB接8255PA
五、实验步骤
1、主机连线说明B4区CS
(8255)——A3区CS1B4区A
0、A1——A3区A
0、A1B4区JP
56、JP53——G5区JP
41、JP
422、运行程序,验证显示结果六源程序1控制8位数码管依次显示0;.MODELTINY.STACK
100.DATAIO8255_ConEQU0F003H;CS3IO8255_AEQU0F000H;AIO8255_BEQU0F001H;BLED_TAB:DB03FH06H05BH04FH66H6DH7DH07HDB07FH6FH77H7CH39H05EH79H71H.CODESTART:MOVAX@DATAMOVDSAXMOVESAXMOVDXIO8255_ConMOVAL80H;方式0,ABC均为输出OUTDXALMOVAL0FEH;8255PC输出MOVCX8GOON:MOVDXIO8255_A;位选OUTDXALROLAL1MOVAHALMOVDXIO8255_BMOVAL03FHOUTDXALMOVALAH;0FFH-8255PACALLDelayJMPGOONDelayPROCNEARPUSHCXMOVCX20000Delay1:LOOPDelay1POPCXRETENDPENDSTART2编写程序,控制8位数码管依次显示任意指定字符(0-F);.MODELTINY.STACK
100.MODELTINY.STACK
100.DATAIO8255_ConEQU0F003H;CS3IO8255_AEQU0F000H;AIO8255_BEQU0F001H;BF1DB0LED_TAB:DB03FH06H05BH04FH66H6DH7DH07HDB07FH6FH77H7CH39H05EH79H71H.CODESTART:MOVAX@DATAMOVDSAXMOVESAX;MOVF10MOVDXIO8255_ConMOVAL80H;方式0,ABC均为输出OUTDXALMOVAL0FEH;8255PC输出MOVCX8GOON:MOVDXIO8255_B;段选MOVBXLED_TAB;装入表头PUSHAXMOVALF1XLAT;AL放字形码OUTDXALPOPAXMOVALAHMOVDXIO8255_A;位选OUTDXALROLAL1MOVAHALINCF1;0FFH-8255PACALLDelayJMPGOONDelayPROCNEARPUSHCXMOVCX800Delay1:LOOPDelay1POPCXRETENDPENDSTART3编写程序,控制8位数码管同时显示
0、
1、……F:.MODELTINY.STACK
100.MODELTINY.STACK
100.DATAIO8255_ConEQU0F003H;CS3IO8255_AEQU0F000H;AIO8255_BEQU0F001H;BLED_TAB:DB03FH06H05BH04FH66H6DH7DH07HDB07FH6FH77H7CH39H05EH79H71HF1DB
0.CODESTART:MOVAX@DATAMOVDSAXMOVESAXMOVDXIO8255_ConMOVAL80H;方式0,ABC均为输出OUTDXALMOVAX0FEFEH;8255PC输出MOVCX1600LEABXLED_TABGOON:MOVALF1XLATMOVDXIO8255_B;段选OUTDXALMOVALAHMOVDXIO8255_A;位选OUTDXALROLAL1MOVAHALCALLDL500msLOOPGOON;8段数码管显示当前值MOVCX1600;8段数码管显示完成,则显示下个字符MOVALAH;;CALLDL3SINCF1CMPF110H;是否显示完了JZEXITJMPGOONDL500msPROCNEARPUSHCXMOVCX400DL500ms1:LOOPDL500ms1POPCXRETDL500msENDPEXIT:ENDSTART
七、思考
(4)编写程序,控制8位数码管显示当前日期以及时间;实验七8251串口实验
一、实验目的与要求了解8251的内部结构、工作原理;了解8251与8088的接口逻辑;掌握对8251的初始化编程方法,学会使用8251实现设备之间的串行通信复习本节实验内容,可尝试自行编写程序,做好实验准备工作,填写实验报告
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容
1、编制程序实现8251A与PC机的串行通讯,使用8253作分频器提供8251的收发时钟
2、连接线路,从微机接收一批数据,接收完毕,再将它们回送给微机
四、程序框图初始化8251接收10个字节数据子程序发送了10个字节数据子程序
五、实验原理图
六、实验步骤
1、连线说明C5区CS
(8253)、A
0、A1——A3区CS
5、A
0、A1C5区CLK0——B2区2MC5区GATE0——C1区的VCCC5区OUT0——C5区RxC、TxCC5区CS
(8251)、C/D——A3区CS
1、A0C5区CLK——B2区4MC5区RXD、TXD——E7区RXD、TXD
2、运行程序
3、运行“串口助手ComPort.EXE”,设置串口波特率48008个数据位,一个停止位,偶校验,打开串口,选择“HEX发送”、“HEX显示”,向8251发送10个字节数据输入数据之间用空格分隔,是否能接收到10个字节数据,接收到的数据是否与发送数据一致
4、改变传输数据的数目,重复实验,观察结果
七、演示程序.MODELTINY;使用8253的计数器0外接2Mhz经26分频后送给8251产生4800bpsCTL_ADDREQU0FF01H;控制字或状态字DATA_ADDREQU0FF00H;读写数据W_8253_T0EQU0BF00H;计数器0地址W_8253_CEQU0BF03H;控制字.STACK
100.DATARe__ive_BufferDB10DUP0;接受缓冲器Send_BufferEQURe__ive_Buffer;发送缓冲器.CODESTART:MOVAX@DATAMOVDSAXMOVESAXNOPCALLINIT_8253CALLINIT_8251START1:MOVCX10CALLRe__ive_GroupMOVCX10CALLSend_GroupJMPSTART1INIT_8253PROCNEARMOVDXW_8253_CMOVAL37H;定时器0,方式3OUTDXALMOVDXW_8253_T0MOVAL26H;BCD码262000000/26=16*4800OUTDXALMOVAL0OUTDXALRETINIT_8253ENDPINIT_8251PROCNEARCALLRESET_8251MOVDXCTL_ADDRMOVAL7EH;波特率系数为16,8个数据位OUTDXAL;一个停止位,偶校验CALLDLTIME;延时MOVAL15H;允许接收和发送发送数据,清错误标志OUTDXALCALLDLTIMERETINIT_8251ENDPReset_8251PROCNEARMOVDXCTL_ADDRMOVAL0OUTDXAL;向控制口写入0CALLDLTIME;延时,等待写操作完成OUTDXAL;向控制口写入0CALLDLTIME;延时OUTDXAL;向控制口写入0CALLDLTIME;延时MOVAL40H;向控制口写入复位字40HOUTDXALCALLDLTIMERETReset_8251ENDP;接受一组数据CX--接受数目Re__ive_GroupPROCNEARLEADIRe__ive_BufferRe__ive_Group1:CALLRe__ive_ByteSTO__LOOPRe__ive_Group1RETRe__ive_GroupENDP;接受一个字节Re__ive_BytePROCNEARMOVDXCTL_ADDRRe__ive_Byte1:INALDX;读入状态TESTAL2JZRe__ive_Byte1;有数据吗?MOVDXDATA_ADDR;有INALDXRETRe__ive_ByteENDP;发送一组数据CX--发送数目Send_GroupPROCNEARLEASISend_BufferSend_Group1:LOD__CALLSendByteLOOPSend_Group1RETSend_GroupENDP;发送一个字节SendbytePROCNEARPUSHAXMOVDXCTL_ADDR;读入状态Sendbyte1:INALDXTESTAL1JZSendbyte1;允许数据发送吗?POPAX;发送MOVDXDATA_ADDROUTDXALRETSendbyteENDP;延时DLTIMEPROCNEARMOVCX10LOOP$RETDLTIMEENDPENDSTART
八、实验扩展及思考请读者思考,如何修改程序实现8251的自发自收功能?实验八步进电机控制
一、实验目的与要求
1、了解步进电机的基本原理,掌握步进电机的转动编程方法
2、了解影响电机转速的因素有那些
二、实验设备STAR系列实验仪一套、PC机一台
三、实验内容编写程序使用G5区的键盘控制步进电机的正反转、调节转速,连续转动或转动指定步数;将相应的数据显示在G5区的数码管上
四、控制原理步进电机的驱动原理是通过它每相线圈的电流的顺序切换来使电机作步进式旋转,驱动电路由脉冲来控制,所以调节脉冲的频率便可改变步进电机的转速,微控制器最适合控制步进电机另外,由于电机的转动惯量的存在,其转动速度还受驱动功率的影响,当脉冲的频率大于某一值(本实验为f.100hz)时,电机便不再转动实验电机共有四个相位(ABCD),按转动步骤可分单4拍(A-B-C-D-A)双4拍(AB-BC-CD-DA-AB)和单双8拍(A-AB-B-BC-C-CD-D-DA-A).
五、程序框图改变方向子程序启动步进电机子程序增速子程序减速子程序定时中断程序
六、实验原理图
七、实验步骤
1、主机连线说明E1区A、B、C、D——B4区PC
0、PC
1、PC
2、PC3E5区CLK——B2区2ME5区CS、A0——A3区CS
5、A0E5区A、B、C、D——G5区A、B、C、DB3区CS、A0——A3区CS
1、A0B3区INT、INTA——ES8688INTR、INTAC5区CS
8253、A
0、A1——A3区CS
2、A
0、A1C5区GATE0——C1区VCCC5区CLK0——B2区1MC5区OUT0——B3区IR0B4区CS
8255、A
0、A1——A3区CS
3、A
0、A
12、调试程序,查看运行结果是否正确
八、演示程序.MODELTINYEXTRNDisplay8:NEARSCAN_KEY:NEARIO8259_0EQU0F000HIO8259_1EQU0F001HCon_8253EQU0E003HT0_8253EQU0E000HIO8255_ConEQU0D003H;CS3IO8255_PCEQU0D002H.STACK
100.DATAStepControlDB0;下一次送给步进电机的值bufferDB8DUP0;显示缓冲区,8个字节buffer1DB8DUP0;显示缓冲区,8个字节SpeedNoDB0;选择哪一级速度StepDelayDB0;转动一步后,延时常数StartStepDelayDB0;若选择速度过快延时由长到短最终使用对应延时常数StartStepDelay1DB0;StartStepDelaybFirstDB0;有没有转动过步进电机bClockwiseDB0;=1顺时针方向=0逆时针方向转动bNeedDisplayDB0;已转动一步,需要显示新步数StepCountDW0;需要转动的步数StepDelayTab:DB
25012583625042363228252221.CODESTART:MOVAX@DATAMOVDSAXMOVESAXNOPMOVbFirst1;有没有转动过步进电机MOVbClockwise1;顺时针方向MOVStepControl33H;下一次送给步进电机的值MOVSpeedNo5;第五级速度CALLInit8255CALLInit8253CALLInit8259CALLWriIntverMOVbuffer0;显示缓冲器初始化MOVbuffer+10MOVbuffer+20MOVbuffer+30MOVbuffer+410HMOVALSpeedNoMOVbuffer+5ALMOVbuffer+610HMOVbuffer+70STAR2:LEASIbufferLEADIbuffer1MOVCX8REPMOV__LEASIbuffer1CALLDisplay8STAR3:CALLScan_KeyJBSTAR5CMPbNeedDisplay0JZSTAR3MOVbNeedDisplay0CALLStep_SUB_1JMPSTAR2STAR5:CLI;终止步进电机转动CMPAL10JNBSTAR1MOVAHbuffer+2MOVbuffer+3AHMOVAHbuffer+1MOVbuffer+2AHMOVAHbufferMOVbuffer+1AHMOVbufferALJMPSTAR2STAR1:CMPAL14JNBSTAR3LEASIDriverTabSUBAL10SHLAL1XORAHAHMOVBXAXJMPCS:[SI+BX]DriverTab:DWDirection;转动方向DWSpeed_up;提高转速DWSpeed_Down;降低转速DWExec;步进电机根据方向、转速、步数开始转动Direction:CMPbClockwise0JZClockwiseMOVbClockwise0MOVbuffer+71AntiClockwise:CMPbFirst0JZAntiClockwise1MOVStepControl91HJMPDirection1AntiClockwise1:MOVALStepControlRORAL2MOVStepControlALJMPDirection1Clockwise:MOVbClockwise1MOVbuffer+70CMPbFirst0JZClockwise1MOVStepControl33HJMPDirection1Clockwise1:MOVALStepControlROLAL2MOVStepControlALDirection1:JMPSTAR2Speed_up:MOVALSpeedNoCMPAL11JZSpeed_up2Speed_up1:INCALMOVSpeedNoALMOVbuffer+5ALSpeed_up2:JMPSTAR2Speed_Down:MOVALSpeedNoCMPAL0JZSpeed_Down1DECALMOVSpeedNoALMOVbuffer+5ALSpeed_Down1:JMPSTAR2Exec:MOVbFirst0CALLTakeStepCountLEABXStepDelayTabMOVALSpeedNoXLATMOVStepDelayALCMPAL50JNBExec1MOVAL50Exec1:MOVStartStepDelayALMOVStartStepDelay1ALSTIJMPSTAR2TIMER0:PUSHAXPUSHDXDECStartStepDelayJNZTIMER0_1MOVALStartStepDelay1CMPALStepDelayJZTIMER0_2DECALMOVStartStepDelay1ALTIMER0_2:MOVStartStepDelayALMOVALStepControlMOVDXIO8255_PCOUTDXALCMPbClockwise0JNZTIMER0_3RORAL1JMPTIMER0_4TIMER0_3:ROLAL1TIMER0_4:MOVStepControlALCMPStepCount0JZTIMER0_1MOVbNeedDisplay1DECStepCountJNZTIMER0_1addsp8;小写部分不允许使用单步、单步进入命令popfclipushfsubsp8nopTIMER0_1:MOVDXIO8259_0MOVAL20HOUTDXALPOPDXPOPAXIRETStep_SUB_1PROCNEARMOVCX4LEABXbufferStep_SUB_1_1:DECBYTEPTR[BX]CMPBYTEPTR[BX]0FFHJNZStep_SUB_1_2MOVBYTEPTR[BX]9INCBXLOOPStep_SUB_1_1Step_SUB_1_2:RETStep_SUB_1ENDPTakeStepCountPROCNEARMOVALbuffer+3;转动步数送入StepCountMOVBX10MULBLADDALbuffer+2MULBLADDALbuffer+1ADCAH0MULBXADDALbufferADCAH0MOVStepCountAXRETTakeStepCountENDPInit8255PROCNEARMOVDXIO8255_ConMOVAL80HOUTDXAL;8255PC输出DECDXMOVAL0FFHOUTDXAL;0FFH-8255PCRETInit8255ENDPInit8253PROCNEARMOVDXCon_8253MOVAL35HOUTDXAL;计数器T0设置在模式2状态BCD码计数MOVDXT0_8253MOVAL10HOUTDXALMOVAL02HOUTDXAL;CLK0/210RETInit8253ENDPInit8259PROCNEARMOVDXIO8259_0MOVAL13HOUTDXALMOVDXIO8259_1MOVAL08HOUTDXALMOVAL09HOUTDXALMOVAL0FEHOUTDXALRETInit8259ENDPWriIntverPROCNEARPUSHESMOVAX0MOVESAXMOVDI20HLEAAXTIMER0STOSWMOVAXCSSTOSWPOPESRETWriIntverENDPENDSTART
九、实验扩展及思考
1、怎样改变电机的转速?
2、通过实验找出电机转速的上限,如何能进一步提高最大转速?
3、怎样能使电机反转?附录一汇编语言的存储模型模型说明TINY微所有数据及代码装入同一个代码段内,此模型的程序按.COM文件格式编写,要求程序从地址0100H处开始__ALL小这种模型包含两个段一个64KB的数据段和一个64KB的代码段MEDIUM中这种模型包含一个64KB的数据段和任意多个代码段,以供大程序使用COMPACT压缩包含一个代码段和任意多个数据段LARGE大LARGE模型允许多个代码段和数据段HUGE(巨型)允许数据段大于64KB,其他与LARGE模型相同FLAT(平展)仅限于____
6.X版本FLAT模型使用一个512KB的段来存储所有的代码和数据,应注意的是该模型主要用于WindowsNT中附录二8279键值显示程序;8279键盘显示器接口芯片;
1.查询控制方式
2.输入时钟2MHZ
3.8279内部20分频(100KHZ);
4.扫描计数器采用编码工作方式(通过外部138译码);
5.显示按键值第九次按键清除显示;8279查询工作方式.MODELTINYCMD_8279EQU0BF01H;8279命令字、状态字地址DATA_8279EQU0BF00H;8279读写数据口的地址PUBLICGetKeyGetKeyAGetKeyBGetBCDKeyDisPlay8SCAN_KEYPUBLICF
1.STACK
100.DATAF1DBLED_TAB:DB0C0H0F9H0A4H0B0H99H92H82H0F8HDB080H90H88H83H0C6H0A1H86H8EHDB0FFH0BFH.CODEGetKeyPROCNEARCMPCX0JZGetKey5CMPCX9JNBGetKey5PUSHAXPUSHBXPUSHDXPUSHFMOVAXCXCLCRCRAX1DECAXADDDIAXSTDMOVAH0CMPF10JZGetKey1CALLKeyScanGetKey1:PUSHAXMOVAL8CLCSUBALCLCALLINIT8279_1;8279初始化POPAXCMPF10JNZGetKey3GetKey2:CALLKeyScan;扫描GetKey3:NOTAHPUSHAXCMPAH0JZGetKey4RORAL4MOVES:[DI]ALJMPGetKey6GetKey4:ORALES:[DI]STO__GetKey6:POPAXLEABXLED_TABXLATCALLWRITE_DATA;显示输入值LOOPGetKey2POPFPOPDXPOPBXPOPAXGetKey5:RETGetKeyENDP;键值在AL中KeyScanPROCNEARCALLSCAN_KEYJNBKeyScanRETKeyScanENDP;CY=1有键键值在AL中;CY=0没有按键GetKeyAPROCNEARCALLSCAN_KEYRETGetKeyAENDP;键值在AL中GetKeyBPROCNEARCALLSCAN_KEYJNBGetKeyBRETGetKeyBENDP;BCD码;F1是否需要先清除显示GetBCDKeyPROCNEARCMPCX0JZGetBCDKey5CMPCX9JNBGetBCDKey5PUSHAXPUSHBXPUSHDXPUSHFMOVAXCXCLCRCRAX1DECAXADDDIAXSTDMOVAH0CMPF10JZGetBCDKey1CALLKeyScanGetBCDKey1:PUSHAXMOVAL8CLCSUBALCLCALLINIT8279_1;8279初始化POPAXCMPF10JNZGetBCDKey3GetBCDKey2:CALLKeyScan;扫描GetBCDKey3:CMPAL10JNBGetBCDKey2NOTAHPUSHAXCMPAH0JZGetBCDKey4RORAL4MOVES:[DI]ALJMPGetBCDKey6GetBCDKey4:ORALES:[DI]STO__GetBCDKey6:POPAXLEABXLED_TABXLATCALLWRITE_DATA;显示输入值LOOPGetBCDKey2POPFPOPDXPOPBXPOPAXGetBCDKey5:RETGetBCDKeyENDP;显示以SI开始的8个数字(0~FDisPlay8PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVCX8;计数用LEABXLED_TABDisPlay81:MOVAL[SI];不用显示的位调整ANDAL7FHCMPAL11HJZDisPlay82;负号Display84:CMPAL16JBDisPlay82MOVAL10H;显示段码中10H位对应的是暗码DisPlay82:XLATXCHGAL[SI]TESTAL80HJZDisplay83XCHGAL[SI]ANDAL7FHMOV[SI]ALDisplay83:INCSILOOPDisPlay81MOVAL0CALLINIT8279_1MOVCX8Display85:DECSIMOVAL[SI]CALLWRITE_DATALOOPDisplay85POPDXPOPCXPOPBXPOPAXRETDisPlay8ENDP;8279初始化INIT8279PROCNEARMOVDXCMD_8279;CMD_8279为写命令地址、读状地址MOVAL34H;可编程时钟设置设置分频系数20分频)OUTDXALMOVAL0;8*8字符显示左边输入外部译码键扫描方式OUTDXALMOVAL90H;从第一个数码管开始移位显示OUTDXALRETINIT8279ENDPINIT8279_1PROCNEARPUSHAXMOVDXCMD_8279;CMD_8279为写命令地址、读状地址MOVAL34H;可编程时钟设置设置分频系数20分频)OUTDXALMOVAL0;8*8字符显示左边输入外部译码键扫描方式OUTDXALCALLCLEAR;清显示POPAXORAL90HOUTDXALRETINIT8279_1ENDPCLEARPROCNEARMOVDXCMD_8279MOVAL0DEH;清除命令OUTDXALWAIT1:INALDXTESTAL80HJNZWAIT1;显示RAM清除完毕吗RETCLEARENDPSCAN_KEYPROCNEARMOVDXCMD_8279INALDX;读状态READ_FIFO:ANDAL7JZNO_KEY;是否有键按下READ:MOVAL40HOUTDXAL;读FIFORAMMOVDXDATA_8279INALDXANDAL3FHSTC;有键SCAN_KEY1:RETNO_KEY:CLC;无键按下,清CYJMPSCAN_KEY1SCAN_KEYENDPKEY_NUMPROCNEARANDAL3FHRETKEY_NUMENDPWRITE_DATAPROCNEARMOVDXDATA_8279OUTDXALRETWRITE_DATAENDPEND附录三8279命令功能一览表开始初始化8253定时器0,方式3,BCD码计数,CLK0/26初始化8251接收10个字节数据子程序将接收到的10个字节数据通过8251发送给微机开始允许接收和发送数据清错误标志复位8251波特率系数为16,8个数据位,一个停止位,偶校验返回开始读入状态有数据读数据-缓冲区接收了10个字节数据返回NNYY开始读入状态有数据发送发送了10个字节数据NNYY返回NYNYNNNN0-需要刷新显示标志1-步进电机未转动过标志1-转动方向标志1:表示顺时针方向33H-下次送给步进电机值5-步进电机转速初始化8255PC口输出初始化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开始YYYYYNNY开始转动方向标志=091H-下次送给步进电机值下次送给步进电机值循环右移二次1-转动方向标志0-送给数码管的第7位步进电机未转动过标志33H-下次送给步进电机值下次送给步进电机值循环左移二次0-转动方向标志1-送给数码管的第7位步进电机未转动过标志返回YNY开始0-步进电机未转动过标志取转动步数取转速对应的延时值转速延时初始转速延时1=初始转速延时转速延时50初始转速延时=50返回开中断初始转速延时=转速延时YN开始转速=11转速+1转速送给数码管第5位返回NY开始转速=0转速-1转速送给数码管第5位返回NNYNNNYYNY初始转速延时1=转速延时初始转速延时-1=0时初始转速延时1-1初始转速延时=初始转速延时11-1转动方向标志=0时下次送给步进电机值循环右移一次1-1转动步数=0时1-需要刷新显示标志转动步数减一1-1转动步数=0时关中断清中断标志开始下次送给步进电机值循环左移一次1-1返回下次送给步进电机值-8255的PC口(控制步进电机转动一步)YPAGE21。