哈工大单片机实验报告 1

Harbin Institute of Technology

单片机原理与应用

实验报告

学生姓名 学班专

号 级 业

: : : : : :

任课教师 所在单位

软件实验

在软件实验部分,通过实验程序的调试,使学生熟悉MCS-51的指令系统,了解程序设计过程,掌握汇编语言设计方法以及如何使用实验系统提供的调试手段来排除程序错误。

实验一 清零程序

一、实验目的

掌握汇编语言设计和调试方法,熟悉键盘操作。

二、实验内容

把2000~20FFh的内容清零。

三、程序框图

四、实验过程

实验中利用MOVX 语句,将外部存储器指定内容清零。利用数据指针DPTR 完成数据传送工作。程序采用用循环结构完成,R0移动单元的个数,可用CJNE 比较语句判断循环是否结束。

五、实验结果及分析

【问题回答】清零前2000H~20FFH中为内存里的随机数,清零后全变为0。

六、实验源程序

; 清零程序 ORG 0640H

MOV DPTR,#2000H ;(2000H)送DPTR MOV R0,#00H

HERE: MOVX @DPTR,A ;0送(DPTR)

INC DPTR ;DPTR+1 INC R0

CJNE R0,#0FFH,HERE SJMP $ END

实验二 拆字程序

一、实验目的

掌握汇编语言设计和调试方法。

二、实验内容

把2000H 的内容拆开,高位送2001H 低位,低位送2002H 低位,2001H 、2002H 高位清零,一般本程序用于把数据送显示缓冲区时用。

三、程序框图

四、实验过程

将寄存器中内容送入2000H ,分别将高低四位移到低位,将高四位置零然后移入2001H 和2002H 中。利用MOVX 指令、DPTR 指针可实现数据的传送,利用高低四位交换指令SWAP 和与指令ANL 可进行对高低位的清零。

五、实验结果及分析

【问题回答】将ANL A,#0FH改为ORL A,#0F0H可以实现将高位置为1。

六、实验源程序

; 拆字程序

START:MOV DPTR,#2000H MOVX A,@DPTR MOV R0,A SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A MOV A,R0 ANL A,#0FH INC DPTR MOVX @DPTR,A ENDEND

实验三 拼字程序

一、实验目的

进一步掌握汇编语言设计和调试方法。

二、实验内容

把2000H 、2001H 的低位分别送入2002H 高低位,一般本程序用于把显示缓冲区的数据取出拼装成一个字节。

三、程序框图

四、实验过程

本实验主要应用与指令ANL 对高四位进行屏蔽,利用SWAP 指令将2000H 低四位交换到高四位,再用或ORL 语句将2000H 和2001H 的高低四位组合在一起送入2002H 中,从而实现两个数低四位组合。

五、实验结果及分析

【问题回答】本实验运行程序后2002H 内容为34H ,即2000H 单元中低四位“3”作为2002H 的高四位,2001H 的低四位“4”作为2002H 的低四位。

六、实验源程序

; 拼字程序

START: MOV DPTR,#2000H MOVX A,@DPTR ANL A,#0FH SWAP A MOV B,A INC DPTR MOVX A,@DPTR

ANL A,#0FH ORL A,B INC DPTR MOVX @DPTR,A

END

实验四 数据区传送子程序

一、实验目的

掌握RAM 中的数据操作。

二、实验内容

把R2、R3源RAM 区首址内的R6、R7字节数据传送到R4、R5目的RAM 区。

三、程序框图

四、实验过程

实验要求将一段内存中数据移动到另一段内存中,本次实验通过寄存器内容截图显示,是把0000H 单元开始20H 个字节的内容送到1000H 开始的连续数据单元中。先把初始地址分别放入源地址寄存器和目的地址寄存器,然后利用一组寄存器作为需转移数据区长度计数器,开始数据转移循环。每进行一次转移地址寄存器向下加一,计数寄存器内容减一,计数寄存器内容为0退出循环移动结束。由于计数以及地址寄存器是由两个八位寄存器组成,需要在加一减一时对其高字节和低字节进行判断。加一时若低字节加一变为0,则高字节加一,否则低字节加一高字节不变。减一时若低字节已是0则高字节减一,同时低字节变为0FFH ,否则低字节减一高字节不变。

五、实验结果及分析

【问题回答】如图R4、R5定义的目的地址单元中转移之前为随机数,转移后内容与以R2、R3开始的的源地址单元中20个字节内容相同,即实现了数据的传送。

六、实验源程序

; 数据区传送子程序 START: MOV R0,#03H MOV R2,#00H MOV R3,#00H MOV R4,#10H MOV R5,#10H HERE: MOV DPH,R2 MOV DPL,R3 MOVX A,@DPTR MOV DPH,R4 MOV DPL,R5 MOVX @DPTR,A INC R3 INC R5 DEC R0

CJNE R0,#01H,HERE END

实验六 查找相同数个数

一、实验目的

熟悉汇编语言编程。

二、实验内容

在2000~200FH中查出有几个字节是零,把个数放在2100H 中。

三、程序框图

四、实验过程

实验中利用R0放置需查找段长度,即从2000H 单元开始,每次检查完一个单元R0减一,指针下移,直到R0等于0结束循环。R1存放等于零数据的个数,程序中利用等于零跳转指令JZ ,实现找到0则R1加一计数的功能。循环终止后,将R1内容存入2100H 中即可。

五、实验结果及分析

【问题回答】若需查找0FFH ,只需将语句JZ LOOP1改为CJNZ R0, #0FFH, LOOP1即可,即数据等于0FFH 时跳转到计数+1的程序段进行计数。

六、实验源程序

ORG 0000H LJMP MAIN

ORG 0AA0H

MAIN:MOV DPL,#00H

MOV DPH,#20H MOV R0,#10H

MOV R1,#00H

LOOP:MOVX A,@DPTR

JZ LOOP1 DEC R0 INC DPTR

SJMP LOOP2

LOOP1:INC R1

DEC R0

INC DPTR

LOOP2:CJNE R0,#00H,LOOP

MOV DPL,#00H MOV DPH,#21H MOV A,R1 MOVX @DPTR,A

SJMP $ END

实验七 无符号双字节快速乘法子程序

一、实验目的

掌握MCS-51汇编语言程序设计方法。

二、实验内容

将(R2 R3)和(R6 R7)中双字节无符号整数相乘,乘积送R4 R5 R6 R7中。

三、程序框图

四、实验过程

本程序是利用单字节的乘法指令MUL ,根据下面的公式实现双字节数的乘法。

(R2 R3)×(R6 R7)

= ((R2)×28+(R3))×((R6)×28+(R7))

= (R2)×(R6)×216+(R2)×(R7)+(R3)×(R6)×28+(R3)*(R7)

将乘数与被乘数高低字节拆开分别相乘,然后再将每个高字节因子向前移动8位进行调整,进行加权求和。利用ADDC 语句可实现带进位的加法运算。得到的最终结果存入R4、R5、R6、R7寄存器中。

五、实验结果及分析

【问题回答】寄存器R2、R3、R6、R7分别输入01、10、11、10,运行程序,即进行0110H

×1110H 的运算,得到结果为00122100H 存放在R4、R5、R6、R7寄存器中,故R4、R6中的内容是00H 和21H 。

六、实验源程序

ORG 0000H LJMP MAIN

ORG 0970H

MAIN: MOV R2,#01H

MOV R3,#10H MOV R6,#11H MOV R7,#10H MOV A,R3 MOV B,R7 MUL AB XCH A,R7 MOV R5,B MOV B,R2 MUL AB ADD A,R5 MOV R4,A CLR A ADDC A,B MOV R5,A MOV A,R6 MOV B,R3 MUL AB ADD A,R4 XCH A,R6 XCH A,B ADDC A,R5 MOV R5,A MOV F0,C MOV A,R2 MUL AB ADD A,R5 MOV R5,A CLR A MOV ACC.0,C

MOV C,F0 ADDC A,B MOV R4,A SJMP $ END

实验八 多分支程序

一、实验目的

掌握汇编语言的编程。

二、实验内容

编写程序,根据送入的数据转移运行。

三、程序框图

四、实验过程

实验中利用散转指令JMP @A+DPTR实现程序的多分支跳转,这里A 为变址寄存器,DPTR 为基址寄存器。跳转到不同分支的运行结果由LED 进行显示,每个分支对应的数码管上显示不同的数字。显示数字由数字七段码送至I/O口显示。在显示程序中利用循环左移加延时子程序调用,实现数字循环显示的效果。

编程中需要注意的是,A 需乘以2即左移一位再作为变址寄存器,这是程序中由于分支跳转语句为2个字节所致。

五、实验结果及分析

实验中可以看到选择不同的数字进入不同分支,LED 管上会出现不同数字的循环左移显示。

【问题回答】如需将循环速度减慢,只要将延时子程序初值变大,或增加循环层数,或者再增加一段循环语句即可,可进行以下修改:

DELAY: 改为 DELAY:

MOV R3, #0FFH MOV R2, #0FFH DL1: MOV R4, #0FFH DL1: MOV R3, #0FFH DL2: NOP DL2: MOV R4, #0FFH NOP DL3: NOP DJNZ R4,DL2 NOP

DJNZ R3,DL1 DJNZ R4,DL3 RET DJNZ R3,DL2

END DJNZ R2,DL1

RET

END

若将0字循环改为4字循环只需将0字七段码0C0H 改为4字七段码99H 即可。

六、实验源程序

ORG 0000H LJMP MAIN ORG 0DA0H LJMP SOX0 ORG 0A10H

MAIN: MOV 20H, #03H MOV A, 20H

MOV DPTR, #LOOP RL A JMP @A+DPTR

LOOP:AJMPLOOP1

AJMPLOOP2 AJMPLOOP3 AJMPLOOP4

LOOP1: MOV 21H, #0C0H

SJMPSOX0

LOOP2:MOV 21H, #0F9H

SJMPSOX0

LOOP3: MOV 21H, #0A4H

SJMPSOX0

LOOP4: MOV 21H, #0B0H SOX0:

MOV A, 21H

MOV R0, #0DCH

MOV R1, #0DDH MOVX @R0, A MOV A, #01H

SOX1:

MOVX @R1, A MOV R2, #20H

LCALL DELAY

RL A SJMP SOX1

DELAY:

MOV R3,#0FFH

DL1:MOV R4,#0FFH DL2:NOP

NOP DJNZ R4,DL2 DJNZ R3,DL1 RET

END

实验十 电脑时钟(定时器、中断器综合实验)

一、实验目的

熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用实时程序的设计与调试技巧。

二、实验内容

编写程序,从本实验系统键盘上输入时间初值,用定时器产生0.1S 定时中断,对时钟计数器计数,并将数值实时地送数码管显示。

三、程序框图

四、实验过程

在与PC 联机状态下,编译、连接、下载PH51\se10.asm,用连续方式运行该程序。 在键盘上输入时间初值,按执行键EXEC 执行,数码管上实时显示时间值。

按“暂停图标”或实验箱上的“暂停按钮”,系统无条件退出该程序运行返回监控状态。

五、实验结果及分析

键入起始时刻小时分钟后,秒显示器从11开始逐次加1,至60进位分显示器,最后到小时显示器,到24小时后全部清零循环往复。

【问题回答】如何修改程序使定时器工作方式改变(实现12小时制)?

将clock 子程序中最后的#24H改为#12H即可。

六、实验源程序

ORG 0000H SJMP CHK00 ORG 000BH

LJMP CLOCK;INT_T0 ORG 0030H CHK00: MOV SP,#60H LCALL LEDP

CHK0: LCALL LCK0 ; 键扫, 显示子程序 LCALL PTDS0 ; 显示缓冲区放数子程序 MOV TMOD,#01H

ORL IE,#10000010b ;EA=1, IT0=1 MOV TL0,#0

MOV TH0,#4ch ; 定时中断初始化 MOV 23H,#00H

SETB TR0 ; 开定时 LOO5: LCALL DIS LCALL PTDS0 SJMP LOO5 PTDS0: MOV R0,#79H MOV A,22H ACALL PTDS MOV A,21H ACALL PTDS MOV A,20H ACALL PTDS RET

;---------------------------------------

PTDS: MOV R1,A ; 拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A

;SSEE ; 显示

PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET

;--------------------------------------- CLOCK: MOV TL0,#0B7H

MOV TH0,#3CH ; 恢复初值 PUSH PSW PUSH ACC

SETB 0D3H ; 保护 INC 23H ;0.1秒加1 MOV A,23H

CJNE A,#20,DONE ;1秒到吗? MOV 23H,#00H ; 清0.1秒单元 MOV A,22H

INC A ; 秒加1 DA A

MOV 22H,A ; 十进制调整 CJNE A,#60H,DONE ;60秒到吗? MOV 22H,#00H ; 秒单元清零 MOV A,21H INC A

DA A ; 分加1. 十进制调整 MOV 21H,A

CJNE A,#60H,DONE ;60分到吗? MOV 21H,#00H ; 分单元清零 MOV A,20H INC A

DA A ; 时加1. 十进制调整 MOV 20H,A

CJNE A,#24H,DONE ;24小时到吗? MOV 20H,#00H ; 时单元清零 DONE: POP ACC ; 退栈 POP PSW RETI

;----------------------------------------------

SSEE: SETB RS1 ; 换工作区 MOV R5,#05H

SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#0DDH MOV A,30H

MOVX @R1,A ; 字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF

MOVC A,@A+DPTR ; 取字形代码 MOV R1,#0DCH

MOVX @R1,A ; 字形送入 MOV A,30H ; 右移 RR A MOV 30H,A DEC 31H MOV A,#0FFH

MOVX @R1,A ; 关显示 DJNZ R7,SSE1 ;6位显示完了吗? DJNZ R5,SSE2 ;5次显示完了吗? CLR RS1 RET

;-------------------------------------------------------

DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH ;------------------------------------------------------- X3: MOV R4,A MOV R0,#50H MOV A,@R0 MOV R1,A MOV A,R4 MOV @R1,A CLR A POP DPH POP DPL

MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30

dec r1 clr a

MOVC A,@A+DPTR X31: MOV @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 ;-------------------------- X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#50H MOV A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET ;---------------------------- XLE: ACALL DIS ACALL KEY

MOV R4,A MOV R1,#48H MOV A,@R1 MOV R2,A INC R1 MOV A,@R1 MOV R3,A MOV A,R4 XRL A,R3 MOV R3,04H MOV R4,02H JZ X10 MOV R2,#88H MOV R4,#88H X10: DEC R4 MOV A,R4 XRL A,#82H JZ X11 MOV A,R4 XRL A,#0EH JZ X11 MOV A,R4 JZ X12 MOV R4,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH X11: MOV R2,04H NOP

NOP

MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOV @R1,A INC R1 MOV A,R3 MOV @R1,A MOV A,R4

JB ACC.5,X113

JB ACC.4,X113 MOV DPTR,#LS3 MOVC A,@A+DPTR

X113: RET

;---------------------------------

LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH ;----------------------------------- DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 LS2: MOV A,@R0 MOVC A,@A+DPTR MOV R1,#0DCH MOVX @R1,A MOV A,R2 inc R1 MOVX @R1,A LS1: DJNZ R3,LS1 CLR C RRC A MOV R2,A DEC R0 JNZ LS2 movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1 POP DPL POP DPH RET

;---------------------------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;--------------------------------------------- KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: MOV R1,#0DDH MOV A,R2 MOVX @R1,A RL A MOV R2,A inc r1

MOVX A,@R1 CPL A ANL A,#0FH JNZ LP0 INC R0 DJNZ R3,LP1 XP33: MOV A,#20H XP3: mov r2,a clr a mov r1,#0ddh movx @r1,a

mov a,r2

CLR RS1 RET ;---------------------------- LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2

SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 sjmp xp3 ;-------------------------------- LEDP: MOV 50H,#7EH

MOV A,#10H MOV R0,#79H

MOV @R0,A

LEDS:

INC R0

CJNE R0,#7EH,LEDS INC A MOV @R0,A RET

;-------------------------------- LCK0: LCALL X2 JB ACC.4,LDFC LCALL X3 DB 79H,7EH SJMP LCK0

LDFC: CJNE A, #16H,LCK0 MOV A, 7AH SWAP A ORL A, 79H MOV 22H, A CJNE A, #60H,LE09 LE09: JNC LE24 MOV A, 7CH SWAP A ORL A, 7BH MOV 21H, A CJNE A, #60H,LE15 LE15: JNC LE24 MOV A, 7EH SWAP A ORL A, 7DH

CJNE A, #24H,LE21 LE21: JNC LE24 RET

;--------------------------------- LE24: CLR 8CH LJMP CHK00 ;-------------------------------- END

实验十一 二进制转换到BCD

一、实验目的

将给定的一个二进制数,转换成二进制编码的十进制(BCD )码。

二、实验内容

掌握简单的数值转换算法,基本了解数值的各种表达方法。

三、程序框图

四、实验过程

本程序中需要转换的二进制数为4AH 。由于八位内存存储的最大数据为FFH 即十进制的255,故所转换的十进制数只有百位、十位和个位。百位的BCD 码即待转换二进制数除以100得到的商,余数保存;用余数除以10得到十位BCD 码,所得余数即为个位BCD 码。将转换后BCD 码三位装入20H-22H 内存即可。

五、实验结果及分析

转换后BCD 码

0020H-0022H 单元中中存放的74即为二进制数4AH 转换后得到的BCD 码。

六、实验源程序

; 待调整数A=4AH

MAIN:CLR A

MOV R5,A MOV R6,A MOV A,#04AH MOV B,#64H DIV AB MOV 20H,A MOV A,B MOV B,#0AH DIV AB MOV 21H,A MOV 22H,B SJMP $ END ORG 0000H LJMP MAIN ORG 100H

实验十四 键盘扫描显示实验

一、实验要求

在上一个实验的基础上,利用实验系统提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成三个模块。

①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 ②显示模块:将显示单元的内容在显示器上动态显示。 ③主程序:调用键输入模块和显示模块。

二、实验目的

⑴掌握键盘和显示器的接口方法和编程方法。 ⑵掌握键盘扫描和LED 八段码显示器的工作原理。

三、实验说明

本实验系统自带一个8×4的键盘,在判断有键按下后,要有一定的延时,防止键盘抖动。

四、程序框图

五、实验步骤

1、在联机状态下,编译、连接、下载、连续运行PH51\se14.asm,利用实验系统的显示设备、键盘实现按键的输入并送至显示设备输出。

2、按“暂停图标”,系统无条件退出该程序运行返回监控状态。

六、实验源程序

OUTBIT equ 0ffddh ; 位控制口/键扫口 OUTSEG equ 0ffdch ; 段控制口 IN equ 0ffdeh ; 键盘读入口 LedBuf equ 60h ; 显示缓冲

org 0 Start:

mov sp,#40h

mov LedBuf+0,#0c2h ; 显示"Good" mov LedBuf+1,#0a3h mov LedBuf+2,#0a3h mov LedBuf+3,#0a1h mov LedBuf+4,#0ffh mov LedBuf+5,#0ffh MLoop:

call DisplayLED ; 显示

call GetKey ; 扫描键盘并读取键值 jb acc.5,MLoop jb acc.4,MLoop

anl a,#00001111b ; 显示键码 mov dptr,#LedMap movc a,@a+dptr

mov LedBuf+5,a sjmp MLoop

Delay: ; 延时子程序 mov r7,#0 DelayLoop:

djnz r7,DelayLoop djnz r6,DelayLoop ret

DisplayLED:

mov r0,#LedBuf

mov r1,#6 mov r2,#00100000b Loop:

mov dptr,#OUTBIT mov a,#0

movx @dptr,a

mov a,@r0 mov dptr,#OUTSEG movx @dptr,a

mov dptr,#OUTBIT mov a,r2

movx @dptr,a

mov r6,#1 call Delay

mov a,r2 rr a mov r2,a

inc r0

djnz r1,Loop

; 共6个八段管 ; 从左边开始显示 ; 关所有八段管 ; 显示一位八段管 ; 显示下一位

ret GetKey:

call ScanKey mov r4,a mov r1,#48h mov a,@r1 mov r2,a inc r1 mov a,@r1 mov r3,a mov a,r4 xrl a,r3 mov r3,04h mov r4,02h jz Key1 mov r2,#88h mov r4,#88h Key1: dec r4 mov a,r4 xrl a,#82h jz Key2 mov a,r4 xrl a,#0eh jz Key2 mov a,r4 jz Key3 mov r4,#20h dec r2 sjmp Key4 Key3: mov r4,#0fh Key2: mov r2,04h mov r4,03h Key4: mov r1,#48h mov a,r2 mov @r1,a inc r1 mov a,r3

mov a,r4 jb acc.5,Exit jb acc.4,Exit mov dptr,#KeyTable movc a,@a+dptr Exit: ret ScanKey: setb RS1 mov r2,#0feh mov r3,#08h mov r0,#00h

LoopS: mov r1,#Low(OUTBIT) mov a,r2 movx @r1,a rl a mov r2,a inc r1 movx a,@r1 cpl a anl a,#0fh jnz Scan inc r0 djnz r3,LoopS ReTKey3:mov a,#20h TKey3: mov r2,a clr a

mov r1,#Low(OUTBIT) movx @r1,a mov a,r2 clr RS1 ret Scan:

cpl a

jb acc.0,TKey0 mov a,#00h

TKey0: jb acc.1,TKey1 mov a,#08h sjmp EndLoop TKey1: jb acc.2,TKey2 mov a,#10h sjmp EndLoop TKey2: jb acc.3,ReTKey3 mov a,#18h EndLoop:add a,r0 sjmp TKey3

LedMap: ; 八段管显示码 db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh

KeyTable: ; 键码定义 db 07h,04h,08h,05h,09h,06h,0ah,0bh db 01h,00h,02h,0fh,03h,0eh,0ch,0dh

end

硬 件 实 验

硬件实验部分可使学生能进一步掌握单片机系统扩展和输入输出程序的设计方法,熟悉对扩展系统的软件、硬件设计,调试方法和技巧。

实验一 P1口亮灯实验

一、实验目的

(1)学习P1口的使用方法; (2)学习延时子程序的编写。

二、实验内容

P1口作为输出口,接八个发光二极管,编写程序,使发光二极管循环点亮。

三、程序框图

四、实验电路

五、实验过程

连接电路,编写程序,然后观察LED 灯的显示情况。

此程序运用定时器中断实现计数定时功能。使用中断时,需设置中断控制字TMOD ,使定时器1工作于中断方式,然后设置延时子程序初值即TH1和TL1,利用ACALL 语句即可申请中断。运行程序时,调用延时子程序,开启计数器,计数器满时发出中断返回中断处,等待下次开始,从而实现循环定时计数功能。

六、实验结果及分析

实验中LED 灯管闪亮并维持一定时间,按循环左移方式点亮。

【问题回答】若要增加LED 灯闪亮时间,可以使延时子程序中计数器计数周期增长,即初值TL1、TH1值减小即可。改变亮灯方向,只需将RL A变为RR A即可。

七、实验源程序

ORG 100H

START: MOV R0, #08H MOV A, #11111110B LOOP: MOV P1, A ACALL DELAY RL A

DJNZ R0, LOOP JMP START

DELAY: MOV TMOD, #00010000B MOV TL1, #0c0H MOV TH1, #63H SETB TR1 JNB TF1, $ CLR TF1 RET END

实验三 P3.3口输入 P1口输出

一、实验目的

1. 掌握P3口、P1口简单使用。

2. 学习延时程序的编写和使用。

二、实验内容

1.P3口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。

2.P1口做输出口,编写程序,使P1口接的8 个发光二极管L1—L8按16进制加一方式点亮发光二极管。

三、程序框图

-31-

四、实验电路

五、实验过程

实验是将P3.3口串行输入的电压变换次数变为累加器中的数并用P1口并行显示出来。P3.3读入数据前应加高电平防止误读。每次读入电压负跳变,累加器中数值加一,取反送至P1口。P1口八位分别控制8个LED 灯管,若为高电平则灭,低电平则亮,从而通过灯的亮灭来表示按键次数。

六、实验结果及分析

实验中每开合一次开关K1,LED 灯的显示情况表示的数字就加一,如同二进制数,灯亮表示1,灯灭表示0。

【问题回答】L3和L4。 开合K1开关13次即对应的二进制数为1101,点亮的LED 灯为L1、

七、实验源程序

ORG 100H START: MOV A, #00H

-32-

CLR C

LOOP: MOV C, P3.3 JC LOOP ACALL DELAY LOOP1: MOV C, P3.3 JC LOOP LOOP2: MOV C, P3.3 JNC LOOP2 ACALL DELAY INC A CPL A MOV P1, A CPL A JMP LOOP

DELAY: MOV R6, #00H DELAY1: MOV R7, #80H DJNZ R7, $ DJNZ R6, DELAY1 RET END

实验四 工业顺序控制

一、实验目的

掌握工业顺序控制程序的简单编程,中断的使用。

二、实验内容

8032的P1.0—P1.6控制注塑机的七道工序,现模拟控制七只发光二极管的点亮,高电平有效,设定每道工序时间转换为延时,P3.4为开工启动开关,高电平启动。P3.3为外故障输入模拟开关,P3.2为0时不断警告。P1.7为报警声音输出,设定6道工序只有一位输出,第七道工序三位有输出。

三、程序框图

-33-

四、实验电路

五、实验过程

实验中用外部中断0,编中断服务程序的关键是:

1. 保护进入中断时的状态,并在退出中断之前恢复进入的状态。

2. 必须在中断程序中设定是否允许中断重入,即设置EX0位。 运行过程:

(1)连续方式开始运行程序,此时应在等待开工状态。 (2)K1拨至低电平“L ”位置,各道工序应正常运行。

(3)K2拨至低电平“L ”位置,应有声音报警(人为设置故障)。

(4)K2拨至高电平“H ”位置,即排除故障,程序应从报警的那道工序继续执行。

K2分别模拟总开关和外部紧急事件,实验中运用外部中断0来实现报警功能,由K1、

一旦有外界中断或人为控制,系统则停在当前工序,执行中断程序。报警时调用响铃子程序设定蜂鸣器响铃,时间由延时长度控制。外部中断消失,且允许工作时,系统按工序一步一步循环进行,由亮灯表示工序进行过程,由延时子程序设定工序持续时长。

六、实验结果及分析

-34-

实验中工序进行由小灯亮灭表示,一旦遇到K1変高电平或者K2为低电平系统即停止K2为低时产生报警声响,K2为高时才继续正常工作。 工作等待中断被处理,只有K1为低,

【问题回答】工序一L1、L2亮工序二L2、L3亮,需将工序一中MOV P1, #7EH改为MOV P1, #7CH,同时将工序二中MOV P1, #7DH改为MOV P1, #79H.

七、实验源程序

ORG 0000H LJMP PO10 ORG 0003H LJMP PO16 ORG 0190H PO10: MOV P1,#7FH ORL P3,#00H PO11: JNB P3.4,PO11 ORL IE,#81H ORL IP,#01H MOV PSW,#00H MOV SP,#53H

PO12: MOV P1,#7EH POa: JNB P3.4,POa ACALL PO1B MOV P1,#7DH POc: JNB P3.4,POc ACALL PO1B MOV P1,#7BH POe: JNB P3.4,POe ACALL PO1B MOV P1,#77H POg: JNB P3.4,POg ACALL PO1B MOV P1,#6FH POb: JNB P3.4,POb ACALL PO1B MOV P1,#5FH POf: JNB P3.4,POf ACALL PO1B MOV P1,#3FH POd: JNB P3.4,POd

; 第一道工序

-35-

ACALL PO1B SJMP PO12

PO16: MOV B,R2

; 保护现场

PO17: MOV P1,#0FFH ; 关输出 MOV 20H,#0A0H ; 振荡次数 PO18: SETB P1.7

; 振荡

ACALL PO1A ; 延时 CLR P1.7

; 停振

ACALL PO1A DJNZ 20H,PO18 CLR P1.7

ACALL PO1A JNB P3.2,PO17 MOV R2,B RETI

PO1A: MOV R2,#06H ACALL DELY RET

PO1B: MOV R2,#30H ACALL DELY RET DELY: PUSH 02H DEL2: PUSH 02H

DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET

END

; 延时 ; 不为0转

; 停振 ; 故障消除吗? ; 恢复现场 ; 延时

-36-

实验七 8255控制交通灯

一、实验目的

了解8255芯片的结构及编程方法,学习模拟交通灯控制的实现方法。

二、实验内容

用8255做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。

三、程序框图

四、实验电路

五、实验过程

假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1东西绿灯通车,南北红灯。过一段时间转状态2,东西绿灯灭,黄灯闪烁几次,南北仍然红灯。再转状态3,南北绿灯通车,东西红灯。过一段时间转状态 4,南北绿灯灭,闪几次黄灯,延时几秒,东西仍然红灯。最后循环至状态1。

实验中调用延时子程序实现交通灯点亮持续一段时间再转变。通过对输出口写入特定数值,实现灯亮灭的控制。延时程序可通过对R2寄存器的压栈和出栈操作实现。在程序实现的过程中,需要对现场进行保护和恢复。交通灯闪烁由调用较短延时实现。

六、实验结果及分析

-37-

在连续运行方式下,初始态为四个路口的红灯全亮之后,东西路口的绿灯亮南北路口的红灯亮,东西路口方向通车。延时一段时间后东西路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,再切换到东西路口方向。之后重复以上过程。

【问题回答】东西方向的红灯是L6和L12。

七、实验源程序

ORG 0BB0H D0: MOV SP,#60H MOV DPTR,#0FFDBH MOV A,#88H MOVX @DPTR,A MOV DPTR,#0FFD8H

MOV A,#0B6H MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A MOV R2,#25H LCALL DELY D3: MOV DPTR,#0FFD8H MOV A,#75H

MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A MOV R2,#55H LCALL DELY MOV R7,#05H D1: MOV DPTR,#0FFD8H

MOV A,#0F3H MOVX @DPTR,A INC DPTR

MOV A,#0CH MOVX @DPTR,A

; 制定一个空间 ; 保护现场

; 写控制字的地址FFDB

; 控制字A 口输出工作在方式0 C口高4位

输入,C 口低4位输出工作在方式0,B 口输出

; 设置控制字

;101100110点亮6 9 12号灯 ;00001101点亮3号灯 ; 点亮4个红灯 ; 设定一个延时时间 ; 延时

;01110101点亮5 9 11 ;00001101点亮3号灯 ; 东西绿灯亮, 南北红灯亮 ; 设定一个延时时间 ; 延时

; 设定闪烁次数 ;11110011 点亮9 10 ;1100点亮3 4

; 东西黄灯亮, 南北红灯亮 -38-

MOV R2,#20H LCALL DELY MOV DPTR,#0FFD8H

MOV A,#0F7H MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A ; 设定一个延时时间 ; 延时

;11110111点亮9号灯

;00001101点亮3号灯 ; 南北红灯亮

MOV R2,#20H

LCALL DELY DJNZ R7,D1 MOV DPTR,#0FFD8H MOV A,#0AEH

MOVX @DPTR,A INC DPTR

MOV A,#0BH MOVX @DPTR,A MOV R2,#55H

LCALL DELY MOV R7,#05H D2: MOV DPTR,#0FFD8H

MOV A,#9EH MOVX @DPTR,A INC DPTR

MOV A,#07H MOVX @DPTR,A MOV R2,#20H

LCALL DELY MOV DPTR,#0FFD8H

MOV A,#0BEH MOVX @DPTR,A INC DPTR

MOV A,#07H MOVX @DPTR,A MOV R2,#20H

LCALL DELY DJNZ R7,D2 LJMP D3 ; 延时

; 闪烁次数未到继续

;10101110点亮6 8 12

;1011点亮2号

; 东西红灯亮, 南北绿灯亮

; 延时 ; 闪烁次数

;10011110点亮6 7 12

;0111点亮1号

; 东西红灯亮, 南北黄灯亮

; 延时

;10111110点亮6 12——把7号黄灯灭了

; 把1号黄灯灭了 ; 东西红灯亮

; 延时

; 闪烁次数未到继续

; 循环

-39-

;--------------------------------------------- DELY: PUSH 02H DEL2: PUSH 02H

DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET

;---------------------------------------------

END

; 延时

实验十九 小直流电机调速试验

一、实验目的

1. 掌握直流电机的驱动原理。 2. 了解直流电机调速的方法。

二、实验内容

1. 用0832 D/A转换电路后的输出经放大后驱动直流电机。

2. 编制程序改变0832输出经放大后的方波信号的占空比来控制电机转速。本实验中 D/A输出为双极性输出,因此电机可以正反向旋转。

三、程序框图

四、实验电路

-40-

五、实验过程

实验时,需先进行D/A电压调零,然后再运行电机调速主程序。实验中,通过中断和循环延时的方法通过D/A产生一定占空比的方波信号,通过数据送缓冲区,将控制信号送入D/A产生控制脉冲。由于D/A输出为双极性输出,因此电机可以正反向旋转驱动电机。通过控制方波信号的占空比,即控制一段时间内的平均电压,从而控制电机转速。

六、实验结果及分析

实验中可以观察到运行调零程序后小电机停转,运行调速程序后小电机开始旋转并以一定的周期变换转动方向。

【问题回答】实验中,可通过控制方波信号的占空比来改变电机转速。可修改LO20程序段中语句MOV A,#80H中立即数80H 的值,来修改占空比。80H 即占空比为1/2,将其值改小,即可增大占空比,从而使电机转速加快。

七、实验源程序

;===================== D/A(调零程序) =========================

;---D/A 0V输出(调基准电压)---

; 在进行D/A输出方波、小直流电机实验之前,必须先运行本调零程序!

; 装载并连续运行本程序,调节基准电压控制电位器W2,使D/A输出端“AOUT”输出电压为0V

ORG 0617h

MOV SP,#53H

MOV 7EH,#00H

MOV 7DH,#08H

MOV 7CH,#03H

MOV 7BH,#02H ; 显示缓冲区初值 LO22: MOV A,#80H

CALL LO21

SJMP LO22

;---------------------------

PTDS: MOV R1,A ; 拆送显示缓冲区 ACALL PTDS1

MOV A,R1

SWAP A

PTDS1: ANL A,#0FH

MOV @R0,A

INC R0

RET

;-----------------------------

DIS: PUSH DPH

PUSH DPL

SETB RS1

MOV R0,#7EH

MOV R2,#20H

MOV R3,#00H

MOV DPTR,#LS0

LS2: MOV A,@R0

MOVC A,@A+DPTR

MOV R1,#0DCH

MOVX @R1,A

MOV A,R2

inc R1

MOVX @R1,A

LS1: DJNZ R3,LS1

CLR C

RRC A

MOV R2,A

DEC R0

JNZ LS2

movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1

POP DPL

POP DPH

RET

;---------------------------------

LO21: MOV DPTR,#0FFE0H

MOVX @DPTR,A ; 送0832转换 MOV R0,#79H

LCALL PTDS

MOV R2,#00H

L023: LCALL DIS ; 显示

DJNZ R2,L023

RET

;----------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H

DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;-------------------------------

END

; 小直流电机调速程序

ORG 05E0H

SE13: MOV SP,#53H

MOV 7EH,#00H

MOV 7DH,#08H

MOV 7CH,#03H

MOV 7BH,#02H ; 显示缓冲区初值 LO20: MOV A,#80H ; 停止 CALL LO21

MOV A,#00H ; 反转

MOV A,#80H ; 停止 CALL LO21

MOV A,#0FFH ; 正转 CALL LO21

SJMP LO20

;====D/A直流电机正转、反转、停止=== LO21: MOV DPTR,#0FFE0H

MOVX @DPTR,A

MOV R0,#79H

LCALL PTDS

MOV R2,#00H

L023: LCALL DIS

DJNZ R2,L023

RET

;---------------------------

PTDS: MOV R1,A

ACALL PTDS1

MOV A,R1

SWAP A

PTDS1: ANL A,#0FH

MOV @R0,A

INC R0

RET

;-----------------------------

DIS: PUSH DPH

PUSH DPL

SETB RS1

MOV R0,#7EH

MOV R2,#20H

MOV R3,#00H

MOV DPTR,#LS0

LS2: MOV A,@R0

MOVC A,@A+DPTR

MOV R1,#0DCH

MOVX @R1,A

MOV A,R2

inc R1 ; 送0832转换 ; 显示 ; 拆送显示缓冲区

LS1: DJNZ R3,LS1

CLR C

RRC A

MOV R2,A

DEC R0

JNZ LS2

movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1

POP DPL

POP DPH

RET

;----------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H

DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;-------------------------------

END

Harbin Institute of Technology

单片机原理与应用

实验报告

学生姓名 学班专

号 级 业

: : : : : :

任课教师 所在单位

软件实验

在软件实验部分,通过实验程序的调试,使学生熟悉MCS-51的指令系统,了解程序设计过程,掌握汇编语言设计方法以及如何使用实验系统提供的调试手段来排除程序错误。

实验一 清零程序

一、实验目的

掌握汇编语言设计和调试方法,熟悉键盘操作。

二、实验内容

把2000~20FFh的内容清零。

三、程序框图

四、实验过程

实验中利用MOVX 语句,将外部存储器指定内容清零。利用数据指针DPTR 完成数据传送工作。程序采用用循环结构完成,R0移动单元的个数,可用CJNE 比较语句判断循环是否结束。

五、实验结果及分析

【问题回答】清零前2000H~20FFH中为内存里的随机数,清零后全变为0。

六、实验源程序

; 清零程序 ORG 0640H

MOV DPTR,#2000H ;(2000H)送DPTR MOV R0,#00H

HERE: MOVX @DPTR,A ;0送(DPTR)

INC DPTR ;DPTR+1 INC R0

CJNE R0,#0FFH,HERE SJMP $ END

实验二 拆字程序

一、实验目的

掌握汇编语言设计和调试方法。

二、实验内容

把2000H 的内容拆开,高位送2001H 低位,低位送2002H 低位,2001H 、2002H 高位清零,一般本程序用于把数据送显示缓冲区时用。

三、程序框图

四、实验过程

将寄存器中内容送入2000H ,分别将高低四位移到低位,将高四位置零然后移入2001H 和2002H 中。利用MOVX 指令、DPTR 指针可实现数据的传送,利用高低四位交换指令SWAP 和与指令ANL 可进行对高低位的清零。

五、实验结果及分析

【问题回答】将ANL A,#0FH改为ORL A,#0F0H可以实现将高位置为1。

六、实验源程序

; 拆字程序

START:MOV DPTR,#2000H MOVX A,@DPTR MOV R0,A SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A MOV A,R0 ANL A,#0FH INC DPTR MOVX @DPTR,A ENDEND

实验三 拼字程序

一、实验目的

进一步掌握汇编语言设计和调试方法。

二、实验内容

把2000H 、2001H 的低位分别送入2002H 高低位,一般本程序用于把显示缓冲区的数据取出拼装成一个字节。

三、程序框图

四、实验过程

本实验主要应用与指令ANL 对高四位进行屏蔽,利用SWAP 指令将2000H 低四位交换到高四位,再用或ORL 语句将2000H 和2001H 的高低四位组合在一起送入2002H 中,从而实现两个数低四位组合。

五、实验结果及分析

【问题回答】本实验运行程序后2002H 内容为34H ,即2000H 单元中低四位“3”作为2002H 的高四位,2001H 的低四位“4”作为2002H 的低四位。

六、实验源程序

; 拼字程序

START: MOV DPTR,#2000H MOVX A,@DPTR ANL A,#0FH SWAP A MOV B,A INC DPTR MOVX A,@DPTR

ANL A,#0FH ORL A,B INC DPTR MOVX @DPTR,A

END

实验四 数据区传送子程序

一、实验目的

掌握RAM 中的数据操作。

二、实验内容

把R2、R3源RAM 区首址内的R6、R7字节数据传送到R4、R5目的RAM 区。

三、程序框图

四、实验过程

实验要求将一段内存中数据移动到另一段内存中,本次实验通过寄存器内容截图显示,是把0000H 单元开始20H 个字节的内容送到1000H 开始的连续数据单元中。先把初始地址分别放入源地址寄存器和目的地址寄存器,然后利用一组寄存器作为需转移数据区长度计数器,开始数据转移循环。每进行一次转移地址寄存器向下加一,计数寄存器内容减一,计数寄存器内容为0退出循环移动结束。由于计数以及地址寄存器是由两个八位寄存器组成,需要在加一减一时对其高字节和低字节进行判断。加一时若低字节加一变为0,则高字节加一,否则低字节加一高字节不变。减一时若低字节已是0则高字节减一,同时低字节变为0FFH ,否则低字节减一高字节不变。

五、实验结果及分析

【问题回答】如图R4、R5定义的目的地址单元中转移之前为随机数,转移后内容与以R2、R3开始的的源地址单元中20个字节内容相同,即实现了数据的传送。

六、实验源程序

; 数据区传送子程序 START: MOV R0,#03H MOV R2,#00H MOV R3,#00H MOV R4,#10H MOV R5,#10H HERE: MOV DPH,R2 MOV DPL,R3 MOVX A,@DPTR MOV DPH,R4 MOV DPL,R5 MOVX @DPTR,A INC R3 INC R5 DEC R0

CJNE R0,#01H,HERE END

实验六 查找相同数个数

一、实验目的

熟悉汇编语言编程。

二、实验内容

在2000~200FH中查出有几个字节是零,把个数放在2100H 中。

三、程序框图

四、实验过程

实验中利用R0放置需查找段长度,即从2000H 单元开始,每次检查完一个单元R0减一,指针下移,直到R0等于0结束循环。R1存放等于零数据的个数,程序中利用等于零跳转指令JZ ,实现找到0则R1加一计数的功能。循环终止后,将R1内容存入2100H 中即可。

五、实验结果及分析

【问题回答】若需查找0FFH ,只需将语句JZ LOOP1改为CJNZ R0, #0FFH, LOOP1即可,即数据等于0FFH 时跳转到计数+1的程序段进行计数。

六、实验源程序

ORG 0000H LJMP MAIN

ORG 0AA0H

MAIN:MOV DPL,#00H

MOV DPH,#20H MOV R0,#10H

MOV R1,#00H

LOOP:MOVX A,@DPTR

JZ LOOP1 DEC R0 INC DPTR

SJMP LOOP2

LOOP1:INC R1

DEC R0

INC DPTR

LOOP2:CJNE R0,#00H,LOOP

MOV DPL,#00H MOV DPH,#21H MOV A,R1 MOVX @DPTR,A

SJMP $ END

实验七 无符号双字节快速乘法子程序

一、实验目的

掌握MCS-51汇编语言程序设计方法。

二、实验内容

将(R2 R3)和(R6 R7)中双字节无符号整数相乘,乘积送R4 R5 R6 R7中。

三、程序框图

四、实验过程

本程序是利用单字节的乘法指令MUL ,根据下面的公式实现双字节数的乘法。

(R2 R3)×(R6 R7)

= ((R2)×28+(R3))×((R6)×28+(R7))

= (R2)×(R6)×216+(R2)×(R7)+(R3)×(R6)×28+(R3)*(R7)

将乘数与被乘数高低字节拆开分别相乘,然后再将每个高字节因子向前移动8位进行调整,进行加权求和。利用ADDC 语句可实现带进位的加法运算。得到的最终结果存入R4、R5、R6、R7寄存器中。

五、实验结果及分析

【问题回答】寄存器R2、R3、R6、R7分别输入01、10、11、10,运行程序,即进行0110H

×1110H 的运算,得到结果为00122100H 存放在R4、R5、R6、R7寄存器中,故R4、R6中的内容是00H 和21H 。

六、实验源程序

ORG 0000H LJMP MAIN

ORG 0970H

MAIN: MOV R2,#01H

MOV R3,#10H MOV R6,#11H MOV R7,#10H MOV A,R3 MOV B,R7 MUL AB XCH A,R7 MOV R5,B MOV B,R2 MUL AB ADD A,R5 MOV R4,A CLR A ADDC A,B MOV R5,A MOV A,R6 MOV B,R3 MUL AB ADD A,R4 XCH A,R6 XCH A,B ADDC A,R5 MOV R5,A MOV F0,C MOV A,R2 MUL AB ADD A,R5 MOV R5,A CLR A MOV ACC.0,C

MOV C,F0 ADDC A,B MOV R4,A SJMP $ END

实验八 多分支程序

一、实验目的

掌握汇编语言的编程。

二、实验内容

编写程序,根据送入的数据转移运行。

三、程序框图

四、实验过程

实验中利用散转指令JMP @A+DPTR实现程序的多分支跳转,这里A 为变址寄存器,DPTR 为基址寄存器。跳转到不同分支的运行结果由LED 进行显示,每个分支对应的数码管上显示不同的数字。显示数字由数字七段码送至I/O口显示。在显示程序中利用循环左移加延时子程序调用,实现数字循环显示的效果。

编程中需要注意的是,A 需乘以2即左移一位再作为变址寄存器,这是程序中由于分支跳转语句为2个字节所致。

五、实验结果及分析

实验中可以看到选择不同的数字进入不同分支,LED 管上会出现不同数字的循环左移显示。

【问题回答】如需将循环速度减慢,只要将延时子程序初值变大,或增加循环层数,或者再增加一段循环语句即可,可进行以下修改:

DELAY: 改为 DELAY:

MOV R3, #0FFH MOV R2, #0FFH DL1: MOV R4, #0FFH DL1: MOV R3, #0FFH DL2: NOP DL2: MOV R4, #0FFH NOP DL3: NOP DJNZ R4,DL2 NOP

DJNZ R3,DL1 DJNZ R4,DL3 RET DJNZ R3,DL2

END DJNZ R2,DL1

RET

END

若将0字循环改为4字循环只需将0字七段码0C0H 改为4字七段码99H 即可。

六、实验源程序

ORG 0000H LJMP MAIN ORG 0DA0H LJMP SOX0 ORG 0A10H

MAIN: MOV 20H, #03H MOV A, 20H

MOV DPTR, #LOOP RL A JMP @A+DPTR

LOOP:AJMPLOOP1

AJMPLOOP2 AJMPLOOP3 AJMPLOOP4

LOOP1: MOV 21H, #0C0H

SJMPSOX0

LOOP2:MOV 21H, #0F9H

SJMPSOX0

LOOP3: MOV 21H, #0A4H

SJMPSOX0

LOOP4: MOV 21H, #0B0H SOX0:

MOV A, 21H

MOV R0, #0DCH

MOV R1, #0DDH MOVX @R0, A MOV A, #01H

SOX1:

MOVX @R1, A MOV R2, #20H

LCALL DELAY

RL A SJMP SOX1

DELAY:

MOV R3,#0FFH

DL1:MOV R4,#0FFH DL2:NOP

NOP DJNZ R4,DL2 DJNZ R3,DL1 RET

END

实验十 电脑时钟(定时器、中断器综合实验)

一、实验目的

熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用实时程序的设计与调试技巧。

二、实验内容

编写程序,从本实验系统键盘上输入时间初值,用定时器产生0.1S 定时中断,对时钟计数器计数,并将数值实时地送数码管显示。

三、程序框图

四、实验过程

在与PC 联机状态下,编译、连接、下载PH51\se10.asm,用连续方式运行该程序。 在键盘上输入时间初值,按执行键EXEC 执行,数码管上实时显示时间值。

按“暂停图标”或实验箱上的“暂停按钮”,系统无条件退出该程序运行返回监控状态。

五、实验结果及分析

键入起始时刻小时分钟后,秒显示器从11开始逐次加1,至60进位分显示器,最后到小时显示器,到24小时后全部清零循环往复。

【问题回答】如何修改程序使定时器工作方式改变(实现12小时制)?

将clock 子程序中最后的#24H改为#12H即可。

六、实验源程序

ORG 0000H SJMP CHK00 ORG 000BH

LJMP CLOCK;INT_T0 ORG 0030H CHK00: MOV SP,#60H LCALL LEDP

CHK0: LCALL LCK0 ; 键扫, 显示子程序 LCALL PTDS0 ; 显示缓冲区放数子程序 MOV TMOD,#01H

ORL IE,#10000010b ;EA=1, IT0=1 MOV TL0,#0

MOV TH0,#4ch ; 定时中断初始化 MOV 23H,#00H

SETB TR0 ; 开定时 LOO5: LCALL DIS LCALL PTDS0 SJMP LOO5 PTDS0: MOV R0,#79H MOV A,22H ACALL PTDS MOV A,21H ACALL PTDS MOV A,20H ACALL PTDS RET

;---------------------------------------

PTDS: MOV R1,A ; 拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A

;SSEE ; 显示

PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET

;--------------------------------------- CLOCK: MOV TL0,#0B7H

MOV TH0,#3CH ; 恢复初值 PUSH PSW PUSH ACC

SETB 0D3H ; 保护 INC 23H ;0.1秒加1 MOV A,23H

CJNE A,#20,DONE ;1秒到吗? MOV 23H,#00H ; 清0.1秒单元 MOV A,22H

INC A ; 秒加1 DA A

MOV 22H,A ; 十进制调整 CJNE A,#60H,DONE ;60秒到吗? MOV 22H,#00H ; 秒单元清零 MOV A,21H INC A

DA A ; 分加1. 十进制调整 MOV 21H,A

CJNE A,#60H,DONE ;60分到吗? MOV 21H,#00H ; 分单元清零 MOV A,20H INC A

DA A ; 时加1. 十进制调整 MOV 20H,A

CJNE A,#24H,DONE ;24小时到吗? MOV 20H,#00H ; 时单元清零 DONE: POP ACC ; 退栈 POP PSW RETI

;----------------------------------------------

SSEE: SETB RS1 ; 换工作区 MOV R5,#05H

SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#0DDH MOV A,30H

MOVX @R1,A ; 字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF

MOVC A,@A+DPTR ; 取字形代码 MOV R1,#0DCH

MOVX @R1,A ; 字形送入 MOV A,30H ; 右移 RR A MOV 30H,A DEC 31H MOV A,#0FFH

MOVX @R1,A ; 关显示 DJNZ R7,SSE1 ;6位显示完了吗? DJNZ R5,SSE2 ;5次显示完了吗? CLR RS1 RET

;-------------------------------------------------------

DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH ;------------------------------------------------------- X3: MOV R4,A MOV R0,#50H MOV A,@R0 MOV R1,A MOV A,R4 MOV @R1,A CLR A POP DPH POP DPL

MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30

dec r1 clr a

MOVC A,@A+DPTR X31: MOV @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 ;-------------------------- X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#50H MOV A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET ;---------------------------- XLE: ACALL DIS ACALL KEY

MOV R4,A MOV R1,#48H MOV A,@R1 MOV R2,A INC R1 MOV A,@R1 MOV R3,A MOV A,R4 XRL A,R3 MOV R3,04H MOV R4,02H JZ X10 MOV R2,#88H MOV R4,#88H X10: DEC R4 MOV A,R4 XRL A,#82H JZ X11 MOV A,R4 XRL A,#0EH JZ X11 MOV A,R4 JZ X12 MOV R4,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH X11: MOV R2,04H NOP

NOP

MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOV @R1,A INC R1 MOV A,R3 MOV @R1,A MOV A,R4

JB ACC.5,X113

JB ACC.4,X113 MOV DPTR,#LS3 MOVC A,@A+DPTR

X113: RET

;---------------------------------

LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH ;----------------------------------- DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 LS2: MOV A,@R0 MOVC A,@A+DPTR MOV R1,#0DCH MOVX @R1,A MOV A,R2 inc R1 MOVX @R1,A LS1: DJNZ R3,LS1 CLR C RRC A MOV R2,A DEC R0 JNZ LS2 movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1 POP DPL POP DPH RET

;---------------------------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;--------------------------------------------- KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: MOV R1,#0DDH MOV A,R2 MOVX @R1,A RL A MOV R2,A inc r1

MOVX A,@R1 CPL A ANL A,#0FH JNZ LP0 INC R0 DJNZ R3,LP1 XP33: MOV A,#20H XP3: mov r2,a clr a mov r1,#0ddh movx @r1,a

mov a,r2

CLR RS1 RET ;---------------------------- LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2

SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 sjmp xp3 ;-------------------------------- LEDP: MOV 50H,#7EH

MOV A,#10H MOV R0,#79H

MOV @R0,A

LEDS:

INC R0

CJNE R0,#7EH,LEDS INC A MOV @R0,A RET

;-------------------------------- LCK0: LCALL X2 JB ACC.4,LDFC LCALL X3 DB 79H,7EH SJMP LCK0

LDFC: CJNE A, #16H,LCK0 MOV A, 7AH SWAP A ORL A, 79H MOV 22H, A CJNE A, #60H,LE09 LE09: JNC LE24 MOV A, 7CH SWAP A ORL A, 7BH MOV 21H, A CJNE A, #60H,LE15 LE15: JNC LE24 MOV A, 7EH SWAP A ORL A, 7DH

CJNE A, #24H,LE21 LE21: JNC LE24 RET

;--------------------------------- LE24: CLR 8CH LJMP CHK00 ;-------------------------------- END

实验十一 二进制转换到BCD

一、实验目的

将给定的一个二进制数,转换成二进制编码的十进制(BCD )码。

二、实验内容

掌握简单的数值转换算法,基本了解数值的各种表达方法。

三、程序框图

四、实验过程

本程序中需要转换的二进制数为4AH 。由于八位内存存储的最大数据为FFH 即十进制的255,故所转换的十进制数只有百位、十位和个位。百位的BCD 码即待转换二进制数除以100得到的商,余数保存;用余数除以10得到十位BCD 码,所得余数即为个位BCD 码。将转换后BCD 码三位装入20H-22H 内存即可。

五、实验结果及分析

转换后BCD 码

0020H-0022H 单元中中存放的74即为二进制数4AH 转换后得到的BCD 码。

六、实验源程序

; 待调整数A=4AH

MAIN:CLR A

MOV R5,A MOV R6,A MOV A,#04AH MOV B,#64H DIV AB MOV 20H,A MOV A,B MOV B,#0AH DIV AB MOV 21H,A MOV 22H,B SJMP $ END ORG 0000H LJMP MAIN ORG 100H

实验十四 键盘扫描显示实验

一、实验要求

在上一个实验的基础上,利用实验系统提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在六位数码管上显示出来。

实验程序可分成三个模块。

①键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 ②显示模块:将显示单元的内容在显示器上动态显示。 ③主程序:调用键输入模块和显示模块。

二、实验目的

⑴掌握键盘和显示器的接口方法和编程方法。 ⑵掌握键盘扫描和LED 八段码显示器的工作原理。

三、实验说明

本实验系统自带一个8×4的键盘,在判断有键按下后,要有一定的延时,防止键盘抖动。

四、程序框图

五、实验步骤

1、在联机状态下,编译、连接、下载、连续运行PH51\se14.asm,利用实验系统的显示设备、键盘实现按键的输入并送至显示设备输出。

2、按“暂停图标”,系统无条件退出该程序运行返回监控状态。

六、实验源程序

OUTBIT equ 0ffddh ; 位控制口/键扫口 OUTSEG equ 0ffdch ; 段控制口 IN equ 0ffdeh ; 键盘读入口 LedBuf equ 60h ; 显示缓冲

org 0 Start:

mov sp,#40h

mov LedBuf+0,#0c2h ; 显示"Good" mov LedBuf+1,#0a3h mov LedBuf+2,#0a3h mov LedBuf+3,#0a1h mov LedBuf+4,#0ffh mov LedBuf+5,#0ffh MLoop:

call DisplayLED ; 显示

call GetKey ; 扫描键盘并读取键值 jb acc.5,MLoop jb acc.4,MLoop

anl a,#00001111b ; 显示键码 mov dptr,#LedMap movc a,@a+dptr

mov LedBuf+5,a sjmp MLoop

Delay: ; 延时子程序 mov r7,#0 DelayLoop:

djnz r7,DelayLoop djnz r6,DelayLoop ret

DisplayLED:

mov r0,#LedBuf

mov r1,#6 mov r2,#00100000b Loop:

mov dptr,#OUTBIT mov a,#0

movx @dptr,a

mov a,@r0 mov dptr,#OUTSEG movx @dptr,a

mov dptr,#OUTBIT mov a,r2

movx @dptr,a

mov r6,#1 call Delay

mov a,r2 rr a mov r2,a

inc r0

djnz r1,Loop

; 共6个八段管 ; 从左边开始显示 ; 关所有八段管 ; 显示一位八段管 ; 显示下一位

ret GetKey:

call ScanKey mov r4,a mov r1,#48h mov a,@r1 mov r2,a inc r1 mov a,@r1 mov r3,a mov a,r4 xrl a,r3 mov r3,04h mov r4,02h jz Key1 mov r2,#88h mov r4,#88h Key1: dec r4 mov a,r4 xrl a,#82h jz Key2 mov a,r4 xrl a,#0eh jz Key2 mov a,r4 jz Key3 mov r4,#20h dec r2 sjmp Key4 Key3: mov r4,#0fh Key2: mov r2,04h mov r4,03h Key4: mov r1,#48h mov a,r2 mov @r1,a inc r1 mov a,r3

mov a,r4 jb acc.5,Exit jb acc.4,Exit mov dptr,#KeyTable movc a,@a+dptr Exit: ret ScanKey: setb RS1 mov r2,#0feh mov r3,#08h mov r0,#00h

LoopS: mov r1,#Low(OUTBIT) mov a,r2 movx @r1,a rl a mov r2,a inc r1 movx a,@r1 cpl a anl a,#0fh jnz Scan inc r0 djnz r3,LoopS ReTKey3:mov a,#20h TKey3: mov r2,a clr a

mov r1,#Low(OUTBIT) movx @r1,a mov a,r2 clr RS1 ret Scan:

cpl a

jb acc.0,TKey0 mov a,#00h

TKey0: jb acc.1,TKey1 mov a,#08h sjmp EndLoop TKey1: jb acc.2,TKey2 mov a,#10h sjmp EndLoop TKey2: jb acc.3,ReTKey3 mov a,#18h EndLoop:add a,r0 sjmp TKey3

LedMap: ; 八段管显示码 db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h db 080h,090h,088h,083h,0c6h,0a1h,086h,08eh

KeyTable: ; 键码定义 db 07h,04h,08h,05h,09h,06h,0ah,0bh db 01h,00h,02h,0fh,03h,0eh,0ch,0dh

end

硬 件 实 验

硬件实验部分可使学生能进一步掌握单片机系统扩展和输入输出程序的设计方法,熟悉对扩展系统的软件、硬件设计,调试方法和技巧。

实验一 P1口亮灯实验

一、实验目的

(1)学习P1口的使用方法; (2)学习延时子程序的编写。

二、实验内容

P1口作为输出口,接八个发光二极管,编写程序,使发光二极管循环点亮。

三、程序框图

四、实验电路

五、实验过程

连接电路,编写程序,然后观察LED 灯的显示情况。

此程序运用定时器中断实现计数定时功能。使用中断时,需设置中断控制字TMOD ,使定时器1工作于中断方式,然后设置延时子程序初值即TH1和TL1,利用ACALL 语句即可申请中断。运行程序时,调用延时子程序,开启计数器,计数器满时发出中断返回中断处,等待下次开始,从而实现循环定时计数功能。

六、实验结果及分析

实验中LED 灯管闪亮并维持一定时间,按循环左移方式点亮。

【问题回答】若要增加LED 灯闪亮时间,可以使延时子程序中计数器计数周期增长,即初值TL1、TH1值减小即可。改变亮灯方向,只需将RL A变为RR A即可。

七、实验源程序

ORG 100H

START: MOV R0, #08H MOV A, #11111110B LOOP: MOV P1, A ACALL DELAY RL A

DJNZ R0, LOOP JMP START

DELAY: MOV TMOD, #00010000B MOV TL1, #0c0H MOV TH1, #63H SETB TR1 JNB TF1, $ CLR TF1 RET END

实验三 P3.3口输入 P1口输出

一、实验目的

1. 掌握P3口、P1口简单使用。

2. 学习延时程序的编写和使用。

二、实验内容

1.P3口做输入口,外接一脉冲,每输入一个脉冲,P1口按十六进制加一。

2.P1口做输出口,编写程序,使P1口接的8 个发光二极管L1—L8按16进制加一方式点亮发光二极管。

三、程序框图

-31-

四、实验电路

五、实验过程

实验是将P3.3口串行输入的电压变换次数变为累加器中的数并用P1口并行显示出来。P3.3读入数据前应加高电平防止误读。每次读入电压负跳变,累加器中数值加一,取反送至P1口。P1口八位分别控制8个LED 灯管,若为高电平则灭,低电平则亮,从而通过灯的亮灭来表示按键次数。

六、实验结果及分析

实验中每开合一次开关K1,LED 灯的显示情况表示的数字就加一,如同二进制数,灯亮表示1,灯灭表示0。

【问题回答】L3和L4。 开合K1开关13次即对应的二进制数为1101,点亮的LED 灯为L1、

七、实验源程序

ORG 100H START: MOV A, #00H

-32-

CLR C

LOOP: MOV C, P3.3 JC LOOP ACALL DELAY LOOP1: MOV C, P3.3 JC LOOP LOOP2: MOV C, P3.3 JNC LOOP2 ACALL DELAY INC A CPL A MOV P1, A CPL A JMP LOOP

DELAY: MOV R6, #00H DELAY1: MOV R7, #80H DJNZ R7, $ DJNZ R6, DELAY1 RET END

实验四 工业顺序控制

一、实验目的

掌握工业顺序控制程序的简单编程,中断的使用。

二、实验内容

8032的P1.0—P1.6控制注塑机的七道工序,现模拟控制七只发光二极管的点亮,高电平有效,设定每道工序时间转换为延时,P3.4为开工启动开关,高电平启动。P3.3为外故障输入模拟开关,P3.2为0时不断警告。P1.7为报警声音输出,设定6道工序只有一位输出,第七道工序三位有输出。

三、程序框图

-33-

四、实验电路

五、实验过程

实验中用外部中断0,编中断服务程序的关键是:

1. 保护进入中断时的状态,并在退出中断之前恢复进入的状态。

2. 必须在中断程序中设定是否允许中断重入,即设置EX0位。 运行过程:

(1)连续方式开始运行程序,此时应在等待开工状态。 (2)K1拨至低电平“L ”位置,各道工序应正常运行。

(3)K2拨至低电平“L ”位置,应有声音报警(人为设置故障)。

(4)K2拨至高电平“H ”位置,即排除故障,程序应从报警的那道工序继续执行。

K2分别模拟总开关和外部紧急事件,实验中运用外部中断0来实现报警功能,由K1、

一旦有外界中断或人为控制,系统则停在当前工序,执行中断程序。报警时调用响铃子程序设定蜂鸣器响铃,时间由延时长度控制。外部中断消失,且允许工作时,系统按工序一步一步循环进行,由亮灯表示工序进行过程,由延时子程序设定工序持续时长。

六、实验结果及分析

-34-

实验中工序进行由小灯亮灭表示,一旦遇到K1変高电平或者K2为低电平系统即停止K2为低时产生报警声响,K2为高时才继续正常工作。 工作等待中断被处理,只有K1为低,

【问题回答】工序一L1、L2亮工序二L2、L3亮,需将工序一中MOV P1, #7EH改为MOV P1, #7CH,同时将工序二中MOV P1, #7DH改为MOV P1, #79H.

七、实验源程序

ORG 0000H LJMP PO10 ORG 0003H LJMP PO16 ORG 0190H PO10: MOV P1,#7FH ORL P3,#00H PO11: JNB P3.4,PO11 ORL IE,#81H ORL IP,#01H MOV PSW,#00H MOV SP,#53H

PO12: MOV P1,#7EH POa: JNB P3.4,POa ACALL PO1B MOV P1,#7DH POc: JNB P3.4,POc ACALL PO1B MOV P1,#7BH POe: JNB P3.4,POe ACALL PO1B MOV P1,#77H POg: JNB P3.4,POg ACALL PO1B MOV P1,#6FH POb: JNB P3.4,POb ACALL PO1B MOV P1,#5FH POf: JNB P3.4,POf ACALL PO1B MOV P1,#3FH POd: JNB P3.4,POd

; 第一道工序

-35-

ACALL PO1B SJMP PO12

PO16: MOV B,R2

; 保护现场

PO17: MOV P1,#0FFH ; 关输出 MOV 20H,#0A0H ; 振荡次数 PO18: SETB P1.7

; 振荡

ACALL PO1A ; 延时 CLR P1.7

; 停振

ACALL PO1A DJNZ 20H,PO18 CLR P1.7

ACALL PO1A JNB P3.2,PO17 MOV R2,B RETI

PO1A: MOV R2,#06H ACALL DELY RET

PO1B: MOV R2,#30H ACALL DELY RET DELY: PUSH 02H DEL2: PUSH 02H

DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET

END

; 延时 ; 不为0转

; 停振 ; 故障消除吗? ; 恢复现场 ; 延时

-36-

实验七 8255控制交通灯

一、实验目的

了解8255芯片的结构及编程方法,学习模拟交通灯控制的实现方法。

二、实验内容

用8255做输出口,控制十二个发光二极管燃灭,模拟交通灯管理。

三、程序框图

四、实验电路

五、实验过程

假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1东西绿灯通车,南北红灯。过一段时间转状态2,东西绿灯灭,黄灯闪烁几次,南北仍然红灯。再转状态3,南北绿灯通车,东西红灯。过一段时间转状态 4,南北绿灯灭,闪几次黄灯,延时几秒,东西仍然红灯。最后循环至状态1。

实验中调用延时子程序实现交通灯点亮持续一段时间再转变。通过对输出口写入特定数值,实现灯亮灭的控制。延时程序可通过对R2寄存器的压栈和出栈操作实现。在程序实现的过程中,需要对现场进行保护和恢复。交通灯闪烁由调用较短延时实现。

六、实验结果及分析

-37-

在连续运行方式下,初始态为四个路口的红灯全亮之后,东西路口的绿灯亮南北路口的红灯亮,东西路口方向通车。延时一段时间后东西路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪耀。闪耀若干次后,再切换到东西路口方向。之后重复以上过程。

【问题回答】东西方向的红灯是L6和L12。

七、实验源程序

ORG 0BB0H D0: MOV SP,#60H MOV DPTR,#0FFDBH MOV A,#88H MOVX @DPTR,A MOV DPTR,#0FFD8H

MOV A,#0B6H MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A MOV R2,#25H LCALL DELY D3: MOV DPTR,#0FFD8H MOV A,#75H

MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A MOV R2,#55H LCALL DELY MOV R7,#05H D1: MOV DPTR,#0FFD8H

MOV A,#0F3H MOVX @DPTR,A INC DPTR

MOV A,#0CH MOVX @DPTR,A

; 制定一个空间 ; 保护现场

; 写控制字的地址FFDB

; 控制字A 口输出工作在方式0 C口高4位

输入,C 口低4位输出工作在方式0,B 口输出

; 设置控制字

;101100110点亮6 9 12号灯 ;00001101点亮3号灯 ; 点亮4个红灯 ; 设定一个延时时间 ; 延时

;01110101点亮5 9 11 ;00001101点亮3号灯 ; 东西绿灯亮, 南北红灯亮 ; 设定一个延时时间 ; 延时

; 设定闪烁次数 ;11110011 点亮9 10 ;1100点亮3 4

; 东西黄灯亮, 南北红灯亮 -38-

MOV R2,#20H LCALL DELY MOV DPTR,#0FFD8H

MOV A,#0F7H MOVX @DPTR,A INC DPTR

MOV A,#0DH MOVX @DPTR,A ; 设定一个延时时间 ; 延时

;11110111点亮9号灯

;00001101点亮3号灯 ; 南北红灯亮

MOV R2,#20H

LCALL DELY DJNZ R7,D1 MOV DPTR,#0FFD8H MOV A,#0AEH

MOVX @DPTR,A INC DPTR

MOV A,#0BH MOVX @DPTR,A MOV R2,#55H

LCALL DELY MOV R7,#05H D2: MOV DPTR,#0FFD8H

MOV A,#9EH MOVX @DPTR,A INC DPTR

MOV A,#07H MOVX @DPTR,A MOV R2,#20H

LCALL DELY MOV DPTR,#0FFD8H

MOV A,#0BEH MOVX @DPTR,A INC DPTR

MOV A,#07H MOVX @DPTR,A MOV R2,#20H

LCALL DELY DJNZ R7,D2 LJMP D3 ; 延时

; 闪烁次数未到继续

;10101110点亮6 8 12

;1011点亮2号

; 东西红灯亮, 南北绿灯亮

; 延时 ; 闪烁次数

;10011110点亮6 7 12

;0111点亮1号

; 东西红灯亮, 南北黄灯亮

; 延时

;10111110点亮6 12——把7号黄灯灭了

; 把1号黄灯灭了 ; 东西红灯亮

; 延时

; 闪烁次数未到继续

; 循环

-39-

;--------------------------------------------- DELY: PUSH 02H DEL2: PUSH 02H

DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET

;---------------------------------------------

END

; 延时

实验十九 小直流电机调速试验

一、实验目的

1. 掌握直流电机的驱动原理。 2. 了解直流电机调速的方法。

二、实验内容

1. 用0832 D/A转换电路后的输出经放大后驱动直流电机。

2. 编制程序改变0832输出经放大后的方波信号的占空比来控制电机转速。本实验中 D/A输出为双极性输出,因此电机可以正反向旋转。

三、程序框图

四、实验电路

-40-

五、实验过程

实验时,需先进行D/A电压调零,然后再运行电机调速主程序。实验中,通过中断和循环延时的方法通过D/A产生一定占空比的方波信号,通过数据送缓冲区,将控制信号送入D/A产生控制脉冲。由于D/A输出为双极性输出,因此电机可以正反向旋转驱动电机。通过控制方波信号的占空比,即控制一段时间内的平均电压,从而控制电机转速。

六、实验结果及分析

实验中可以观察到运行调零程序后小电机停转,运行调速程序后小电机开始旋转并以一定的周期变换转动方向。

【问题回答】实验中,可通过控制方波信号的占空比来改变电机转速。可修改LO20程序段中语句MOV A,#80H中立即数80H 的值,来修改占空比。80H 即占空比为1/2,将其值改小,即可增大占空比,从而使电机转速加快。

七、实验源程序

;===================== D/A(调零程序) =========================

;---D/A 0V输出(调基准电压)---

; 在进行D/A输出方波、小直流电机实验之前,必须先运行本调零程序!

; 装载并连续运行本程序,调节基准电压控制电位器W2,使D/A输出端“AOUT”输出电压为0V

ORG 0617h

MOV SP,#53H

MOV 7EH,#00H

MOV 7DH,#08H

MOV 7CH,#03H

MOV 7BH,#02H ; 显示缓冲区初值 LO22: MOV A,#80H

CALL LO21

SJMP LO22

;---------------------------

PTDS: MOV R1,A ; 拆送显示缓冲区 ACALL PTDS1

MOV A,R1

SWAP A

PTDS1: ANL A,#0FH

MOV @R0,A

INC R0

RET

;-----------------------------

DIS: PUSH DPH

PUSH DPL

SETB RS1

MOV R0,#7EH

MOV R2,#20H

MOV R3,#00H

MOV DPTR,#LS0

LS2: MOV A,@R0

MOVC A,@A+DPTR

MOV R1,#0DCH

MOVX @R1,A

MOV A,R2

inc R1

MOVX @R1,A

LS1: DJNZ R3,LS1

CLR C

RRC A

MOV R2,A

DEC R0

JNZ LS2

movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1

POP DPL

POP DPH

RET

;---------------------------------

LO21: MOV DPTR,#0FFE0H

MOVX @DPTR,A ; 送0832转换 MOV R0,#79H

LCALL PTDS

MOV R2,#00H

L023: LCALL DIS ; 显示

DJNZ R2,L023

RET

;----------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H

DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;-------------------------------

END

; 小直流电机调速程序

ORG 05E0H

SE13: MOV SP,#53H

MOV 7EH,#00H

MOV 7DH,#08H

MOV 7CH,#03H

MOV 7BH,#02H ; 显示缓冲区初值 LO20: MOV A,#80H ; 停止 CALL LO21

MOV A,#00H ; 反转

MOV A,#80H ; 停止 CALL LO21

MOV A,#0FFH ; 正转 CALL LO21

SJMP LO20

;====D/A直流电机正转、反转、停止=== LO21: MOV DPTR,#0FFE0H

MOVX @DPTR,A

MOV R0,#79H

LCALL PTDS

MOV R2,#00H

L023: LCALL DIS

DJNZ R2,L023

RET

;---------------------------

PTDS: MOV R1,A

ACALL PTDS1

MOV A,R1

SWAP A

PTDS1: ANL A,#0FH

MOV @R0,A

INC R0

RET

;-----------------------------

DIS: PUSH DPH

PUSH DPL

SETB RS1

MOV R0,#7EH

MOV R2,#20H

MOV R3,#00H

MOV DPTR,#LS0

LS2: MOV A,@R0

MOVC A,@A+DPTR

MOV R1,#0DCH

MOVX @R1,A

MOV A,R2

inc R1 ; 送0832转换 ; 显示 ; 拆送显示缓冲区

LS1: DJNZ R3,LS1

CLR C

RRC A

MOV R2,A

DEC R0

JNZ LS2

movx @r0,a

dec r0 cpl a movx @r0,a

CLR RS1

POP DPL

POP DPH

RET

;----------------------------

LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H

DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;-------------------------------

END


相关文章

  • 哈工大单片机实验报告
  • H a r b i n I n s t i t u t e o f T e c h n o l o g y 单片机原理与应用 实验报告 学生姓名 学班专 号 级 业 : : : : : : 电信学院 任课教师 所在单位 2014年4 月 软 ...查看


  • 哈工大电工自主设计实验
  • 姓名班级 实验日期 实验名称:智能抢答器 1. 实验目的 1) 培养综合开发能力.创新思维,锻炼坚忍不拔的意志. 2) 学习单片机,练习编程. 3) 培养认真.仔细的好习惯. 2. 总体设计方案或技术路线 抢答器简介:主持人操控S12与S1 ...查看


  • 机械手对目标物体抓取的研究
  • 12 机械手对目标物体抓取的研究 机械手对目标物体抓取的研究 Reserch on SnatchTargetObjectbyRobotHand 李亮费 凌 (西华大学机械工程与自动化学院,四川成都610039) 摘要 机械手在工业控制自动化 ...查看


  • 河工大现代医学仪器实验报告
  • YJ-02型医学电子教学仪器综合试验箱 现代医学仪器 课程实验指导 河北工业大学工程学院 生物医学工程专业 2016年春季 实验一 血氧饱和度测量仪设计实验 一. 实验目的 1. 了解血氧饱和度测试的意义和无创伤测试基本原理. 2. 掌握血 ...查看


  • 研究生院工作总结
  • 哈尔滨工业大学深圳研究生院 2014年度工作总结及2014年工作要点 一.2014年工作总结 2014年是深圳研究生院发展建设中最为关键的一年,也是走上正规化办学道路的第一年.根据建院三步走的发展建设战略以及年度工作计划,2014年处于第二 ...查看


  • 大学几乎所有学科的课本答案[2]
  • 大学几乎所有学科的课本答案! 来源: 任明嘉的日志 经济金融 [PDF格式]<会计学原理>同步练习题答案 [Word格式]<成本会计>习题及答案(自学推荐,23页) [Word格式]<成本会计>配套习题集 ...查看


  • 合工大研究生复试
  • 合肥工业大学2016年硕士研究生招生考试复试科目要求 001仪器科学与光电工程学院 联系电话:0551-62901513传真:0551-62901508联系人:袁老师 各专业复试科目包括英语听力测试.英语口语测试.专业综合课笔试及综合素质面 ...查看


  • 哈工大数电自主设计报告
  • 姓名 班级 学号 实验日期 节次 教师签字 成绩 实验名称:基于555定时器设计的频率和脉宽可调的波形发生器 1. 实验目的 1) 进一步掌握555定时器的基本电路功能及使用方法: 2) 使用555定时器设计一个频率和脉宽可调的波形发生器: ...查看


  • 哈工大实验报告电工模拟
  • 总成绩: 一.设计任务 设计一个方波-三角波发生器 二.设计条件 本设计基于学校实验室,所用元件如下: EEL-69模拟.数字电子技术实验箱 一台 集成运算放大器实验插板 一块 直流稳压电源 一台 双踪示波器 一台 数字万用表 一块 主要元 ...查看


热门内容