這是我編寫的基于51單片機的語音搶答器的設計源文件和PROTUES仿真圖!
智能搶答器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (27.25 KB, 下載次數: 29)
下載附件
2017-12-3 01:06 上傳
單片機源程序如下:
- #include "reg51.h" //51系列單片機定義文件
- #include "intrins.h" //調用_nop_();延時函數用
- #define IN P1 //顯示數據段碼輸出口
- #define uchar unsigned char//無符號字符(8位)
- #define uint unsigned int //無符號整數(16位)
- uchar num; //搶答選手編號
- uchar time=20; //搶答時間初值
- uchar dtime=30; //回答時間初值
- uchar n,m,num_1; //搶答時間臨時變量,秒計數值,搶答選手號
- sbit key1=P3^0; //開始
- sbit key2=P3^1; //停止
- sbit key3=P3^2; //設定
- sbit key4=P3^3; //確認
- sbit key5=P3^4; //搶答時間加1
- sbit key6=P3^5; //搶答時間減1
- sbit key7=P3^6; //回答時間加1
- sbit key8=P3^7; //回答時間減1
- bit TZ=0; //調整標志位
- bit RUN=1; //運行標志,=0,搶答計時=1,回答計時。
- sbit W1=P2^4;
- sbit W2=P2^5;
- sbit W3=P2^6;
- sbit W4=P2^7;
- sbit busy =P2^0;
- sbit dat =P2^1;
- sbit rest =P2^2;
- sbit point=P0^7;
- void display();
- void sound(uchar k);
- /************************************/
- uchar code dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0xFF,0x7F};
- /* 共陽七段LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" */
- /********1毫秒延時子函數**********/
- delay1ms(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<120;j++)
- ;
- }
- /********************************************************報數 程序********************************************************/
- void sound(uchar k)
- {uint i;
- while(busy==0){display();}
- rest=1;
- display();
- rest=0;
- for(i=k;i>0;i--)
- {dat=1;
- display();
- dat=0;
- }
- }
- //******************************************顯示程序
- void display()
- {if(TZ==0)
- {P0=dis_7[num]; W1=0; delay1ms(1); W1=1;
- P0=0xbf; W2=0; delay1ms(1); W2=1;
- P0=dis_7[n/10%10]; W3=0; delay1ms(1); W3=1;
- P0=dis_7[n%10]; W4=0; delay1ms(1); W4=1;
- }
- else
- {P0=dis_7[time/10%10]; W1=0; delay1ms(1); W1=1;
- P0=dis_7[time%10];point=0; W2=0; delay1ms(1); W2=1;
- P0=dis_7[dtime/10%10]; W3=0; delay1ms(1); W3=1;
- P0=dis_7[dtime%10]; W4=0; delay1ms(1); W4=1;
- }
-
- }
- /********************************************************/
- /**********語音程序******************/
- void nose(uchar x)
- { switch (x)
- { case 0:{sound(29);sound(17);break;}
- case 1:{sound(num+1);sound(11);sound(12);sound(13);break;}
- case 2:{sound(32);break;}
- case 3:{sound(29);sound(25);break;}
- case 4:{sound(num+1);sound(11);;sound(14);sound(12)break;}
- case 5:{sound(28);sound(25);break;}
- default: break;
- }
- }
- /*掃描程序*/
- /*****************************************/
- void keyscan()
- {
- if(P1!=0xFF&&TR0==0&&TZ==0)
- {num_1=P1;
- switch(num_1)
- { case 0xfe: {num=1;nose(4);} break;
- case 0xfd: {num=2;nose(4);} break;
- case 0xfb: {num=3;nose(4);} break;
- case 0xf7: {num=4;nose(4);} break;
- case 0xef: {num=5;nose(4);} break;
- case 0xdf: {num=6;nose(4);} break;
- case 0xbf: {num=7;nose(4);} break;
- case 0x7f: {num=8;nose(4);} break;
- default: break;
- }
- while(key2==1){display();}
- {sound(32);
- num=0;
- }
- while(key2==0);
- }
- if(key1==0)
- {delay1ms(20);
- if(key1==0)
- { sound(32);
- while(key1==0);
- TR0=1;
- RUN=0;
- n=time;
-
- while(TR0!=0&&P1==0xff)
- {display();
- if(key2==0)
- {while(key2==0);
- n=0;
- num=0;
- TR0=0;
- }
- }
- TR0=0;m=0;
- num_1=P1;
- switch(num_1)
- { case 0xfe: {num=1;nose(1);RUN=1;n=dtime;TR0=1;} break;
-
- case 0xfd: {num=2;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0xfb: {num=3;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0xf7: {num=4;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0xef: {num=5;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0xdf: {num=6;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0xbf: {num=7;nose(1);RUN=1;n=dtime;TR0=1;} break;
- case 0x7f: {num=8;nose(1);RUN=1;n=dtime;TR0=1;} break;
- default: break;
- }
- while(TR0!=0)
- {display();
- if(key2==0)
- {while(key2==0);
- n=0;
- num=0;
- TR0=0;
- }
- }
- num=0;m=0;
- }
- }
- if(key2==0)
- {delay1ms(20);
- if(key2==0)
- {while(key2==0);
- n=0;
- num=0;
- TR0=0;
- TZ=0;
- }
- }
- if(key3==0&&TR0==0&&num==0)
- {delay1ms(20);
- if(key3==0)
- {while(key3==0);
- TZ=1;
- }
- }
- if(key4==0&&TR0==0&&num==0)
- {delay1ms(20);
- if(key4==0)
- {while(key4==0);
- TZ=0;
- }
- }
- if(key5==0&&TZ==1)
- {delay1ms(20);
- if(key5==0)
- {while(key5==0);
- if(time>=89)
- {time=90;
- }
- else
- {time++;
- }
- display();
- }
- }
- if(key6==0&&TZ==1)
- {delay1ms(20);
- if(key6==0)
- {while(key6==0);
- if(time<=6)
- {time=5;
- else
- {time--;
- }
- display();
- }
- }
- if(key7==0&&TZ==1)
- {delay1ms(20);
- if(key7==0)
- {while(key7==0);
- if(dtime>=89)
- {dtime=90;
- }
- else
- {dtime++;
- }
- display();
- }
- }
- if(key8==0&&TZ==1)
- {delay1ms(20);
- if(key8==0)
- {while(key8==0);
- if(time<=6)
- {dtime=5;
- }
- else
- {dtime--;
- }
- display();
- }
- }
- }
- /*主程序*/
- void main()
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (6.59 KB, 下載次數: 39)
下載附件
2017-12-3 01:05 上傳
所有資料51hei提供下載:
新建 WinRAR 壓縮文件.rar
(103.02 KB, 下載次數: 62)
2017-12-2 16:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|