栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

80C51单片机:4.中断、定时器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

80C51单片机:4.中断、定时器

80C51单片机系列
  1. 80C51单片机
  2. 点亮第一个发光二极管,及流水灯案例
  3. 数码管显示及封装与消隐
  4. 中断、定时器

文章目录
  • 80C51单片机系列
  • 前言
  • 中断
  • 定时器
  • 下一章:


前言

什么是中断?

中断是指CPU在执行当前程序时系统出现了某种状况,使得CPU必须停止当前程序,而去执行另一段程序来处理的出现的紧急事务,处理结束后CPU再返回到原先暂停的程序继续执行,这个过程就称为中断。

中断的作用

使得计算机系统具备应对对处理突发事件的能力,使其能及时响应紧急事件。

提高处理器效率,如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低。


中断

这里我们写一个简单的中断程序。

要求实现效果:写一个死循环,每循环50次就触发中断一次,让二极管全部发光,计数 + 1 并且显示计数。

这里使用上一篇中封装的数码管显示文件显示计数。(这就是封装的好处,写一遍后面用到直接包含头文件)

项目目录如下:

这里就不展示数码管显示部分的代码了,上一章中已经封装过了,不知道的可以去看上一章。

main文件

#include

// 包含位移头文件
#include
// 包含封装的数码管显示头文件
#include"num_led.h"

// 二极管串口
#define GPIO_LED P2

typedef unsigned int uint;
typedef unsigned char uchar;

void Show_Delayms(unsigned char c);

sbit int0 = P3^2;

void main()
{
	uint i,num=0;
	
	EA = 1;//开启总中断
	EX0 = 1;//开启外部中断0
	//默认电平触发
	
	//设置为跳变沿触发
	IT0=1;	//方式1
	//TCON = 0x01;  //方式2直接操作寄存器

	for(i=1;;i++)
	{
		Num_show(num);
		
		if(i%50 == 0)
		{
			num += 1;
			
			//电平触发中断
			int0 = 0;
			Show_Delayms(1);//二极管灯亮时间
			
			//低电平触发时做取消中断操作
			//跳变沿触发时做高电平返回IO口,下次触发0
			int0 = 1;
			GPIO_LED = 0xff;
			
		}
	}
}

//中断处理程序
void exter0() interrupt 0 // 使用外部中断0
{
	GPIO_LED = 0x00;//让二极管全亮
}

//显示延时函数
void Show_Delayms(unsigned char c)
{
	unsigned char a;
	for(;c>0;c--)
		for(a=200;a>0;a--);
}

最终实现效果为:数码管显示计数每加 1 一次,二极管全部发光一次。


定时器

中断已经学会了,那我们用中断来再写一个定时器。

定时器 main 文件

#include

// 包含位移头文件
#include
// 包含封装的数码管显示头文件
#include"num_led.h"

// 二极管串口
#define GPIO_LED P2

typedef unsigned int uint;
typedef unsigned char uchar;
	
uchar tt;

void main()
{
	uint num=0;
	
	//设置定时器0为工作方式1
	TMOD = 0x01;
	
	//计算并赋值初值
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	
	EA = 1;//开启总中断
	ET0 = 1;//开启定时器0中断
	
	TR0 = 1;//启动定时器0
	
	
	while(1)
	{
		Num_show(num);
		if(tt == 20) // 中断20次 为 1 秒
		{
			tt=0;
			num += 1;
			if(num == 1){
				GPIO_LED = 0xfe;
			}else{
				GPIO_LED = _crol_(GPIO_LED,1);
			}
		}
	}
	
}

//中断处理程序,使用外部中断 1		
void exter0() interrupt 1 //选择寄存器组using 1
{
	// 中断一次50毫秒
	TH0 = (65536-50000)/256;
	TL0 = (65536-50000)%256;
	tt++;
}


下一章:

下一章:5.独立键盘、矩阵键盘检测

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号