微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于单片机的计时器与中断系统

关于单片机的计时器与中断系统

时间:11-23 来源:互联网 点击:

,当将其设置为1时中断优先级较高。
可以按照上图以此类推。
(这里,PT2是80C52的中断,不介绍)
优先级高的中断可以打断优先级低的中断而先执行,实现中断嵌套。那么同一优先级之间不能打断,如果多个同优先级中断同时申请,则按照自然优先级顺序执行中断,自然优先级如下:

中断源中断标志中断服务程序入口优先级顺序
外部中断0IE00003H
T0TF0000BH
外部中断1IE10013H
T1TF1001BH
串行口中断RI或者TI0023H

中断使用方法如下所示:
函数名interruptxusingy
例如:voidfun()interrupt0using1
那么,这里的x代表的是何种中断具体如下:
0:代表外部中断0
1:定时/计数器0
2:外部中断1
3:定时/计数器1
4:串行口中断
这里y代表寄存器组,可取0~7,也可以不写。
例如,外部中断0可以写:
interrupt0using1
外部中断1可写
interrupt2using1


下面看一个使用定时器和中断的数字时钟的例子:

#include

#defineucharunsignedchar

ucharsecond=1; //秒,全局变量
ucharcount=0; //中断次数
ucharcodetab[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};

voidDelay(inta){ //延迟
inti;
while(a--){
for(i=0;i<148;i++);
}
}

//次函数表明使用的是定时器,定时为50ms
voidTime0_Init()
{
TMOD=0x01;
//TMOD为00000001 表明定时器处于定时模式,
//且为16位定时器,GATE=0,配合下面TR0=1,则启动寄存器
TH0=0x4c;
//设定初值,即设定定时时间
TL0=0x00;
//设定初值,即设定定时时间
IE =0x82;
//0x82二进制为10000010,即RA=1,ET0=1,
//设定允许响应总中断和T0中断
TR0=1;
//设置TCON中TR0=1,允许T0工作
}

voidTime0_Int()interrupt1 //中断处理
{
TH0=0x4c;
//重新设定初值
TL0=0x00;
count++;
if(count==20){
count=0;
second++;
//时间秒数加1
}
}

ucharkeyscan(){//4×4键盘扫描检测
ucharhang[4]={0xfe,0xfd,0xfb,0xf7};
uchartemp;
inti,j;
for(i=0;i<4;i++){
P1=hang[i];
temp=0x10;
for(j=0;j<4;j++){
if(!(temp&P1)){
returni*4+j;
}
temp<=1;
}
}
return0;
}

ucharshow_hour(ucharh){ //显示小时
ucharx=h/24;
uchary=h$;
P2=0;
P0=tab[y/10]-0x80;
Delay(1);
P2=1;
P0=tab[y];
returnx;
}

ucharshow_minute(ucharm){ //显示分钟
ucharx=m/60;
uchary=m`;
P2=3;
P0=tab[y/10]-0x80;
Delay(1);
P2=4;
P0=tab[y];
returnx;
}

ucharshow_second(uchars){ //显示秒
ucharx=s/60;
uchary=s`;
P2=6;
P0=tab[y/10]-0x80;
Delay(1);
P2=7;
P0=tab[y];
returnx;
}

voidmain()
{
ucharhour=1,minute=1;
ucharh,m,s;
uchark,mk=0;
Time0_Init();
while(1){
Delay(1);
if(mk==0){
s=show_second(second);
second%=60;
mk++;
}
elseif(mk==1){
minute+=s;
m=show_minute(minute);
minute%=60;
mk++;
}else{
hour+=m;
h=show_hour(hour);
hour%=24;
mk++;
mk=mk%3;
}
k=keyscan();//检测按键
if(12==k||13==k||14==k){
Delay(50);
k=keyscan(); //软件消抖
if(12==k||13==k||14==k){
if(12==k)hour++;
elseif(13==k)minute++;
elseif(14==k)second++;
}
}
}
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top