加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

基于51單片機(jī)8位競(jìng)賽搶答器_倒計(jì)時(shí)可調(diào)+LED跑馬燈

08/12 09:29
843
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

Proteus仿真版本:proteus 7.8

程序編譯器:keil 4/keil 5

編程語言:C語言

設(shè)計(jì)編號(hào):Q006

基本功能

1、以單片機(jī)位核心,設(shè)計(jì)一個(gè)8位搶答器:同時(shí)供8名選手比賽,分別用6個(gè)按鍵表示;

2、無人搶答時(shí),8個(gè)跑馬燈循環(huán)點(diǎn)亮,數(shù)碼管顯示00;

3、設(shè)置一個(gè)系統(tǒng)清楚和搶答控制開關(guān)(開始搶答后才允許選手搶答),開關(guān)由主持人控制;

4、搶答器具有鎖存和顯示功能。選手在設(shè)定的時(shí)間內(nèi)進(jìn)行搶答,搶答有效,定時(shí)器停止工作,數(shù)碼管顯示選手編號(hào)和搶答時(shí)間,并保持到主持人將系統(tǒng)清除為止;

5、搶答器具有頂是搶答功能,且一次搶答的時(shí)間由主持人設(shè)定(如20s),由加減按鍵設(shè)定;

6、當(dāng)主持人啟動(dòng)“開始”鍵后,定時(shí)器進(jìn)行倒計(jì)時(shí),同時(shí)揚(yáng)聲器發(fā)出短暫的聲響,聲響持續(xù)時(shí)間位0.5s左右;

7、如果定時(shí)器時(shí)間已到,無人搶答,本次搶答無效,該題作廢,系統(tǒng)報(bào)警并禁止搶答,定時(shí)器顯示器上顯示00。

概述

1.1 課程設(shè)計(jì)目的

(1) 綜合所學(xué)的單片機(jī)原理及接口技術(shù)等課程的理論知識(shí)完成本課程設(shè)計(jì);

(2) 學(xué)習(xí)并掌握基本電路設(shè)計(jì)與使用方法,單片機(jī)的編程與應(yīng)用方法;

(3) 提高綜合分析、解決實(shí)際問題的能力。

1.2 任務(wù)和要求

本設(shè)計(jì)是以搶答為出發(fā)點(diǎn)??紤]到依需設(shè)定限時(shí)回答的功能,利用AT89C51單片機(jī)及外圍接口實(shí)現(xiàn)的搶答系統(tǒng),利用單片機(jī)的定時(shí)器/計(jì)數(shù)器定時(shí)和記數(shù)的原理,將軟、硬件有機(jī)地結(jié)合起來,使得系統(tǒng)能夠正確地進(jìn)行計(jì)時(shí),同時(shí)使數(shù)碼管能夠正確地顯示時(shí)間。用開關(guān)做鍵盤輸出,發(fā)光二極管蜂鳴器發(fā)出提示。同時(shí)系統(tǒng)能夠?qū)崿F(xiàn):在搶答中,只有開始后搶答才有效,如果在開始搶答前搶答為無效;在軟件中還應(yīng)用了外部中斷,通過中斷解除搶答的鎖存,似的設(shè)計(jì)更加靈活,實(shí)用性更強(qiáng)。

本設(shè)計(jì)主要設(shè)計(jì)指標(biāo):

(1) 按鍵輸入模塊,包括主持人時(shí)間加,時(shí)間減,開始搶答,新一輪4個(gè)按鍵和選手一號(hào)到八號(hào)共搶8答按鍵;

(2) 顯示模塊,可以搶答實(shí)現(xiàn)倒計(jì)時(shí)和顯示搶答選手編號(hào)。

(3) 蜂鳴器模塊,用于倒計(jì)時(shí)提醒,倒計(jì)時(shí)開始后發(fā)出短暫的聲響,聲響持續(xù)的時(shí)間為0.5s左右。

1.3 系統(tǒng)結(jié)構(gòu)圖

image-20220903170727402

圖1 系統(tǒng)結(jié)構(gòu)圖

主持人控制搶答器時(shí)間加減和開始,設(shè)置好時(shí)間或者使用默認(rèn)時(shí)間后,按下開始按鍵即開始倒計(jì)時(shí),每倒計(jì)時(shí)一秒蜂鳴器短暫鳴0.5提醒選手。選手在開始搶答后按下各自的按鍵搶答,一旦按下會(huì)顯示選手編號(hào)。一輪搶答結(jié)束后,主持人按下新一輪即可進(jìn)入下一輪的搶答。

2理論分析與計(jì)算

倒計(jì)時(shí)主要應(yīng)用了51單片機(jī)的定時(shí)器,本設(shè)計(jì)應(yīng)用定時(shí)器產(chǎn)生50ms定時(shí)。以12Mhz的晶振來說,機(jī)器周期是1us,計(jì)滿TH0、TL0就需要216-1個(gè)數(shù),再來一個(gè)數(shù)就“溢出”產(chǎn)生中斷,一次溢出也就是65536us,約等于65.5ms,假若定時(shí)50ms需要一個(gè)預(yù)裝值(初值),總值-需要值=預(yù)裝值。預(yù)裝后,定時(shí)器從預(yù)裝值開始加值,定時(shí)器溢出中斷后,會(huì)重新從預(yù)裝值開始加值加到50ms就再產(chǎn)生中斷,從而達(dá)到了定時(shí)的目的。如果要定時(shí)1s就可以讓定時(shí)器中斷1000ms/50ms=20次。

仿真圖

img

img

img

源碼

img

4.1 主程序

主程序完成外部中斷初始化、定時(shí)器初始化、蜂鳴器模塊初始化。主程序掃描主持人不斷掃描按鍵,進(jìn)行對(duì)應(yīng)的操作。

進(jìn)入主程序后,顯示顯示預(yù)設(shè)的倒計(jì)時(shí)數(shù)字20,程序掃描主持人按鍵倒計(jì)時(shí)加減鍵和開始按鍵。按下開始按鍵后,倒計(jì)時(shí)開始工作,實(shí)時(shí)刷新倒計(jì)時(shí)數(shù)字,每倒計(jì)時(shí)1秒蜂鳴器beep引腳拉低0.5秒,蜂鳴器短鳴0.5秒。在掃描到選手按下按鍵后,倒計(jì)時(shí)定時(shí)器停止工作,顯示選手編號(hào)和按下?lián)尨疰I的時(shí)間。

主要(關(guān)鍵)代碼:

	EA=1;
 	EX0=1;//外部中斷0
	IT0=1;//設(shè)置下降沿觸發(fā)中斷0
	TMOD=0x11;
	TH0=(65536-50000)/256;//這是50ms的
	TL0=(65536-50000)%256;
	ET0=1;
	TR0=0; 
	TH1=(65536-50000)/256;//這是50ms的
	TL1=(65536-50000)%256;
	ET1=1;
	TR1=1; 
	time=20; //定時(shí)時(shí)間
	num=0; //選手編號(hào)
	flag=0; //搶答模式標(biāo)志位
	beep=0;//蜂鳴器為0 不響

此段程序是完成外部中斷初始化、定時(shí)器初始化、蜂鳴器模塊初始化。完成后進(jìn)入大循環(huán)。

TempData[2]=dofly_DuanMa[time/10];

//分解顯示信息,如要顯示68,則68/10=6  68%10=8  

TempData[3]=dofly_DuanMa[time%10];

if(num!=0)

   m=1;
if(start==0)

{
   DelayMs(10); 
   if(start==0)
   {	
   	flag=1;

    	 while(!start);

   		}
   }

這段函數(shù)完成了倒計(jì)時(shí)的顯示和掃描是否開始倒計(jì)時(shí)。在沒有開始搶答時(shí),選手按下按鍵會(huì)顯示選手編號(hào)和清零時(shí)間,一起防止選手搶答。開始搶答后,標(biāo)志位flag變?yōu)?。開始執(zhí)行按鍵掃描函數(shù)check2();

void check1()
{
	if(num==1)
	{
		TempData[0]=dofly_DuanMa[num/10];
		//分解顯示信息,如要顯示68,則68/10=6  68%10=8  
		TempData[1]=dofly_DuanMa[num%10];
		beep=0;
		Display(0,8); //數(shù)碼管顯示函數(shù)
		TR0=0;	
		while(m);
	}   		

假如按鍵1按下,會(huì)顯示選手編號(hào)。同時(shí)程序會(huì)卡在while(m);循環(huán)。此時(shí)除了新一輪按鍵之外的任何按鍵都系統(tǒng)沒有任何變化。

oid restart() interrupt 0//按鍵中斷處理函數(shù) 新一輪
{
	m = 0;
	num = 0;
	TR0 = 0;
	flag = 0;
	time = 23;
	TempData[0] = 0;
	TempData[1] = 0;
	TempData[2] = 0;
	TempData[3] = 0;
}

新一輪按鍵是外部中斷0,即使程序一直在執(zhí)行while(m)循環(huán),按下按鍵后,程序會(huì)執(zhí)行一次中斷函數(shù),將變量清零,函數(shù)重新執(zhí)行按鍵掃描。

4.2 按鍵掃描子函數(shù)

關(guān)鍵代碼介紹

	if(key1==0)
	{
		DelayMs(10); 
		if(key1==0)
		{	
			num=1;
			while(!key1);
		}
	}

程序一直判斷按鍵引腳電壓,按下按鍵電壓為0。按鍵會(huì)產(chǎn)生抖動(dòng),需要進(jìn)行消抖處理,演示10毫秒后,如果按鍵電壓還是0,令按鍵數(shù)目num為1。表示按下的按鍵是按鍵1。供主函數(shù)處理按鍵消息。

4.3顯示子程序

關(guān)鍵代碼介紹

/*------------------------------------------------
 顯示函數(shù),用于動(dòng)態(tài)掃描數(shù)碼管
 輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個(gè)數(shù)碼管開始顯示
 如輸入0表示從第一個(gè)顯示。
 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
	unsigned char i;
	  
	for(i=0;i<Num;i++)
	{ 
		DataPort=0;   //清空數(shù)據(jù),防止有交替重影
       	DUAN=1;     //段鎖存
       	DUAN=0;

       	DataPort=dofly_WeiMa[i+FirstBit]; //取位碼 
       	WEI=1;     //位鎖存
       	WEI=0;

       	DataPort=TempData[i]; //取顯示數(shù)據(jù),段碼
       	DUAN=1;     //段鎖存
       	DUAN=0;
       
	   	DelayMs(2); // 掃描間隙延時(shí),時(shí)間太長(zhǎng)會(huì)閃爍,太短會(huì)造成重影

	}
} 

該函數(shù)用于動(dòng)態(tài)掃描數(shù)碼管。輸入?yún)?shù) FirstBit 表示需要顯示的第一位,如賦值2表示從第三個(gè)數(shù)碼管開始顯示,如輸入0表示從第一個(gè)顯示。 Num表示需要顯示的位數(shù),如需要顯示99兩位數(shù)值則該值輸入2。顯示主要控制74HC573鎖存數(shù)據(jù)。先清除數(shù)據(jù),清段鎖存。然后選擇位碼。開位鎖存將數(shù)據(jù)存在位鎖存器,選擇到了需要顯示的數(shù)碼管。位鎖存完成后將數(shù)據(jù)寫進(jìn)段鎖存數(shù)據(jù),將需要顯示的數(shù)據(jù)寫到數(shù)碼管中。

4.4蜂鳴器提示子函數(shù)

蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負(fù)極接到三極管的發(fā)射極E,三極管的基極B經(jīng)過限流電阻R3后由單片機(jī)的beep引腳控制,當(dāng)beep輸出低電平時(shí),三級(jí)管QS截止,沒有電流流過線圈,蜂鳴器不發(fā)聲;當(dāng)beep輸出高電平時(shí),三級(jí)管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制beep腳的電平來使蜂鳴器發(fā)出聲音和關(guān)閉。

void timer_t0() interrupt 1
{
    TH0=(65536-50000)/256;//這是50ms的
 	TL0=(65536-50000)%256;
	t++;
	beep=0;
	if(t==20)//設(shè)置為20,就是1s為高1s為低
	{
		beep=1;
    	t=0;
		time--;
		TempData[2]=dofly_DuanMa[time/10];//分解顯示信息,如要顯示68,則68/10=6  68%10=8  
		TempData[3]=dofly_DuanMa[time%10];
		if(time<=0)
		{
			time=0;			
		}			
	} 
}

在50ms一次的定時(shí)器0中斷中,每10次中斷令蜂鳴器置零。第20次中斷令蜂鳴器置一。以此產(chǎn)生0.5s短暫提醒。

資料清單

img

  • 設(shè)計(jì)資料獲取聯(lián)系方式.doc

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
ATXMEGA64A3U-AU 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, PQFP64, 14 X 14 MM, 1 MM THICKNESS, 0.80 MM PITCH, GREEN, PLASTIC, MS-026AEB, TQFP-64

ECAD模型

下載ECAD模型
$4.53 查看
MCF5282CVM66J 1 Freescale Semiconductor IC,MICROCONTROLLER,32-BIT,COLDFIRE CPU,CMOS,BGA,256PIN,PLASTIC
暫無數(shù)據(jù) 查看
FS32K146HAT0MLLT 1 NXP Semiconductors RISC Microcontroller

ECAD模型

下載ECAD模型
$11.53 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜