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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 215|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)搶答器程序 之前發(fā)過一版但是這版更加的精細(xì) 我增加了按鍵和定時器自動走

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1152291 發(fā)表于 2025-6-25 11:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
書寫的51程序我之前發(fā)過一版但是這版更加的精細(xì) 我增加了按鍵和定時器自動走
#include <reg52.h>

//------------------------- 引腳定義 --------------------------//
sbit BEEP = P2^0;        //蜂鳴器控制引腳,高電平有效

sbit LED1 = P2^3;        //LED1,控制引腳,低電平有效
sbit LED2 = P2^2;        //LED2,控制引腳,低電平有效
sbit LED3 = P2^1;        //LED3,控制引腳,低電平有效

//數(shù)碼管引腳定義
#define duanPore        P0                //數(shù)碼管段控制端口,高電平有效
sbit DIG1 = P2^4;                        //數(shù)碼管第1位位選控制端口,低電平有效
sbit DIG2 = P2^5;                        //數(shù)碼管第2位位選控制端口,低電平有效
sbit DIG3 = P2^6;                        //數(shù)碼管第3位位選控制端口,低電平有效
sbit DIG4 = P2^7;                        //數(shù)碼管第4位位選控制端口,低電平有效

//按鍵引腳定義
sbit KEY1 = P1^0;                //1號選手
sbit KEY2 = P1^1;                //2號選手
sbit KEY3 = P1^2;                //3號選手
sbit KEY4 = P1^3;                //4號選手
sbit KEY5 = P1^4;                //5號選手
sbit KEY6 = P1^5;                //6號選手
sbit KEY7 = P3^2;                //主持人鍵
sbit KEY8 = P3^3;                //設(shè)置鍵
sbit KEY9 = P1^6;                //增加鍵
sbit KEY10 =P1^7;                //減少鍵
#define uchar unsigned char
#define uint unsigned int



//---------------------- 全局變量定義 --------------------//

//數(shù)碼管段碼表,適用于共陰數(shù)碼管
unsigned char code tab_duan[18] =
{
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,        //0~9
        0x77,0x7c,0x39,0x5e,0x79,0x71,                //A~F
        0x40,0x00                                                        //'-',關(guān)閉顯示
};
unsigned char dat_buf[4] = {0,0,0,0};        //顯示數(shù)據(jù)緩存區(qū),默認(rèn)上電顯示"  05"
int time = 10;                                //倒計時時間
unsigned char i = 0;
unsigned int count = 0;                //計數(shù)緩存變量
bit flag_lock = 1;                         //鍵盤鎖定標(biāo)志,1:不鎖定,0:鎖定
uint flag=0;



//------------------------------- 函數(shù)聲明 ------------------------------------//
void DelayMs(unsigned int ms);                //延時函數(shù),單位:ms
void dig_scan(unsigned char *dat);
unsigned char KeyScan(void);                //獨立按鍵掃描
void InitTimer0(void);                                //定時器0初始化
void alarm(void);                //報警函數(shù)
void AnswerTask(void);        //搶答任務(wù)




/* 主函數(shù) */
void main(void)
{
        BEEP = 0;                        //上電默認(rèn)關(guān)閉蜂鳴器
        LED1 = 1;
        InitTimer0();                //定時器0初始化        

        while(1)
        {
                if(KeyScan() == 7)        //如果主持人鍵按下,則進(jìn)行搶答
                {
                        alarm();                //蜂鳴器響一聲
                        AnswerTask();        //進(jìn)行搶答任務(wù)
                }
                if(KEY9 == 0)                //如果按鍵8按下
        {   
                DelayMs(50);        //延時10ms去除按鍵抖動        
                if(KEY9 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
        time++;
        if(time > 260)//只顯示0~9,故到9 就歸零
        {
                time =0;
        }
        while(KEY9 == 0);//保持對K1的判斷,松開才執(zhí)行下一句
        dat_buf[1] = time/ 100 % 10;
        dat_buf[2] = time / 10;                //取出倒計時的十位數(shù)
        
        dig_scan(dat_buf);        //測試數(shù)碼管顯示                                
        }
        if(KEY10 == 0)                //如果按鍵8按下
        {   
                DelayMs(50);        //延時10ms去除按鍵抖動        
                if(KEY10 == 0)                        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                while(KEY10 == 0);
                          time--;
                                if(time <0)//讓0~9不論是加還是減都能循環(huán)
                                {
                                        time =99;
                                }
        }
            dat_buf[1] = time/ 100 % 10;;                //取出倒計時的十位數(shù)
                dat_buf[2] = time / 10;                //取出倒計時的十位數(shù)
               
                dig_scan(dat_buf);        //測試數(shù)碼管顯示        
        }
}

/* 延時函數(shù),單位:ms */
void DelayMs(unsigned int ms)
{
        unsigned char a,b,c;

        while(--ms)
        {
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
                    for(a=2;a>0;a--);        
        }
}

/* 數(shù)碼管顯示掃描 */
void dig_scan(unsigned char *dat)
{
        /* 動態(tài)掃描處理 */
        switch(i)
        {
                case 0:
                {
                        duanPore = tab_duan[dat[0]];        //顯示第1位數(shù)碼管內(nèi)容        
                        DIG1 = 0;
                        break;
                }
                case 1:
                {
                        duanPore = tab_duan[dat[1]];        //顯示第2位數(shù)碼管內(nèi)容        
                        DIG2 = 0;                                                //選通第2位數(shù)碼管
                        break;
                }
                case 2:
                {
                        duanPore = tab_duan[dat[2]];        //顯示第3位數(shù)碼管內(nèi)容        
                        DIG3 = 0;                                                //選通第3位數(shù)碼管
                        break;
                }
                case 3:
                {
                        duanPore = tab_duan[dat[3]];        //顯示第4位數(shù)碼管內(nèi)容        
                        DIG4 = 0;                                                //選通第4位數(shù)碼管
                        break;
                }
                default: break;        
        }
        DelayMs(5);                //掃描延時10ms,根據(jù)實際情況適當(dāng)修改改延時時間
        DIG1 = 1;                        //消隱
        DIG2 = 1;
        DIG3 = 1;
        DIG4 = 1;
        ++i;                                //掃描變量循環(huán)
        if(i > 3)
                i = 0;        
}

/* 獨立按鍵掃描 */
unsigned char KeyScan(void)
{
        if(KEY1 == 0)                //如果按鍵1按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY1 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 1;        //輸出按鍵值1
        }
        if(KEY2 == 0)                //如果按鍵2按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY2 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 2;        //輸出按鍵值2
        }
        if(KEY3 == 0)                //如果按鍵3按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY3 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 3;        //輸出按鍵值3
        }
        if(KEY4 == 0)                //如果按鍵4按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY4 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 4;        //輸出按鍵值4
        }
        if(KEY5 == 0)                //如果按鍵5按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY5 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 5;        //輸出按鍵值5
        }
        if(KEY6 == 0)                //如果按鍵6按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY6 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 6;        //輸出按鍵值6
        }
        if(KEY7 == 0)                //如果按鍵7按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY7 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 7;        //輸出按鍵值7
        }
        if(KEY8 == 0)                //如果按鍵8按下
        {
                DelayMs(10);        //延時10ms去除按鍵抖動        
                if(KEY8 == 0)        //再確認(rèn)一次按鍵按下,表示到這按鍵已經(jīng)穩(wěn)定了
                        return 8;        //輸出按鍵值8
        }
        //輸出按鍵值8
        return 0;                        //無按鍵按下輸出0
}

/* 定時器0初始化 */
void InitTimer0(void)
{
    TMOD = 0x01;        //配置定時器0為工作模式1,16位定時器
    TH0 = (65536 - 10000) / 256;        //定時10ms
    TL0 = (65536 - 10000) % 256;
    EA = 1;                        //打開總中斷
    ET0 = 1;                //打開定時器0中斷
    TR0 = 0;                //上電默認(rèn)關(guān)閉定時器0
}
/* 定時器0中斷服務(wù)函數(shù),10ms進(jìn)一次中斷 */
void Timer0Interrupt(void) interrupt 1
{
    TH0 = (65536 - 10000) / 256;        //定時10ms,重新裝載計數(shù)值
    TL0 = (65536 - 10000) % 256;
           
        ++count;
        if(count > 100)                                 //1s時間計算:10ms * 100 = 1s
        {
                count = 0;                                        //計數(shù)值清零
                --time;                                                //倒計時時間減一次
                if(time <= 0)                                //如果倒計時結(jié)束,則關(guān)閉定時器0,停止倒計時,并聲光報警和鎖定鍵盤
                {
                        TR0 = 0;                                //關(guān)閉定時器0
                        BEEP = 1;                                //聲光報警
                        LED1 = 0;
                        flag_lock = 0;                        //鎖定鍵盤                                
                }                                
        }
        
}
/* 報警函數(shù) */
void alarm(void)
{
        BEEP = 1;                //蜂鳴器響一下
        DelayMs(300);        //延時300ms
        BEEP = 0;
}
/* 實現(xiàn)搶答任務(wù) */
void AnswerTask(void)
{
        unsigned char key_val;                //按鍵值緩存

        TR0 = 1;                                        //啟動定時器0,開始倒計時
        while(1)
        {
                if(flag_lock == 1)
                {
                        key_val = KeyScan();                //獲取按鍵值
                        switch(key_val)
                        {
                                case 1:
                                {
                                        dat_buf[0] = key_val;        //第1位數(shù)碼管顯示1號
                                                        //顯示'-'
                                        time = 200;                                //倒計時20s,選手回答時間
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;                        //鎖定鍵盤
                                        break;
                                }
                                case 2:
                                {
                                        dat_buf[0] = key_val;        //第2位數(shù)碼管顯示2號
                                                        //顯示'-'
                                        time = 20;                                //倒計時20s,選手回答時間
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;
                                        break;
                                }
                                case 3:
                                {
                                        dat_buf[0] = key_val;        //第3位數(shù)碼管顯示3號
                                                        //顯示'-'
                                        time = 20;
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;
                                        break;
                                }
                                case 4:
                                {
                                        dat_buf[0] = key_val;        //第4位數(shù)碼管顯示4號
                                                //顯示'-'
                                        time = 20;
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;
                                        break;
                                }
                                case 5:
                                {
                                        dat_buf[0] = key_val;        //第5位數(shù)碼管顯示5號
                                                //顯示'-'
                                        time = 20;
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;
                                        break;
                                }
                                case 6:
                                {
                                        dat_buf[0] = key_val;        //第6位數(shù)碼管顯示6號
                                       
                                        time = 20;
                                        alarm();                                //蜂鳴器響一下
                                        flag_lock = 0;
                                        break;
                                }
                                default: break;
                        }
                }
                   dat_buf[1] = time / 100 % 10;                //取出倒計時的十位數(shù)
                dat_buf[2] = time / 10;                //取出倒計時的十位數(shù)
                dig_scan(dat_buf);                        //數(shù)碼管顯示內(nèi)容
        }
}









分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费色片| 特级特黄aaaa免费看 | 欧美日韩综合在线 | 久久久精品国产sm调教 | 欧美黄色片在线观看 | 99精品网站| 国产精品视频免费 | 午夜在线观看视频网站 | 六月天婷婷 | a级片在线| 99热亚洲 | 日日夜夜精品免费 | 黄色免费小视频 | 久久精品在线 | 性视频网 | 亚洲精品视频在线观看免费 | 中文字幕精品视频 | 国产精品久久 | 婷婷综合 | 男人操女人视频网站 | 国产日韩精品在线 | 久久a级片 | 草逼com | 国产无遮挡又黄又爽免费网站 | 亚洲成人一区 | 国产视频在线观看视频 | 午夜国产一区 | 中文字幕在线视频播放 | 免费观看一区二区 | 在线伊人网 | 亚洲天天干 | 久久不射网 | 亚洲欧洲av | 欧美亚洲国产日韩 | 亚洲国产成人91精品 | 欧美一区二区三区四区五区 | 日韩一区二区三区在线 | 丰满少妇在线观看网站 | 麻豆成人91精品二区三区 | 国产在线日韩 | 国产精品偷乱一区二区三区 |