欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Proteus仿真51单片机外部中断实验

程序员文章站 2024-01-10 23:54:52
...

一、实验目的 
1.进一步熟悉利用 PROTEUS、Keil uVision5 等软件的使用方法。 
2.理解单片机的中断、中断优先级原理及中断过程,掌握中断服务子程序的编写方法。
 
3.熟悉数码管的显示原理。 
二、实验任务 1.基本任务 
已知单片机的 P0 口接了一位七段数码管,当无外部中断(外部中断 0)时,数码
管按 a~g 段依次点亮,不断循环显示;当有外部中断(按钮被按下,P3.2 有下降沿电
压)时,数码管显示状态改为“8”亮灭闪烁显示,亮灭闪烁显示 8 次后,返回主程序
继续按段顺序点亮。请在 Proteus 中画出电路原理图,并编写程序仿真实现上述功能。 
2.拓展任务(若未做,则实验报告也无需体现,以保证实验视频和实验 报告的一致性!)
 
在以上基本任务的基础上,加入一个声光报警器和外部中断 1,当有外部中断 1 时,
系统会产生声光报警。假设外部中断 1 的优先级高于外部中断 0。请在 Proteus 中画出
电路原理图,并编写程序仿真实现上述功能。 

基于Proteus仿真51单片机外部中断实验
 

#include "stc15.h"  //单片机头文件
#include "intrins.h"  //延时函数左右移函数头文件
unsigned char i;  //定义字符i
void Delay1000ms()		//@11.0592MHz 1000ms延时函数
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void main()
{ 
	P0=0x00; //单片机自启动时为高电平,需先对P0端置0
	IE0=0;  //防止启动时自动进行一次中断
	IE1=0;  //防止启动时自动进行一次中断
	P0M0=0x00;  //准双向口配置
	P0M1=0x00;  //准双向口配置
	EA=1;  //全局中断使能位使能
	EX0=1;  //外部中断位0中断位使能
	EX1=1;  //外部中断位1中断位使能
	IT0=1; //设置中断0为下降沿触发
	IT1=1;  //设置中断1为下降沿触发
	PX0=0;  //外部中断源0低优先级
	PX1=1;  //外部中断源1高优先级
		while(1)  //死循环
	{
		for(i=0;i<7;i++)  //循环7次使a~g依次点亮
		{    
			Delay1000ms();
		P0=_crol_(0x01,i); //左移函数从0x01开始左移循环7次
		}
	}
}
void INT0_ISR(void) interrupt 0  //外部中断源0的中断服务函数
{   
   Delay1000ms();  //消抖
	 for(i=0;i<8;i++)   //亮灭循环8次
	{
		P0 = 0x7f;  //配置字形8的段码为7f
		Delay1000ms();
		P0 = 0x00;   //使字形8熄灭
		Delay1000ms();
	}
}
void INT1_ISR(void) interrupt 2  //外部中断源1的中断服务函数
{   
	 Delay1000ms();  //消抖
	{
		P07 = 1;  //配置P07端口使声光报警启动
		Delay1000ms();
	}
}