- 80C51单片机
- 点亮第一个发光二极管,及流水灯案例
- 数码管显示及封装与消隐
- 中断、定时器
文章目录
- 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.独立键盘、矩阵键盘检测



