51单片机学习知识请看:[https://pan.baidu.com/s/1Z16EDr5AyUfDpsbtRw-fLQ?pwd=kzs1]
提取码:kzs1
使用的软件平台:Keil和Proteus。
文章目录
一、中断与定时器简介
1.中断
中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并快速响应与及时处理。当中断请求源发出中断请求时,如中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
2.定时器
C51单片机的定时器原理是通过内部的时钟信号对寄存器进行自动加一操作,当达到设定值时触发溢出中断,从而实现定时功能。具体来说,C51单片机内部有一个由晶振决定的时钟周期,这个时钟周期通常由外部晶振频率决定,例如使用12MHz晶振,其时钟周期为1/12MHz。在这个基础上,一个机器周期通常包含12个时钟周期,因此如果晶振是12MHz的话,一个机器周期就是1μs。51单片机拥有两组定时器/计数器(定时器0和定时器1),它们是独立于CPU运行的,也就是说它们的执行不需要CPU的直接参与,这样设计是为了提高单片机的效率,让CPU去处理更加复杂的事情。在定时模式下,每当经过一个机器周期,定时器的计数寄存器(THx和TLx)就会自动加1。当计数器从设定的初值开始计数到达最大值后,会触发一个溢出,此时相应的溢出中断标志位会被置位,如果使能了中断,则会向CPU发出中断请求。用户可以通过设置这些寄存器的初值来控制定时的时间长度,以及通过编程中断服务程序来定义定时器溢出后要执行的操作。
二、实现
1.LED中断实验
1.1单一外中断
具体效果:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。
电路图:
KeilC语言代码:
##include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延时函数Delay( ),i形式参数,不能赋初值
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<333;j++) //晶振为12MHz,j选择与晶振频率有关
{
;} //空函数
}
void main( ) //主函数
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
IT0=1; //选择外部中断0为跳沿触发方式
while(1) //循环
{
P1=0;} // P1口的8只LED全亮
}
void int0( ) interrupt 0 using 0 //外中断0的中断服务函数
{
uchar m;
EX0=0; //禁止外部中断0中断
for(m=0;m<5;m++) //交替闪烁5次
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(400) ; //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(400); //延时
EX0=1; //中断返回前,打开外部中断0中断
}
Proteus仿真效果:
中断1
1.2两个外中断
具体效果:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。
电路图:
代码实现:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)