中断与定时器计数器的C.doc
文本预览下载声明
1.MCS-51单片机的中断系统由哪几个特殊功能寄存器组成?
MCS-51单片机的中断系统是由TCON、IE、IP组成的。
2.MCS-51单片机中与定时器/计数器有关的特殊功能寄存器有哪几个?它们的功能各是什么?
和定时器/计数器有关的寄存器分别为TMOD、TCON、TH、TL
TMOD寄存器是定时器/计数器工作方式设置寄存器
TCON寄存器是定时器/计数器控制寄存器
TH、TL是初值寄存器
3.试编写一段对中断系统初始化程序,允许外部中断0、外部中断1、定时器/计数器T0溢出中断、串行口中断,且使定时器/计数器T0溢出中断为高优先级中断。
IE=0X87;
IP=0X02;
4.MCS-51单片机若要把外部中断源扩充为6个,可采用哪些方法?如何确定它们的优先级?
可以采用两种方法。
(1)利用外部中断和查询相结合的方法扩展外部中断如果系统外中断请求源,可以按照们的轻重缓急进行排队,把其中最高级别的中断源直接连接到单片机外中断0输入引脚,其余的外部中断请求可用利用逻辑器件通过与或者或的办法连接到单片机外中断1引脚,同时还连接到输入/输出端口(如P0或P1)的若干引脚,用来查询判断具体是哪一个中断请求源发生的中断事件。
,利用单片机扩展5个外部中断源,中断的优先次序为0~4,其中0接到外部中断0上,1~4通过与门接到外部中断1上;单片机的P1.4~P1.7接4个发光二极管用来作输出指示;当有1~4其中一个外部中断发生时,相应的发光二极管~点亮;当0外部中断发生时,4个发光二极管全亮。代码如下:
#includereg51.h
sbit P1_0=P1^0; //定义位变量
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
void main()
{ P1=0xFF; //熄灭LED
IT0= IT1=1; //外中断0触发方式EA=1; EX0=1; EX1=1; //中断for( ; ; ) //延时等待中断发生
{}
}
void INT0_ISR( ) interrupt 0 //外中断0中断服务函数
{P1=0x0F; //P1口高位置0点亮4个LED
}void INT1_ISR( ) interrupt 2 //外中断1中断服务函数
{ if (P1_0==0) {P1=0xef;} //如果为中断1,点亮D1 else if (P1_1==0) {P1=0xdf;}
else if (P1_2==0) {P1=0xbf;}
else if (P1_3==0) {P1=0x7f; } //如果为中断4,点亮D4}
(2)利用优先编码器扩展外部中断可以采用优先级解码芯片如74LS148,把多个中断源信号作为一个中断。如图所示,在有8个中断源的情况下,经74LS148优先译码后,只占3个I/O引脚,即用3根引脚可分辨8个中断源,从而节省了I/O口资源。程序代码如下:
#includereg51.h
unsigned char status; /定义一变量用来读取P0口状态
void main( )
{EA=1;
EX0=1;
IT0=1;
for( ; ; )
{;}
}
void INT0_ISR( ) interrupt 0//外中断0中断服务函数{ status=P00x07; //读取P0口低三位状态不同的值对应不同的中断源
switch(status)
{ case 0: P1=0xfe; break; //处理中断源0 case 1: P1=0xfd; break;
case 2: P1=0xfb; break;
case 3: P1=0xf7; break;
case 4: P1=0xef; break;
case 5: P1=0xdf; break;
case 6: P1=0xbf; break;
case 7: P1=0x7f; break; //处理中断源7 }
}
5.在MCS-51单片机系统中,已知振荡频率是12MHz,用定时器/计数器T0实现从P1.1产生周期是2s的方波,试编程。
要输出周期为s的方波,应产生s的周期性定时,定时到则对P1.1取反可实现用定时/计
显示全部