8051 单片机P1口实验
- 格式:docx
- 大小:608.41 KB
- 文档页数:9
验三 8051单片机P1口应用实验
1 实验目的
(1)掌握P1口作为I/O口时的使用方法。
(2)理解读引脚和读锁存器的区别。
3 实验器材
(1)超想-3000TB综合实验仪 1 台
(2)超想3000仿真器 1 台
(3)连线 若干 根
(4)计算机 1 台
4 实验原理
由8051组成的单片机系统通常情况下,P0口分时复用作为地址、数据总线,P2口提供A15-A8即高8,位地址,P3口用作第二功能,只有P1口通常用作I/0口。P1口是8位准双向口,它的每一位都可独立地定义为输入或输出,因此既可作为8位的并行I/O口,也可作为8位的输入输出端。当工作在输入方式时,对应位的锁存器必须先置1,才能正确地读到引脚上的信号,否则,执行读引脚指令时,若对应位的锁存器的值为0,读的结果永远为0。每个I/0端口都有两种读入,即读锁存器和读引脚,读引脚指令一般都是以I/0端口为源操作数的指令,如MOV C,P1.3,而读锁存器指令一般为“读-修改-写”指令,如ANL P1.3,C指令,请同学们在实验中体会。图示中,P1.2作为输出口,P1.3作为输入口。
P1口作为输出
实验电路
实验程序
ORG 0000H
START:MOV A,#01H
LP: MOV P1,A
MOV R1,#10
DEL1:MOV R2,#200
DEL2:MOV R3,#126
DEL3:DJNZ R3,DEL3
DJNZ R2,DEL2
DJNZ R1,DEL1
RL A
LJMP LP
END
8路指示灯读出8路开关量的状态
org 0000h ;开始
loop: mov p2,#0ffh
MOV A,P2 ;P2口的状态(开关)读到A
MOV P1,A ;把A的数据送到P1口(指示灯)
SJMP LOOP ;重新开始
END
广告灯实验
框图
实验电路
程序
ORG 0000H
START: MOV DPTR,#TABLE
LOOP: CLR A
MOVC A,@A+DPTR
CJNE A,#25H,LOOP1
SJMP START
LOOP1: MOV P1,A
MOV R3,#20 LCALL DELAY
INC DPTR
SJMP LOOP
DELAY: MOV R4,#20
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
DJNZ R3,DELAY
RET
TABLE: DB 01H,02H,04H,08H
DB 10H,20H,40H,80H
DB 01H,02H,04H,08H
DB 10H,20H,40H,80H
DB 80H,40H,20H,10H
DB 08H,04H,02H,01H
DB 80H,40H,20H,10H
DB 08H,04H,02H,01H
DB 00H, 0FFH,00H, 0FFH
DB 00H, 0FFH,00H, 0FFH
DB 25H
END
实验四 外部中断实验
1.实验目的与要求
通过本实验加深对8051单片机中断系统的理解,学习外部中断的基本使用方法和相关编程
3.实验器材:
(1)超想-3000TB综合实验仪 1 台 (2)超想3000仿真器 1 台
(3)连线 若干 根 (4)计算机 1 台
4.实验原理:
MCS-51单片机有5个中断源,其中两个是由/INT0、/INT1引脚输入的外部中断源;另外三个是内部中断源即由T0、T1的溢出引起中断和串行口发送完一个字节或接收到一个字节数据引起中断。触发外部中断有两种方式,即下降沿引起中断或低电平引起中断。当编程TCON中的ITi为1时,则引起触发的方式为边沿触发方式,反之为低电平触发方式。每个中断源的中断请求能否得到响应要受两级“开关” 的控制,即一个总“开关”EA和五个分“开关”ES、ET1、EX1、ETO和EX0的控制,只有当EA为1,且对应的分“开关”也为1时,相应中断源的中断请求才能被响应。5个中断源可编程为两个优先级,同一优级内以/INT0的优先级最高,然后是TO中断、/INT1中断、T1中断和串行口中断。5个中断源对应有个固定的中断服务程序入口地址。CPU在每个机器周期顺序采样每个中断源,如查询到某个中断源的中断标志为1,中断系统通过硬件自动将相应的中断矢量装入PC,进入中断服务程序。
实验内容
P1口的8个灯循环亮,用单次脉冲申请中断,按下脉冲源后8个灯全部闪烁5次后继续循环亮。
电路
框图
程序
org 0000h ;开始
sjmp start
org 0003h ; 中断入口(P3.2)
sjmp ext0 ;到中断子程序
start: mov ie,#10000001b ;中断使能
mov ip,#00000001b ;中断优先
mov tcon,#0000000b ;中断为电平触发 mov sp,#70h ;堆栈指针
loop: mov a,#01h ;左移动初值
mov r2,#07 ;左移动7次
loop1: mov p1,a ;输出到P1口
acall delay ;延时
rl a ;左移动一位
djnz r2,loop1 ;左移动7次了吗?
mov r2,#07 ;设定右移7次
loop2: rr a
mov p1,a
acall delay
djnz r2,loop2 ;右移动7次了吗?
sjmp loop
ext0: push acc ;把a压入堆栈
push psw ;保存现场
setb rs0 ;设定工作寄存器1
clr rs1
mov a,#0FFH ;使P1全亮一次
mov r2,#10 ;闪烁5次(亮灭共10次,小心了)
loop3: mov p1,a ;输出到P1
acall delay
cpl a
djnz r2,loop3 ;10次到了么?没有继续否则完成
pop psw ;恢复现场
pop acc
reti
delay: mov r5,#20 ;延时200MS
d1: mov r6,#20
d2: mov r7,#250
djnz r7,$
djnz r6,d2
djnz r5,d1
ret
end
2 P1口的8个灯循环亮,用单次脉冲申请中断,按下脉冲源后小喇叭响,松开继续循环
电路
框图
程序清单
org 0000h ;开始
sjmp start ;跳到主程序
org 0003h ;int0中断入口(p3.2)
sjmp ext0 ;到中断子程序 start: mov ie,#10000001b ;中断使能
mov ip,#00000001b ;中断优先
mov tcon,#0000000b ;中断为电平触发
mov sp,#70h ;堆栈指针
main: ;主程序循环点亮
mov p1,#0FFh ;全亮
lcall delay ;延时一段时间
mov a,#01h ;每次只亮一个灯。
loop: mov p1,a ;输出到p1
lcall delay ;延时
rl a ;循环左移
ajmp loop ;跳转main继续循环
ext0: push acc ;把A的值压入堆栈,保存A)
push psw ;(保存现场)
cpl p3.3 ;小喇叭响
acall deL ;小喇叭响的速率
pop psw ;恢复现场
pop acc
reti
delay:mov r5,#20 ;延时子程序1闪烁灯调用
d1: mov r6,#20
d2: mov r7,#250
djnz r7,$
djnz r6,d2
djnz r5,d1
ret
del: mov r4,#250 ;延时子程序2小喇叭调用
djnz r4,$
ret
end