首页 > 其他分享 >51单片机笔记[2]-中断模块

51单片机笔记[2]-中断模块

时间:2022-09-01 00:34:39浏览次数:91  
标签:count 中断 void 51 二极管 delay 单片机 int 模块

实验目的

  1. 熟悉Keil,Proteus软件的使用
  2. 熟悉中断的概念,以及编程中的应用

实验内容

开关中断控制发光二极管的亮灭

  1. 按下开关K3(P3.2),8个发光二极管点亮与熄灭循环交替
  2. 按下开关K4(P3.3),前4个发光二极管与后4个发光二极管交替点亮

定时器中断控制数码管显示

  1. 按下P3.2“计数”按键时,中断程序累加计数,通过数码管(连接在P2口)显示按键次数。(计数范围0-9)
  2. P3.3“清零按键”时,数码管清零

原理

中断(stc官方datasheet有详细介绍)

中断有如下几种类型:

  • 外部中断
  • 定时器中断
  • 串口中断
  • 低压检测中断
  • 比较器中断
  • PWM中断及PWM异常检测中断

为了能让大家更容易理解中断概念, 我们先来举一个生活事例: 你打开火, 烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警 声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完 开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断。引起 CPU 中断的根源称为中断源,每一个中断源有一个优先级别。

中断流程
中断程序流程

中断嵌套与中断优先级

中断嵌套
中断优先级
中断优先级硬件实现

中断函数与中断号


所用的stc15w4k32s4提供了21个中断请求源.我们主要用到外部中断0(interrupt 0或称INT 0),定时器0中断(interrupt 1),外部中断1(interrupt 2,INT 1),定时器1中断(interrupt 3).
我们可以通过操作「中断允许寄存器」或「中断优先级控制寄存器」来暂时屏蔽某个中断。

CPU中断对比RTOS中的任务管理

[https://www.cnblogs.com/dream397/p/15895220.html]
在RTOS内核中,不再单纯的只有一个main函数在跑,而是系统中「同时存在多个任务」,由内核根据不同的任务优先级进行抢占式调度执行。

RTOS内核中PendSV异常(任务切换/调度)的优先级被设为最低,有3个优点:

① 使得在「任何任务」的执行过程中,都可以被外设产生的中断请求所中断(假设中断都已经使能);

② 避免在中断处理程序中产生任务切换;

③ 使得中断处理程序可以按照中断优先级正常嵌套,不会受任务的影响;

这样一来,即使程序中有了RTOS内核,「从中断产生到执行中断处理程序的整个过程都和裸机程序没有什么不同」。

51单片机扩展外部中断源

[https://blog.csdn.net/billliu66/article/details/121572136]
主要有如下几种方法扩展外部中断:

  • 使用专用芯片,如8259A
  • 内部定时器做计数器用,计数值达到1时就触发中断,对条件进行判断,进行相应动作
  • 外部中断端口二极管并接输入,利用软件查询定位输入源

时钟

实验过程

流程图

开关控制LED灯 开关计数器

原理图

开关控制二极管亮灭 定时器中断

代码

文件:4.c

#include <stdio.h>
//#include <reg52.h>
#include <stc15f2k60s2.h>
sbit KEY_3 = P3^2;
sbit KEY_4 = P3^3;
//延时函数
void delay(int ms){
	int i,j;
	for(i=0;i<ms;i++){
		for (j=0;j<114;j++);
	}
}
//中断服务函数
	//8个LED点亮与熄灭循环交替
void LED_FN_1() interrupt 0{
	if(KEY_3==0){
	while(1){
  IT0=1; //外部中断0为下降沿触发
	IT1=1; //外部中断1为下降沿触发
	EX0=1; //开EX0中断
	EX1=1; //开EX1中断 
	EA = 1;   // 打开总中断
		
			P6=0xff;
			delay(200);
			P6=0x00;
			delay(200);
		
	 }
	}
}
	//前四个发光二极管与后4个发光二极管交替点亮
void LED_FN_2() interrupt 2{
	
	if(KEY_4==0){
	while(1){
	IT0=1; //外部中断0为下降沿触发
	IT1=1; //外部中断1为下降沿触发
	EX0=1; //开EX0中断
	EX1=1; //开EX1中断 
	EA = 1;   // 打开总中断
		P6=0xf0;
		delay(200);
		P6=0x0f;
		delay(200);
	 }
	}
}
//主函数
void main(void)
{
	unsigned int i = 0;
	IT0=1; //外部中断0为下降沿触发

	IT1=1; //外部中断1为下降沿触发

	EX0=1; //开EX0中断

	EX1=1; //开EX1中断 
	
	EA = 1;   // 打开总中断

	while(1)
	{
		//等待中断
	}
}

文件:5.c

#include <stdio.h>
//#include <reg52.h>
#include <stc15f2k60s2.h>
sbit KEY_3 = P3^2;
sbit KEY_4 = P3^3;
int count=0;
//段码表
unsigned char distab[16] = {
	0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};//0-F
//显示函数
void show_char(int input){
		P4=0xFF;
		P4=~distab[input];
}
//延时函数
void delay(int ms){
	int i,j;
	for(i=0;i<ms;i++){
		for (j=0;j<114;j++);
	}
}
//中断服务函数
	//8个LED点亮与熄灭循环交替
void LED_FN_1() interrupt 0{
	if(KEY_3==0){
		if(count>=9) count=0;
		count+=1;
			show_char(count);
			delay(2000);
			P6=0xff;
			delay(1000);
			P6=0x00;
			delay(1000);
	}
}
	//前四个发光二极管与后4个发光二极管交替点亮
void LED_FN_2() interrupt 2{
	if(KEY_4==0){
		count=0;
		show_char(count);
		delay(1000);
		//P6=0xf0;
		P6=0xf0;
		delay(200);
		P6=0x0f;
		delay(200);
	}
}
//主函数
void main(void)
{
	unsigned int i = 0;
	IT0=1; //外部中断0为下降沿触发

	IT1=1; //外部中断1为下降沿触发

	EX0=1; //开EX0中断

	EX1=1; //开EX1中断 
	
	EA = 1;   // 打开总中断

	while(1)
	{
		
		//等待中断
	}
}

标签:count,中断,void,51,二极管,delay,单片机,int,模块
From: https://www.cnblogs.com/qsbye/p/16644985.html

相关文章

  • Java模块化
    1.Java模块化概述1.1JDK8及以前开发模式每个java文件被明确地放入到一个包中java文件编译后的class文件,可以压缩为jar包,供别的程序调用一个程序可以使用类库,类库通......
  • 使用selenium自动化模块实现登录12306
    importtimefromselenium.webdriverimportChromefromselenium.webdriver.chrome.optionsimportOptionsfromselenium.webdriver.common.byimportByfromselenium.w......
  • 学习python-Day51
    今日学习内容静态文件及相关配置使用django步骤创建django项目并创建对应关系在urls.py中添加一组对应关系在APP的views.py中编写核心业务代码利用三板斧与前端做......
  • webpack css-loader模块化导致的antd样式不好用解决方案
    css-loader模块化会导致antd样式文件无效,解决的方式就是排除node_modules下的目标文件就可以如果你用的less就可以按以下方式来配置{test:/\.less$/,inclu......
  • 模块
    在编写程序的过程中把所有代码都写到一个脚本中肯定不便于维护和使用。python有一种方法可以把定义放在一个脚本里,并在其他脚本或解释器的交互式实例中使用他们。这样的......
  • P3514 [POI2011]LIZ-Lollipop
    给定长度为\(n\)的序列,里面的元素为1或2,求是否有一种方案,取出连续的一段,使得到的元素和等于给定的值,若可以则输出一种方案。多组询问,\(n,q\leq10^6\)。感觉有点水,典......
  • 河北稳控科技使用标准信号检测 VM振弦采集模块测量精度
    河北稳控科技使用标准信号检测VM振弦采集模块测量精度(一) (1)电源1.1VDD引脚电源必须使用LDO稳压或者低纹波线性电源,LDO推荐使用AM1117_3.3V芯片,测试时发现SPX......
  • 51JOB网站地区_平均薪资_数据分析与可视化
    importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Mapper;importorg.apache.hadoop.mapreduce.Reduc......
  • gradle多模块项目打包依赖拆分
    一、目录结构.├──boogle-common│  ├──build.gradle.kts│  └──src├──boogle-core│  ├──build.gradle.kts│  └──src├──......
  • Python-常用内置模块
    常用内置模块数学计算模块math函数说明ceil(x)返回大于或等于x的最小整数floor(x)返回小于或等于x的最大整数sqrt(x)返回x的平方根pow(x,y)返......