006-中断
中断
引例:烧水,电视,电话,在某个场景下同时发生,此刻人作为处理这些问题的唯一主体,就需要有一个轻重缓急,按照紧迫程度(优先级)去解决这些问题。
中断使能寄存器——IE的控制位(8位控制):
- 第7位 EA——总中断, 为1时打开(总开关)
- 第1位 ET0——定时器0中断使能,为1时打开(相当于闹钟开关)
注意:
- 中断函数不需要调用,达到中断条件自动进入。
- 刷新时间固定1ms,不会受到计算过程的影响。
- 中断函数定义时,格式为:
void InterruptTime0() interrupt 1
其中的1表示中断函数编号,其计算方式为:x*8+3=?,?为中断向量地址的十进制值,例如本例采用T0中断,对应地址为0x000B=11,所以x=1。
- 中断优先级分为固有优先级和抢占优先级:
固有优先级:几个中断同时发生时,先处理优先级默认高的程序,处理过程中对其他一切中断不予响应。
抢占优先级:同时发生中断,优先级高的西先响应,在处理中断过程中,出现更高级别优先级,则先执行更改级别优先级再回来处理当前优先级。
实验一:我们对【005-数码管的使用】中方案三的程序进行改动,使用中断函数以解决抖动问题。
#include<reg52.h> //头文件
sbit LS1 = P2^2; //74LS138控制端
sbit LS2 = P2^3;
sbit LS3 = P2^4;
unsigned char shu_ma_guan[16] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //0~F的对应值
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//全局变量
unsigned char LedBuff[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //定义8个数码管初始状态均为00000000,即都不显示
unsigned char flag1s = 0; //一秒到达标志位,为1即表示到达一秒
unsigned int cnt = 0;
unsigned char i = 0;
void main() //主函数
{
unsigned long sec = 0;
TMOD = 0x01; //定时器定义,晶振12Mhz,每次1ms
TH0 = 0xFC;
TL0 = 0x18;
TR0 = 1; //打开定时器
EA = 1; //打开中断总开关
ET0 = 1; //打开定时器0中断开关
while(1)
{
if(flag1s == 1 ) //判断是否到一秒
{
flag1s = 0; //时间到达一秒,标志复位
sec++; //时间到达一秒自动加1
LedBuff[0] = shu_ma_guan[sec%10]; //确定数码管在某个时间时各个位的显示数字
LedBuff[1] = shu_ma_guan[sec/10%10];
LedBuff[2] = shu_ma_guan[sec/100%10];
LedBuff[3] = shu_ma_guan[sec/1000%10];
LedBuff[4] = shu_ma_guan[sec/10000%10];
LedBuff[5] = shu_ma_guan[sec/100000%10];
LedBuff[6] = shu_ma_guan[sec/1000000%10];
LedBuff[7] = shu_ma_guan[sec/10000000%10];
}
}
}
//中断函数
void InterruptTime0() interrupt 1 //函数名中在:Interrupt——中断函数,Time0——定时器0中断
//不要忘记interrupt关键字及1(1的计算看文章开头)
{
TH0 = 0xFC; /定义定时器
TL0 = 0x18; //注意:右移TF0溢出时,进入定时器中断硬件自动清零,不在需要软件清零,省略语句TF0=0;
cnt++; //TFO溢出一次,自动加1
if(cnt == 1000) /时间到达一秒
{
cnt = 0; //复位,从新计次
flag1s = 1; //1秒到达标志置1
}
P0 = 0x00; //消除鬼影,使得数码管的所有段全灭
switch(i) //数码管刷新
{
case 0: LS3=0;LS2=0;LS1=0;i++;P0=LedBuff[0];break;
case 1: LS3=0;LS2=0;LS1=1;i++;P0=LedBuff[1];break;
case 2: LS3=0;LS2=1;LS1=0;i++;P0=LedBuff[2];break;
case 3: LS3=0;LS2=1;LS1=1;i++;P0=LedBuff[3];break;
case 4: LS3=1;LS2=0;LS1=0;i++;P0=LedBuff[4];break;
case 5: LS3=1;LS2=0;LS1=1;i++;P0=LedBuff[5];break;
case 6: LS3=1;LS2=1;LS1=0;i++;P0=LedBuff[6];break;
case 7: LS3=1;LS2=1;LS1=1;i=0;P0=LedBuff[7];break;
default: break;
}
}
本文来自博客园,作者:shihao_Yang,转载请注明原文链接:https://www.cnblogs.com/Yang-shihao/p/14353178.html