标题:
51单片机数码管倒计时程序问题
[打印本页]
作者:
张无忌
时间:
2020-12-8 13:36
标题:
51单片机数码管倒计时程序问题
//------------------------------------------------
效果应该是按下k2,开始倒计时,按k3加5
但是按k2为什么数码管只亮一下
/********************************/
/* 简单的定时器 */
/********************************/
#include <reg52.h>
//定义IO
sbit smg1 = P0^0;
sbit smg2 = P0^1;
sbit smg3 = P0^2;
sbit smg4 = P0^3;
sbit k1 = P3^3;
sbit k2 = P3^6;
sbit k3 = P3^7;
//宏定义
#define SMG_table P1
//定义全局变量
unsigned int djs_n = 5, flag2 = 0, flag1 = 0, flag3 = 0, i = 1,
k2_count = 0, key2_flag = 0;
unsigned char table[ ]={0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 ,0x82 , 0xf8 , 0x80 , 0x90 , 0x88 , 0x83 , 0xc6 , 0xa1 , 0x86 , 0x8e};
//函数申明
void init_time0();
void delay(int t); //4
void djs_display(); //5
void key_djs(); //6
//main-----------------------------------------------------
void main()
{
init_time0();
while (1)
{
if (k2 == 0)
{
k2_count++;
if (k2_count == 10)
{
key2_flag = 1;
}
}
if (k2 == 1)
{
if (key2_flag == 1)
{
key2_flag = 0;
flag1 = 1;
}
}
}
}
//
//开机数码管计时器--------------------------------------
//数码管显示
//定时器中断初始化
void init_time0()//3
{
TMOD =0x01;//定时器0工作方式1
TH0 = 0xf8;
TL0 = 0x30;
ET0=1; //定时器中断允许位
EA = 1;
TR0=1;
}
//延时函数/
void delay(int t)//4
{
int i;
while(t--)
{
for (i = 0; i < 110; i++);
}
}
void key_djs()//6
{
if (k3 == 0)
{
delay(10);
if (k3 == 1)
{
djs_n = djs_n + 5;
}
}
}
//定时器中断
void timer0()interrupt 1
{
static timer_count2 = 0;
if (flag1 == 1)
{
P2 = 0;
TH0 = 0xf8;
TL0 = 0x30;
timer_count2++;
if (timer_count2 == 500)
{
timer_count2 = 0;
djs_n--;
}
switch (i)
{
case 1:
smg4=1;SMG_table = table[djs_n / 1000];smg1 = 0;i++;break;
case 2:
smg1 = 1;SMG_table = table[djs_n / 100 % 10];smg2= 0;i++; break;
case 3:
smg2=1;SMG_table = table[djs_n / 10 % 10];smg3=0;i++;break;
case 4:
smg3=1;SMG_table = table[djs_n % 10];smg4=0;i=1;break;
}
if (djs_n == -1)
{
djs_n = 5;
}
}
}
//------------------------------------------------
效果应该是按下k2,开始倒计时,按k3加5
但是按k2为什么数码管只亮一下
作者:
robinsonlin
时间:
2020-12-8 15:06
你的k2_count使用完以后,置0了吗?
还有,djs_n定义的是unsigned, 如何能等于 -1 ?
作者:
suncat0504
时间:
2020-12-8 19:47
具体程序我没有去仔细分析。你的主函数中的按键检查处理中,没有追加防抖动处理。
由于程序执行周期很快,当你按下K2时,很可能在定时器中断处理还没有被执行之前,k2 == 0就已经被执行
很多次了, 于是key2_flag = 1了。当你松开K2时,下一次的循环处理时,key2_flag = 1的条件就已经满足了, 然后key2_flag = 0;,并且 flag1 = 1;了。
如果你希望能对K2的按下松开完成准确计数,必须追加防抖动处理。防抖时间间隔一般设为20ms。同时追加安检松开的检测处理,避免一次按下,k2_count++;被执行多次
作者:
jiahz2019
时间:
2020-12-8 20:14
#define SMG_table P1 这条定义个人认为有点多此一举,直接 P1=tab[****] 岂不是更简洁?
作者:
yewangege
时间:
2020-12-8 21:27
定义的问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1