IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式仿真项目:报警器 中断 -> 正文阅读

[嵌入式]嵌入式仿真项目:报警器 中断

控制灯移位(c):

/*中断控制灯移位实验(查询方式) */
//===================声明区=================================
#include	<reg51.h>		// 定义8051暂存器之标头档 
#define LED  P0            //定义LED端口
unsigned char SHIFT=0x01;         //LED显示初始状态
unsigned char i;
//===================主程序==================================
main()							// 主程序开始 
{	
	LED=0x00;//LED熄灭
	IT0=1;   //外部中断1控制为边沿触发方式(下降沿有效)	
	EX0=1;   //允许INT0中断
	EA=1;    //开放所有中断
	while(1)              // 无穷回圈,程序一直跑
    {
	while(IE0)			  //等待中断标志位	 
	{
		LED=(SHIFT<<i);   //左移一位	
		i=(++i)%8;        //调整移位位置
        IE0=0;            //清中断标志位
	}
	}	
}							// 主程序结束 

控制数码管(c):

/*数码管中断控制实验 (数码管七段输出8闪烁,若有中断产生,
七段笔划A、B、C、D、E、F依次来回逐个点亮3轮后又循环复原。)*/
//===================声明区=================================
#include	<reg51.h>		// 定义8051暂存器之标头档 
#define LED  P2            //定义LED端口
unsigned char SHIFTL=0x01;         //LED显示初始状态
unsigned char SHIFTR=0x20;         //LED显示初始状态
unsigned char i;
void delay1ms(int x);     //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{   
	unsigned char j;
	for(j=0;j<3;j++)
		{
			while(LED!=0xdf)   //七段笔划A、B、C、D、E、F依次顺时针方向逐个点亮3轮
			{
				LED=~(SHIFTL<<i);      
				delay1ms(500);
    			i=(++i)%6;
			}
			while(LED!=0xfe)  //七段笔划F、E、D、C、B、A依次逆时针方向逐个点亮3轮
			{
				LED=~(SHIFTR>>i);
				delay1ms(500);
				i=(++i)%6;
			}
		}
}


	 
//===================主程序==================================
main()							// 主程序开始 
{	
	IT0=1;   //外部中断1控制为边沿触发方式(下降沿有效)	
	EX0=1;   //允许INT0中断
	EA=1;    //开放所有中断
	while(1)					// 无穷回圈,程序一直跑 
	{
	   LED=0x00;                //数字8闪烁
	   delay1ms(500);
	   LED=0xff;
	   delay1ms(500);
	}	
}							// 主程序结束 
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)			 
{	int i,j;					// 声明整数变数i 
	for(i=0;i<x;i++)			// 计数x次,延迟约*1ms		
		for(j=0;j<120;j++);		// 计数120次,延迟约1ms 
}		

控制外部中断(c):

//按钮控制发光二极管,每按一次按钮,按顺序循环移动点亮一位
#include<reg51.h>
unsigned char temp;//中间变量
//定义键
sbit k0=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit k4=P1^4;
sbit k5=P1^5;
sbit k6=P1^6;
sbit k7=P1^7;
void main()
{	
	EA=1;//cpu开中断
	EX0=1;//外部中断0开中断
	EX1=1;//外部中断1开中断
	IT0=1;//外部中断0设置为下降沿触发方式
	IT1=1;//外部中断1设置为下降沿触发方式
	PX0=1;//外部中断0设置为高优先级
	P0=0xff;//开始全都不亮
	temp=0xfe;//设置发光二极管初始状态
	while(1);//等待中断
}
void ext0(void )interrupt 0 using 0 //外部中断0
{
   P0=temp;//点亮相应指示灯
   temp=temp<<1|1;//修改灯状态
   if(temp==0xff)
     temp=0xfe;
}
void ext1(void )interrupt 2 using 0 //外部中断1
{
  if(k0==0)//判断K0,如果不是,继续判断下一个
  {
  	P0=0xFF;//灯全灭
  }
  else if(k1==0)//判断K1,如果不是,继续判断下一个
  {
  	P0=0x0;//灯全亮
  }
   else if(k2==0)//判断K2,如果不是,继续判断下一个
  {
  	P0=0x55;
  }
   else if(k3==0)
  {
  	P0=0x7;
  }
   else if(k4==0)
  {
  	P0=0x0f;
  }
   else if(k5==0)
  {
  	P0=0x1f;
  }
    else if(k6==0)
  {
  	P0=0x3f;
  }
    else if(k7==0)
  {
  	P0=0x7f;
  }
}

中断及优先级(c):

/*中断优先级控制实验 (INT0低级中断,控制P2口数码管;INT1为高级中断,控制P1口数码管;
主程序控制P0口数码管*/
//===================声明区=================================
#include	<reg51.h>		    // 定义8051寄存器头文件 
#define SMG_ZHU   P0            //定义主程序控制的数码管端口
#define SMG_INT1  P1            //定义外部中断1控制的数码管端口
#define SMG_INT0  P2            //定义外部中断0控制的数码管端口
#define uchar unsigned char
uchar code TABP[10]=	// 共阳7节显示器(g~a)编码 
{ 	0xc0, 0xf9, 0xa4, 0xb0, 0x99,	// 数字0-4
  	0x92, 0x82, 0xf8, 0x80, 0x90, 	// 数字5-9
};  		
void delay1ms(int x);     //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{   
		uchar i;
		for(i=0;i<10;i++)
		{
	   		SMG_INT0=TABP[i];                //显示数字0~9
	   		delay1ms(500);
	   	}
		SMG_INT0=0xff;
}
void service_int1(void) interrupt 2 using 2
{   
		uchar i;
		for(i=0;i<10;i++)
		{
	   		SMG_INT1=TABP[i];                //显示数字0~9
	   		delay1ms(500);
	   	}
		SMG_INT1=0xff;
}

	 
//===================主程序==================================
main()							// 主程序开始 
{	
	IT0=1;   //外部中断0控制为边沿触发方式(下降沿有效)
	IT1=1;   //外部中断1控制为边沿触发方式(下降沿有效)
	PX1=1;   //外部中断1为高优先级
	EX0=1;   //允许INT0中断
	EX1=1;   //允许INT1中断
	EA=1;    //开放所有中断
	while(1)					// 无穷回圈,程序一直跑 
	{  
		uchar i;
		for(i=0;i<10;i++)
		{
	   		SMG_ZHU=TABP[i];                //显示数字0~9
	   		delay1ms(500);
	   	}
	}	
}							// 主程序结束 
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)			 
{	int i,j;					// 声明整数变数i 
	for(i=0;i<x;i++)			// 计数x次,延迟约*1ms		
		for(j=0;j<120;j++);		// 计数120次,延迟约1ms 
}		

中断计数(c):

/*中断计数实验 (P0十位数码显示;P2口控制个位数码显示;
使用外部中断0*/
//===================声明区=================================
#include<reg51.h>		       //定义8051寄存器头文件 
#define SMG_SW   P0            //定义十位数码显示端口
#define SMG_GW   P2            //定义个位数码显示端口
#define uchar unsigned char    //定义uchar数据类型
uchar   DATA_SW;               //定义保存十位数据变量
uchar   DATA_GW;               //定义保存个位数据变量
uchar   k;                     //保存计数值变量
uchar code TABP[10]=	       //共阳7节显示器(g~a)编码 
{ 	0xc0, 0xf9, 0xa4, 0xb0, 0x99,	// 数字0-4
  	0x92, 0x82, 0xf8, 0x80, 0x90, 	// 数字5-9
};  		
void delay1ms(int x);     //延迟函数
//===================中断程序================================
void service_int0(void) interrupt 0 using 1
{   
		k++;
		DATA_GW=k%10;
		DATA_SW=k/10;
}	 
//===================主程序==================================
main()							// 主程序开始 
{	
	IT0=1;   //外部中断0控制为边沿触发方式(下降沿有效)
	EX0=1;   //允许INT0中断
	EA=1;    //开放所有中断
	while(1)					// 无穷回圈,程序一直跑 
	{  
	  		SMG_GW=TABP[DATA_GW];    //显示个位数字
            SMG_SW=TABP[DATA_SW];    //显示十位数字
	   		delay1ms(500);
	}	
}							// 主程序结束 
// === 延迟函数,延迟约x*1ms ================================
void delay1ms(int x)			 
{	int i,j;					// 声明整数变数i 
	for(i=0;i<x;i++)			// 计数x次,延迟约*1ms		
		for(j=0;j<120;j++);		// 计数120次,延迟约1ms 
}		

自动防盗报警器(c):

//自动防盗报警器
//功能要求:
//任意输入低电平,报警器响并显示。
//报警后有其他位置的传感器送来低电平,
//喇叭继续响,显示会随之改变。
//也就是记忆之前所有低电平,
//直到按复位,清除记忆,停止报警。
//
//每个输入信号出现低电平,都可以引起外中断0的中断。
//在外中断0的中断服务程序中,查询P2口的每个输入信号,
//判断中断信号来自哪里,然后输出报警信号:显示和声音
#include<reg51.h>            //引用库定义
void delayms(unsigned int t);//延时声明
unsigned char out,temp;      //定义中间变量
void main()
{	
	EA=1;        //允许外中断0,初始化
	EX0=1;
	IT0=1;       //外中断0下降沿触发
	out=0xff;    //输出开始值全1
	P1=0x00;     //试验输出效果
	delayms(300);//延时
	P1=0xff;     //试验完毕
	while(1);    //死循环,等待中断(出现情况报警)
}
//以下外中断0的中断服务程序
//程序循环检测扩展的中断输入信号,
//只要某输入端产生过负脉冲,就自动记忆,
//脉冲过去了也还记得,显示也不会消失。
//只要开始报警,本服务程序就不结束,直到复位
void ext0(void )interrupt 0 using 0
{
  temp=P2;      //读取传感器状态
  out=out&temp; //保存当前报警状态
  P1=out;       //输出
}
void delayms(unsigned int t)//延时子程序,约1毫秒
{
	unsigned int i,j;
	for(i=0;i<t;i++)
		for(j=0;j<124;j++);
}

?

中断控制移灯:

//按钮控制发光二极管,每按一次按钮,按顺序循环移动点亮一位
#include<reg51.h> //引用库定义
unsigned char temp;//临时变量

void main()
{	
	EA=1;//cpu开中断
	EX0=1;//外部中断0开中断
	IT0=1;//外部中断0设置为下降沿触发方式
	P0=0xff;//开始全都不亮
	temp=0xfe;//初始值
	while(1);//等待中断
}
void ext0(void )interrupt 0 using 0 //外部中断0
{
   P0=temp;
   temp=temp<<1|1;//修改灯状态
   if(temp==0xff)
     temp=0xfe;
}

?

?

扩展外部中断:

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:50:57  更:2021-09-22 14:51:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:31:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码