关于单片机的计时器与中断系统
时间:11-23
来源:互联网
点击:
,当将其设置为1时中断优先级较高。
可以按照上图以此类推。
(这里,PT2是80C52的中断,不介绍)
优先级高的中断可以打断优先级低的中断而先执行,实现中断嵌套。那么同一优先级之间不能打断,如果多个同优先级中断同时申请,则按照自然优先级顺序执行中断,自然优先级如下:
中断源 | 中断标志 | 中断服务程序入口 | 优先级顺序 |
外部中断0 | IE0 | 0003H | 高 |
T0 | TF0 | 000BH | ↓ |
外部中断1 | IE1 | 0013H | ↓ |
T1 | TF1 | 001BH | ↓ |
串行口中断 | RI或者TI | 0023H | 低 |
中断使用方法如下所示:
函数名
例如:void
那么,这里的x代表的是何种中断具体如下:
0:代表外部中断0
1:定时/计数器0
2:外部中断1
3:定时/计数器1
4:串行口中断
这里y代表寄存器组,可取0~7,也可以不写。
例如,外部中断0可以写:
interrupt
外部中断1可写
interrupt
下面看一个使用定时器和中断的数字时钟的例子:
#include
#define
uchar
uchar
uchar
void
int
while(a--){
for(i=0;i<148;i++);
}
}
//次函数表明使用的是定时器,定时为50ms
void
{
TMOD
//TMOD为
//且为16位定时器,GATE=0,配合下面TR0=1,则启动寄存器
TH0
//设定初值,即设定定时时间
TL0
//设定初值,即设定定时时间
IE
//0x82二进制为1000
//设定允许响应总中断和T0中断
TR0
//设置TCON中TR0=1,允许T0工作
}
void
{
TH0
//重新设定初值
TL0
count++;
if(count==20){
count=0;
second++;
//时间秒数加1
}
}
uchar
uchar
uchar
int
for(i=0;i<4;i++){
P1=hang[i];
temp=0x10;
for(j=0;j<4;j++){
if(!(temp&P1)){
return
}
temp<=1;
}
}
return
}
uchar
uchar
uchar
P2=0;
P0=tab[y/10]-0x80;
Delay(1);
P2=1;
P0=tab[y];
return
}
uchar
uchar
uchar
P2=3;
P0=tab[y/10]-0x80;
Delay(1);
P2=4;
P0=tab[y];
return
}
uchar
uchar
uchar
P2=6;
P0=tab[y/10]-0x80;
Delay(1);
P2=7;
P0=tab[y];
return
}
void
{
uchar
uchar
uchar
Time0_Init();
while(1){
Delay(1);
if(mk==0){
s=show_second(second);
second%=60;
mk++;
}
else
minute+=s;
m=show_minute(minute);
minute%=60;
mk++;
}else{
hour+=m;
h=show_hour(hour);
hour%=24;
mk++;
mk=mk%3;
}
k=
if(12==k||13==k||14==k){
Delay(50);
k=
if(12==k||13==k||14==k){
if(12==k)hour++;
else
else
}
}
}
}
单片机计时器中断系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)