在KEIL软件中建立51单片机工程,要求每隔500ms点亮上题中1个led灯,依次完成8个led灯点亮过程

在KEIL软件中建立51单片机工程,要求每隔500ms点亮上题中1个led灯,依次完成8个led灯点亮过程,第1张

定时器/计数器代替外部中断

因为单片机的定时器/计数器本质上就是个加一计数器,当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灯点亮过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8839261.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存