PPT文檔:
2.png (103.97 KB, 下載次數: 182)
下載附件
2016-4-7 02:59 上傳
仿真:
1.png (33.91 KB, 下載次數: 162)
下載附件
2016-4-7 02:59 上傳
0.png (41.59 KB, 下載次數: 154)
下載附件
2016-4-7 02:59 上傳
以上壓縮包所有資料下載:
八路搶答器單片機課程設計.rar
(168.9 KB, 下載次數: 219)
2016-4-7 03:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
侯從彬;呂衛偉;劉艷平;朱強 實驗要求: 1: 兩個兩位的數碼管, 一個用來顯示倒計時時間, 一個用來顯示選手的編號。 2: 主持人控制兩個按鍵K1-K2: 功能鍵K1:搶答開始,開始倒時,揚聲器響。 功能鍵K2: 功能1:清除顯示(時間從倒計時的最大時間開始,選手編號顯示清零); 功能2:設置倒計時的時間。 八位選手各控制一鍵,待主持人按下開始鍵后,第一個按下搶答鍵的選手的編號將被顯示。揚聲器停,其他鍵均被屏蔽,至到主持人再次按下開始鍵。 實驗模塊分析: - 數碼管的使用:
共陰極:
1.001.jpg (20.62 KB, 下載次數: 166)
下載附件
2016-4-7 03:08 上傳
(1) 位選端: 置數功能 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 啟動置數; D0=1 停止置數; 例如:置D0=0;P0=0X3F; 則數碼管顯示數字 0 2 . 本實驗需要兩個數碼管同時顯示,實際上是達不到同時顯示的;但可以利用“視覺暫留效應”達到此效果; 同時也要考慮到消除數碼管顯示抖動現象; 這就需要實驗者熟練應用 delay() 延時函數; d1=0; P0=tab[num/10];//倒計時控制 delay(5); d1=1; d2=0; P0=tab[num%10]; delay(5); d2=1; 其中的 delay(5) 就是為了達到一上所敘述的目的 <二>、 蜂鳴器:
1.002.jpg (7.77 KB, 下載次數: 189)
下載附件
2016-4-7 03:08 上傳
只要在BUZ 端接地即可鳴叫。 <二、程序框圖> 主函數:
實物圖連接:
1.014.jpg (33.6 KB, 下載次數: 177)
下載附件
2016-4-7 03:08 上傳
P1口接8選手開關,在ZK1 ZK2為主持人開關,功能與題目要求一樣 P0 口為數碼管位選 。 注意:P0口使用時必須接上拉電阻否則為高阻態 。 P2口的分別用作主持人開關(P2^0、P2^1)兩數碼管段選(P2^4...P2^7); 實驗程序分析: #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;//*********************八位選手開關 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;//*****************************主持人開關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,定時 TL0=0XB0; //********************定時50ms TH0=0X3C; ET0=1; //**************開中斷 EA=1; num=max;//置倒計時計數初值 } void delay(uint xms) { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } /********************************************** 倒計時 選手號顯示函數 **********************************************/ void display() {d1=0; //控制開始置數 P0=tab[num/10];//倒計時控制取最高位 delay(5); d1=1; //停止置數操作 d2=0; P0=tab[num%10];//倒計時取最低位 delay(5); d2=1; x1=0; //控制開始置數 P0=tab[flag/10];//選手號控制 delay(5); x1=1; //停止置數操作 x2=0; P0=tab[flag%10]; delay(5); x2=1; } /**********************************************************主函數部分 **********************************************************/void main() { init(); while(1) { jianpan();display();} } /*************************************** 中斷控制倒計時 *************************************/ void timer0(void) interrupt 1 { TL0=0XB0; //******重裝初值,定時50ms TH0=0X3C; aa++; if(aa==20)//**********************************1秒到了 { aa=0;//**************************************計數清零 num--; if(num==0)//倒計時為0時迅速變為初值同時關中斷停止倒計時 { num=max; TR0=0; } buz=0;//***************要求蜂鳴器響 delay(20);//**************************蜂鳴器響,特別注意時間為一秒buz=1; } } /************************************************** 按鍵控制 程序的核心部分 ****************************************************/ void jianpan() { if(zk1==0&flag=0) { delay(5);//消除數碼管抖動操作 flag=0;//數碼管顯示0 display(); TR0=1;//ZK1鍵按下,開中斷以此控制:只有當此鍵按下時才搶答 } if(zk2==0&&TR0==0)//注意這里要求TR0=0; { delay(5);//消除抖動 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;//倒計時顯示最大值 TR0=0;//注意此時關中斷,不再進行倒計時 buz=0; delay(20); buz=1; } while(!zk2)//倒計時中ZK2 鍵不可影響 display(); } /**********************************************************TR0控制搶答先后順序 *********************************************************/ if(k1==0&&TR0==1)//注意此時TR0=1才執行以下按鍵操作 { buz=0; delay(20); buz=1; delay(5); flag=1; TR0=0;//此鍵按下關中斷,其他選手按鍵不再受影響 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). 此實驗最大的特點便是中斷的巧妙應用 另外要注意延遲函數對數碼管顯示效果的影響 (2). 控制選手先后順序時,設置了兩個條件:按鍵和TR0, 而TR0則是控制關鍵,也是主持人按鍵控制的關鍵 |