无单片机数码管倒计时频率怎么设置
发布网友
发布时间:2023-06-02 06:15
我来回答
共2个回答
热心网友
时间:2024-10-28 01:18
1月6日在任何时候,按下复位按键,倒计时将暂停工作,并且恢复倒计时当前默认值99。如果长按复位按键,在数码管会切换到第2个闪烁窗口,用来设置速度档位...
热心网友
时间:2024-10-28 01:19
首先得任务就是数码管循环显示00-59,如果没有每隔一秒的话,可以设置一个for循环来控制数码管显示时间,也可以用DeBug功能来调试出大概一秒,但是这些不怎么准确,所以要使用定时器中断来控制一秒。而00-59的值则设置一个全局变量num来存放。数码管显示的时候,直接设置十位和个位对num分别求模和求余,然后在数码管上动态显示即可。
接着就是独立按键,这里我用的是类似于矩阵按键的检测方法,首先给一个高电平,然后根据按键后返回的值来判断哪个键按下,因为这里有四个按键,写在一起容易搞混,直接写四个函数,按下按键直接进入对应函数处理,因为K0可能会按到两次,对应K1和K2有不同的功能,那么可以设置一个标志位在K1和K2函数里判别K0按下几次,选择对应的功能。
按下K0之后,进入K0函数处理,设置一个全局变量flag,首先默认为0,按下一下为1,再次按下之后,为2,而按下K0之后要调整秒数,那么数码管就得暂停,也就是定时器暂停(TR0=0;)
按下K1和K2之后,首先先判断标志位flag的值,如果为0,也就是没有按过K0,那么直接跳出函数就好,如果为1,也就是K0按下一次,可以对个位处理,K1为加,即加1,K2为减,即减1,要注意的是,当num为00或者59是减1或者加1必须处理,因为00–59,不会出现超过59的数。如果为2,也就是K0按下两次,可以对十位处理,K1为加,即加10,K2为减,即减10,要注意的是,当num为00或者59是减10或者加10必须处理,因为00–59,不会出现超过59的数。
按下K3之后,表示按键完成,数码管接着显示秒数,即定时器启动(TR0=1;)
主函数里面不断的按键检测然后数码管显示即可。
项目代码
数码管循环显示00–59
//数码管显示函数
void Showsmg(u8 shi,u8 ge){ //十位 个位
//十位
LSA=1;LSB=1;LSC=1;
P0=smgan[shi];
Delay(1);
P0=0x00;
//个位
LSA=0;LSB=1;LSC=1;
P0=smgan[ge];
Delay(1);
P0=0x00;
}
//延时函数
void Delay(u16 i) //11.0592 1ms
{
while(i--){
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
//初始化定时器函数
void Init(){
t0=0;
num=0;
shi=0;
ge=0;
flag=0;
TMOD=0x01;
TH0=(65536-9174)/256; //10ms
TL0=(65536-9174)%256;
EA=1;
ET0=1;
TR0=1;
}
void main(){
Init();
while(1){
shi=num/10;
ge=num%10;
Showsmg(shi,ge);
}
}
void Timer0() interrupt 1{
TH0=(65536-9174)/256; //重置
TL0=(65536-9174)%256;
t0++;
if(t0==100){
t0=0;
num++;
if(num==60)
num=0;
}
}
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
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
独立按键的检测
//按键检测
void KeyDown(){
GPIO_KEY=0x0f; //独立按键端口
if(GPIO_KEY!=0x0f){
Delay(10);
if(GPIO_KEY!=0x0f){
GPIO_KEY=0x0f;
switch(GPIO_KEY){
case 0x0d : Key0();break; //k0
case 0x0e : Key1(flag);break; //k1
case 0x0b : Key2(flag);break; //k2
case 0x07 : Key3();break; //k3
}
}while(GPIO_KEY!=0x0f); //松手检测
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16