文档库 最新最全的文档下载
当前位置:文档库 › 实验名称:单片机IO口控制实验

实验名称:单片机IO口控制实验

实验名称:单片机IO口控制实验
实验名称:单片机IO口控制实验

实验名称:单片机I/O口控制实验

实验目的:

利用单片机的P1口作为I/O口,学会利用P1口作为输入和输出口。

实验原理:

一、 C51的IO口系统:

P0~P3端口功能总结:

(1)P0~P3口都是并行I/O口,但P0口和P2口,还可用来构建系统的数据总线和地址总线,所以在电路中有一个MUX,以进行转换。

而P1口和P3口无构建系统的数据总线和地址总线的功能,因此,无MUX。P0口的MUX的一个输入端为“地址/数据”信号。

P2口的MUX的一个输入信号为“地址”信号。

(2)在4个口中只有P0口是一个真正的双向口,P1~P3口都是准双向口。

原因:P0口作数据总线使用时,需解决芯片内外的隔离问题,即只有在数据传送时芯片内外才接通;不进行数据传送时,芯片内外应处于隔离状态。为此,P0口的输出缓冲器应为三态门。P0口中输出三态门是由两只场效应管(FET)组成,所以是一个真正的双向口。

P1~P3口,上拉电阻代替P0口中的场效应管,输出缓冲器不是三态的-准双向口。

(3)P3口的口线具有第二功能,为系统提供一些控制信号。

因此P3口增加了第二功能控制逻辑。这是P3口与其它各口的不同之处。

二、C51的中断系统

单片机能及时地响应和处理单片机外部事件或内部事件所提出的中断请求。

1.五个中断请求源:

(1)INT0*—外部中断请求0,由引脚INT0*输入,中断请求标志为IE0。

(2)INT1*—外部中断请求1,由引脚INT1*输入,中断请求标志为IE1。

(3)定时器/计数器T0溢出中断请求,中断请求标志为TF0。

(4)定时器/计数器T1溢出中断请求,中断请求标志为TF1。

(5)串行口中断请求,中断请求标志为TI或RI。由特殊功能寄存器TCON和SCON的相应位锁存。

2.中断控制:

中断允许寄存器IE:CPU对中断源的开放或屏蔽,由片内的中断允许寄存器IE控制。字节地址为A8H,可位寻址。

IE对中断的开放和关闭为两级控制。

总的开关中断控制位EA(IE.7位):

EA=0,所有中断请求被屏蔽。

EA=1,CPU开放中断,但五个中断源的中断请求是否允许,还要由IE中的5个中断请求允许控制位决定。

IE中各位的功能如下:

(1)EA:中断允许总控制位

0:CPU屏蔽所有的中断请求(CPU关中断);

1:CPU开放所有中断(CPU开中断)。

(2)ES:串行口中断允许位

0:禁止串行口中断;

1:允许串行口中断。

(3)ET1:定时器/计数器T1的溢出中断允许位

(4)EX1:外部中断1中断允许位

(5)ET0:定时器/计数器T0的溢出中断允许位

(6)EX0:外部中断0中断允许位。

中断优先级寄存器:

两条基本规则:

(1)低优先级可被高优先级中断,反之则不能。

(2)同级中断不会被它的同级中断源所中断。

IP各个位的含义:

(1)PS——串行口中断优先级控制位

1:高优先级中断;

0:低优先级中断。

(2)PT1——定时器T1中断优先级控制位

1:高优先级中断;

0:低优先级中断。

(3)PX1——外部中断1中断优先级控制位

1:高优先级中断;

0:低优先级中断。

(4)PT0——定时器T0中断优先级控制位

1:高优先级中断;

0:低优先级中断。

(5)PX0——外部中断0中断优先级控制位

1:高优先级中断;

0:低优先级中断。

由软件可改变各中断源的中断优先级。

IT0/IT1——触发方式选择位:

0:低电平触发方式,-INT0/1低电平时IE0/IE1=0,-INT0/1高电平时IE0/IE1=1。

1:下降沿触发方式,检测到下降沿,则使IE0/IE1=1,CPU相应中断后自动清除IE0/IE1。

实验内容:

1、编写程序,用P1.0-P1.2口连接LED,查询拨键开关SW1的状态来控制LED的亮和

灭(P1.7接SW1)。

2、编写程序,用P1.0-P1.2口连接LED,用按键开关KEY1作为外部中断输入INT0控制

LED的亮和灭(按一次按键LED状态取反一次)。

实验1:采用查询方式,流程图如下所示:

代码及注释:

ORG 8000H ;硬件仿真调试程序

LJMP MAIN

ORG 8100H ;硬件仿真调试程序

MAIN: SETB P1.0 ;给LED一个初态,熄灭

SETB P1.1

SETB P1.2

BACK: SETB P1.7 ;对输入位P1.7置1

JB P1.7,BACK1 ;开关断开,跳转至BACK1

CLR P1.0 ;开关闭合,所有LED灯亮

CLR P1.1

CLR P1.2

SJMP BACK ;返回继续查询

BACK1: SETB P1.0 ;开关断开,所有LED灯熄灭

SETB P1.1

SETB P1.2

SJMP BACK ;返回继续查询

END

电路图:

实验结果及分析:

LED灯的初始状态为熄灭状态,当闭合拨键开关时,三个LED灯同时点亮,当断开拨键开关时,三个LED灯同时熄灭。

在这个实验中是通过软件不断查询P1.7口的状态来控制LED灯的亮灭,实验前应注意先设置LED灯的状态。可通过将LED灯与电源或地线直接相连来观测LED是共阴极还是共阳极。实验时将LED灯和电源直接相连时,灯亮,说明此LED灯为共阴极的,即低电平点亮,故初始化时将LED灯置1为熄灭状态。当开关断开时,P1.7为高电平,P1.0~P1.2输出高电平,LED灯熄灭;当开关闭合时,P1.7为低电平,P1.0~P1.2输出低电平,LED灯亮。由此便可通过JB跳转指令对开关状态进行检测后,来确定P1.0~P1.2的输出状态。

预习报告中的电路图只画了LED灯和开关的连接,不太完整。修改后的电路图将晶振部分和复位部分的电路图也画上了,如上图所示。

实验2:采用中断方式,流程图如下所示:

代码及注释:

ORG 8000H ;硬件仿真调试程序

LJMP MAIN

ORG 8003H ;硬件仿真调试程序

LJMP INTT0 ;INT0中断服务程序跳转程序

ORG 8100H

MAIN: CLR P1.0 ;设置LED灯的初态

CLR P1.1

CLR P1.2

SETB P3.2 ;P3.2锁存器置1,INT0中断输入

SETB IT0 ;指定INT0为边沿触发方式

SETB EX0 ;开放INT0中断

SETB EA ;开放CPU的中断

SJMP $ ;等待中断

ORG 8200H ;INT0中断服务程序

INTT0: CLR EA ;关中断

CPL P1.0 ;所有LED灯的状态取反

CPL P1.1

CPL P1.2

MOV R0,#10000 ;延时部分

DJNZ R0,$

SETB EA ;开中断

RETI

END

电路图:

实验结果及分析:

LED灯的初始状态为点亮,当按下按键开关时,三个LED灯同时熄灭,再次按下按键开关时,三个LED灯同时点亮,如此反复。

实验时也应先设置LED灯的初始状态,而后设置中断的方式。按键开关与P3.2口相连,每按一次按键开关,INT0中断输入,程序跳转至中断服务程序,通过对LED灯状态取反来控制LED灯的亮灭。

实验过程中反复按下按键开关,观察LED灯的亮灭状态,发现LED灯在亮灭过程中会偶有闪烁现象。这是因为按键开关容易产生抖动,需要增加防抖动的措施。因此,我对预习报告中的代码做了一些修改,在LED灯状态取反后添加了一个延时程序,即:MOV R0,#10000 ;延时部分

DJNZ R0,$

因为实验中所用的晶振振荡频率为12MHz,周期为1/12us,而每个机器周期占用12个振荡周期,故每个机器周期正好为1us。查表可知DJNZ指令占用2个机器周期,所以延时部分的计数值设为10000,这样此循环所用的时间就为10000*1*2=20000us=20ms。但是加上这个延时后,LED灯还是偶尔会出现闪烁现象,后把延时改为15ms和30ms,发现作用也

不大。这个问题主要应该还是按键开关的灵敏度不够高,虽然增加延时可以有所改善,但LED灯偶尔还是有些闪烁,不过这也不影响对实验结果的验证。

相关文档