单片机中断相关的理解

一、中断

编写一个中断最重要的是编写中断的初始化程序,中断服务程序和了解中断的类型/触发机制

二、编写中断程序

1.外部中断INT0/INT1

原理图

触发机制:通过给开发板引脚用橘色线接地,直接用手插拔,在原理图上,INT0 INT1对应P32 P33两个引脚,从芯片上的文字即可看出
在这里插入图片描述
由于触发机制为外部线路插拔,所以手册中提到不需要软件置位,而是硬件自动置位,免去了设置的烦恼
在这里插入图片描述
在这里插入图片描述

初始化

查询手册中的中断寄存器可知

其中IE的B7位,B2位,B0位和外部中断INT1 INT0有关,需要设置
TCON的B2位,B0位和外部中断INT1 INT0有关,需要设置

初始化代码如下:

	IE|=(1<<7);中断总开关
	TCON&=~(1<<0);T0外部中断开关
	TCON&=~(1<<2);T1外部中断开关
	IE|=(1<<2)|(1<<0);触发方式

中断服务函数如下:

void it_0() interrupt 0
{
	P2=~(1<<0);	如果P32引脚用橘色线连接到地,第一个led亮
}

void it_1() interrupt 2
{
	P2=~(1<<1);如果P33引脚用橘色线连接到地,第二个led亮
}

此时理解中断相关概念:
中断:一个程序运行时接收到中断源发出的中断请求,CPU允许这个中断请求的紧急事件先执行,执行完了以后又回到现场继续没有被执行完的工作。
中断源:能够向CPU发出中断请求的请求源。
中断执行流程:
/中断源发出中断请求;
/CPU查看中断是否被允许,这个中断是否被屏蔽;
/CPU查看中断优先级;
/CPU保护现场;
/执行中断服务函数;
/CPU恢复现场。
中断向量表:中断服务函数的指针数组。

在这里插入图片描述
这里的函数定义方式就是中断服务函数的头定义方式,进入中断后的功能需要自己编写,如笔者编写的void it_0() interrupt 0;这个定义中只有函数名可以更改,其它部分都不能更改。

2.定时器/计数器T0

原理图

触发机制:通过软件置位打开寄存器开关使用定时器/计数器,在原理图上,T0 T1对应P34 P35两个引脚,从芯片上的文字即可看出
在这里插入图片描述

初始化

查询手册中的寄存器可知

其中IE的B7位,B1位和T0有关,需要设置

TCON的B4位和中断T0有关,需要设置,B5硬件自动置位,不需要手动置位
B0位需要设置T0中断触发方式,下降沿触发代表一次跳变触发一次,低电平触发代表只要处在这个电平就一直会触发

·触发条件:
电平触发:
观察下图方波,如果电平触发,代表只要IT0处于低电平/高电平就会持续触发中断,即就是低电平触发时IT0值为0则一直触发,高电平触发时IT0值为1则一直触发
下降/上升沿触发:
下降/上升沿触发代表IT0值发生跳变的拿一下会发生中断,跳变次数为触发中断次数,即就是IT0值从1变成0的瞬间下降沿触发,IT0值从0变成1的瞬间上升沿触发
在这里插入图片描述

TMOD的B3位,B1位,B0位和TH0有关,需要设置
这里有用的模式为16位定时器模式和8位自动重装定时器模式

关于51单片机定时器模式的选择,参考的原文链接:http://news.eeworld.com.cn/mcu/2015/0826
方式0:13位定时计数方式,最大计数值为2^13=8192,定时8192个机器周期。此方式已经不再用了,是为了和以前的单片机兼容,学初者不用掌握。
方式1:16位定时计数方式,最大计数值为2^16=65536,定时65536个机器周期。此方式可实现最大的定时时间和最大计数次数。是最常用方式之一。
方式2:8位自动重装计数方式,最大计数值为2^8=256,定时256个机器周期。此方式工作时定时或计数到了不用重装初值,精度较高。另外在串口通讯时常用此方式。是最常用方式之一。
方式3:特殊工作方式。将定时器0分成两个8位功能不全的定时计数器,要占用T1部分功能。也不常用。
在这里插入图片描述
选择模式是为了给TH0,TL0设置初始值,以及确定是否需要给她们手动重装,模式1需要手动重装
在这里插入图片描述
模式2不需要手动重装

·TH0 TL0计算方法:
在这里插入图片描述
先看手册里面的计算逻辑
参考文章https://blog.youkuaiyun.com/gordor1122/article/details/116485417
时钟周期=1/晶振频率
机器周期=12*时钟周期
一个机器周期=12/晶振频率
这里的12,是单片机的分频:
参考文章https://blog.youkuaiyun.com/weixin_51370842
1T 模式 (不分频) —— 1个系统基本时钟,执行一个动作
12T模式(12分频) —— 12个系统基本时钟,执行一个动作
51单片机为12分频,晶振频率使用12MHZ,因此一个机器周期为1μs
在这里插入图片描述
先看手册里面的计算逻辑
计算定时器计时次数,先确定定时时间500ms,机器周期1μs
定时器计时次数=500ms/1μs=500,000
由于超出了2^16=65535的大小,将其拆分为5000x100
将65535-5000装入TH0 TL0中,高8位装入TH0 低8位装入TL0

初始化代码如下:

	TMOD&=~(1<<3);
	TMOD|=(1<<1);
	TMOD&=~(1<<0);
	TH0=60535>>8;
	TL0=60535;
	IE|=(1<<1)|(1<<7);	
	TCON|=(1<<4);

定时器中断函数如下:

void timer() interrupt 1
{
	++cnt; 
	if(cnt>=100)
	{
		P2^=(1<<7);
		cnt=0;
		TH0=60535>>8; //手动重装
		TL0=60535;
	}
}

相对应的,8位自动重装就不需要在触发中断后再对TH0 TL0赋值,硬件会自动重装
如果在计算计时次数时加入占空比,时间使用PWM频率,那么需要了解一些概念:
参考文章https://blog.youkuaiyun.com/as480133937
占空比:高电平在一个时钟周期所占的比率
PWM:脉冲宽度调制,可以产生指定频率的方波
PWM的频率:1s内信号的周期数(单位:HZ)
PWM的周期=1/PWM的频率
·假设信号的占空比为50%,PWM500HZ
PWM的周期=1/500HZ=2ms
2msx50%=1ms
1ms/1μs=1000
最后得出计时次数1000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值