本次設計采用了LM016L 的顯示器,用來顯示10s倒計時和搶答選手號碼,用來顯示搶答中的選手號碼。位選端分別與P2口的第七位,第六位以及第零位相接。通過上拉電阻接power,實現(xiàn)數(shù)碼管的點亮。 8個選手按鍵接P2口,主持人按鍵接在P1.0~P1.4上 單片機程序如下
- #include<reg51.h>
- #include<lcd1602.h>
- sbit sjjia=P1^0; //定義時間加按鈕
- sbit sjjian=P1^1; //定義時間減按鈕
- sbit kaishi=P1^2; //定義開始按鈕
- sbit fuwei=P1^3; //定義復位按鈕
- sbit soud=P1^4; //報警按鈕
- sbit led_r=P1^5; //定義搶答成功指示
- sbit led_y=P1^6; //定義闡述時間到指示
- unsigned charnum[]={'0','1','2','3','4','5','6','7','8','9'},num2;
- unsigned char model,time,temp;
- void init() //初始化函數(shù)
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- TR0=0;
- EA=1;
- P1=0x0f;
- model=0;
- time=30;
- }
- void delay(unsigned char i) //延時函數(shù)
- {
- unsignedchar j,k;
- while(i--)
- for(j=100;j>0;j--)
- for(k=100;k>0;k--);
- }
- void star() //啟動
- {
- lcd_xml(0x80);lcd_xsj(" welcome ");
- delay(100);
- lcd_xml(0xc0);lcd_xsj("8 Way Responder");
- delay(80);
- }
- void led_num() //刷新倒計時
- {
- lcd_xml(0x80);lcd_xsj("Countdown : ");
- lcd_xml(0x8d);lcd_xsj2(num[time/10]);
- lcd_xml(0x8e);lcd_xsj2(num[time%10]);
- }
- void reset() //復位
- {
- TR0=0;
- P1=0x0f;
- led_r=0;
- led_y=0;
- P2=0xff;
- model=0;
- time=10;
- led_num();
- lcd_xml(0xc0);lcd_xsj(" Not started ");
- }
- void Not_started()
- {
- if(sjjia==0)
- {
- delay(10);
- if(sjjia==0)
- {
- time++;
- if(time==100)time=0;
- led_num();
- }
- }
- if(sjjian==0)
- {
- delay(10);
- if(sjjian==0)
- {
- time--;
- if(time==0)time=99;
- led_num();
- }
- }
- if(kaishi==0)
- {
- delay(10);
- if(kaishi==0)
- {
- model=1;
- TR0=1;
- lcd_xml(0xc0);lcd_xsj("Start Responder");
- soud=1;delay(10);soud=0;
- }
- }
- }
- void anjian()
- {
- if(P2!= 0xff)
- {
- delay(5);
- if(P2!= 0xff)
- {
- temp=~P2;
- model=3;
- led_r=1;
- soud=1;delay(10);soud=0;
- switch(temp)
- {
- case0x01:num2=1;break;
- case0x02:num2=2;break;
- case0x04:num2=3;break;
- case0x08:num2=4;break;
- case0x10:num2=5;break;
- case0x20:num2=6;break;
- case 0x40:num2=7;break;
- case0x80:num2=8;break;
- }
- lcd_xml(0xc0);lcd_xsj("Competitor: ");
- lcd_xml(0xce);lcd_xsj2(num[num2]);
- time=60;
- P2=temp;
- }
- }
- }
- void finish()
- {
- if(!time)
- {
- led_y=1;
- lcd_xml(0xc0);lcd_xsj(" End ");
- }
- }
- void main()
- {
- init();
- lcd_init();
- star();
- reset();
- while(1)
- {
- if(fuwei==0) //復位鍵檢測
- {
- delay(1);
- if(fuwei==0)
- reset();
- }
- switch(model)
- {
- case0:Not_started();break;
- case1:anjian();break;
- case2:finish();break;
- case3:break;
- default: model=0;break;
- }
- }
- }
- void timee() interrupt 1 //1s函數(shù)中斷
- {
- unsignedchar a;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- a++; //是否滿1s
- if(a==24)
- {
- a=0;
- if(model==1|| model==3)
- {
- time--;
- led_num();
- if(time==0)
- {
- model=2;
- soud=1;delay(20);soud=0;
- }
- }
- }
- }
復制代碼
|