找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的八路搶答器設(shè)計(jì)。

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:587535 發(fā)表于 2020-2-14 16:26 來自手機(jī) | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、四鍵設(shè)計(jì)功能1、程序開始當(dāng)按下開始搶答按鈕后,數(shù)碼管顯示搶答倒計(jì)時(shí)。在該時(shí)間內(nèi)八路搶答按下有效,若超出搶答時(shí)間蜂鳴器發(fā)出搶答失敗警報(bào)預(yù)示該次搶答失敗。若有效時(shí)間內(nèi)有人搶答則1位數(shù)碼管顯示搶答選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí)。在答題有效時(shí)間內(nèi)答題完成則搶答成功,若超過答題時(shí)間,蜂鳴器給出答題超時(shí)警報(bào),答題失敗。2、在開始搶答的過程中可按下結(jié)束搶答來中斷此次搶答。直接結(jié)束搶答后數(shù)碼管均顯示0.等待下次搶答開始。3、在開始搶答時(shí),可以不使用開始搶答按鈕而按下隨機(jī)抽擊選手答題按鈕來隨機(jī)抽取一位選手答題。該按鈕按下后1位數(shù)碼管顯示隨機(jī)選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí),若時(shí)間超時(shí),蜂鳴器給出警報(bào)。若有效時(shí)間內(nèi)答題,則答題成功。4、在隨機(jī)抽取選手答題中,可以按下結(jié)束隨機(jī)抽取選手答題按鈕來結(jié)束隨機(jī)抽取答題。結(jié)束后數(shù)碼管均顯示0.等待下次搶答開始。二、兩鍵設(shè)計(jì)功能1、程序開始當(dāng)按下開始搶答按鈕后,數(shù)碼管顯示搶答倒計(jì)時(shí)。在該時(shí)間內(nèi)八路搶答按下有效,若超出搶答時(shí)間蜂鳴器發(fā)出搶答失敗警報(bào)預(yù)示該次搶答失敗。若有效時(shí)間內(nèi)有人搶答則1位數(shù)碼管顯示搶答選手號(hào),二位數(shù)碼管顯示答題倒計(jì)時(shí)。在答題有效時(shí)間內(nèi)答題完成則搶答成功,若超過答題時(shí)間,蜂鳴器給出答題超時(shí)警報(bào),答題失敗。2、在開始搶答的過程中可按下結(jié)束搶答來中斷此次搶答。直接結(jié)束搶答后數(shù)碼管均顯示0.等待下次搶答開始。
P0^0; //二位數(shù)碼管第一位選擇腳sbit DG2 = P0^1; //二位數(shù)碼管第二位選擇腳sbit DG3 = P0^3;//P2端口 數(shù)碼管段選//P1端口 八位選手搶答sbit start_qd_pin = P3^7;//開始搶答按鈕連接管腳sbit end_qd_pin = P3^5;                //結(jié)束搶答按鈕連接管腳sbit start_srand_qd_pin = P3^4;//開始隨機(jī)抽取選手按鈕連接管腳sbit end_srand_qd_pin = P3^6;//結(jié)束隨機(jī)抽取選手按鈕連接管腳sbit beep=P3^3;//蜂鳴器連接管腳unsigned char weixuan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管段碼:0123456789unsigned char qd_num=0;        //搶答選手號(hào)unsigned char qd_time=0;        //搶答倒計(jì)時(shí)間unsigned char timeout_num=0;        //定時(shí)器產(chǎn)生中斷次數(shù)unsigned char work_status = 0;        //工作狀態(tài),下面幾個(gè)為工作狀態(tài)定義的宏#define START_QD_STATUS 0#define WAIT_QD_STATUS 1#define ACK_QD_STATUS 2#define ACK_SRAND_QD_STATUS 3/*------延時(shí)2ms函數(shù)------*/void delay2ms(void)   //誤差 0us{    unsigned char a,b;    for(b=4;b>0;b--)        for(a=248;a>0;a--);    _nop_();  //if Keil,require use intrins.h}/*------延時(shí)50ms函數(shù),參數(shù)num為延時(shí)多少個(gè)50ms------*/void delay50ms(unsigned int num)   //誤差 0us{    unsigned char a,b;        unsigned char i=0;        for(i=0; i<num; i++)        {    for(b=173;b>0;b--)        for(a=143;a>0;a--);        }}/*---初始化定時(shí)器0---*/void InitTimer0(void)//50ms{    TMOD = 0x01;//定時(shí)器工作模式1    TH0 = 0x3C;        //定時(shí)器裝值高8位    TL0 = 0x0B0;//定時(shí)器裝值低8位    EA = 1;                //使能總中斷    ET0 = 1;        //使能定時(shí)器0中斷    TR0 = 1;        //啟動(dòng)定時(shí)器}/*------關(guān)閉定時(shí)器0------*/void end_Timer0(void){        ET0 = 0;//關(guān)閉定時(shí)器0中斷    TR0 = 0;//停止定時(shí)器0}/*----初始化函數(shù)-----*/void init(void){        DG1 = 0;        DG2 = 0;        DG3 = 0;                beep = 0;//上電時(shí)由于該腳為高,而為高時(shí)蜂鳴器會(huì)叫,故初始化為低}/*----------等待開始搶答狀態(tài)該狀態(tài)下一直等待按下開始搶答按鈕或隨機(jī)搶答按鈕,再進(jìn)入相應(yīng)的工作狀態(tài)!這種狀態(tài)機(jī)的編程方式是當(dāng)前單片機(jī)開發(fā)者的主流思想。---------*/void start_qd_status(void){        if(start_qd_pin == 0)//檢測(cè)到開始搶答按鈕按下        {                work_status = WAIT_QD_STATUS;//工作狀態(tài)設(shè)置為等待答題狀態(tài)                qd_num = 0;                        //回答選手號(hào)為0,等待選手按下                qd_time = 20;                //20s搶答時(shí)間                timeout_num=0;                //中斷次數(shù)清0                InitTimer0();                //開啟定時(shí)器0        }        if(start_srand_qd_pin == 0)//檢測(cè)到隨機(jī)抽取選手答題按鈕按下        {                work_status = ACK_SRAND_QD_STATUS;//工作狀態(tài)設(shè)置為隨機(jī)選手回答狀態(tài)                srand(TL0%100);                                //產(chǎn)生隨機(jī)數(shù)種子,srand和rand函數(shù)有興趣可以百度一下單片機(jī)產(chǎn)生隨機(jī)數(shù)方法!                qd_num = (rand()%9);//0-8, 產(chǎn)生隨機(jī)數(shù)                if(qd_num == 0)                        //防止產(chǎn)生隨機(jī)數(shù)0                        qd_num = (rand()%9);        //再次產(chǎn)生隨機(jī)數(shù)                qd_time = 30;                                //30s答題時(shí)間                timeout_num=0;                                //中斷次數(shù)清0                InitTimer0();                                //開始定時(shí)器0        }}/*-------開始按鈕按下后,等待選手搶答狀態(tài)函數(shù)------*/void wait_qd_status(void){        unsigned char i = 0;        if(qd_time == 0)//無人搶答,搶答時(shí)間已到        {                end_Timer0();//停止定時(shí)器0                //蜂鳴器給出無人搶答警報(bào)                beep = 1;        //蜂鳴器響                delay50ms(40);                beep = 0;                work_status = START_QD_STATUS;//無人搶答后恢復(fù)原始狀態(tài),設(shè)置工作狀態(tài)為開始搶答狀態(tài)        }        if(end_qd_pin == 0)//檢測(cè)到結(jié)束按鍵        {                end_Timer0();//停止定時(shí)器0                qd_num = 0;//回答選手號(hào)為0                qd_time = 0;//搶答時(shí)間清0                work_status = START_QD_STATUS;//工作狀態(tài)置開始搶答狀態(tài)        }        switch(P1)//檢測(cè)哪位選手按下?lián)尨鸢粹o        {                case 0xfe://1號(hào)                        qd_num = 1;//回答選手號(hào)為1                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;            case 0xfd://2號(hào)                        qd_num = 2;//回答選手號(hào)為2                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0xfb://3號(hào)                        qd_num = 3;//回答選手號(hào)為3                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0xf7://4號(hào)                        qd_num = 4;//回答選手號(hào)為4                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0xef://5號(hào)                        qd_num = 5;//回答選手號(hào)為5                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0xdf://6號(hào)                        qd_num = 6;//回答選手號(hào)為6                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0xbf://7號(hào)                        qd_num = 7;//回答選手號(hào)為7                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                case 0x7f://8號(hào)                        qd_num = 8;//回答選手號(hào)為8                        qd_time = 30;                        timeout_num=0;                        InitTimer0();                        work_status = ACK_QD_STATUS;                        break;                default:                        break;        }}/*------選手回答問題狀態(tài)------*/void ack_qd_status(){        unsigned char i = 0;        if(qd_time == 0)//答題超時(shí)        {                end_Timer0();//結(jié)束定時(shí)器0                qd_num = 0;                qd_time = 0;                for(i=0;i<3;i++)//選手回答問題超時(shí)警報(bào)                {                        beep = 1;                        delay50ms(5);                        beep = 0;                        delay50ms(5);                }                work_status = START_QD_STATUS;//設(shè)置工作狀態(tài)為開始搶答狀態(tài)        }        if(end_qd_pin == 0)//結(jié)束按鍵按下        {                end_Timer0();//結(jié)束定時(shí)器0                qd_num = 0;                qd_time = 0;                work_status = START_QD_STATUS;//設(shè)置工作狀態(tài)為開始搶答狀態(tài)        }}/*-------隨機(jī)選手回答狀態(tài)-------*/void ack_srand_status(){        unsigned char i = 0;        if(qd_time == 0)//答題超時(shí)        {                end_Timer0();//結(jié)束定時(shí)器0                qd_num = 0;                qd_time = 0;                for(i=0;i<3;i++)//隨機(jī)選手回答問題超時(shí)警報(bào)                {                        beep = 1;                        delay50ms(5);                        beep = 0;                        delay50ms(5);                }                work_status = START_QD_STATUS;        }        if(end_srand_qd_pin == 0)//結(jié)束按鍵        {                end_Timer0();//結(jié)束定時(shí)器0                qd_num = 0;        //選手號(hào)清0                qd_time = 0;//時(shí)間清0                work_status = START_QD_STATUS;//設(shè)置工作

5a7a2ead57189fdd.png (109.98 KB, 下載次數(shù): 57)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表