STC89C52的四个 外部中断 基本使用方法

1. STC89C52中断系统

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。STC89C52系列单片机提供了8个中断请求源,它们分别是:

  • 外部中断0(NT0); 对应I/O :P32
  • 定时器0中断;
  • 外部中断1(INT1); 对应I/O :P33
  • 定时器1中断;
  • 串口(UART)中断;
  • 定时器2中断;
  • 外部中断2(INT2); 对应I/O :P43
  • 外部中断3(INT3) 。 对应I/O:P42

所有的中断都具有4个中断优先级。用户可以用关总中断允许位(EAE.7)或相应中断的允许位来屏蔽所有的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请:每一个中断源可以用软件独立地控制为开中断或关中断状态:每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。STC89C52系列单片机的各个中断查询次序如下表所示:在这里插入图片描述
相同优先级内的查询次数也就是我们在使用时的中断号: 函数名() interrupt 中断号

2. 示例程序

主函数:

#include "STC.h"//选择对应型号头文件,这里由于重定义不再选择 “reg52.h”
#include "delay.h" 
//#include "uart.h"
#include "ex_interrupt.h"

void main()
{	
	P1=0xff;
	P46 = 1;
	// 初始化外部中断
	Ex0_Init(Mode_1);  //初始化外部中断为模式1,下降沿触发
	Ex1_Init(Mode_0);  //初始化外部中断为模式0,低电平触发
	Ex2_Init(Mode_1);
	Ex3_Init(Mode_0);
	
	while(1)
	{	
		P46=!P46;
		delay_ms(500);	
	}
}

ex_interrupt.h文件:

#ifndef _EX_INTERRUPT_H
#define _EX_INTERRUPT_H
#include "STC.h"
//外部中断子函数声明
void Ex0_Init(uint8 ExMode);
void Ex1_Init(uint8 ExMode);
void Ex2_Init(uint8 ExMode);
void Ex3_Init(uint8 ExMode);

extern uint8 Mode_0;
extern uint8 Mode_1;

//void MCU_PowerDown(); //STC MCU掉电唤醒

/*	STC89C系列 外部中断2,3 定义		*/
/*	如果使用reg52.h或STC89C52的头文件未定义,请取消如下注释	*/

//sfr P4 = 0xe8; 

//sbit INT2 = P4^3;  //中断输入引脚
//sbit INT3 = P4^2:

//sfr XICON = 0xc0;

//sbit PX3 = XICON^7;
//sbit EX3 = XICON^6;
//sbit IE3 = XICON^5;
//sbit IT3 = XICON^4;
//sbit PX2 = XICON^3;
//sbit EX2 = XICON^2;
//sbit IE2 = XICON^1;
//sbit IT2 = XICON^0;
#endif

在 ex_interrupt.c文件中简单配置一下,我这里采用模块化程序,在main()函数中调用初始化函数,并传入触发方式参数。

#include "ex_interrupt.h"

/*****************************************************
 * 函数名: void Ex0_Init()
 * 功	能 : 外部中断INT0 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex0_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT0 = 0;
	}	IT0 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发
		EX0 = 1;				//使能外部中断0
		EA = 1; 				//开总中断
}


/*****************************************************
 * 函数名: void Ex1_Init()
 * 功	能 : 外部中断INT1 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex1_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT1 = 0;
	}	IT1 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX1 = 1;				//使能外部中断1
		EA = 1; 				//开总中断
}

/*****************************************************
 * 函数名: void Ex2_Init()
 * 功	能 : 外部中断INT2 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex2_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT2 = 0;
	}   IT2 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX2 = 1;				//使能外部中断2
		EA = 1; 				//开总中断
}

/*****************************************************
 * 函数名: void Ex3_Init()
 * 功	能 : 外部中断INT3 初始化函数
 * 入参数: 中断模式设置(1:下降沿触发, 0:低电平触发)
 * 返回值: 无
 *****************************************************/
void Ex3_Init(uint8 ExMode)
{
	if(ExMode==Mode_0)
	{
		IT3 = 0;
	}	IT3 = 1;				//中断模式设置(1:下降沿触发, 0:低电平触发)
		EX3 = 1;				//使能外部中断3
		EA = 1; 				//开总中断
}

// ====================================================

/****************************************************
 * 函数名:void ExInt0_ISR() interrupt 0
 * 功	能 :外部中断INT0 服务函数 引脚 P32
 * 返回值:无
 ****************************************************/
void ExInt0_ISR() interrupt 0
{
/* 用户中断服务任务	*/
	P10 = !P10;		//状态取反
}


/****************************************************
 * 函数名:void ExInt1_ISR() interrupt 2
 * 功	能 :外部中断INT1 服务函数 引脚P33
 * 返回值:无
 ****************************************************/
void ExInt1_ISR() interrupt 2
{
/* 用户中断服务任务	*/
	P11 = !P11;		//状态取反
}

/****************************************************
 * 函数名:void ExInt2_ISR() interrupt 6
 * 功	能 :外部中断INT2 服务函数引脚P43
 * 注	意 :在使用外部中断2时需要定义 P43 和 XICON寄存器,见.h文件
 * 返回值:无
 ****************************************************/
void ExInt2_ISR() interrupt 6
{
/* 用户中断服务任务	*/
	P12 = !P12;		//状态取反
}


/****************************************************
 * 函数名:void ExInt3_ISR() interrupt 7
 * 功	能 :外部中断INT3 服务函数   引脚P42
 * 注	意 :在使用外部中断3时需要定义 P42 和 XICON寄存器,见.h文件
 * 返回值:无
 ****************************************************/
void ExInt3_ISR() interrupt 7
{
/* 用户中断服务任务	*/
	P13 = !P13;		//状态取反
}


/***************************************************
* 函数名: void MCU_PowerDown()
* 功 能 : STC89C52系列单片机外部中断0(下降沿)唤醒掉电模式
		任何方式均可设置 掉电模式 并非只有外部中断
* 返回值: 无
* 使用说明:若使用请 将该函数放在主循环中
****************************************************/
void MCU_PowerDown()
{
	INT0=1;					//ready read INTO port
	while(!INT0);		// check INTO
	_nop_();				//空语句 延时
	_nop_();
	PCON = 0x02;		//MCU power down 唤醒掉电模式
	_nop_();
	_nop_();
	P1++;
}

3. 总结

经过对STC89C52四个外部中断的简单配置 使用,可见其和传统51单片机具有相似性,继承了传统控制方式,又添加了新的可用外设。但其中需要注意,对于STC89C52RC的P4端口的使用,在官方的头文件和keil 环境中的reg52.h中是没有定义的,外部中断INT2和INT3的控制寄存器,各位也没有定义。所以用户若要使用这两个额外中断,需要更具官方手册自行定义。但也要注意,区分不同系列,比如STC89C52RC的XICON寄存器首地址为:0xc0; P4端口的首地址为:0xe8;而在12系列中则不是这个对应关系了。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
单片机课程设计 题 目 基于51单片机的万年历设计 学生姓名 专业班级 学 号 院 (系) 指导教师 完成时间 目录 1课程设计的目的 1 2课程设计的任务与要求 1 2.1设计任务 1 2.2设计要求 1 3单片机发展概况 1 4设计原理与功能说明 4 4.1设计思想 4 4.2总体电路图 5 4.3时钟模块 6 4.4液晶显示模块 6 4.5按键模块 7 5系统测试 7 5.1硬件测试 7 5.2软件测试 8 6总结 8 参考文献 10 附录一:总体电路原理图 11 附录二:主程序 12 附录三:元器件清单 27 附录四:实物图 28 1课程设计的目的 1.通过制作万年历,可以对单片机这门课程更好的认识。 2.理论与实践结合,提高自己的动手能力。 3.学会与合作者更好的交流学习,共同进步和提高。 4.能够增长查阅资料的能力,视野更加开阔。 5.拓展其他学科的联系,全面发展。 6.培养自我发现问题,解决问题的能力。 2课程设计的任务与要求 2.1设计任务 1.可以去学校图书馆或者网上,搜集整理相关的资料,做好前期理论准备,为以后设 计电路,看懂电路图做理论支持。 2.构想万年历电路图,并且具有可行性,画出电路图。 3.列举电路所需的电子元件,仔细对比所需的元件的参数,通过去电子元件经销商或 者网购购买。 2.2设计要求 1.显示年、月、日、时、分、秒。 2.可通过键盘自动调整时间。 3.计时精度:月误差小于20秒。 3单片机发展概况 单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段: 第一阶段(1976-1978):初级单片机微处理阶段。该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。 第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。 第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业 测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理 系统和局域网络系统。 STC系列单片机是由STMicroelectronics 公司生产,并有宏晶公司做大陆代理的。本设计使用STC89C52作为控制核心,其管脚兼 容其他51系列的单片机,以下对STC89C52进行简单讲解。 STC89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数 器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三 大总线。采用40Pin封装的双列直接DIP结构,图3.1是它们的引脚配置,40个引脚中,正 电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口 线复用。现在对各引脚功能说明如下(图3.2): (1)主电源引脚 Vcc :接+5V电源正端。 Vss :接+5V电源地端。 (2)输入/输出引脚 P.0~P0.7:P0口的8个引脚。在不接片外存储器与不扩展I/O接口时,可作为准双向 输入/输出接口。在接有片外存储器或扩展I/O接口时,P0口分时复用为低8位地址总线 和双向数据总线。 P1.0~P1.7:P1口的8个引脚。可作为准双向I/O接口使用。对于52子系列,P1.0 与 P1.1还有第二种功能:P1.0 可用作定时器/计数器2的计数脉冲输入端T2。P1.1可用作定时器/计数器2的外部控制 端T2EX。 P2.0~P2.7:P2口的8个引脚。可作为准双向I/O接口;有接有片外存储器或扩展I/ O接口且寻址范围超过256个字节时,P2口用作高8位地址总线。 P3.0~P3.7:P3口的8个引脚。除作为准双向I/O接口使用外,还具有第二种功能 ,详见图3.2。 图3.1 STC89C52单片机管脚图 "引脚 "第二功能 " "P3.0 "RXD(串行口输入) " "P3.1 "TXD(串行口输出) " "P3.2 "I¯N¯T¯0¯(外部中断0输入) " "P3.3 "I¯N¯T¯1¯(外部中断1输入) " "P3.4 "T0(定时器0的外部输入) " "P3.5 "T1(定时器1的外部输入) " "P3.6 "W¯R¯(片外数据存储器写控制信号 " "P3.7 ") " " "R¯D¯(片外数据存储器读控制信号 " " ") " 图3.2 P3口第二功能表 4设计原理与功能说明 4.1设计思想 以STC89C52单片机为核心,外接单片机复位电路,单片机晶振电路,时钟芯片DS130 2,按键电路,液晶显示电路,通过控制STC89C52单片机的接口来控制时
课程名称: 微机原理课程设计 题 目: 数字电压表 摘要 单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表 示单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个 计算机系统集成到一个芯片上。单片机由运算器,控制器,存储器,输入输出设备构成 ,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。 概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应 用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择 。它最早是被用在工业控制领域。 其中我们用于学习用的最多的是STC89C52单片机STC89C52STC公司生产的一种低 功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典 的MCS- 51内核,但也做了很多改进使得芯片具有传统51单片机不具备的功能。STC89C52具有8k 字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结 构,全双工串行口。 本设计就是以单片机STC89C52为核心,附以外围电路,实现数字电压表的功能,并运 用软件Proteus进行仿真来得到实验结果。 关键词:STC89C52单片机、仿真、中断、数字电压表、数码管显示 目录 一、任务要求 4 1.1 设计任务 4 1.2 设计要求 4 1.3 发挥部分 4 1.4 创新部分 4 二、方案总体设计与论证 5 三、硬件设计 6 3.1 单片机晶振部分 6 3.2 单片机复位部分 6 3.3 电源模块部分 7 3.4 A/D转换部分 7 3.5 数码管显示部分 8 3.6 单片机STC89C52 10 四、软件设计 13 4.1 程序设计总方案 13 4.2 系统子程序设计 13 4.3 A/D转换子程序 13 4.4 中断 14 五、系统仿真与调试 15 六、设计总结与心得体会 18 6.1 设计总结 18 6.2 心得体会 18 七、参考文献 19 一、任务要求 1.1 设计任务 使用所学的单片机以及编程的知识,利用PCF8591A/D转换芯片把电阻转换为电压并使 用四位数码管显示出来。 1.2 设计要求 利用所学的软硬件知识,使用KEIL uVision4软件编写能够实现数字电压表功能的程序。使用软件将数字电压表的硬件电路 的模拟电路在70mm*90mmPCB板模板上绘制出来,然后根据lochmaster30软件所绘制的模 拟电路在70mm*90mmPCB板上焊接出来。检查电路焊接完好后把编写好的程序下载到单片 机内验证编写的程序,观察数字电压表的显示情况是否与实验要求相符。 1.3 发挥部分 使用PCF8591A/D转换芯片通过电阻的调节改变电压并在数码管上显示出来,并且使用 一个LED实时的把电压的大小体现出来,电压变高LED就变亮,电压变低LED就变暗。 1.4 创新部分 本实验需求测量0- 5V电压,发挥创新,将测量电压的大小增大,设置成可调挡的形式。可测量5V、10V、2 0V电压等。由于时间关系,程序只写了测量5V电压的,稍后会更新程序。本实验采用的 是四路检测问做法,尽可能发挥了它的功能。 二、方案总体设计与论证 本次步进电机控制实验以单片机为主体,P0口接上拉电阻驱动数码管的段码,P2口连 接数码管的位码,P2口的高四位从低到高分别控制第一、二、三、四个数码管亮或者灭 。P1.0口和P1.1口分别接PCF8591芯片的SCL和SDA引脚。SCL和SDA引脚分别为I2C总线的 时钟线、数据线。AIN0口接蓝白卧式可调电阻,当可调电阻滑动时,电阻的变化引起电 压的变化,经过PCF8591芯片的实时转换,通过单片机处理实时的在数码管上显示出来。 同时也能够通过外接在芯片的AOUT口的LED体现电压的大小。AOUT口为芯片的D/A转换输 出端。外加复位和晶振电路等组成的最小系统。EA引脚接高电平。 进行本实验之初具有两套方案: 方案一:使用附加发光二极管的亮与暗来体现电压的大小。此方法拥有体现电压大小 的效果更明确的优势。但是硬件电路会复杂一点。 方案二:不使用附加发光二极管的亮与暗来体现电压的大小。此方法具有硬件电路简 单的优势,节约了成本。但是体现效果不明显。 经过衡量,觉得附加LED体现会使电压大小的体现效果更加明了。所以选择方案一。 使用数码管显示附加LED来体现不电压的大小。 设计变化框图如图1所示: 图1 变化框图 设计系统功能图如图2所示: 图2 系统功能图 总体方案工作原理:STC89C52是集成40个I/O口的单片机,拥有12MHZ的晶振周期

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guard_Byte

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值