PPT文檔:
仿真:
以上壓縮包所有資料下載:
八路搶答器單片機(jī)課程設(shè)計(jì).rar
(168.9 KB, 下載次數(shù): 219)
2016-4-7 03:00 上傳
點(diǎn)擊文件名下載附件
侯從彬;呂衛(wèi)偉;劉艷平;朱強(qiáng) 實(shí)驗(yàn)要求: 1: 兩個(gè)兩位的數(shù)碼管, 一個(gè)用來(lái)顯示倒計(jì)時(shí)時(shí)間, 一個(gè)用來(lái)顯示選手的編號(hào)。 2: 主持人控制兩個(gè)按鍵K1-K2: 功能鍵K1:搶答開(kāi)始,開(kāi)始倒時(shí),揚(yáng)聲器響。 功能鍵K2: 功能1:清除顯示(時(shí)間從倒計(jì)時(shí)的最大時(shí)間開(kāi)始,選手編號(hào)顯示清零); 功能2:設(shè)置倒計(jì)時(shí)的時(shí)間。 八位選手各控制一鍵,待主持人按下開(kāi)始鍵后,第一個(gè)按下?lián)尨疰I的選手的編號(hào)將被顯示。揚(yáng)聲器停,其他鍵均被屏蔽,至到主持人再次按下開(kāi)始鍵。 實(shí)驗(yàn)?zāi)K分析: - 數(shù)碼管的使用:
共陰極:
(1) 位選端: 置數(shù)功能 P00…P07 輸入 | 0X3F | 0X06 | 0X5B | 0X4F | 0X66 | 0X6D | 0X7D | 0X07 | 0X7F | 0X6F | 顯示 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
(2) 段選端: 控制功能 D0..D1; D0=0 啟動(dòng)置數(shù); D0=1 停止置數(shù); 例如:置D0=0;P0=0X3F; 則數(shù)碼管顯示數(shù)字 0 2 . 本實(shí)驗(yàn)需要兩個(gè)數(shù)碼管同時(shí)顯示,實(shí)際上是達(dá)不到同時(shí)顯示的;但可以利用“視覺(jué)暫留效應(yīng)”達(dá)到此效果; 同時(shí)也要考慮到消除數(shù)碼管顯示抖動(dòng)現(xiàn)象; 這就需要實(shí)驗(yàn)者熟練應(yīng)用 delay() 延時(shí)函數(shù); d1=0; P0=tab[num/10];//倒計(jì)時(shí)控制 delay(5); d1=1; d2=0; P0=tab[num%10]; delay(5); d2=1; 其中的 delay(5) 就是為了達(dá)到一上所敘述的目的 <二>、 蜂鳴器:
只要在BUZ 端接地即可鳴叫。 <二、程序框圖> 主函數(shù):
實(shí)物圖連接:
P1口接8選手開(kāi)關(guān),在ZK1 ZK2為主持人開(kāi)關(guān),功能與題目要求一樣 P0 口為數(shù)碼管位選 。 注意:P0口使用時(shí)必須接上拉電阻否則為高阻態(tài) 。 P2口的分別用作主持人開(kāi)關(guān)(P2^0、P2^1)兩數(shù)碼管段選(P2^4...P2^7); 實(shí)驗(yàn)程序分析: #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define max 20 uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,}; sbit d1=P2^4;//**************段選 sbit d2=P2^5; sbit x1=P2^6; sbit x2=P2^7; sbit k1=P1^0;//*********************八位選手開(kāi)關(guān) sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit k5=P1^4; sbit k6=P1^5; sbit k7=P1^6; sbit k8=P1^7; sbit zk1=P2^0;//*****************************主持人開(kāi)關(guān)zk1 zk2 sbit zk2=P2^1; sbit buz=P2^2;//*******************蜂鳴器 uchar num,aa; uchar f,flag; void jianpan(); void init(void) { TMOD=0X01;//***************T0,模式1,定時(shí) TL0=0XB0; //********************定時(shí)50ms TH0=0X3C; ET0=1; //**************開(kāi)中斷 EA=1; num=max;//置倒計(jì)時(shí)計(jì)數(shù)初值 } void delay(uint xms) { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } /********************************************** 倒計(jì)時(shí) 選手號(hào)顯示函數(shù) **********************************************/ void display() {d1=0; //控制開(kāi)始置數(shù) P0=tab[num/10];//倒計(jì)時(shí)控制取最高位 delay(5); d1=1; //停止置數(shù)操作 d2=0; P0=tab[num%10];//倒計(jì)時(shí)取最低位 delay(5); d2=1; x1=0; //控制開(kāi)始置數(shù) P0=tab[flag/10];//選手號(hào)控制 delay(5); x1=1; //停止置數(shù)操作 x2=0; P0=tab[flag%10]; delay(5); x2=1; } /**********************************************************主函數(shù)部分 **********************************************************/void main() { init(); while(1) { jianpan();display();} } /*************************************** 中斷控制倒計(jì)時(shí) *************************************/ void timer0(void) interrupt 1 { TL0=0XB0; //******重裝初值,定時(shí)50ms TH0=0X3C; aa++; if(aa==20)//**********************************1秒到了 { aa=0;//**************************************計(jì)數(shù)清零 num--; if(num==0)//倒計(jì)時(shí)為0時(shí)迅速變?yōu)?/span>初值同時(shí)關(guān)中斷停止倒計(jì)時(shí) { num=max; TR0=0; } buz=0;//***************要求蜂鳴器響 delay(20);//**************************蜂鳴器響,特別注意時(shí)間為一秒buz=1; } } /************************************************** 按鍵控制 程序的核心部分 ****************************************************/ void jianpan() { if(zk1==0&flag=0) { delay(5);//消除數(shù)碼管抖動(dòng)操作 flag=0;//數(shù)碼管顯示0 display(); TR0=1;//ZK1鍵按下,開(kāi)中斷以此控制:只有當(dāng)此鍵按下時(shí)才搶答 } if(zk2==0&&TR0==0)//注意這里要求TR0=0; { delay(5);//消除抖動(dòng) if(zk2==0&&TR0==0) if(flag==0) {num--;buz=0;delay(20);buz=1;} if(num==0) num=max; if(flag!=0)//ZK2鍵清零操作 { flag=0; num=max;//倒計(jì)時(shí)顯示最大值 TR0=0;//注意此時(shí)關(guān)中斷,不再進(jìn)行倒計(jì)時(shí) buz=0; delay(20); buz=1; } while(!zk2)//倒計(jì)時(shí)中ZK2 鍵不可影響 display(); } /**********************************************************TR0控制搶答先后順序 *********************************************************/ if(k1==0&&TR0==1)//注意此時(shí)TR0=1才執(zhí)行以下按鍵操作 { buz=0; delay(20); buz=1; delay(5); flag=1; TR0=0;//此鍵按下關(guān)中斷,其他選手按鍵不再受影響 display(); } /************************************* 以下原理相同 *************************************/ if(k2==0&&TR0==1) { buz=0;delay(20);buz=1; delay(5); flag=2; TR0=0; display(); } if(k3==0&&TR0==1) { buz=0;delay(20);buz=1; delay(5); flag=3; TR0=0; display(); } if(k4==0&&TR0==1) { buz=0;delay(20);buz=1; delay(5); flag=4; TR0=0; display(); } if(k5==0&&TR0==1) { delay(5); flag=5; TR0=0; display(); } if(k6==0&&TR0==1) { buz=0;delay(20);buz=1; delay(5); flag=1; TR0=0; display(); } if(k7==0&&TR0==1) { buz=0;delay(20); buz=1; delay(5); flag=7; TR0=0; display(); } if(k8==0&&TR0==1) { buz=0;delay(20); buz=1; delay(5); flag=8; TR0=0; display(); } } (1). 此實(shí)驗(yàn)最大的特點(diǎn)便是中斷的巧妙應(yīng)用 另外要注意延遲函數(shù)對(duì)數(shù)碼管顯示效果的影響 (2). 控制選手先后順序時(shí),設(shè)置了兩個(gè)條件:按鍵和TR0, 而TR0則是控制關(guān)鍵,也是主持人按鍵控制的關(guān)鍵 |