第一个实验:
题目:编程对开关的拨动次数进行计数。
连线:将P1.0口与开关相连,P2口连接八个LED灯作为结果计数结果的输出。
;******单片机实验3-key******
;******2019-5-17-DXZ*******
ORG 0000H
LJMP MAIN
ORG 0030H
KEY_count EQU 60H ;定义按键次数
MAIN:
MOV P2, #00H ;初始换P2口
MOV KEY_count, #00H ;初始化按键次数
MOV C, P1.0 ;读取按键状态送C
STAT: SETB P1.0 ;设置当前P1.0状态,为读取做准备
JNC ANTHOR ;判断上一次开关状态是否为0,为0跳转
JB P1.0, STAT ;上次状态不为0,则判断这次是否为1,为1跳转继续读取
LJMP KEYCOUNT ;这次不为1,则跳转至按键次数加1代码
LJMP STAT ;继续读取
ANTHOR: JB P1.0, KEYCOUNT ;上次状态为0,则判断这次状态是否为1
LJMP STAT ;重新读取
KEYCOUNT: MOV C, P1.0 ;这次状态送C
LCALL DELAY ;按键防抖
MOV C, P1.0
INC KEY_count ;按键次数加1
MOV P2, KEY_count ;送至P2口显示
LJMP STAT
DELAY: MOV R7, #10 ;延时10ms
MOV R6, #50
DELAY1:DJNZ R6, DELAY1
DJNZ R7, DELAY1
RET
END
第二个实验:
题目:数据排序实验。
连线:对使用伪指令定义的片内RAM30H-39H十个单元的数据进行升序排序(单元数据初值自定),可使用大家比较熟悉的冒泡排序算法,排序后的数据以每两秒一个的方式通过P2口连接的八个LED灯显示输出。
;******单片机作业片ram数值排序*****
;******2019-5-21*DXZ**************
NUM1 DATA 30H ;伪指令定义片内RAM单元
NUM2 DATA 31H
NUM3 DATA 32H
NUM4 DATA 33H
NUM5 DATA 34H
NUM6 DATA 35H
NUM7 DATA 36H
NUM8 DATA 37H
NUM9 DATA 38H
NUM10 DATA 39H
LARGE EQU 60H ;放置要比较的数值
ORG 0000H
LJMP MAIN
ORG 0030H ;主函数起始地址
MAIN:
MOV NUM1, #3 ;向先前定义的RAM单元放置数值
MOV NUM2, #30
MOV NUM3, #2
MOV NUM4, #22
MOV NUM5, #11
MOV NUM6, #99
MOV NUM7, #32
MOV NUM8, #10
MOV NUM9, #101
MOV NUM10, #1
MOV R3, #8 ;定义冒泡排序法的比较趟数
STAT:MOV R5, #9 ;定义排序法的一趟里比较的次数
MOV R0, #30H ;初始地址送寄存器R0
STAT1:MOV A, @R0 ;寄存器间接寻址,送R0所指单元数至A
INC R0 ;指向下一地址单元
MOV LARGE, @R0 ;寄存器间接寻址,送R0所指单元数至LARGE
CJNE A, LARGE, $ + 3 ;比较A和LARGE里存放的数的大小
JNC ANTHOR ;A大,则跳转
LCALL Exchange ;LARGE大,则交换(调用交换子函数)
BACK:DJNZ R5, STAT1 ;次比较循环
DJNZ R3, STAT ;趟比较循环
MOV R5, #10 ;初始化P2口输出次数
MOV R0,#30H ;指向定义单元首地址
P2OUT:MOV P2, @R0 ;输出排序后的结果
LCALL DELAY ;延时
INC R0 ;移向下一个数
DJNZ R5,P2OUT ;循环10次
SJMP $
ANTHOR: LJMP BACK ;前一个数大,则不交换
Exchange:MOV @R0, A ;前一个数小,将前一个数放在后一个数的位置
DEC R0 ;地址前移
MOV @R0, LARGE ;后一个数放前一个数的位置
INC R0
RET
DELAY: MOV R7, #20 ;延时子函数,延时2S
MOV R6, #200
MOV R4, #250
DELAY1:DJNZ R4,DELAY1
DJNZ R6,DELAY1
DJNZ R7,DELAY1
RET
END