找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2728|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机数码管倒计时程序问题

[复制链接]
跳转到指定楼层
楼主
ID:855076 发表于 2020-12-8 13:36 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
//------------------------------------------------
效果应该是按下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为什么数码管只亮一下

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

5#
ID:857089 发表于 2020-12-8 21:27 | 只看该作者
定义的问题
回复

使用道具 举报

地板
ID:656213 发表于 2020-12-8 20:14 | 只看该作者
#define SMG_table P1   这条定义个人认为有点多此一举,直接 P1=tab[****] 岂不是更简洁?
回复

使用道具 举报

板凳
ID:517466 发表于 2020-12-8 19:47 | 只看该作者
具体程序我没有去仔细分析。你的主函数中的按键检查处理中,没有追加防抖动处理。
由于程序执行周期很快,当你按下K2时,很可能在定时器中断处理还没有被执行之前,k2 == 0就已经被执行
很多次了, 于是key2_flag = 1了。当你松开K2时,下一次的循环处理时,key2_flag = 1的条件就已经满足了, 然后key2_flag = 0;,并且 flag1 = 1;了。
如果你希望能对K2的按下松开完成准确计数,必须追加防抖动处理。防抖时间间隔一般设为20ms。同时追加安检松开的检测处理,避免一次按下,k2_count++;被执行多次

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:451718 发表于 2020-12-8 15:06 | 只看该作者
你的k2_count使用完以后,置0了吗?
还有,djs_n定义的是unsigned, 如何能等于 -1 ?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表