如图所示为篮球比赛计时记分电路的Proteus仿真图。该仿真使用ATmega128作为控制核心、LGM12864作为计时记分器的显示装置、矩阵键盘作为输入设备实现篮球比赛的计时记分功能。
ATmega128是ATMEL公司的 8位系列单片机的最高配置的一款单片机,稳定性极高,被广泛的应用在了汽车电车管理、门禁系统、遥控器、智能家居、以及计量电表等领域。Atmega128A是AVR8位微处理器芯片,采用先进的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 ;
}
}
}
【闲鱼】https://m.tb.cn/h.UdSkzRt?tk=PVee2yrTOME CZ0001 「我在闲鱼发布了【基于ATmega128的篮球比赛记时记分器。该仿真采用ATe】」
点击链接直接打开