51单片机实验

1、延时子程序

1
2
3
4
5
6
7
8
DELAY:MOV R5,#25   ;写一个延时函数,DELAY就是延时函数的意思。R5是一个寄存器,我们把立即数25移到R5里面去
D1:MOV R6,#100 ;把100放到R6这个寄存器中
D2:MOV R7,#100 ;把100放到R7这个寄存器中
DJNZ R7,$ ;DJNZ指令:减一不为零转移指令。这里的$就是停在这里的意思,和DJNZ R7,DJNZ是一个意思
DJNZ R6,D2
DJNZ R5,D1
RET
END

例:已知晶振为12MHz,试编写10ms的延时子程序。

答:晶振为12MHz时,机器周期Tcy=1us(2分)

故10ms=10000us=100 * 100 * Tcy (2分)

因此,

(2 * 内循环+3) * 外循环 +3

1
2
3
4
5
DEALY: MOV R0,#100
D1: MOV R1,#50
D2: DJNZ R1,D2;(2*50*100us)
DJNZ R0,D1
RET

2、查RAM数据

试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。

1
2
3
4
5
6
7
FIND: MOV R0,#02FH ;把30H的前一个29H立即数给R0
MOV 51H,#0 ;把立即数0给51H这个单元
LOOP: INC R0 ;R0自增1
CJNE @R0,#0AAH,NEXT ;R0是地址,地址里面的内容和立即数0AAH进行比较,不相等就到NEXT,相等就执行下一条指令
INC 51H ;51H自增1
NEXT:CJNE R0,#50H,LOOP ;R0的地址和立即数50H进行比较,不相等就到LOOP,相等就执行下一条指令
RET

分析一下程序设计逻辑:R0是一个地址,把30H前面一个地址2FH给它,然后把立即数0给51H,即默认未找到即为00H。

​ R0自增1,地址就会从2FH变成30H,然后判断30H这个地址里面的值是否是0AAH,如果是说明找到了,就把51H增加1。然后下一句看看R0有没有到到50H,如果有,下一句就是程序结束,如果没有就会循环,因为已经找到了,再不断自增1,直到50H即可,反正51H已经是01H了。

​ 如果30H不是0AAH那么就直接到NEXT,不让51H变成01H,然后因为没有到50H所以就继续循环看看其他单元是否有0AAH

3、I/O口实验(可能不考)

设计一个用3个按键控制8个LED灯闪烁状态的程序,要求:

1)没有按键按下时,8个小灯亮500MS,灭500MS循环

2)第一个按键按下,8个小灯间隔4个亮,4个灭,500MS循环

3)第二个按键按下,8个小灯全灭,然后每隔500MS从左向右依次亮一个,全亮后再熄灭,如此循环

4)第三个按键按下,回到主程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
FIRST BIT P1.0
SECOND BIT P1.1
THIRD BIT P1.2
MAIN:
KEY1:JB FIRST,KEY2;如果FIRST没有被按下即为1,则跳转到KEY2,如果被按下,则执行下面语句
CALL DELAY;调用延时,消除抖动
JNB FIRST,$;松手检测,只有按下之后松手FIRST为1之后,程序才能执行
CALL DELAY;调用延时,消除抖动
/*开始执行*/
LOOP1:
JNB THIRD,KEY2;如果THIRD被按下,则跳转到KEY2
MOV P0,#55H
CALL DELAY
MOV P0,#0AAH
CALL DELAY
JMP LOOP1
KEY2:
JB THIRD,KEY0;如果THIRD没有被按下即为1,则跳转到KEY0,如果被按下,则执行下面语句
CALL DELAY;调用延时,消除抖动
JNB FIRST,$;松手检测,只有按下之后松手,程序才能执行
CALL DELAY;调用延时,消除抖动
JMP MAIN

KEY0:;没有按键按下时,亮500MS灭500MS循环
MOV P0,#00H
CALL DELAY
MOV P0,#0FFH
CALL DELAY
JMP KEY1
DELAY:MOV R5,#5
D1:MOV R6,#200
D2:MOV R7,#250
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

4、定时器实验

1)利用定时器设计1s的中断,要求每一秒计数值加1,该值在40H单元中,并实时地将40H单元内容通过8个LED灯显示出来。

2)将定时器用于检测按键动作(即定时器当成外部中断功能使用),要求按键动作一次计数值加1,该值在30H单元中,并实时将30H单元内容通过8个LED灯显示出来。

期中考的方波要掌握:

请完成从P1.0引脚上输出周期为2ms的方波的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ORG     0000H
LJMP MAIN
ORG 000BH ;T0接口
LJMP T0_INT
ORG 0100H
MAIN: MOV SP,#60H
MOV TH0,#0FEH ;H高
MOV TL0,#0CH ;L低
MOV TMOD,#01H; 16BIT计数 0000 0001 启用定时器0的工作方式1。即首先对TMOD寄存器初始化
;打开中断
SETB ET0
SETB EA
SETB TR0
SETB P1.0;p1.0置1
JMP $ ;(主程序)(5分)

T0_INT: MOV TH0,#0FEH
MOV TL0,#0CH
CPL P1.0 ;反
RETI ;跳出中断 (定时中断)(4分)
END

5、串口实验

设计一个简单的双机通信:

甲机为单片机,乙机为PC机或单片机,具体实验内容如下:

甲机每秒钟计数单元加1(可以假设计数单元为30H),同时每秒钟到的时候将计数单元数据向乙机发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ORG 0000H
LJMP MIAN
ORG 0040H
MAIN: MOV SCON,#80H 方式2
MOV 30H,#00H
LOOP: MOV A,30H
MOV SBUF,A ;当成发送的寄存器
JNB TI,$ ;如果发送完数据t1置1,过后不会变为0. 判断是否为1,如果为1才继续执行
CLR TI ;手动清0
LCALL DELAY
INC 30H
LJMP LOOP
DELAY:MOV R7,#10
D1: MOV R6,#200
D2: MOV R5,#250
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
END

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!