单片机报告

姓名: 学号:

实验一

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

相关推荐