51单片机启用2个定时制作流水灯+Proteus仿真

51单片机启用2个定时制作流水灯+Proteus仿真


  • Proteus
    在这里插入图片描述

程序代码

采用2个定时器,工作方式都是1

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "reg52.h"

static unsigned char value = 0x01,value1 = 0x01; //给P1赋值 对应 0000 0001
static unsigned char i=0,j=0,n=0,m=0;
static unsigned char flag =1,flag1 = 1; //左右移动标志
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\*函数名:Timer0\_Init
\*功能:定时器0初始化
\*参数:无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Timer\_Init()
{
EA=1;//打开总中断
ET0=1;//打开定时器0中断允许
ET1=1;//打开定时器1中断允许
//TMOD|=0X01;//选择为定时器0模式,工作方式1,16位定时器,仅用TR0打开启动。
TMOD = 0x11; //同时设置T0和T1为工作模式1
TH0=(65536-50000)/256; //高四位寄存器的值; //给定时器赋初值,定时50ms
TL0=(65536-50000)%256; //低四位寄存器的值;
TH1=(65536-50000)/256; //高四位寄存器的值; //给定时器赋初值,定时50ms
TL1=(65536-50000)%256; //低四位寄存器的值;
// TH0=0X3C;
// TL0=0XB0;


TR0=1;//打开定时器0
TR1=1;//打开定时器1
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\*函数名:main
\*功能:函数入口
\*参数:无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void main()
{
Timer\_Init();
P0 = value;
P2 =value1;
while(1)
{

}
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名: Timer0
\* 函数功能: 定时器0中断服务函数
\* 参数:无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Timer0() interrupt 1
{
static int i = 0; //控制循环左右移动
static int j = 0; //控制左右移动时间


j += 1; //每次进入中断加1

TH0=(65536-50000)/256; //高四位寄存器的值;
TL0=(65536-50000)%256; //低四位寄存器的值;
// TH0=0X3C; //手动给定时器重新赋初值,定时50ms
// TL0=0XB0;

if(j>=40)
{//2秒移位一次50msX40

if(i>=0 && i < 7 && flag ==1)
{
i++;
value = value<<1; //0000 0001 << = 0000 0010
}
else if(i==7)
{
flag = 0;
}
if(i <= 7 && i>0 && flag == 0)
{
i--;
value = value>>1; //0000 0001 >> = 0000 0010
}
else if(i==0)
{
i++;
value = value<<1; //若此处不移则led0会在返回时多亮一个0.25s
flag = 1;
}

P0 = value;
j=0; //时间计数清零
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名: Timer1
\* 函数功能: 定时器1中断服务函数
\* 参数:无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void Timer1() interrupt 3
{
m += 1; //每次进入中断加1
// TH1=0X3C; //手动给定时器重新赋初值,定时50ms
// TL1=0XB0;
if(m>=20)
{

if(n>=0 && n < 7 && flag1 ==1)
{
n++;
value1 = value1<<1; //0000 0001 << = 0000 0010
}
else if(n==7)
{
flag1 = 0;
}
if(n <= 7 && n>0 && flag1 == 0)
{
n--;
value1 = value1>>1; //0000 0001 >> = 0000 0010
}
else if(n==0)
{
n++;
value1 = value1<<1; //若此处不移则led0会在返回时多亮一个0.25s
flag1 = 1;
}
P2 = value1;
m=0; //时间计数清零
}
TH1=(65536-50000)/256; //高四位寄存器的值;
TL1=(65536-50000)%256; //低四位寄存器的值;
}

仿真资源和程序代码

1
2
3
链接:https://pan.baidu.com/s/132KX6Emc2kwI6mYstEwTVQ 
提取码:jjf3