如图所示,篮球比赛计时记分电路Proteus仿真图。该仿真使用ATmega128作为控制核心,LGM12864作为计时记分器的显示装置,矩阵键盘作为输入设备,实现篮球比赛的计时记分功能。
ATmega128是ATMEL公司的 8位系列单片机最高配置的单片机稳定性高,广泛应用于汽车电车管理、门禁系统、遥控器、智能家居、计量电表等领域。Atmega128A是AVR采用先进的8位微处理器芯片RISC结构,采用AVR内核,拥有16MHz工作频率,工作电压2.7-5.5V。
模拟运行后会使用LGM12864显示比赛时间、两队分数和小节数。显示部分用中文显示。
按下开始按钮后,比赛时间将开始倒计时。在此期间,可以修改A队和B队的比赛分数。
按暂停后停止倒计时,按设定按钮修改比赛时间。按下设置按钮后,相应的修改位置会闪烁。设置按钮可以修改比赛时间的分钟和秒。修改秒数据后,再次按下设置按钮,退出设置模式。复位按钮可以复位比赛设计和分数。
程序使用ICCAVR7.22开发。部分程序代码如下:
void main(void) { uint key_store=0x01; DDRC=0x0f; //PC口上拉电阻使能 PORTC=0xf0; DDRB=0xff; //PB口上拉电阻使能 PORTB=0xff; system_init(); //系统初始化,设置IO口属性 delay_nms(100); //延时100ms //************************************************************ LCDchushihua(); ////液晶显示器初始化 LCDQingPing(); ///液晶显示器清屏 DDRB|=0x20 ; Display(); //显示初始化函数 timer1_init(); ///定时器初始化 TIMSK=0x04; ///定时器中断设置 SEI(); //开中断 Display_Score(scorea,scoreb); //显示初始分数 vision_tab(); //显示比赛的小节数 beer0(); while(1) { if(update==1) //如果更新标志位 { update = 0 ; //清除标志位 if(time_fen==0&byte_tab==4) //如果比赛节省了最后一分钟,而且是最后一节 { Display_Number(time_miao,cnt); //快速倒计时 }else { Display_Number(time_fen,time_miao); ///在其他情况下显示正常时间倒计时 } //delay_nms(100); //延时100ms //Display_Number(time_fen,time_miao,byte_tab); } keyboardscan(); ///键盘扫描,看看有没有按钮 if(key!=0xff&flag==0) //如果有按钮,按键值0显示~15 { flag = 1 ; switch(key) ///根据按钮调整比赛分数和比赛时间 { case 1 : if(start==1){if(scoreb<200)scoreb=scoreb 1;else scoreb = 0 ;} Display_Score(scorea,scoreb);break ;//B队分数 1 case 2 : if(start==1){if(scoreb<200)scoreb=scoreb 2;else scoreb = 0 ;} Display_Score(scorea,scoreb);break ;//B队分数 2 case 3 : if(start==1){if(scoreb<200)scoreb=scoreb 3;else scoreb = 0 ;} Display_Score(scorea,scoreb);break ;//B队分数 3 case 4 : if(start==0){ ///调整时间 if(mode==1) { if(time_fen<59) time_fen ;else time_fen = 0 ; }else if(mode==2) { if(time_miao<59) time_miao ;else time_miao = 0 ; } } break ;// case 5 : if(start==1){if(scorea<200)scorea=scorea 1;else scorea = 0 ;}Display_Score(scorea,scoreb); break ;//A队分数 1 case 6 : if(start==1){if(scorea<200)scorea=scorea 2;else scorea = 0 ;}Display_Score(scorea,scoreb); break ;//A队分数 2 case 7 : if(start==1){if(scorea<200)scorea=scorea 3;else scorea = 0 ;}Display_Score(scorea,scoreb); break; //A队分数 3 case 8 : if(start==0) { if(mode==1) { if(time_fen>0) time_fen--;else time_fen = 59 ; }else if(mode==2) { if(time_miao>0) time_miao--;else time_miao = 59 ; } }break ; //时间减调 case 9 : start = 1 ;mode=0; break ;//开始按键 case 10 : if(start!=1){beer0();start = 0 ; time_miao=0;time_fen=2;byte_tab=1;scorea=0;scoreb=0;}Display_Score(scorea,scoreb);vision_tab(); break ;//复位按钮,只能在暂停状态下进行复位操作 case 0 : start = 0 ;break ;//暂停按钮 case 11 : if(start==0){if(mode<2)mode ;else mode = 0 ;}break ;//模式选择,只有在暂停模式下才能调整时间 } }else if(key==0xff) { flag = 0 ; } } }