04 蓝桥杯---单片机的中断系统

我们为什么要学习中断系统呢?那是因为软件延时不精准的问题。为了精准延时必须使用中断系统。而这一部分稍微有了点难度。在写程序前,需要学习一些理论知识。首先我们要认识一下定时器:
在这里插入图片描述
在这里,我们需要注意的是,定时器不仅解决了定时精准的问题,而且还不占用硬件资源。在以后写程序时,会有很大的作用。既然定时器如此神奇,让我们看看他的原理和用法:
在这里插入图片描述
虽然有这么多,其实我们常用 的也就那么一部分。再来看看是怎么控制的吧!
在这里插入图片描述
在这里插入图片描述大家看到这里,会有一些疑惑,为什么会有第四个部分呢?不是只有三个部分吗?其实这是中断系统里的部分。学到这里就可以试着写程序了。大家看到这里肯定会有很多疑问,还是不懂。这里教大家一个技巧,打开STC仿真软件,在右边的上边会看到许多选项,选择定时器就会看到我们要的定时器程序了。
在这里插入图片描述void Timer0Init(void) //5微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
这个即是我们想的5毫秒定时器程序。接下来,我为大家逐行解释。

void Timer0Init(void) //5微秒@11.0592MHz 在这里我们只用了定时器的模式0,所以这也是固定写法。

AUXR |= 0x80; //定时器时钟1T模式 辅助寄存器AUXR首先是高四位只用T0X12的部分,所以高四位为1000,又由于定时器0 的速度是传统的8051的12倍,不分频。所以低四位为0000,。那么合起来为:1000 0000 转化为二进制为0x80.|按位相或的目的在与它不分频。为什么是1T呢?它指的是一个机器周期,也是晶振,相当于人的心脏。

TMOD &= 0xF0; //设置定时器模式 这里只用到了定时器0,也就是低四位的部分为:0000.而其他部分不用,则高四位为:1111。所以合起来为:1111 0000.按位相与的目的在于保持定时器0是开着的。

TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
设置好模式后,当然是要赋初值的。这一部分比较复杂,我们设置的是5毫秒的定时器,晶振的频率为11.0592MHZ,这里有些些计算公式可以计算高8位和低8位的值:
在这里插入图片描述
首先是要算N=?t=5ms tcy=11.0592MHZ 那么N=55296个数。
然后我需要解释一下什么叫16位自动重载模式:定时器0是16位的,它可以从0记到65536 。 比如记5秒:65536-50000=15536,就从15536开始装载,就开始了计数,记到65536后,就开始了自动重载。
最后X=65536-55296=10240,转化为二进制为2800,那么高8位是28,低八位是00.

TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
在这里插入图片描述
这样大家就一目了然了。至此解释完毕。

接下来,进入中断系统。
在这里插入图片描述
中断的内容其实挺好理解的,我就不再解释了。再来看看一个图会更明白一些,
在这里插入图片描述
在这里插入图片描述
其实他说这么多,我们只用定时器0中断。
在这里插入图片描述
首先是要初始化两个值,如下图:
在这里插入图片描述
在这里插入图片描述
然后需要单独写一个中断函数;void time0(void) interrupt 1,在里面写下具体的应用。

下面贴一个数码管9秒倒计时后第一个灯亮的程序:
#include<stc15f2k60s2.h>

#define uchar unsigned char

uchar code tab[]={0xc0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xbf,0XFF};

unsigned char SS=0;
unsigned char num=0;
void Timer0Init(void);

void main()
{
Timer0Init();
EA=1;//总中断
ET0=1;//定时器的中断,在此中断系统设置完成
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序
P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF; //数码管初始化程序

while(1)
{
	if(num==9)
	{
		P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
		P0=0XFE;//打开第一个灯
		P2=0XC0;P0=0X01;P2=0XFF;P0=0XFF;
	}
}

}

void Timer0Init(void) //5毫秒@11.0592MHz
{
// AUXR |= 0x80; //定时器时钟1T模式 AUXR =AUXR|0x80; 0010 1010 | 1000 0000 = 1010 1010
// TMOD &= 0xF0; //设置定时器模式 // TMOD = TMOD&0xF0; 1010 1010 & 1111 0000 = 1010 0000
AUXR=0X80;
TMOD=0XF0;//11.0592MHz 55296 5MS 65536-55296=10240
TL0 = 0x00; //设置定时初值
TH0 = 0x28; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

void time0(void) interrupt 1//进入中断系统的函数
{
SS++;//SS=SS+1;
if(SS200)
{
SS=0;
P0=tab[num];
num++;
if(num
10)num=0;
}
}

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值