姓名: 学号:
实验一
1、存储块置全“1”源代码:
汇编语言源程序:
ORG 00H
START EQU 30H ;起始地址
MOV R1,#START
MOV R0,#32 ;Rn中设置32字节计数值
MOV A,#0FFH
LOOP: mov @R1,A
INC R1 ;指向下一个地址
DJNZ R0,LOOP ;计数值减1,不为零继续
SJMP $
END
在下划线处填入适当指令。
输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。
解释START EQU 30H。
答:START = 30H
一、 二进制BCD码转换源代码:
汇编语言源程序:
RESULT EQU 30H
ORG 00H
LJMP START
START: push 40h
MOV A,#123
LCALL BINTOBAC
SJMP $
BINTOBAC:MOV B,#100
DIV AB
MOV RESULT,A
MOV A,B
MOV B,#10
DIV AB
MOV RESULT+1,A
MOV RESULT+2,B
RET
END
在下划线处填入适当指令。
用单步执行的方法,观察子程序调用过程中堆栈指针的变化。
1、sp总是初始化到07H
二、 二进制ASCII码转换源代码:
汇编语言源程序:
RESULT EQU 30H
ORG 00H
START:
MOV A,#1AH
LCALL BINTOHEX
LJMP $
BINTOHEX:
MOV DPTR,#ASCIITAB ;表的首址ASCIITAB送DPTR
MOV B,A
SWAP A
ANL A,#0FH ;取A的高四位
MOVC A,@A+DPTR ; 查ASCII表
MOV RESULT,A
MOV A,B
ANL A,#0FH
MOVC A,@A+DPTR ; 查ASCII表
MOV RESULT+1,A
RET
ASCIITAB:
DB '0123456789ABCDEF'
END
在下划线处填入适当指令。
单步运行程序观察查表指令的执行过程。
把 LJMP $这条指令注释掉,然后全速运行该程序,然后让其停止观察程序执行到哪里?
执行到MOV A,#1AH
正常输出31 41
改后输出 34 31
实验内容2
输入、汇编、调试下列四个程序,通过信息窗口观察并回答问题。
1、 程序a.asm
ORG 0000H
MOV 30H,#87H
MOV A,#69H
ADD A,30H
NOP
END
问:CY= 0 ,(A)= 1 ,OV=0 ,P= 0 将程序中的指令NOP改为 指令DA A后
问:CY=1 ,(A)= 1 ,OV=0 ,P= 0
2、 程序b.asm
ORG 0000H
MOV SP,#60H
MOV DPTR,#0A679H
PUSH DPH
PUSH DPL
MOV A,#80H
PUSH ACC
POP B
POP 30H
POP 31H
NOP
END
问:(SP)=60H ,(A)= 80H ,(30H)=79H
(B)=80H ,(DPH)=0A6H ,(DPL)=79H
3、 程序c.asm
ORG 0000H
MOV DPTR,#TAB
MOV A,#05H
MOVC A,@A+DPTR
NOP
ORG 1000H
TAB: DB 6FH,30H,96H,75H,0A8H,0FEH
DB 49H,8AH,5FH,0B6H,7FH,0C4H
END
问:执行完MOVC A,@A+DPTR以后,(A)= 0FEH
4、 程序d.asm
ORG 0000H
MOV A,#02H
MOV B,A
RL A
ADD A,B ,(31H)=0A6H ,
MOV DPTR,#TAB
JMP @A+DPTR
NOP
ORG 0800H
TAB: LJMP 1000H
LJMP 2000H
LJMP 3000H
LJMP 4000H
END
问:执行完JMP @A+DPTR以后,PC=0806H
实验二 汇编语言程序设计(一)
一、内存块移动
汇编语言源程序:
ORG 00H START: MOV R0, #30H MOV R1, #00H ;设置源地址 MOV R2, #40H MOV R7, #0 MOV R3, #00H ;设置目标地址 ;设置计数值
;将源地址(3000H)赋DPTR LOOP: MOV DPH, R0
MOV DPL, R1 MOV DPH, R2 MOV DPL, R3 INC R1
R3 ;将目标地址(4000H)赋DPTR ;源地址加1 ;目标地址加1 MOVX @DPTR, A ;将源地址中的数据送到目标地址 MOVX A, @DPTR ;取源地址中的数据 INC
DJNZ R7, LOOP
LJMP $
END
输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。
二、程序转跳表
汇编语言源程序:
ORG 00H MOV A,#0 MOV A,#1 MOV A,#2 MOV A,#3
LJMP $
ADD A,ACC JMP @A+DPTR AJMP FUNC0 AJMP FUNC1 AJMP FUNC2 AJMP FUNC3
MOV 30H,#0
MOV 31H,#1
MOV 32H,#2
MOV 33H,#3
END ;AJMP为二字节指令,地址偏移量*2 ;设置基址 ;设置地址偏移量 START: CALL FUNCENTER ;设置地址偏移量 ;设置地址偏移量 ;设置地址偏移量 CALL FUNCENTER CALL FUNCENTER CALL FUNCENTER FUNCENTER: MOV DPTR,#FUNCTAB ;跳转到目标地址 FUNCTAB: FUNC0:
RET RET RET RET FUNC1: FUNC2: FUNC3:
输入源程序,编译无误后,用单步执行的方法,观察各个相应存储单元和寄存器中内容的变化。
三、数据排序
汇编语言源程序:
ORG EQU
BIT 00H 10 ;数据个数 SIZE ARRAY EQU FLAG
SORT:
50H ;数据起始地址 00H ;交换标志 ;首地址输入到R0 ;数据个数减一输入到R7 ;交换标志置零 MOV R0,#ARRAY FLAG MOV R7,#SIZE-1 CLR
COON:
MOV A,@R0 MOV R2,A INC R0 MOV B,@R0 SJMP NEXT JC SETB XCH DEC XCH INC JB END ;将首地址中的内容读到A ;将数据写入到R2中 ;将首地址中的内容读到B ;首地址加一 CJNE A,B,NOTEQUAL ;不相等则跳转 NEXT ;前小后大,不交换 ;前大后小,置交换标志 ;交换 ;R0减1 NOTEQUAL: FLAG A,@R0 R0 A,@R0 R0 NEXT: DJNZ R7,COON FLAG,SORT SJMP $ ;R7不等于0时转到GOON(即没有交换完) ;FLAG=1时转到SORT使FLAG清零
四、调试程序S1.asm
程序:S1.asm
ORG 0000H
MOV R0,#30H
MOV R7,#20H
MOV DPTR,#1000H
LOOP1: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R7,LOOP1
NOP
NOP
LJMP $
ORG 1000H
DB 23H,45H,0A5H,7FH,8DH,0CDH,33H,0BFH
DB 0FH,66H,9AH,8CH,33H,69H,50H,2DH
DB 6DH,45H,0FEH,90H,0ABH,3CH,67H,88H
DB 0EDH,0FFH,00H,21H,63H,9DH,77H,45H
END
思考题:
1、在这个程序中的32个数据原来在哪里?这个程序完成了什么操作?
答:外部ROM区,将外部ROM的1000H开始处的32个数据放到内部30H开始的32内存中
2、如果把MOVC A,@A+DPTR改成MOVX A,@A+DPTR会发生什么情况? 答:将外部RAM的1000H开始处的32个数据放到内部30H开始的32内存中
3、程序中的ORG指令起什么作用?
答:设置程序起始处
4、将上述程序修改成将32个数据传送到外部数据区2050H开始的单元中去。 答: ORG 0000H
MOV R0,#0
MOV R1,#50H
MOV R7,#20H
LOOP1:
MOV A,#0
MOV DPH,#10H
MOV DPL,R0
MOVC A,@A+DPTR
MOV DPH,#20H
MOV DPL,R1
MOVX @DPTR,A
INC R0
INC R1
DJNZ R7,LOOP1
NOP
NOP
LJMP $
ORG 1000H
DB 23H,45H,0A5H,7FH,8DH,0CDH,33H,0BFH
DB 0FH,66H,9AH,8CH,33H,69H,50H,2DH
DB 6DH,45H,0FEH,90H,0ABH,3CH,67H,88H
DB 0EDH,0FFH,00H,21H,63H,9DH,77H,45H
END
实验三 汇编语言程序设计(二)
一、调试S2.asm、S3.asm两个程序并完成思考题 程序:S2.asm
ORG 0000H
MOV 30H,#68H
MOV 31H,#0AFH
MOV 40H,#9AH
MOV 41H,#59H
MOV R0,#30H
MOV R1,#40H
MOV R7,#02H
CLR C
LOOP2: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,LOOP2
MOV A,#00H
ADDC A,#00H
MOV @R0,A
LJMP $
END
思考题:
1、程序运行结束时,(32H)=01H ,(31H)=09H ,(30H)=02H
2、观察程序运行时,CY,OV,P,AC标志位的变化。
3、修改原始数据为8421码(压缩BCD码),并把程序改成8421码(压缩BCD码)加法程序,并运行该程序。
程序:S3.asm
ORG 0000H
MOV SP,#60H
MOV A,#68H
MOV B,#7EH
MOV DPTR,#20A8H
MOV R0,#74H
MOV R1,#49H
MOV 08H,#30H
MOV 09H,#50H
SETB RS0
PUSH DPH
PUSH DPL
PUSH B
PUSH ACC
MOV @R0,A
XCH A,B
MOV @R1,A
POP ACC
POP DPL
CLR RS0
NOP
NOP
END
思考题:
1、(A)= 68H ,(B)=68H ,(DPH)= 20H ,(DPL)=7EH ,(SP)=62H ,
2、(74H)= 0 ,(49H)=0 ,(30H)= 68H ,(50H)=7EH
保护和恢复现场数据的规则是什么?
答:堆栈,后进先出
二、编程并调试B1.asm和B2.asm
B1.asm
已知(30H)=89H,(31H)=41H,编写并调试一个程序:将30H,31H中的内容进行字节分离为四个字节,高四位为零,低四位为分离后的内容,存放在32H~35H的单元中。 答:也可以直接将8、9、4、1分别放到32H、33H、34H、35H 中
ORG 0000H
MOV SP,#60H
MOV 30H,#89H
MOV 31H,#41H
PUSH 31H
PUSH 30H
ANL 30H,#0F0H
MOV A,30H
SWAP A
MOV 32H,A
POP 30H
ANL 30H,#0FH
MOV 33H,30H
ANL 31H,#0F0H
MOV A,31H
SWAP A
MOV 34H,A
POP 31H
ANL 31H,#0FH
MOV 35H,31H
NOP
END
B2.asm
已知(30H)=89H,(31H)=41H,编写并调试一个程序:将30H,31H中的内容进行循环右移五次。
ORG 0000H
MOV SP,#60H
MOV R7,#5
MOV 30H,#89H
MOV 31H,#41H
MOV A,31H
MOV C,ACC.0
LOOP: MOV A,30H
RRC A
MOV 30H,A
MOV A,31H
RRC A
MOV 31H,A
DJNZ R7,LOOP
NOP
END
1、多路开关指示
AT89C51单片机的P1.0~P1.3接4个二极管,P1.4~P1.7接4个开关,编程读取开关状态,使得对应的发光二极管反映开关状态(开关闭合,对应的灯亮)。
Porteus模型为Multi Switch.DSN如下图所示。
程序设计:
开关状态检测,对于单片机来说,是检测其I/O口的输入。可以轮流检测每个开关状态。根据每个开关的状态让相应的发光二极管指示。
汇编语言源程序:
ORG 00H
START: MOV A,P1 ;读取P1口数据
SWAP A ;交换A中高四位与低四位的位置
ORL A,0F0H ;与0F0H相或
MOV P1,A ;将开关状态送LED显示
SJMP START ;转移到START
END
问题:
为什么A要与0F0H相或?
2、键盘显示
AT89C51的并行口P3上接4×4键盘,P3.0~P3.3为行线,P3.4~P3.7位4列线,在数码管上显示每个按键的序号。
程序指导书有。
3、0-59s计时器(软件延时)
在AT89C51单片机的P2和P3口分别接二个共阴极数码管,编写程序实现0~59s循环计数,并将计数值在数码管显示。
Porteus模型为Timer(Soft).DSN如下图所示。
程序设计:
用一个存储单元作为秒计数单元,当1s到来时,就让秒计数单元加1,当秒计数单元到达60时,就自动返回0,重新计数。显示时要把秒计数单元中数据的十位数和个位数分开,通过查表在数码管上显示。
汇编语言程序:
ORG 00H
START:MOV DPTR,#TABLE
MOV R0,#00H
S1: MOV P3,#00H
MOV P2,#00H
S2: MOV R1,#10
MOV A,R0
MOV B,R1
DIV AB
MOVC A,@A+DPTR
MOV P2,A
MOV A,B
MOVC A,@A+DPTR
MOV P3,A
LCALL DELAY
INC R0
CJNE R0,#60,S2
MOV R0,#00H
LJMP S1
DELAY:MOV R5,#100
D1: MOV R6,#100
D2: MOV R7,#50
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
实验五 功能模块二(定时器)
一、定时器实验:
AT89C51单片机的实验电路如图所示,P1.0口接一个发光二极管,编写程序,控制发光二极管闪烁,时间间隔1s,要求采用AT89C51单片机的内部定时器计时,用中断方式,采用工作方式2。
程序设计要求:
设置内部计数器用作定时器, 是对机器周期数计数。每个机器周期的长度是12个振荡器振荡周期。单片机晶振用12MHz,工作方式2,即8位自动重装方式定时器,定时100微秒中断一次,通过计算,得到定时常数=156,然后对100微秒中断次数计数10000次,就是1s。
汇编语言源程序:
ORG 00H
TICK EQU 10000
T100us EQU 256-100
C100us EQU 30H
LEDBUF EQU 40H
LED BIT P1.0
LJMP START ;跳至主程序
ORG 001BH ;中断服务子程序起始地址 TOINT:PUSH PSW
MOV A,C100us+1
JNZ GOON
DEC C100us
GOON: DEC C100us+1
MOV A,C100us
ORL A,C100us+1
JNZ EXIT
MOV C100us ,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
CPL LEDBUF
EXIT: POP PSW
RETI ;中断返回
START:MOV TMOD,#20H ;方式2,定时器
MOV TH1,#9CH ;置定时器初值
MOV TL1,#9CH
MOV IE,#88H ;开中断
SETB TR1 ;开始定时
CLR LEDBUF
CLR LED
MOV C100us ,#HIGH(TICK)
MOV C100us+1,#LOW(TICK)
LOOP: MOV C,LEDBUF
MOV LED,C
LJMP LOOP
END
二、定时/计数器T0作定时应用3
用AT89C51的定时器/计数器T0产生2s的定时,每当2s定时到来时,更换指示灯闪亮,每个指示灯闪亮的时间为0.2s,也就是说,开始D1指示灯闪亮0.2s,当2s定时到来之后,D2开始闪亮0.2s,如此循环下去。0.2s的闪亮时间也由定时/计数器T0完成。
程序:
COUNT EQU 30H
FLASH EQU 31H
ORG 00H
SJMP START
ORG 0BH ;定时器0中断入口
LJMP INT_T0
START:MOV COUNT,#00H
MOV FLASH,#00H
MOV TMOD,#01H ;设置工作方式
MOV TH0,#3CH ;设置初值
MOV TL0,0B0H
MOV IE,#82H ;开中断
SETB TR0
SJMP $ ;等等中断 turn to LJMP INT_T0
INT_T0:MOV A,COUNT
CJNE A,#00H,L1
CPL P1.0
INC FLASH
MOV A,FLASH
CJNE A,#40,RETUNE
MOV FLASH,#00H
INC COUNT
LJMP RETUNE
L1: CJNE A,#01H,L2
CPL P1.1
INC FLASH
MOV A,FLASH
CJNE A,#40,RETUNE
MOV FLASH,#00H
INC COUNT
LJMP RETUNE
L2: CJNE A,#02H,L3
CPL P1.2
INC FLASH
MOV A,FLASH
CJNE A,#40,RETUNE
MOV FLASH,#00H
INC COUNT
LJMP RETUNE
L3: CJNE A,#03H,RETUNE
CPL P1.3
INC FLASH
MOV A,FLASH
CJNE A,#40,RETUNE
MOV FLASH,#00H
INC COUNT//MOV COUNT,#00H可以循环亮
LJMP RETUNE
RETUNE:MOV TH0,#3CH
MOV TL0,#0B0H
RETI//retune to SJMP $
END
三、计数器
从AT89C51单片机的P3.4口输入外部时钟,编写程序,对外部脉冲个数进行计数,并将计数值用8位发光二极管以二进制数显示出来。
程序设计要求:
AT89C51内部定时/计数器用作计数器,外部时间计数脉冲由P3.4引入定时器T0,单片
机在每个机器周期采样一次T0引脚的输入波形,如果有跳变,则计数值自动加1。
汇编语言源程序:
ORG MOV MOV MOV SETB MOV LJMP END 0000H TMOD,#00000101B TH0,#0 TL0,#0 TR0 P1,TL0 ;置T0计数器方式1 ;置T0初值 ;T0运行 ;记录P1口脉冲个数 ;返回 LOOP: LOOP
重庆科技学院课程设计成果院系电气与信息工程学院班级电自普1002班学生姓名邹锋学号20xx441603设计地点单位逸夫科技大楼I3…
单片机总结报告IC卡小组成员刘绍凯06291043刘永欢06291044一实验设备二实验原理刘中芳06291045如硬件连接图所示…
姓名学号实验一1存储块置全1源代码汇编语言源程序ORG00HSTARTEQU30H起始地址MOVR1STARTMOVR032Rn中…
目录一概述11设计制作产品的背景目的意义12设计制作产品的设计要求13分工情况工作计划及本人所总结工作14本课题的基本内容重点及难…
电气与信息工程学院实践基地实验报告黑龙江科技学院单片机综合设计性实验实验项目名称生产车间流水线自动控制模拟所属课程名称单片机实验日…
题目单片机组成原理实验报告学院计算机科学与工程学院专业信息安全姓名学号20xx年12月8日实验一输入输出接口编程一实验目的1掌握K…
西南科技大学学生实验报告实验课程名称单片机原理及接口技术开课实验室CADCAM计算机实验室学院制造学院专业成型班级学生姓名学号开课…
桂林电子科技大学职业技术学院单片机实训报告红外遥控学院系电子信息工程系专业电子信息工程技术学号1212220xx7学生姓名李建军指…
目录一概述11设计制作产品的背景目的意义12设计制作产品的设计要求13分工情况工作计划及本人所总结工作14本课题的基本内容重点及难…
西南科技大学20xx级微机原理与接口技术课题名称姓名学号系部专业指导教师课程设计报告微机原理与接口技术制造科学与工程学院20xx年…