490 likes | 655 Views
单片机原理. 第 10 章 实训. 10.1 实训一 数据传送. 第 10 章 实训. 10.1.1 实训目的. 掌握 8031 内部 RAM 和外部 RAM 之间的数据传送方法及这两个存储器的特点与应用。. 第 10 章 实训. 10.1. 2 实训内容. 编写并调试一个数据传送程序实现: ①将 50H ~ 5FH 数据送到数据存储 7E00H ~ 7E0FH 单元中; ②将数据存储 7E00H ~ 7E0FH 中的数据送到 8031 单片机内部 RAM 的 60H ~ 6FH 中;
E N D
10.1 实训一 数据传送 第10章 实训 10.1.1 实训目的 掌握8031内部RAM和外部RAM之间的数据传送方法及这两个存储器的特点与应用。
第10章 实训 10.1.2 实训内容 编写并调试一个数据传送程序实现: ①将50H~5FH数据送到数据存储7E00H~7E0FH单元中; ②将数据存储7E00H~7E0FH中的数据送到8031单片机内部RAM的60H~6FH中; ③将以(R2,R3)为源RAM区首地址内的(R6、R7)两个字节数据,传送到以(R4、R5)为末地址的RAM区中。
第10章 实训 10.1.3 程序流程图 本实训要求①实现的程序流程图如图10-1所示,其余要求的实现与之类似。
第10章 实训 10.1.4 调试方法 (1)打开仿真软件中内部数据空间和外部数据空间,在50H~5FH数据单元中分别送数,如1,2,3,4,…等16个数据。 (2)单步运行(断点设在BP2,程序运行至断点),检查外部RAM(7E00H~7F0FH)数据是否与50H~5FH数据一一对应。 (3)如果程序运行不能进入某一断点,则应单步、断点分段检查程序,排除错误直至正确为止。
第10章 实训 10.1.5参考程序 MAIN: MOV R0,#50H MOV R7,#16 MOV DPTR,#7E00H LOOP: MOV A,@R0 MOVX @DPTR,A INC DPTR INC R0 DJNZ R7,LOOP HALT:SJMP HALT
第10章 实训 10.1.6 实训思考 试编写将外部数据存储区6030H~607FH的内容写入外部RAM的7030H~707FH中。
10.2 实训二数据传送 第10章 实训 10.2.1 实训目的 通过编写数据转换程序,熟悉MCS-51系列单片机的汇编语言程序设计方法。
第10章 实训 10.2.2 实训内容 编写并调试一个二进制转十进制程序,其功能为将40H、50H两数据单元中的二进制数转换为十进制数,并将转换结果存放在R4、R5、R6数据单元中。
第10章 实训 10.2.3 程序流程图 本实训的程序流程图如图所示。
第10章 实训 10.2.4 调试方法 (1)、断点设在BP1,程序运行至BP1,检查40H、50H内容是否与输入值对应。 (2)、断点设在BP2,程序运行至BP2,检查R4、R5、R6的内容是否为二进制所对应的十进制转换结果。 (3)、程序连续运行。若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。 (4)、改动40H、50H中的内容。连续运行观察结果正确与否。
第10章 实训 10.2.5参考程序 MAIN: MOV A,#60H MOV 40H,A MOV A,#3CH MOV 50H,A MOV A,40H; BP1 ACALL B2TO10 ;调用二进制转十进制子程度 MOV A,50H; BP2 CALL B2TO10 HALT: SJMP HALT B2TO10:MOV B,#0AH ;除十求余的方法将二进制转换为十进制 DIV AB MOV R6,B MOV B,#0AH DIV AB MOV R4,A MOV A,B MOV R5,A RET
第10章 实训 10.2.6 实训思考 试编写一个功能和本实验类似的整数十进制转二进制的程序。
10.3 实训三 时钟操作编程 第10章 实训 10.3.1 实训目的 熟悉8051单片机的中断过程、中断服务程序的设计方法;熟悉8051单片机的查表指令、散转指令的功能和使用方法;掌握查表和散转程序的设计与调试。
第10章 实训 10.3.2 实训内容 编程设置定时器每100μs中断一次,在中断服务程序中,对中断次数进行计数,100μs计数10000次就是1秒。然后再对秒计数得到分和小时值,并送入显示缓冲区。
第10章 实训 10.3.3 程序流程图 本实训实现的程序流程图如图所示。
第10章 实训 10.3.4 调试方法 (1)断点设在BP1,进入断点地址,检查30H内容是否是时间的变化。 (2)断点设在BP2,程序运行至断点,检查(SP)内容返回地址高位。 (3)断点设在BP3,程序运行至断点,检查P1.0的电平是否反转, 若有错误,应改用单步或断点分段调试,排除软件错误,直至正确为止。
第10章 实训 10.3.5参考程序 ORG0000H TickEQU 10000 ;10000 × 100μs = 1s T100μs EQU256-50 ;100μs时间常数(6M) C100μsEQU30H ;100μs记数单元 LEDBμF EQU0 LED EQUP1.0 LJMPSTART ORG 000BH T0Int: ;TO中断服务程序 PUSHPSW MOVA, C100μs+1 JNZGOON DECC100μs GOON: DEC C100μs+1 MOVA, C100μs ORLA, C100μs+1 JNZEXIT ;100μs 记数器不为0, 返回 MOVC100μs, #HIGH(Tick) ;100μs 记数器为0, 重置记数器 MOVC100μs+1, #LOW(Tick) CPLLEDBUF ; 取反LED EXIT:
第10章 实训 10.3.5参考程序 POPPSW ; 恢复现场 RETI ; 中断返回 START: MOVTMOD, #02H ; 方式2, 定时器 MOVTH0, #T100μs MOVTL0, #T100μs MOVIE, #10000010B ; EA=1, IT0 = 1 SETBTR0 ; 开始定时 CLRLEDBUF CLRLED MOVC100μs, #HIGH(Tick) MOVC100μs+1, #LOW(Tick) LOOP: ; LED显示并等待中 MOV C, LEDBUF MOVLED, C LJMPLOOP END
第10章 实训 10.3.6 实训思考 若将0~F按键对应查表为1~16立方表(十进制),并在LED数码管上显示,程序应该怎样修改?
10.4 实训四 计数器编程 第10章 实训 10.4.1 实训目的 掌握定时器T0、T1的方式选择和编程方法,了解计数器程序设计方法,进一步学会实时I/O程序的调试方法。
第10章 实训 10.4.2 实训内容 编写并调试一个程序,用定时器T0计数,使计数器从0开始以一个周期的速度加1计数,显示器实时显示其计数值。
第10章 实训 10.4.3 程序流程图 本实训实现的程序流程图如图所示。
第10章 实训 10.4.4 调试方法 (1)断点设在BP1,程序运行到BP1,应进入中断服务程序,否则应检查T0初始化程序正确与否。 (2)程序连续运行,显示器缓冲区从0开始加1显示。 若有错误应改用单步或断点分段调试程序,排除软件错误,直至正确为止。
第10章 实训 10.4.5参考程序 MOVTMOD, #00000101B; 方式1,记数器 MOVTH0, #0 MOV TL0, #0 SETBTR0; 开始记数 LOOP: MOV P1, TL0; 将记数结果送P1口 LJMPLOOP END
第10章 实训 10.4.6 实训思考 若6位显示器计数值从999999减1计数,程序应怎样修改?
10.5 实训五 数据排序实验 第10章 实训 10.5.1 实训目的 熟悉8031单片机的指令系统;掌握程序设计方法。
第10章 实训 10.5.2 实训内容 编写并调试一个排序子程序,其功能为用冒泡法将内部RAM中的n个单字节无符号二进制整数从小到大的次序重新排列,并将这一列数据从小到大依次序存储在以6000H为起始地址的单元中。
第10章 实训 10.5.3 程序流程图 本实训实现的程序流程图如图所示。
第10章 实训 10.5.4 调试方法 (1)打开仿真软件中的内部RAM窗口,在50H~59H单元中输入10个任意排列的原始数据。 (2)单步运行程序,两数比较后,若第一个数大于第二个数则所在RAM位置交换,否则不变。 (3)单步运行程序(或断点运行),检查50~59H内容是否已经按从小到大的顺序排列。 (4)连续运行,再打开仿真软件的外部存储窗口,查看6000H内容是否有10个数据按从小到大的顺序排列。 (5)程序运行如果不正确,则应分段检查程序,用单步或断点方式调试程序,排除错误。最后修改软件初始值、交换五组数据测试程序的正确性。
第10章 实训 10.5.5参考程序 MOV @R1,A INC DPTR INC R1 DJNZ R7,LOOP CALL SORT; 调用排序子程序 CALL SORT MOV DPTR,#6000H MOV A,#50H MOV R7,#10 LOOPI:MOVX @DPTR,A INC DPTR INC A DJNZ R7,LOOPI CDO: CALL DISPLAY SJMP CDO ORG 0000H JMP MAIN SIZEDB 10 DATADB 55H,33H,66H, 77H,99H, 11H, 22H, 88H, 44H, 00H TAG DB 20H MAIN:MOV SP,#70H MOV DPTR,#DATA MOV R1,#50H ; 在片内RAM中数据地址 MOV R7,#10; 10个数排序 LOOP:CLR A MOVC A,@A+DPTR 将10个原始数存入50H~51H单元中
第10章 实训 10.5.5参考程序 NOTEQUAL:JCNEXT; 前小后大, 不交换 SETB TAG; 前大后小, 置交换标志 XCH A, @R0; 交换 DEC R0 XCH A, @R0 INC R0 NEXT:DJNZ R7, COON JB TAG, SORT RET DISPLAY:… END SORT: MOV R0, #50H; 排房子程序 MOV R7, #SIZE-1 CLR TAG COON: MOV A, @R0 MOV R2, A INC R0 MOV B, @R0 CJNE A, B, NOTEQUAL SJMP NEXT
10.6 实训六 P1口彩灯控制实验 第10章 实训 10.6.1 实训目的 通过实验了解单片机最小系统;了解P1口作为输入、输出方式使用时,CPU对P1口操作方法。
第10章 实训 10.6.2 实训内容 (1)P1口输出练习。 (2)编制程序使P1口8个发光二极管同时灭,延时0.5s,同时亮,反复循环。 (3)发光二极管依次间隔0.5s点亮一只,反复循环。 (4)编制P1口演示实验程序,使8个发光二极管0.5s(LED)每隔一个(或二个)右移(左移),循环点亮。
第10章 实训 10.6.3 程序流程图 本实训实现的程序流程图如图所示。
第10章 实训 10.6.4实验步骤 1.实验线路连接 (1)将8031、373、2764组合成为最小系统,其中地址线和数据线已经连好,也可用分立的器件一个一个连接P1口、P2口、P3口的P2.5、P2.6、P2.7,包括数据口P0均有引出插座可外接。8031的复位电路、振荡电路均已连好,复位电路还加接了按键可随时复位系统。 (2)先将组合最小系统板和驱动板、8彩灯板拼装好,且称为实验系统,然后按照图10-7所示的接线原理图,在反面连接好线,反复检查,不要错线、漏线。连好线后,再在元件表面用万用表Ω档检查连线的各脚之间是否相通,检查无误后再进行下一步。
第10章 实训 10.6.4实验步骤 2.硬件诊断 硬件正常工作是单片机系统最基本的条件,诊断硬件好坏方法有: (1)用瞬间短路法诊断硬件好坏。 (2)用仿真器诊断硬件好坏。 (3)用下载式开发系统诊断硬件好坏(相当于直接固化程序调试)。 (4)用专用的编程器(固化器)来固化程序调试。
第10章 实训 10.6.4实验步骤 3.程序编写与调试 (1)硬件仿真调试 ①编辑程序。 ②汇编程序。 ③装载程序。 ④运行程序。 ⑤查看结果。
第10章 实训 10.6.4实验步骤 (2) .软件仿真调试方法 • 在文件项目中编辑文件(或打开以上文件6.AMS)。 • 在项目中建立新项目,增加新文件。 • 汇编。 • 设置。首先设置操作项,再设置窗口观察项,只打开主寄存器窗口和P1口状态图就行。 • 调试。还是用单步运行,观察P1、A、R4、R5中数据变化情况与所编程序是否一致。
10.7 实训七 键盘扫描显示 第10章 实训 10.7.1 实训目的 掌握89C51键盘、显示器的接口方法;掌握按键并将键值显示出来的编程方法。为诊断硬件,测试硬件,产品开发、软件编程打下基础。
第10章 实训 10.7.2 实训内容 (1)编写并调试出一个键盘子程序。 (2)用子程序调用方法,分别调用键盘子程序和显示子程序,将按一个键的值(0~F),在数码管上显示出来,依次显示或定位分别显示。
第10章 实训 10.7.3 程序流程图 本实训实现的程序流程图如图所示。
第10章 实训 10.7.4实验步骤 1.实验线路连接 将组合实训板拼装好,按图连接好每一条线,检查无误后可进行下一步。
第10章 实训 10.7.4实验步骤 DB3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H DELAY:; 延时子程序 MOV R7, #0 DELAYLOOP: DJNZR7, DELAYLOOP DJNZR6, DELAYLOOP RET DISPLAYLED: MOVR0, #LEDBUF MOVR1, #6; 共6个八段管 MOVR2, #00100000B ; 从左边开始显示 LOOP: 2.固化以下程序 ORG 0000H OUTBITEQU 0FE02H; 位控制口 CLK164EQU 0FE04H; 段控制口(接164时钟位) DAT164EQU 0FE06H; 段控制口(接164数据位) INEQU 0FE00H; 键盘读入口 LEDBUF EQU 60H;显示缓冲 LJMP START LEDMAP: ; 八段管显示码
第10章 实训 10.7.4实验步骤 KEYTABLE:; 键码定义 DB16H, 15H, 14H, 0FFH DB13H, 12H, 11H, 10H DB0DH, 0CH, 0BH, 0AH DB0EH, 03H, 06H, 09H DB0FH, 02H, 05H, 08H DB00H, 01H, 04H, 07H GETKEY: MOV DPTR, #OUTBIT MOV P2, DPH MOV R0, #LOW(IN) MOV R1, #00100000B MOV R2, #6 KLOOP: TESTKEY: MOV DPTR, #OUTBIT MOV A, #0 MOVX @DPTR, A; 输出线置为0 MOV DPTR, #IN MOVXA, @DPTR; 读入键状态 CPLA ANLA, #0FH; 高四位不用 RET
第10章 实训 10.7.4实验步骤 MOV R1, A; 键值 = 列 X 4 + 行 MOVA, R2 DECA RLA RLA MOV R2, A; R2 = (R21)*4 MOV A, R1 ; R1中为读入的行值 MOV R1, #4 LOOPC: RRCA ; 移位找出所在行 JC EXIT INC R2; R2 = R2+ 行值 DJNZ R1, LOOPC EXIT: MOVA, R1; 找出键所在列 CPLA MOVX @DPTR, A CPL A RRA MOV R1, A ; 下一列 MOVX A, @R0 CPLA ANL A, #0FH JNZ GOON1 ; 该列有键入 DJNZ R2, KLOOP MOV R2, #0FFH ; 没有键按下, 返回 0FFH SJMP EXIT GOON1:
第10章 实训 10.7.4实验步骤 MOV A, R2 ; 取出键码 MOV DPTR, #KEYTABLE MOVCA, @A+DPTR MOVR2, A WAITRELEASE: MOVDPTR, #OUTBIT ; 等键释放 CLR A MOVX @DPTR, A MOV R6, #10 CALLDELAY CALLTESTKEY JNZ WAITRELEASE MOV A, R2 RET START: MOVSP, #40H MOVLEDBUF, #0FFH; 显示 8.8.8.8. MOV LEDBUF+1, #0FFH MOV LEDBUF+2, #0FFH MOV LEDBUF+3, #0FFH MOV LEDBUF+4, #0 MOV LEDBUF+5, #0 MLOOP: CALL DISPLAYLED; 显示 CALL TESTKEY ; 有键入? JZ MLOOP ; 无键入, 继续显示
第10章 实训 10.7.4实验步骤 MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV LEDBUF+5, A LJMP MLOOP END 注意:固化后插入89C51插座,按0~F键应在显示块上显示出来,若不正常,检查硬件各部分直到正常为止。