本次设计采用了LM016L 的显示器,用来显示10s倒计时和抢答选手号码,用来显示抢答中的选手号码。位选端分别与P2口的第七位,第六位以及第零位相接。通过上拉电阻接power,实现数码管的点亮。 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() //初始化函数
- {
- 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) //延时函数
- {
- 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函数中断
- {
- 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;
- }
- }
- }
- }
复制代码
|