看看吧非常全的資料
8路搶答器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (19.25 KB, 下載次數(shù): 313)
下載附件
2017-7-13 02:27 上傳
1、各單元電路模塊功能1.1時(shí)鐘電路模塊時(shí)鐘電路由一個(gè)晶體振蕩器12MHZ和兩個(gè)22pF的瓷片電容組成。時(shí)鐘電路用于產(chǎn)生單片機(jī)工作所需的時(shí)鐘信號(hào),而時(shí)序所研究的是指令執(zhí)行中各信號(hào)之間的相互關(guān)系。單片機(jī)本身就是一個(gè)復(fù)雜的同步時(shí)序電路,為了保證同步工作方式的實(shí)現(xiàn),電路應(yīng)在唯一的時(shí)鐘信號(hào)控制下嚴(yán)格地工作。其電路如圖3.4所示:
1.001.jpg (13.75 KB, 下載次數(shù): 231)
下載附件
2017-7-13 02:30 上傳
圖3.4 時(shí)鐘電路模塊 1.2復(fù)位電路模塊 電容在上接高電平,電阻在下接地,中間為RST。這種復(fù)位電路為高電平復(fù)位。其工作原理是:通電時(shí),電容兩端相當(dāng)于是短路,于是RST引腳上為高電平,然后電源通過電阻對(duì)電容充電,RST端電壓慢慢下降,降到一定程度,即為低電平,單片機(jī)開始正常工作。其電路如圖3.5所示:
1.002.jpg (8.25 KB, 下載次數(shù): 213)
下載附件
2017-7-13 02:30 上傳
圖3.5 復(fù)位電路模塊 1.3主控制系統(tǒng)模塊/最小系統(tǒng)主控制器采用STC89C52RC,STC89C52RC 單片機(jī)是宏晶科技推出的新一代高速/低功耗/超強(qiáng)抗干擾的單 片機(jī),指令代碼完全兼容傳統(tǒng) 8051 單片機(jī),12 時(shí)鐘/機(jī)器周期和 6 時(shí)鐘/機(jī)器周 期可以任意選擇。 其特點(diǎn)如下: 1. 增強(qiáng)型 8051 單片機(jī),6 時(shí)鐘/機(jī)器周期和 12 時(shí)鐘/機(jī)器周期可以任 意選擇,指令代碼完全兼容傳統(tǒng) 8051. 2. 工作電壓:5.5V~3.3V(5V 單片機(jī))/3.8V~2.0V(3V 單片機(jī)) 3. 工作頻率范圍:0~40MHz,相當(dāng)于普通 8051 的 0~80MHz,實(shí)際工 作頻率可達(dá) 48MHz 4. 用戶應(yīng)用程序空間為 8K 字節(jié) 5. 片上集成 512 字節(jié) RAM 6. 通用 I/O 口 (32 個(gè)) 復(fù)位后為: , P1/P2/P3/P4 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需加上拉電阻。 7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程) ,無需專用編程器,無 需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數(shù)秒即可完成一片 8. 具有 EEPROM 功能 9. 具有看門狗功能 10. 共 3 個(gè) 16 位定時(shí)器/計(jì)數(shù)器。即定時(shí)器 T0、T1、T2 11. 外部中斷 4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒 12. 通用異步串行口(UART) ,還可用定時(shí)器軟件實(shí)現(xiàn)多個(gè) UART 13. 工作溫度范圍:-40~+85℃(工業(yè)級(jí))/0~75℃(商業(yè)級(jí)) 14. DIP 封裝
1.003.jpg (63.2 KB, 下載次數(shù): 234)
下載附件
2017-7-13 02:30 上傳
1.4顯示電路
1.004.jpg (46.64 KB, 下載次數(shù): 223)
下載附件
2017-7-13 02:30 上傳
四位共陰極數(shù)碼管顯示。數(shù)據(jù)接P0口加上拉電阻驅(qū)動(dòng)。段接P2.0 P2.1 P2.2,因?yàn)槭枪碴帢O的所以不需要加驅(qū)動(dòng)模塊。 1.5 報(bào)警電路
1.005.jpg (25.06 KB, 下載次數(shù): 211)
下載附件
2017-7-13 02:30 上傳
Q1:9013,PNP三極管,單片機(jī)IO口輸出0時(shí)蜂鳴器響,輸出1時(shí)蜂鳴器不響。 1.6電源模塊本設(shè)計(jì)有兩種供電方式,一種是,電池供電,另一種是usb供電。
1.006.jpg (67.85 KB, 下載次數(shù): 226)
下載附件
2017-7-13 02:30 上傳
1.7 按鍵輸入電路
1.007.jpg (24.39 KB, 下載次數(shù): 240)
下載附件
2017-7-13 02:30 上傳
上面從左到右:開始 暫停 服務(wù) 下面從左到右:1號(hào) 2號(hào) 3號(hào) 4號(hào) 5號(hào) 6號(hào) 7號(hào) 8號(hào)
單片機(jī)源程序如下:
- #include
- #include
- sbit smg1=P2^4; //定義數(shù)碼管第一位
- sbit smg2=P2^6; //定義數(shù)碼管第二位
- sbit smg3=P2^7; //定義數(shù)碼管第三位
- sbit smg4=P2^5;
- sbit keyks=P2^2; //定義開始按鍵
- sbit keytz=P2^1; //定義停止按鍵
- sbit keyqc=P2^0; //定義清除按鍵
- sbit key1=P1^4; //定義1號(hào)搶答選手 sbit
- sbit key2=P1^5; //定義2號(hào)搶答選手
- sbit key3=P1^6; //定義3號(hào)搶答選手
- sbit key4=P1^7; //定義4號(hào)搶答選手
- sbit key5=P3^4; //定義5號(hào)搶答選手
- sbit key6=P3^5; //定義6號(hào)搶答選手
- sbit key7=P3^6; //定義7號(hào)搶答選手
- sbit key8=P3^7; //定義8號(hào)搶答選手
- sbit spk=P1^0; //定義蜂鳴器
- int djs=60,js=0; //djs和bt是初始倒計(jì)時(shí)時(shí)間,可修改
- unsigned char flag=0;
- //int table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- int table[]={0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7,0x80};
- void delayms(int x) //延時(shí)函數(shù)
- {
- char i;
- while(x--)
- {
- for(i=500;i>0;i--);
- }
- }
-
- void Timer0_init() //定時(shí)器0初始化
- {
- js=0;
- TMOD=0x01; //T0為定時(shí)器方式1
- TH0=60;
- TL0=176;
- //TR0=1;//IT1=1;
- ET0=1;//EX1=1;
- EA=1;
- }
- void timer0() interrupt 1 using 1 //定時(shí)器0中斷服務(wù)函數(shù)
- {
- TF0=0;
- TH0=60;
- TL0=176; //賦初值
- js++;
- if(flag==1)
- {
- if(js<8)
- spk=0;
- else spk=1;
- }
- if(js==20)
- { js=0;
- djs--; //產(chǎn)生1s的倒計(jì)時(shí)
- }
- }
- void djsxs() //顯示倒計(jì)時(shí)函數(shù)
- { int b1,b2;
- b1=djs/10;
- b2=djs%10; // 將倒計(jì)時(shí)時(shí)間分成高低位
- P0=table[b1];
- smg2=0;
- delayms(3);
- smg2=1; //顯示十位數(shù)字
- P0=table[b2];
- smg3=0;
- delayms(3); //顯示個(gè)位數(shù)字
- smg3=1;
- }
- void djsxs30() //第二位數(shù)碼管顯示-
- {
- P0=0x80; //第二位數(shù)碼管
- smg4=0;
- delayms(3);
- smg4=1;
- }
- void djsxs22()
- {
- P0=0x80;
- smg1=0;
- delayms(3);
- smg1=1;
- //第一位數(shù)碼管顯示-
- P0=0x80; //第二位數(shù)碼管
- smg4=0;
- delayms(3);
- smg4=1;
-
- P0=0x80;
- smg2=0;
- delayms(3); //第三位數(shù)碼管顯示-
- smg2=1;
- P0=0x80;
- smg3=0;
- delayms(3);
- smg3=1; //第四位數(shù)碼管顯示-
- }
- void djsxs1()
- {
- P0=table[1];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示1
- }
- void djsxs2()
- {
- P0=table[2];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示2
- }
- void djsxs3()
- {
- P0=table[3];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示3
- }
- void djsxs4()
- {
- P0=table[4];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示4
- }
- void djsxs5()
- {
- P0=table[5];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示5
- }
- void djsxs6()
- {
- P0=table[6];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示6
- }
- void djsxs7()
- {
- P0=table[7];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示7
- }
- void djsxs8()
- {
- P0=table[8];
- smg1=0;
- delayms(3);
- smg1=1; //第一位數(shù)碼管顯示8
- }
- void main()
- {
- int djs1=60;
- Timer0_init(); //初始化定時(shí)器中斷
- spk=1; //蜂鳴器不響
- djs=60; //倒計(jì)時(shí)賦值
- while(1)
- {
- LOOP1: djs=djs1;
- djsxs22(); //LOOP1是標(biāo)號(hào),顯示 - --
- if(key1==0) //在定時(shí)器運(yùn)行狀態(tài)下,key1==0 則說明1號(hào)選手按下按鍵
- {
- delayms(3);
- if(key1==0)
- {
- while(!key1); //去除按鍵抖動(dòng)后,重新在判斷,是否確實(shí)按下
- djs=60;
- while(1)
- {
- TR0=0; //定時(shí)器停止
- djsxs();
- if(key2==0) //復(fù)位按下按下
- {
- delayms(8); //去除抖動(dòng)
- if(key2==0) //再次判斷是否按下復(fù)位按鍵
- {
- do
- {
- while(!key2); //如果按下復(fù)位鍵,則回到- --狀態(tài)
- delayms(5);
- }
- while(key2!=1);
- djs++;
- djs1=djs;
- }
- }
- if(key3==0) //復(fù)位按下按下
- {
- delayms(8); //去除抖動(dòng)
- if(key3==0) //再次判斷是否按下復(fù)位按鍵
- {
- do
- {
- while(!key3); //如果按下復(fù)位鍵,則回到- --狀態(tài)
- delayms(5);
- }
- while(key3!=1);
- djs--;
- djs1=djs;
- }
- }
- if(key1==0) //復(fù)位按下按下
- {
- delayms(3); //去除抖動(dòng)
- if(key1==0) //再次判斷是否按下復(fù)位按鍵
- {
- while(!key1); //如果按下復(fù)位鍵,則回到- --狀態(tài)
- goto LOOP1; //goto語(yǔ)句,回到loop1表號(hào)處
- }
- }
- }
- }
- }
- if(keyks==0)
- {
- //spk=0;
- delayms(3); //去除按鍵抖動(dòng)
- if(keyks==0)
- {
- while(!keyks); //以上表示按下開始按鍵
- //spk=1; //蜂鳴器不響
- TR0=1; //啟動(dòng)定時(shí)器 開始倒計(jì)時(shí)
- while(1)
- {
- djsxs();
- if(keytz==0)
- {
- delayms(3); //此處表示出去抖動(dòng), 以后不一一標(biāo)出
- if(keytz==0)
- {
- while(!keytz); //以上表示按下停止按鍵后
- {
- TR0=0; //定時(shí)器停止
- flag=0;//
- spk=1;
- }
- }
- }
- if(keyks==0)
- {
- //spk=0;
- delayms(3);
- if(keyks==0)
- {
- while(!keyks); //以上表示按下清楚按鍵后
- //spk=1; //蜂鳴器不響
- TR0=1; //定時(shí)器啟動(dòng)
- }
- }
- /***************************以下是八個(gè)選手搶答,key1表示1號(hào)選手,依次類推,注釋只寫第一位選手,其他和第一個(gè)完全一致,************************************/
- if((key1==0)&&(TR0==1)) //在定時(shí)器運(yùn)行狀態(tài)下,key1==0 則說明1號(hào)選手按下按鍵
- { spk=0; //蜂鳴器響
- delayms(3);
- if(key1==0)
- {
- while(!key1); //去除按鍵抖動(dòng)后,重新在判斷,是否確實(shí)按下
- {
- spk=1; //蜂鳴器不響
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0; //定時(shí)器停止
- djsxs1(); //顯示選手編號(hào)
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs(); //顯示剩余倒計(jì)時(shí)時(shí)間
- if(keyqc==0)
- {
- delayms(3); //去除抖動(dòng)
- if(keyqc==0)
- {
- while(!keyqc); //如果按下清楚鍵,則回到- --狀態(tài)
- goto LOOP1; //goto語(yǔ)句,回到loop1表號(hào)處
- }
- }
- }
- }
- }
- if((key2==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key2==0)
- {
- while(!key2);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs2();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key3==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key3==0)
- {
- while(!key3);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs3();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key4==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key4==0)
- {
- while(!key4);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs4();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key5==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key5==0)
- {
- while(!key5);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs5();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key6==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key6==0)
- {
- while(!key6);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs6();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- }
- if((key7==0)&&(TR0==1))
- { spk=0;
- delayms(3);
- if(key7==0)
- {
- while(!key7);
- {
- spk=1;
- flag=0;//清0最后五秒響蜂鳴器
- }
- while(1)
- {
- TR0=0;
- djsxs7();
- djsxs30(); //第二位數(shù)碼管顯示-
- djsxs();
- if(keyqc==0)
- {
- delayms(3);
- if(keyqc==0)
- {
- while(!keyqc);
- goto LOOP1;
- }
- }
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
(0KT8F1MBU9QE1PVNYM)06D.png (32.02 KB, 下載次數(shù): 360)
下載附件
2017-7-12 14:23 上傳
0.png (75.78 KB, 下載次數(shù): 301)
下載附件
2017-7-13 02:25 上傳
所有資料51hei提供下載:
八路搶答器設(shè)計(jì).zip
(1.95 MB, 下載次數(shù): 1759)
2017-7-12 14:24 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|