因为单片机的定时器/计数器本质上就是个加一计数器,当T0或者T1溢出的时候会请求中断。所以根据这个原理,先把定时器/计数器设置成计数模式,初始值为满值,把外部中断源输入到P34或者P35引脚,这样每输入一个下降沿,都将TF0/TF1置1,中断成立。
实现代码:
#include <reg51h>
unsigned char key;
sbit K1=P3^2;
sbit K2=P3^4;
sbit K3=P3^3;
sbit K4=P3^5;
void one(){}
void two(){}
void three(){}
void four(){}
void main()
{
TMOD=0xee;
TH0=0xff;
TL0=0xff;
TH1=0xff;
TL1=0xff;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
IT0=0;
EX0=1;
IT1=0;
EX1=1;
EA=1;
while(1)
{
switch(key)
{
case 1:one();break;
case 2:two();break;
case 3:three();break;
case 4:four();break;
}
}
}
void Int0() interrupt 0
{
if(K1==0)
{
while(K1==0);
key=1;
}
}
void t0() interrupt 1
{
if(K2==0)
{
while(K2==0);
key=2;
}
}
void Int1() interrupt 2
{
if(K3==0)
{
while(K3==0);
key=3;
}
}
void t1() interrupt 3
{
if(K4==0)
{
while(K4==0);
key=4;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
我测试了程序,程序是没有错误,进入不了中断是因为你的定时器1你设置的为
0xfd很快就置中断标志位TF1,而有没有清除中断标志位,导致timer0不能进入中断。 你也可以再加入一个void timer1(void) interrupt 3 {}也可以进入timer0中断了。
把ET1=1;去掉就可以进入中断了。
我记得做波特率不用把中断打开的,只要计数就可以了。
#include <reg52h>
//点亮八位共阳
unsigned char led=0xfe; //8个bit位的数
unsigned int counter=0;
void time_init()
{
TMOD=0x01;//定时器0,工作模式1,16位定时器
TH0=0xb4;
TL0=0x00; //定时器初始值46080,定时50ms;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//运行定时器
}
void main()
{
time_init();
for(;;)
{
P1=led;
}
}
void time_inter() interrupt 1
{
IT0=1;//清除中断标志
TH0=0xb4;
TL0=0x00;
counter++;
if(counter==10) //500ms延时
{
counter=0;
led=led<<1;//点亮下一个灯
}
}
//点亮八位共阴
/
unsigned char led=0x01,led1=0x01; //8个bit位的数
unsigned int counter=0;
void time_init()
{
TMOD=0x01;//定时器0,工作模式1,16位定时器
TH0=0xb4;
TL0=0x00; //定时器初始值46080,定时50ms;
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//运行定时器
}
void main()
{
time_init();
for(;;)
{
P1=led;
}
}
void time_inter() interrupt 1
{
IT0=1;//清除中断标志
TH0=0xb4;
TL0=0x00;
counter++;
if(counter==10) //500ms延时
{
counter=0;
led1=led;
led1=led1<<1;//点亮下一个灯
led=led|led1;
}
}
/
个人自写,亲试有效。欢迎交流
TMOD=|0x20;//定时器1工作方式2,8位自动重装,TH1是重装值,TL1是初值 //初始化外部中断
TH1=0x00; //重载值 2^8=256 us
TL1=0x00; //初始化值
ET1=1; //开中断
TR1=1; //开定时器1
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P32) //初始化定时器
EX0 = 1; //使能外部中断
EA = 1; //开总中断
以上就是关于单片机中断两次怎么实现连接全部的内容,包括:单片机中断两次怎么实现连接、51单片机定时器问题、在KEIL软件中建立51单片机工程,要求每隔500ms点亮上题中1个led灯,依次完成8个led灯点亮过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)