实验二单片机P1口输入输出及中断实验.docx
《实验二单片机P1口输入输出及中断实验.docx》由会员分享,可在线阅读,更多相关《实验二单片机P1口输入输出及中断实验.docx(17页珍藏版)》请在冰豆网上搜索。
实验二单片机P1口输入输出及中断实验
单片机P1口输入输出及外部中断实验
1、实验目的
1、学习P1口的使用方法。
2、学习延时子程序的编写和使用。
3、熟练在汇编软件环境下编写、修改、调试、和运行硬件程序
4、熟悉汇编语言
2、实验说明
1、P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
2、P1.0,P1.1作输入口接两个拨动开关,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取开关状态,将此状态,在发光二极管上显示出来。
编程时应注意P1.0,P1.1作为输入口时应先置1,才能正确读入值。
3、用单次脉冲申请中断,在中断处理程序中使P1.0的输出状态发生反转,并通过发光二极管观察P1.0的电平。
3、实验仪器
计算机
伟福软件(lab2000P)
4、实验内容
1、P1口是准双向口。
它作为输出口时与一般的双向口使用方法相同。
由准双向口结构可知当P1口用为输入口时,必须先对它置“1”。
若不先对它置“1”,读入的数据是不正确的。
2、8051延时子程序的延时计算问题,计算和估算延时子程序的时间。
3、保护进入中断时的状态,并在退出中断之前恢复进入时的状态。
4、必须在中断程序中设定是否允许中断重入,即设置EXO位。
1>关于延时子程序的时间计算,查指令表可知MOV和DJNZ指令均需用两个机器周期,在6MHz晶振时,一个机器周期时间长度为12/6MHZ,所以上面延时子程序该的执行时间为:
(256×255+2)×2×12÷6≈261ms
2>采用P1口作输出
P1口是准双向口,它作为输出口使用时具有锁存功能。
实验所需要LED电平显示电路如图所示。
3>采用P1口作输入和输出
由P1口的准双向口结构可知,当作为输入口时,必须先对它置“1”。
若不先对它置“1”,读入的数据是不正确的。
实验所需要LED电平显示电路和逻辑电平开关电路如图所示。
思考题
1、改变延时时间,变快或者变慢,观察效果;
2、第2个实验在每个端口增加软件延时,延时时间变快或者变慢,观察拨动开关响应效果;
3、改变流水灯的运行方向;
4、改变流水灯的运行模式,双灯对跑,双灯一起跑。
5、把实验改为int1中断,需要改动几处,如何改动。
6、把实验改为同时int0和int1中断驱动2个灯,需要改动几处,如何改动。
程序参考流程框图
实验电路及连线
实验电路
5、源程序修改原理及其仿真结果
流水灯实验1:
Loop:
mova,#01h
movr2,#8
Output:
movP1,a
rla
callDelay
djnzr2,Output
LjmpLoop
Delay:
movr6,#0
movr7,#0
DelayLoop:
djnzr6,DelayLoop
djnzr7,DelayLoop
ret
end
思考题一:
修改延时子程序
查指令表可知MOV和DJNZ指令均需用两个机器周期,在6MHz晶振时,一个机器周期时间长度为12/6MHZ,所以上面延时子程序该的执行时间为:
(256×255+2)×2×12÷6≈261ms=0.261s
在ms级别上人眼是无法区别快慢的,所以设计增加延时到s级别以区别于ms,即此延时级别上增加十倍,修改程序如下
Delay:
movr6,#0
movr7,#0
movr5,#0Ah;若效果不明显可以增大倍数
DelayLoop:
djnzr6,DelayLoop
djnzr7,DelayLoop
djnzr5,DelayLoop
ret
end
修改后的仿真结果为
实现了秒级别的延时。
思考题三:
改变流水灯的运行方向
修改程序如下:
Loop:
mova,#01h
movr2,#8
Output:
movP1,a
rra;rl表示左移,rr表示右移,可实现流水灯方向的变换
callDelay
djnzr2,Output
LjmpLoop
思考题四:
改变流水灯的运行模式,双灯对跑,双灯一起跑
修改为双灯对跑:
Loop:
movr0,#01h
movr1,#80h
movr2,#4;若改为8可以实现相对点亮然后相反点亮的循环
Output:
mova,r0
adda,r1
movP1,a;由于只有a可以实现移位功能,故用r0和r1将数据暂存,然后分别实现移位后相加移入a再赋值,以实现双灯对跑
mova,r0
rla
movr0,a
mova,r1
rra
movr1,a
callDelay
djnzr2,Output
ljmpLoop
Delay:
movr6,#0
movr7,#0
DelayLoop:
djnzr6,DelayLoop
djnzr7,DelayLoop
ret
end
软件仿真结果及实验现象描述:
;复位后P1口均为高电平
;第一次实现r0和r1数据相加赋值给P1,点亮边沿的两盏灯
;实现r0和r1数据的移位以后再次相加赋值给p1口,实现左右的四盏灯对跑
;循环次数为4次,完成后回到点亮边沿的两盏灯
修改为双灯一起跑:
Loop:
mova,#11h
movr2,#8
Output:
movP1,a
rla
callDelay
djnzr2,Output
LjmpLoop
软件仿真结果及实验现象描述:
复位后P1口都为高电平
赋入a的初值,此时0和4灯亮
a值左移位再次赋值,此时1和5灯亮,一下同理
流水灯实验2:
思考题二:
每个端口增加软件延时,延时时间变快或者变慢,观察拨动开关响应效果
KeyLeftequP1.0
KeyRightequP1.1
LedLeftequP1.2
LedRightequP1.3
SETBKeyLeft
SETBKeyRight
Loop:
MOVC,KeyLeft
CallDelay;在读入数据与传送数据间增加延时,观察控制效果
MOVLedLeft,C
MOVC,KeyRight
CallDelay
MOVLedright,C
LJMPLoop
Delay:
movr6,#0
movr7,#0
movr5,#0Ah;若效果不明显可以增大倍数或者减小倍数
DelayLoop:
djnzr6,DelayLoop
djnzr7,DelayLoop
djnzr5,DelayLoop
ret
end
思考题五:
如果LED灯为低电平点亮应如何改动
若LED灯为低电平点亮则只需将赋值中的0和1对换,如源程序中的a赋值为01h,然后对它进行移位再赋值,此时就应该改为赋值feh,然后移位时候相当于移的是0信号,让各个口循环出现低电平,以实现点亮LED灯。
其他点亮方式同理。
思考题六:
把实验改为int1中断,需要改动几处,如何改动
LEDequP1.0
LEDBufequ0
ljmpStart
org13h;13h为中断1的入口地址
Interrupt1:
;改为中断1的中断子程序
pushPSW;保护现场
cplLEDBuf;取反LED
movc,LEDBuf
movLED,c
popPSW;恢复现场
reti
org100H
Start:
clrLEDBuf
clrLED
movTCON,#00000100;外部中断1下降沿触发
movIE,#10000100;打开外部中断允许位(EX1)及总中断允许位(EA)
ljmp$
end;硬件接口要改变,单脉冲要接P3.3
思考题七:
把实验改为同时int0和int1中断驱动2个灯,需要改动几处,如何改动
LEDequP1.0
LED2equP1.1
LEDBufequ0
LEDBuf2equ0;增加P1.1灯对应的参数
ljmpStart
org3
Interrupt0:
pushPSW;保护现场
cplLEDBuf;取反LED
movc,LEDBuf
movLED,c
popPSW;恢复现场
reti
org13h
Interrupt1:
pushPSW
cplLEDBuf2
movc,LEDBuf2
movLED2,c
popPSW
reti;增加INT1中断子程序,使两个中断互不干扰
org100H
Start:
clrLEDBuf
clrLED
clrLEDBuf2
clrLED2
movTCON,#00000101;外部中断1和中断0下降沿触发
movIE,#10000101;打开外部中断允许位(EX1&EX0)及总中断允许位(EA)
ljmp$
end;硬件连接注意INT0输入对应P3.2,输出对应P1.0接L0,INT1输入对应P3.3,输出对应P1.1接L1
硬件仿真结果:
单脉冲接P3.2口时控制L0灯,按下单脉冲L0灯的状态发生一次转变,实现了连续按键L0灯一亮一灭闪烁,接P3.3都是L1灯出现同样的效果,说明实现了中断控制灯的状态转换,并且两个中断互不影响。