第一篇:4路搶答器設計程序
#include
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,//0~f顯示表
0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};unsigned char code table0[]={0xf1,0xf2,0xf4,0xf8};
//P2口位選
unsigned char code table2[]={0xef,0xdf,0xbf,0x7f};
//P3口送行信號 unsigned char display[]={0,0,0,0};//顯示位 void sw1();
//子函數申明 void sw2();void sw3();void sw4();void xianshi();void init();unsigned char temp,num2,x,x1,x2,a,count;
//變量聲明 int num,num1;unsigned char key;unsigned char i,j;sbit P3_4=P3^4;sbit P3_5=P3^5;sbit P3_6=P3^6;sbit P3_7=P3^7;sbit k1=P1^0;
//位申明(時間加)sbit k2=P1^1;
//位申明(時間減)sbit k3=P1^2;
//位申明(開始)sbit k4=P1^3;
//位申明(復位)sbit sp=P1^4;
//蜂鳴器 sbit l1=P1^5;
//LED顯示 sbit l2=P1^6;
//LED顯示
void delay(unsigned char z)
//延時1ms子函數 {
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);}
void init()
//初始化子函數 { a=0;TMOD=0x01;
//定時器T0工作方式設定
TH0=(65536-10000)/256;//裝初值
TL0=(65536-10000)%256;EA=1;
//開定時器T0 ET0=1;
if(k1==0)
//判斷時間加K1是否按下
{
delay(5);
//延時躲過抖動
if(k1==0)
//再次確認是否按下K1
{
num++;
//時間自加1
if(num==99)
//如果時間num=99,清零num
{
num=0;
}
num2=num;
//將num值賦值給num2
while(k1==0);//等待K1松手
}
}
if(k2==0)
//判斷時間減K2是否按下
{
delay(5);
//延時躲過抖動
if(k2==0)
//再次確認是否按下K2
{
num--;
//時間自減1
if(num==-1)//如果時間num=-1,賦值num=99
{
num=99;
}
num2=num;//將num值賦值給num2
while(k2==0);//等待K2松手
}
}
if(k3==0)
//判斷開始按鈕K3是否按下
{
delay(5);
//延時躲過抖動
if(k3==0)//再次確認是否按下K3
{
x++;
//自加1
if(x==2)//假如x=2,清零x
{
x=0;
}
}
} }
void keyboad()
//按鍵檢測子函數 { while(1)
{
P3=0xff;
//讀引腳前需寫入高電平
P3_4=0;
//置第一行線為低
temp=P3;
//P3口信息送入temp中
temp=temp & 0x0f;//屏蔽高四位,保留低四位
if(temp!=0x0f)//判斷:假如列線有不為高的時候,執行if循環體
{
delay(5);//延時躲過抖動
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;//判斷是哪個鍵按下
switch(temp)
{
case 0x0e: //第一行第四個按下
{delay(5);num1=4;l2=0;xianshi();} //第一行第一個鍵按下
break;
case 0x0d:
//第一行第三個按下
{delay(5);num1=3;l2=0;xianshi();}
break;
case 0x0b:
//第一行第二個按下
{delay(5);num1=2;l2=0;xianshi();}
break;
case 0x07: //第一行第一個按下
{delay(5);num1=1;l2=0;xianshi();} break;//第一行第一個鍵按下
}
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延時躲過抖動
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=8;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=7;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=6;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=5;l2=0;xianshi();} break;
}
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延時躲過抖動
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=12;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=11;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=10;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=9;l2=0;xianshi();} break;
//第二行第四個鍵按下//第二行第三個鍵按下//第二行第二個鍵按下//第二行第一個鍵按下//第三行第四個鍵按下//第三行第三個鍵按下//第三行第二個鍵按下//第三行第一個鍵按下
}
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
delay(5);//延時躲過抖動
temp=P3;
temp=temp & 0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
{delay(5);num1=16;l2=0;xianshi();} break;
case 0x0d:
{delay(5);num1=15;l2=0;xianshi();} break;
case 0x0b:
{delay(5);num1=14;l2=0;xianshi();} break;
case 0x07:
{delay(5);num1=13;l2=0;xianshi();} break;
}
temp=P3;
P0=table[key];
}
}
} }
void xianshi(){
TR0=0;
//停止定時計數
num=0;
//倒計時num清零
sp=1;
//成功搶答,蜂鳴器叫
delay(100);
//延時一段時間
sp=0;
//關蜂鳴器
//第四行第四個鍵按下//第四行第三個鍵按下//第四行第二個鍵按下//第四行第一個鍵按下
while(1)
{
for(a=0;a<4;a++)//顯示部分位選
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10;
//倒計時顯示0
display[1]=num%10;
display[2]=num1/10;
//顯示搶答者號
display[3]=num1%10;
if(k4==0)
//判斷復位鍵K4是否按下
{
num=num2;
//num2值賦值給num
num1=0;
//清零搶答者號顯示
TR0=1;
//啟動定時器TO
l1=1;
//D1,D2關閉
l2=1;
return;
}
} }
void main()
//主函數 {
l1=1;
//D1,D2關閉
l2=1;
sp=0;//初始化蜂鳴器
x=0;
num=num2=30;
//賦初值
while(1)
{
if(x==1)
//開始鍵按下
{
delay(5);
TR0=1;
//啟動定時
while(1)
{
keyboad();//調用按鍵檢測子函數
if(k4==0)//判斷復位鍵是否按下
{
l1=1;//D1,D2關閉
l2=1;
delay(5);
num=num2;//倒計時時間30秒賦值給num
TR0=1;//啟動定時器T0
}
}
}
else
//開始鍵沒有按下
{
for(a=0;a<4;a++)
//顯示部分位選
{
delay(5);
P2=table0[a];
P0=table[display[a]];
}
display[0]=num/10;//倒計時顯示0
display[1]=num%10;
display[2]=num1/10;
//顯示搶答者號
display[3]=num1%10;
init();
//初始化
}
} }
void time0()interrupt 1 //定時器T0中斷 {
TH0=(65536-10000)/256;
//重裝初值
TL0=(65536-10000)%256;count++;
//中斷次數記錄
if(k4==0)
//復位鍵K4檢測
{
num=num2;
TR0=1;
num1=0;
return;
}
for(a=0;a<4;a++)
{
delay(10);
P2=table0[a];
P0=table[display[a]];
} display[0]=num/10;
//倒計時顯示0
display[1]=num%10;
display[2]=num1/10;//顯示搶答者號
display[3]=num1%10;
if(count==100)
//1秒定時是否已到
{
count=0;
//清零記錄
num--;
//顯示倒計時自減一
if(num<6)
//倒計時倒數6秒,D2亮,蜂鳴器報警
{
l1=~l1;
sp=1;
delay(100);
sp=0;
if(num==0)
//倒計時為0,D2亮,蜂鳴器報警
{
l1=0;
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
delay(100);
sp=1;delay(200);sp=0;
}
if(num==0)
{
while(1)
{
xianshi();
//調用延時子函數
if(k4==0)//假如復位鍵按下
{
l1=1;
//D1,D2滅
l2=1;
num=num2;//30秒倒計時賦值給num
TR0=1;//啟動定時器T0
return;
}
}
}
} } x2++;if(x2==4){
x2=0;} P3=table2[x2];
//分別給行線送低電?
第二篇:搶答器~C51~帶程序
前 言
在電視和學校中我們會經常看到一些智力搶答的節目,如果要是讓搶答者用舉手等方法,主持人很容易誤判,會造成搶答的不公平,比賽中為了準確、公正、直觀地判斷出第一搶答者,所設計的搶答器通常由數碼顯示、燈光、音響等多種手段指示出第一搶答者。為了使這種不公平不發生,只有靠電子產品的高準確性來保障搶答的公平性。
功能分為基本功能和擴展功能,基本功能是能夠實現搶答器的功能,擴展功能進一步豐富了搶答器的功能,更佳人性化。
基本功能可以有同時供8名選手比賽,分別用8個按鈕S0 ~ S7表示;設置一個系統復位按鈕和搶答控制按鈕,這組開關由主持人控制;搶答器具有鎖存與顯示功能。即選手按動按鈕,揚聲器發出聲響提示,鎖存相應的選手號碼并且通過數碼管顯示。選手搶答實行優先鎖存,優先搶答選手的編號一直保持到主持人將系統清除為止。
擴展功能有搶答器具有定時搶答功能,且搶答的時間由主持人設定(如30秒)。當主持人按下啟動鍵后,定時器進行倒計時;參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統清除為止。如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示00。
此設計可以用三種方法實現:數字電路,單片機,PLC。其中PLC方案與單片機方案原理相似,但成本太高,故不采用此方案,在此不另作比較。主要在數字電路和單片機兩個方案中選擇。
AT89C52 是美國ATMEL 公司生產的低電壓,高性能CMOS 8 位單片機,片內含8k bytes 的可反復擦寫的Flash 只讀程序存儲器和256 bytes 的隨機存取數據存儲器(RAM),器件采用ATMEL 公司的高密度、非易失性存儲技術生產,與標準MCS-51 指令系統及8052產品引腳兼容,片內置通用8 位中央處理器(CPU)和Flash 存儲單元,功能強大AT89C52 單片機適合于許多較為復雜控制應用場合。
基于單片機的八路搶答器是針對目前的搶答器市場而設計的,其高度的準確性,低廉的成本,是絕對有競爭優勢,其市場前景巨大。通過本課題的訓練,不僅可以研制出一套八路搶答器,還可以使我們通過對單片機電路的設計與編程,達到理論與實踐相結合的目的,強化我們四年中的學習知識,能提高解決實際問題的能力。
第一章 設計的依據
1.1 課題的提出
在電視和學校中我們會經常看到一些智力搶答的節目,如果要是讓搶答者用舉手等方法,主持人很容易誤判,會造成搶答的不公平,比賽中為了準確、公正、直觀地判斷出第一搶答者,所設計的搶答器通常由數碼顯示、燈光、音響等多種手段指示出第一搶答者。為了使這種不公平不發生,只有靠電子產品的高準確性來保障搶答的公平性。
1.2 實現的系統功能簡介
功能分為基本功能和擴展功能,基本功能是能夠實現搶答器的功能,擴展功能進一步豐富了搶答器的功能,更佳人性化。
1.基本功能:
(1)同時供8名選手比賽,分別用8個按鈕S0 ~ S7表示。
(2)設置一個系統復位按鈕和搶答控制按鈕,這組開關由主持人控制。(3)搶答器具有鎖存與顯示功能。即選手按動按鈕,揚聲器發出聲響提示,鎖存相應的選手號碼并且通過數碼管顯示。選手搶答實行優先鎖存,優先搶答選手的編號一直保持到主持人將系統清除為止。
2.擴展功能:
(1)搶答器具有定時搶答功能,且搶答的時間由主持人設定(如30秒)。當主持人按下啟動鍵后,定時器進行倒計時。
(2)參賽選手在設定的時間內進行搶答,搶答有效,定時器停止工作,顯示器上顯示選手的編號和搶答的時間,并保持到主持人將系統清除為止。如果定時時間已到,無人搶答,本次搶答無效,系統報警并禁止搶答,定時顯示器上顯示00。
第二章 總體方案確定
2.1 方案論證
此設計可以用三種方法實現:數字電路,單片機,PLC。其中PLC方案與單片機方案原理相似,但成本太高,故不采用此方案,在此不另作比較。2.1.1數字電路總體方案
如下圖所示為數字電路總體方框圖。其工作原理為:接通電源后,主持人將開關撥到“清除”狀態,搶答器處于禁止狀態,編號顯示器滅燈,定時器顯示設定時間;主持人將開關置“開始”狀態,宣布“開始”搶答器工作。定時器倒計時,揚聲器給出聲響提示。選手在定時時間內搶答時,搶答器完成:優先判斷、編號鎖存、編號顯示、揚聲器提示。當一輪搶答之后,定時器停止、禁止二次搶答、定時器顯示剩余時間。如果再次搶答必須由主持人再次操作“清除”和“開始”狀態開關。
圖2.1.1 數字電路方案
2.1.2 MCS-51方案
該方案主要由 搶答、聲音警示、燈光指示和計時電路組成,借助較少的外圍元件完成搶答的整個過程。系統框圖如下圖所示。
圖2.1.2 單片機方案
2.2 方案確定
通過三個方案比較,單片機控制的設計方案外圍的元件也很少,成本比較低,制作簡單,實現的功能靈活。由于是單片機控制,對搶答器隊參賽選手的動作的先后有很強的分辨力,即使先后只相差幾毫秒,搶答器也能分辨出來,搶答器直接顯示動作選手的編號和答題時間,并保持到主持人清零為止。所以我選擇采用單片機控制的方案來完成搶答器電路。
第三章 硬件設計
3.1 整體電路設計
整個系統可以分為五部分:搶答電路,主持人控制按鈕,單片機最小系統,顯示電路,蜂鳴器。如下圖所示
圖3.1 整體電路
3.2 復位電路設計
復位電路采用經典的51系列單片機的復位方法:上電復位和開關復位。通電后,給電容充電,在此過程中,單片機復位;運行時,按下復位按鈕,RST端口變為高電平,進行復位。復位電路和晶振電路如下:
圖3.2 復位電路和晶振電路 3.3 顯示電路的設計
顯示電路和揚聲器電路如下圖所示:
圖3.3.1 顯示電路 圖3.3.2 揚聲器電路
3.4 控制電路實現
主持人的按鍵有四個,分別是:開始、復位、加
1、減1。按鍵一般按下的過程中有抖動,需要消抖處理,本設計中采用了并聯電容處理,實際調試過程中證明效果很好,故軟件不需要再次做消抖處理。
圖3.4.1 選手按鍵電路 圖3.4.2 主持人控制電路
3.5 硬件電路設計小結
經過幾十個晝夜奮戰,硬件電路終于調試成功,想想開始的時候什么都不確定,第一次焊接好了之后,到處都是問題,到現在的穩定運行,真的有一種莫大的滿足感。特別是消抖這一塊,一直是我們設計不穩定運行的主因,在指導老師的悉心指導下,在院系領導的關懷下,我們的問題也一一迎刃而解。
第四章 軟件設計
4.1 總體設計
第五章 電路調試
5.1硬件調試
基本電路板檢查: 根據前面的研究完成各個電路模塊的原理設計并生成PCB圖,制作電路板,進行實驗調試。
(1)檢查印制板的印制線是否有斷路,是否有毛刺,是否與其它線或是焊盤粘連,焊盤是否有脫落,過孔是否有未金屬化現象等等。
(2)先用萬用表復核目測中認為可疑的連接或是接點,檢查它們的通短狀態是否與設計規定相符。再檢查各種電源線與地線之間是否有短路現象,如有再仔細檢查出并排除。短路現象一定要在器件安裝及加電前檢查出。
(3)路接通電源后,用手摸一下芯片是否發熱,如果發熱,立即關掉電源,稍后再進行再次檢測;如果沒有發熱,再測試芯片的VCC端電壓是否達到設計要求,接地端是否都接地。
主控模塊調試: 在本次設計中,主控模塊是非常重要的部分,它不僅是本次設計的核心,同時在后面的8255A顯示也是起關鍵的作用。在本次硬件調試中也遇到了問題,接上電源的時候,數碼管不亮,沒有任何顯示,于是我做了如下的工作:(1)檢查電源是否通電,發現指示燈亮著;(2)編程使P1為低電平,檢查到P1輸出為低;(3)檢查P0口未接上拉電阻,接上數碼管發亮了。
由次我深刻的認識到:制作電路板是一個比較繁瑣的過程,它需要我們時刻都要用心去做,每個環節都不能忽視,只有這樣才能達到鍛煉的目的。
5.2軟件調試
當硬件制作完成后,軟件制作也是不可輕視的部分,是實現電路的功能的關鍵部分,通過本次畢業設計,總結經驗如下:
(1)先進行人工檢查。寫好程序后,不立刻燒入單片機,先對紙面上的程序進行人工檢查。由于采用C語言編程,所以要特別小心地檢查語法錯誤,如括號不配對,漏寫分號等,通過仔細的檢查,發現并排除這些錯誤。
(2)人工檢查無誤后,上機調試。在編譯時給出的語法錯誤的信息,根據提示的信息具體找出程序中錯誤之處并改之,從上至下逐一改正。應當注意的是:有的提示出錯行并不是真正出錯的行,如果在提示出錯的行上找不到錯誤的話,則應該到上行再找。
(3)當確認程序無語法錯誤和邏輯錯誤時,通過直接下載到單片機來調試。采用的是自下到上的調試方法,即單獨調好每一個模塊,然后再連接成一個完整的系統調試。
(4)程序燒入單片機后,觀察各個部件的工作是否正常,功能是否實現。如不能正常工作,則繼續檢查程序中的相應模塊,必要時從上到下重新檢查程序。
總 結
搶答器豐富了我們的生活,社會中本來就充滿著競爭。只是沒有很明顯的表現出來,通過運用它我們可以很好的證明自己的膽識和自信,所以做起搶答器來,也很想去了解它,對于八路搶答器原理說起來很簡單,也沒什么復雜性,所以看似很簡單,但實踐中卻發現不是那么回事,實際調試的過程中,一點問題都不能存在,否則它就不運行,真正體會到了什么叫一絲不茍,什么叫鍥而不舍。在以后的工作和學習中,我一定會深刻運用這次的心得體會。
總之,這次實踐是非常成功的,我們追求的是理論與實踐并存,這次畢業設計就很好的為大學生表現自己綜合能力提供有力的平臺。實踐中也發了自己有一點不懂的地方,通過這次實踐才徹底搞懂,這證明了理論學習后還是需要實踐課程的。
在這個過程中,通過老師的指導和自己的摸索,學會了自己學習新知識,查找資料的方法,我想這應該是我們大學中應該掌握的方法。
致 謝
本設計經過一個學期的的時間,到今天終于完成了。在此,向我的指導老師表示最誠摯的謝意。從課題的選擇,前期的準備工作、方案的制定,系統的開發與調試,到論文的撰寫修改定稿都滲透了老師的心血。在這三個月中,老師以他淵博的學識、卓越的才智、嚴謹的治學精神和求實創新的工作作風以及平易近人的態度使我受益匪淺,在學習中給我很大的啟迪和幫助,對我的指導更是給我留下了極為深刻的印象。使我在這次畢業設計中學到了許多知識。
在整個課題的研究和設計過程中,還得到了其他院系和實驗室的老師們的幫助和支持,在我設計時遇到困難時,他們給予了我不少的幫助和鼓勵,再次表示誠摯的感謝。正是由于他們的幫助,才使這次設計能順利的完成。
此外,我還要特別感謝大學四年里的老師和同學,感謝我們系的全體老師以及所有關心我,幫助我,鼓勵我的人,沒有你們的無私幫助,我是很難完成我的畢業設計的,謝謝你們。
參考文獻
[1] 康華光,《電子技術基礎.數字部分(第四版)》[M],北京:高等教育出版社,2003.
[2] 李廣弟,《單片機基礎》[M],北京:北航出版社,2001.
[3] 梁超,一款基于單片機技術的電子搶答器[J ],機電工程技術,2005,34(1). [4] 李朝青,單片機原理及接口技術[M],北京:北京航空航天大學出版社,1999. [5] 齊向東,多功能數字顯示搶答器[J ].黃石高等專科學院學報,1996.
附錄
附錄1數字搶答器原理圖
附錄2 AT89S52芯片主程序
#include
sbit P2_4=P2^4;///加1鍵 sbit P2_5=P2^5;//減1鍵 sbit P2_6=P2^6;//確認鍵 sbit P2_7=P2^7;//蜂鳴器
uchar a=20,b=0,c=0;unsigned
int gong=100,yi=100,er=100,san=100,si=100,wu=100,liu=100,qi=100,ba=100;//8組得分變量
uchar disp[]={0,0,0,0};//四個顯示單元
uchar dispbit[]={0xfe,0xfd,0xfb,0xf7};//數碼管掃描代碼 uchar dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf};//共陽數碼管數字代碼
//------------------------數碼管顯示子程序
void display(void){ uchar i,j;disp[3]=b;//求得四個單元值 disp[2]=10;disp[1]=a/10;disp[0]=a%10;for(i=0;i<4;i++)//循環四次送四個單元供顯示 { P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //--------------void display1(void){ uchar i,j;disp[3]=b;disp[2]=gong/100;disp[1]=gong%100/10;disp[0]=gong%100%10;for(i=0;i<4;i++){ P0=dispcode[disp[i]];P2=dispbit[i];for(j=0;j<255;j++);} } //------------中斷定時50ms子程序 void t0(void)interrupt 1 using 1 { c++;TH0=0x3c;//定時器0附初值 TL0=0xb0;} //--------------------------void main(void){unsigned int d;//條件判斷,用于第一個人按到后,后面的人再按不管用.TMOD=0x01;//用定時器定時50MS TH0=0x3c;//定時器0附初值 TL0=0xb0;ET0=1;EA=1;while(1){ P2_7=1;// display();if(c==20)// { c=0;a--;} if(P2_4==0)// { while(P2_4==0);// if(a==99){ a=0;a--;} a++;//} if(P2_5==0)//{ while(P2_5==0);if(a==0)a=100;a--;} if(P2_6==0)//蜂鳴器不響 一秒到,秒減1 加1鍵 松開鍵 定時加1 減1鍵 確認鍵 { while(P2_6==0);TR0=1;} if(a==0)//定時時間到報警一直響 { TR0=0;P2_7=0;} if(tj==1){ while(P2_6==1){ display1();if(P2_4==0){ while(P2_4==0);if(b==1)//加分
{ yi=yi+10;gong=yi;}
if(b==2){er=er+10;gong=er;}
if(b==3){san=san+10;gong=san;}
if(b==4){si=si+10;gong=si;}
if(b==5){wu=wu+10;gong=wu;}
if(b==6){liu=liu+10;gong=liu;}
if(b==7){qi=qi+10;gong=qi;}
if(b==8){ba=ba+10;gong=ba;}
} if(P2_5==0){while(P2_5==0);if(b==1){yi=yi-10;gong=yi;}//減分
if(b==2){er=er-10;gong=er;}
if(b==3){san=san-10;gong=san;}
if(b==4){si=si-10;gong=si;}
if(b==5){wu=wu-10;gong=wu;}
if(b==6){liu=liu-10;gong=liu;}
if(b==7){qi=qi-10;gong=qi;}
if(b==8){ba=ba-10;gong=ba;}
} }while(P2_6==0);tj=0;a=20,b=0;} if(tj==0){ switch(P1&0xff)//程序判斷是哪一組搶答 {case 0xef:b=5;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=wu;break;case 0xdf:b=6;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=liu;break;case 0xbf:b=7;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=qi;break;case 0x7f:b=8;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=ba;break;case 0xfe:b=1;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=yi;break;case 0xfd:b=2;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=er;break;case 0xfb:b=3;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=san;break;case 0xf7:b=4;TR0=0;P2_7=0;tj=1;for(d=0;d<10000;d++);gong=si;break;default: break;} } } }
第三篇:FPGA搶答器設計報告
Vb開辦上海電力學院
課程設計報告
信息工程系
搶答器設計報告
一、設計目的:
本課程的授課對象是電子科學與技術專業本科生,是電子類專業的一門重要的實踐課程,是理論與實踐相結合的重要環節。
本課程有助于培養學生的數字電路設計方法、掌握模塊劃分、工程設計思想與電路調試能力,為以后從事各種電路設計、制作與調試工作打下堅實的基礎
二、實驗器材和工具軟件:
PC機一臺、QuartusII軟件、DE2板。
三、設計內容:
(1)搶答器可容納四組12位選手,每組設置三個搶答按鈕供選手使
用。
(2)電路具有第一搶答信號的鑒別和鎖存功能。在主持人將系統復位并發出搶答指令后,蜂鳴器提示搶答開始,時顯示器顯示初始時間并開始倒計時,若參賽選手按搶答按鈕,則該組指示燈亮并用組別顯示器顯示選手的組別,同時蜂鳴器發出“嘀嘟”的雙音頻聲。此時,電路具備自鎖功能,使其它搶答按鈕不起作用。
(3)如果無人搶答,計時器倒計時到零,蜂鳴器有搶答失敗提示,主持人可以按復位鍵,開始新一輪的搶答。
(4)設置犯規功能。選手在主持人按開始鍵之前搶答,則認為犯規,犯規指示燈亮和顯示出犯規組號,且蜂鳴器報警,主持人可以終止搶答執行相應懲罰。
(5)搶答器設置搶答時間選擇功能。為適應多種搶答需要,系統設有10秒、15秒、20秒和3O秒四種搶答時間選擇功能。
四、設計具體步驟:
首先把系統劃分為組別判斷電路模塊groupslct,犯規判別與搶答信號判別電路模塊fgqd,分頻電路模塊fpq1,倒計時控制電路模塊djs,顯示時間譯碼電路模塊num_7seg模塊,組別顯示模塊showgroup模塊這六個模塊,各模塊設計完成后,用電路原理圖方法將各模塊連接構成系統。
各模塊功能及代碼:
1、組別判別模塊
(1)功能:可容納四組12位選手,每組設置三個搶答按鈕供選手使用。若參賽選手按搶答按鈕,則輸出選手的組別。此時,電路具
signal rst : std_logic;begin
h<=“0000” when(a=“000” and b=“000” and c=“000” and d=“000”)else
“0001” when(a/=“000” and b=“000” and c=“000” and d=“000”)else
“0010” when(a=“000” and b/=“000” and c=“000” and d=“000”)else
“0100” when(a=“000” and b=“000” and c/=“000” and d=“000”)else
“1000” when(a=“000” and b=“000” and c=“000” and d/=“000”)else
“0000”;process
begin
wait on clock until rising_edge(clock);
if clr='1' then
rst<='1';
g<=“0000”;
end if;
if h/=“0000” then
if rst='1' then
g<=h;
rst<='0';
end if;
end if;
end process;
end behave_groupslct;
2、犯規判別與搶答信號判別模塊
(1)功能:若參賽選手在主持人按開始鍵之后按搶答按鈕,則使該組指示燈亮并輸出選手的組別,同時蜂鳴器發出響聲。
選手在主持人按開始鍵之前搶答,則認為犯規,犯規指示燈亮并輸出犯規組號,且蜂鳴器報警。
(2)原理:c[3..0]接組別判別模塊的g[3..0],即此時c為按鍵組別的信息。go接主持人的“開始”按鍵。由于無論是在正常情況還是犯規情況下按下按鍵,都必須顯示按鍵的組別且蜂鳴器響,所以將c的值給hex以輸出按鍵組別,且在有按鍵按下(c/=“0000”)時輸出fm為‘1’,否則為‘0’。若在開始之前有按鍵按下時,即go='0'且c/=“0000”,輸出ledfg為‘1’,否則為‘0’。若在開始之后有按鍵按下,將c的值給led,使該組指示燈亮,開始之前led輸出“0000”。
(3)程序代碼:
library ieee;
use ieee.std_logic_1164.all;
entity fgqd is port(c:in std_logic_vector(3 downto 0);
go:in std_logic;
hex:out std_logic_vector(3 downto 0);
led:out std_logic_vector(3 downto 0);
ledfg,fm:out std_logic);
end fgqd;
architecture behave_fgqd of fgqd is begin);end djs;
architecture behave_djs of djs is begin
process(clock,aclr,s)
begin
if(aclr='1')then
if(s=“00”)then
q<=“01010”;
elsif(s=“01”)then
q<=“01111”;
elsif(s=“10”)then
q<=“10100”;
else
q<=“11110”;
end if;
else
if rising_edge(clock)then
if en='1' then
q<=q-1;
if(q=“00000” and grpsl=“0000”)then
time0<='1';
else
time0<='0';
end if;
end if;
end if;
end if;
end process;end behave_djs;
4、分頻器模塊
(1)功能:實現50MHz—1Hz的分頻,為倒計時模塊提供時鐘。
(2)程序代碼
library ieee;
use ieee.std_logic_1164.all;
entity fpq1 is port(clkin :in std_logic;
clkout:out std_logic);end fpq1;
architecture behave_fpq1 of fpq1 is constant N: Integer:=24999999;signal Counter:Integer RANGE 0 TO N;signal Clk: Std_Logic;begin
process(clkin)
begin
if rising_edge(clkin)then--每計到N個(0~n-1)上升沿,輸出信號翻轉一次
if Counter=N then
Counter<=0;
Clk<=NOT Clk;
else
Counter<= Counter+1;
end if;
end if;
end process;clkout<= Clk;end behave_fpq1;
5、時間顯示譯碼器
(1)功能:將時間信息在7段數碼管上顯示。
(2)程序代碼
library ieee;
use ieee.std_logic_1164.all;
entity num_7seg is port(c:in std_logic_vector(4 downto 0);
hex:out std_logic_vector(13 downto 0));
end num_7seg;
architecture behave_num_7seg of num_7seg is begin
with c(4 downto 0)select
hex<= “10000001000000” when “00000” ,--“0”
“10000001111001” when “00001” ,--“1”
“10000000100100” when “00010” ,--“2”
“10000000110000” when “00011” ,--“3”
“10000000011001” when “00100” ,--“4”
“10000000010010” when “00101” ,--“5”
“10000000000010” when “00110” ,--“6”
“10000001111000” when “00111” ,--“7”
“10000000000000” when “01000” ,--“8”
“10000000010000” when “01001” ,--“9”
“11110011000000” when “01010” ,--“10”
“11110011111001” when “01011” ,--“11”
“11110010100100” when “01100” ,--“12”
“11110010110000” when “01101” ,--“13”
“11110010011001” when “01110” ,--“14”
“11110010010010” when “01111” ,--“15”
“11110010000010” when “10000” ,--“16”
“11110011111000” when “10001” ,--“17”
“11110010000000” when “10010” ,--“18”
“11110010010000” when “10011” ,--“19”
“01001001000000” when “10100” ,--“20”
“01001001111001” when “10101” ,--“21”
“01001000100100” when “10110” ,--“22”
“01001000110000” when “10111” ,--“23”
“01001000011001” when “11000” ,--“24”
“01001000010010” when “11001” ,--“25”
“01001000000010” when “11010” ,--“26”
“01001001111000” when “11011” ,--“27”
來。然后就是將選出的組別鎖存。將按下按鍵的組別賦給一內部信號“h”(沒有按鍵按下時h=“0000”),當復位鍵按下時(clr=‘1’)輸出g=“0000”并且將另一內部信號rst置1。當復位后(rst=‘1’)有按鍵按下時將h的值給輸出信號g,并且將標志信號rst清零。這樣就實現最快按鍵組別鎖存功能。
六、心得體會
通過此次設計,我掌握了數字電路的設計方法,尤其是模塊劃分、工程設計思想與電路調試能力,都有了一定的提高。為以后從事各種電路設計、制作與調試工作打下堅實的基礎。
第四篇:基于aduino的搶答器設計
/*
QIANG DA QI
disigned by ckj
2012/12/8
*/
int d[4]={7,12,2,6};//shuju
boolean ds[4]={0,0,0,0};//si ge jie kou de shuju
int lt=3;//ceshi shuruduan
int bi=4;//xiaoyin duankou
int le=5;//suoding kongzhiduan
int xuanshou[9]={0,A0,A1,A2,A3,A4,A5,8,9};//xuanshou int fuwei=10;
int zhishideng=11;//zhishideng
int fengmingqi=13;//xiang
/*************************************/
void shuchushezhi()//shezhi duankou wei shuchu {
int i(0);
for(i=0;i<=3;i++)
pinMode(d[i],OUTPUT);//sige shujuduan zhiwei shuchupinMode(bi,OUTPUT);//xiaoyin
pinMode(le,OUTPUT);//suocun
pinMode(lt,OUTPUT);//dnegceshiduan
pinMode(zhishideng,OUTPUT);
pinMode(fengmingqi,OUTPUT);
}
/*************************************/
void shurushezhi()//shezhi shuchu duankou
{
int i(0);
for(i=0;i<=7;i++)//shezhi xuanshou wei shuchupinMode(xuanshou[i],INPUT);
pinMode(fuwei,INPUT);//fuwei
}
/*************************************/
{
int i(0);
digitalWrite(le,LOW);
digitalWrite(bi,HIGH);//quxiao xiaoyin
digitalWrite(lt,HIGH);//shumaguan quanliang
for(i=0;i<=3;i++)
{
digitalWrite(d[i],ds[i]);
}
delay(200);
digitalWrite(bi,LOW);//xiaoyindelay(200);
digitalWrite(bi,HIGH);//quxiao xiaoyin
digitalWrite(lt,HIGH);//quxiao quanliang
}
/*************************************/
void zhuanhuan(int i)//shijinzhi zhuan erjinzhi bing shuchu shuju
{
switch(i)
{
case 0:
ds[0]=0;
ds[1]=0;
ds[2]=0;
ds[3]=0;
break;
case 1:
ds[0]=1;
ds[1]=0;
ds[2]=0;
ds[3]=0;
break;
case 2:
ds[0]=0;
ds[1]=1;
ds[2]=0;
ds[3]=0;
break;
case 3:
ds[0]=1;
ds[1]=1;
ds[2]=0;
break;
case 4:
ds[0]=0;
ds[1]=0;
ds[2]=1;
ds[3]=0;
break;
case 5:
ds[0]=1;
ds[1]=0;
ds[2]=1;
ds[3]=0;
break;
case 6:
ds[0]=0;
ds[1]=1;
ds[2]=1;
ds[3]=0;
break;
case 7:
ds[0]=1;ds[1]=1;ds[2]=1;ds[3]=0;
break;
case 8:
ds[0]=0;
ds[1]=0;
ds[2]=0;
ds[3]=1;
break;
default:
break;
}
int j;
for(j=0;j<=3;j++)
{
digitalWrite(d[j],ds[j]);//shujuduan xieru shuju
}
}
/*************************************/
void xianshi(int i)//shezhixianshihanshu
{
boolean f(0);//shezhi yi ge biaozhi bianliang
digitalWrite(le,LOW);//suocun bu gongzuo
digitalWrite(fengmingqi,HIGH);//fengmingqi gongzuo
zhuanhuan(i);//diaoyong zhuanhuan hanshu
digitalWrite(le,HIGH);//suocun
delay(200);//yanshi 200 haomiao
digitalWrite(zhishideng,HIGH);//zhishidengliang
digitalWrite(fengmingqi,LOW);//fengmingqi guanbi
while(!f)//meiyou an fuwei jianshi yizhi xunhuan
{
f=digitalRead(fuwei);
if(f)//fangzhidoudong
{
delay(10);
f=digitalRead(fuwei);
if(f)//fuwei jian anxia
{
digitalWrite(le,LOW);//guandiaosuocun
digitalWrite(zhishideng,LOW);//guandiao zhishi deng
zhuanhuan(0);//xianshi0
break;//likai xunhuan
}
}
}
}
/*************************************/
void setup()
{
shuchushezhi();//shuchu chushihua
shurushezhi();//shuru chushihua
ceshi();//ceshi yixia shumaguan
}
/*************************************/
void loop()
{
boolean flag(0);//shezhi yige biaozhi bianliang
int i(0);//shezhi yi ge zhongjian bianliang
for(i=1;i<=8;i++)
{
flag=digitalRead(xuanshou[i]);//jiancha shi fou you xuanshou anxia jianif(flag)//ruguo youren an anjian
{
delay(10);
flag=digitalRead(xuanshou[i]);//fangzhi doudong
if(flag)//ruguo zhende anxiaqule
{
xianshi(i);//xianshi bing sucun
}
else//bushi dehua flagbianwei 0
{
flag=0;//biaoshi bian wei 0;
}
}
}
}
第五篇:搶答器設計心得
回顧上一周課程設計的時間,收獲了很多,也付出了很多,周一至周二主要熟悉ewb軟件的操作使用,學會仿真,周三至周四是看書查找資料,對相關元器件做一些了解,并把元器件布好線,以待焊接,周五至周六主要是焊接與調試,由于我底子薄弱了一點,剛開始可能會有一點害怕,害怕失敗,因為上一次做收音機都不成功,雖說認真努力的做了,但看到舍友們都找資料在桌面上仿真,我也不甘示弱,并認真的去查找資料,在桌面上仿真,布線,焊接等一步一步的慢慢的走過來,當我看到搶答器正常工作時,興奮不已,給了我自信和勇氣,希望以后能有更多的時間和機會和同學一起動手做一些產品出來,不僅提高我們的動手能力,而且鞏固了平常所學的知識,通過我們自己去查找總結印象更深刻,與此同時,增進了我們同學之間的友誼,也許某年后的一天看到自己的搶答器,一定會想起我的搭檔和一起合作的時間。
在這幾天中,體會到了團結協作的重要性和樂趣,有什么問題很想法拿出來一起探討與分享,將會有更好的答案,活躍了一個人的思維,豐富了我們的頭腦,學會去接受別人,肯定別人,同樣也得到了別人的尊重與肯定,除了討論之外,還需積極獨立思考,唯獨通過自己的獨立思考,才能解決相關問題,才能提高對專業知識的熟悉程度,以后才能學會用,同樣這也是我該努力的兩個方向。
我不敢說以后一定要學得怎么樣,至少現在懂得一定要善于觀察,積極思考,態度認真,堅持到底做好每一件事,同樣對待身邊的每個人。
有時會感覺這些并不是我自己摸索到的,而是老師您在教學中無形傳授給我們的,雖然我現在學得不怎么樣,但我不怕失敗,并勇敢地走下去。
搶答器設計心得(2):
一、設計目的:
比賽中為了準確、公正、直觀地判斷出第一搶答者,所設計的搶答器通常由數碼顯示、燈光、音響等多種手段指示出第一搶答者。同時還應設計記分、犯規和獎懲記錄等多種功能。
設計一四人搶答器,具體要求:當主持人宣布開始時,一旦有任何參賽者最先按下按鈕,則此參賽者對應的指示燈點亮,而其余三個參賽者的按鈕將不起作用,信號也不再被輸出,直到主持人宣布下一輪搶答開始為止。
二、設計任務:
1、基本部分:
(1)搶答氣可供四組使用,組別鍵號可以鎖存;搶答指示用發光二極管(led)。
(2)記分部分獨立(不受組別信號控制),至少用2位二組數碼管指示,步進有10分,5分兩種選擇,并且具有預置、遞增、遞減功能。
(3)要求可靠性,操作簡便。
2、發揮部分:
(1)增加搶答路數。
(2)數碼管顯示組別鍵號。
(3)自動記分:當主持人分別按步進得分鍵,遞增鍵或遞減鍵后能夠將分值自動累計在某組記分器上。
(4)超時報警。
(5)其他。
3、分析各部分工作原理,繪制電路圖,撰寫設計報告。
三、設計內容:
1、儀器設備及元件:
電工學實驗臺、集成電路74ls175、74ls20、74ls00,蜂鳴器,電源、邏輯電平顯示等。
2、操作步驟:
圖示是四人(組)參加智力競賽的搶答電路,電路中的主要器件是74ls175型四上升沿d觸發器,它的清零端和時鐘脈沖是四個d觸發器公用的。
(1)按照電路圖連接電路。
(2)搶答前先清零,q1-q4均為0,相應的發光二極管led都不亮;q1-q4均為1,與非門g1輸出為0,揚聲器不響。同時,g2輸出為1,將g3開通,時鐘脈沖cp可以經過g3進入d觸發器的cp端。此時,由于s1-s4均未按下,d1-d4均為0,所以觸發器的狀態不變。
(3)搶答開始,若s1首先被按下,d1和q1均變為1,相應的發光二極管亮;q1變為0,g1的輸出為1,揚聲器響。同時g2輸出為0,將g3關斷,時鐘脈沖cp便不能經過g3進入d觸發器。由于沒有時鐘脈沖,因此再接著按其他按鈕,就不起作用了,觸發器的狀態不會改變。
(4)搶答判決完畢,清零,準備下次搶答用。
四、設計心得:
電子課程設計是本學期中唯一的一門課程設計,我們理所當然的要認真對待,本次設計我選擇的是數字智力競賽搶答器的設計,這個課題用到了數字電路方面的知識,通過這次課程設計,使我對與非門以及集成電路有了一定的了解,對課本上的知識有了近一步的掌握。
完成本次課程設計的過程,是一個從無到有的過程,因為以前沒有過類似的課程設計,所以起初不知該從何下手,后來仔細閱讀設計的題目和要求,閱讀設計指導書,再到圖書館和網上查找資料,總算是有點眉目了。
知道了如何下手,后面的工作就容易一些了,萬事開頭難啊,和同學們在一起,不明白的地方可以隨時問,互相幫助,完成課程設計,這樣的一段經歷,或許是我在完成課程設計的同時,收獲的一份財富。
埋頭苦干的過程是苦澀的,在書山中查找資料的過程是疲倦的,但當課程設計完成時,那感覺是甜蜜的,沒有耕耘,哪來得收獲的喜悅,不懂付出怎么能知道回報的快樂,一分耕耘一分收獲,有付出才會有回報,就在這樣的痛與快樂的交換中,我學到了知識,學到了道理,學到了做人的道理。