中断与定时器计数器的C51

更新时间:2023-11-16 07:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

·1· 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输入引脚INT0,其余的外部中断请求可以用利用逻辑器件通过“与”或者“或”的办法连接到单片机外中断1引脚INT1,同时还连接到输入/输出端口(如P0或P1)的若干引脚,用来查询判断具体是哪一个中断请求源发生的中断事件。

电路如下,利用单片机扩展5个外部中断源,中断的优先次序为S0~S4,其中S0接到外部中断0上,S1~S4通过“与”门接到外部中断1上;单片机的P1.4~P1.7接4个发光二极管用来作为输出指示;当有S1~S4其中一个外部中断发生时,相应的发光二极管D1~D4点亮;当S0外部中断发生时,4个发光二极管全亮。

·1·

C5源程序代码如下:

#include 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; EA=1; {;} }

//外中断0中断服务函数 //P1口高4位置0,点亮4个LED

//熄灭LED

//外中断0、1脉冲触发方式 //中断管理 //延时等待中断发生

//定义位变量

IT0=1; IT1=1; for( ; ; )

EX0=1; EX1=1;

void INT0_ISR( ) interrupt 0 { }

void INT1_ISR( ) interrupt 2 { if (P1_0==0) {P1=0xef;}

P1=0x0F;

//外中断1中断服务函数 //如果为中断S11,点亮D1

else if (P1_1==0) {P1=0xdf;} else if (P1_2==0) {P1=0xbf;} }

else if (P1_3==0) {P1=0x7f; } //如果为中断S44,点亮D4

·3· (2)利用优先编码器扩展外部中断

可以采用优先级解码芯片如74LS148,把多个中断源信号作为一个中断。如下图所示,在有8个中断源(S0~S7)的情况下,经74LS148优先译码后,只占3个I/O引脚,即用3根引脚可分辨8个中断源,从而节省了I/O口资源(8个中断源的响应用D1~D7模拟)。

C51源程序代码如下:

#include unsigned char status; void main( ) {

EA=1;

EX0=1; IT0=1; {;} }

//定义一变量,用来读取P0口状态

for( ; ; )

void INT0_ISR( ) interrupt 0//外中断0中断服务函数 {

status=P0&0x07;

//读取P0口低三位状态,不同的值对应不同的中断源

//处理中断源0

switch(status) {

case 0: P1=0xfe; break; 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

}

}

·1·

5.在MCS-51单片机系统中,已知振荡频率是12MHz,用定时器/计数器T0实现从P1.1产生周期是2s的方波,试编程。

要输出周期为2s的方波,应产生1s的周期性定时,定时到则对P1.1取反即可实现。 用定时/计数器T0产生周期性为10ms的定时,然后用一个变量对10ms计数100次。系统时钟为12MHz,定时/计数器T0定时10ms,计数值N为10000,选方式1,方式控制字为00000001B(01H),则初值X为X=65 536-10 000。

C51源程序代码如下:

#include sbit P1_1=P1^1; unsigned char i; void main( ) {

i=0;

//初始化

TMOD=0x01;

TH0=(65536-10000)/256; TL0=(65536-10000)%6; EA=1; ET0=1; TR0=1; while(1); }

void time0_int(void) interrupt 1 {

TH0=(65536-10000)/256; TL0=(65536-10000)%6; i++; { } }

if (i==100)

i=0;

//中断服务程序 //重载初始值 //重载初始值

//每发生一次中断,计数变量加1 //发生50次中断,定时0.5ms //计数变量清零

//定义计数变量

P1_1=!P1_1;

6.在MCS-51单片机系统中,已知振荡频率是12MHz,用定时器/计数器T1实现从P1.1产生高电平宽度是100ms,低电平宽度是200ms的矩形波,试编程。

根据输出要求,脉冲信号在一个周期内高电平占100ms,低电平占200ms。 C51源程序代码如下:

#include sbit P1_1=P1^1; unsigned char i; void main( ) {

i=0;

//初始化

//定义计数变量

TMOD=0x01;

TH0=(65536-50000)/256; TL0=(65536-50000)%6; EA=1; TR0=1; while(1); }

void time0_int(void) interrupt 1 {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; i=i+1;

if(i==2) P1_1=0; else if(i==6)

{ }

}

P1_1=1; i=0;

//计数变量清零

//高电平时间到变低 //周期时间到变高

//中断服务程序 //重载初始值

ET0=1;

·5·

7.用MCS-51单片机单片机制作一个模拟航标灯,灯接在P1.7上,INT0接光敏器件,使它具有如下功能: (1)白天航标灯熄灭,夜间间歇发光,亮2s,灭2s ,周而复始; (2)将INT0信号作为门控信号,启动定时器定时。 按以上要求编写控制主程序和中断服务程序。 #include unsigned char i; sbit P1_1=P1^1; void main() { i=0;

TMOD=0x09;

TH0=(65536-50000)/256; TL0=(65536-50000)%6; EA=1; ET0=1; TR0=1; while(1)

{ if(!P3^2) P1|=0x80; }

}

//int0=1时启动定时器0

//int0=0,白天 //P1.7置1,灯灭

本文来源:https://www.bwwdw.com/article/7vhv.html

Top