久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2766|回復: 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:451718 發表于 2020-12-8 15:06 | 只看該作者
你的k2_count使用完以后,置0了嗎?
還有,djs_n定義的是unsigned, 如何能等于 -1 ?
回復

使用道具 舉報

板凳
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:656213 發表于 2020-12-8 20:14 | 只看該作者
#define SMG_table P1   這條定義個人認為有點多此一舉,直接 P1=tab[****] 豈不是更簡潔?
回復

使用道具 舉報

5#
ID:857089 發表于 2020-12-8 21:27 | 只看該作者
定義的問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九久久 | 亚洲自拍偷拍视频 | 国产精品视频一二三区 | 91精品在线播放 | 99re视频在线观看 | 国产精品久久久久久久久久免费看 | 盗摄精品av一区二区三区 | com.国产| 在线免费观看a级片 | 成人av一区| 视频一区在线播放 | 久久久久久高潮国产精品视 | 成人久久18免费 | 成人在线免费视频观看 | 中文字幕视频在线观看 | 国产在线麻豆精品入口 | 国产精品1区2区 | 久久鲁视频 | 国产一区二区三区高清 | 精品亚洲二区 | www97影院 | 日本久草 | 日韩av一区二区在线 | 精品国产一区二区三区性色 | 久久久美女 | 国产精品一区二区久久久久 | 国产在线观看一区 | 精品综合 | 欧美日韩高清在线观看 | 久久精品久久久久久 | 国产一级片免费看 | 99久久久国产精品免费消防器 | 日韩中文字幕免费在线 | 一区二区在线 | 在线观看亚洲专区 | 91人人看 | 日本一区二区三区在线观看 | 91干b| 国产欧美在线一区二区 | 在线免费观看日本 | av在线三级 |