AVR单片机程序设计——比赛计时计分器-1-一、设计目的本设计是基于ATMEGA48单片机的比赛计时计分器,利用8路7段LED数码管作为显示器件,采用3乘3矩阵式键盘作为输入,主要用于各种体育比赛记录分数,在此设计中共接入了2个四位一体7段LED数码管显示器,第一个显示器为一个倒数计时,第二个显示器为两队得分。本设计中的倒数计时器时间为40分钟,可以进行开始计时、暂停计时的操作,分别通过S3_1、S3_2按钮实现,并通过蜂鸣器表示是否操作成功,时间通过1个四位一体7段LED数码管显示器显示,前两位为分钟数,后两位为秒数。本设计中可以对两队得分进行加1分、加2分、加3分操作,分别通过S1_1、S1_2、S1_3、S2_1、S2_2、S2_3按钮实现,并通过蜂鸣器的不同工作方式表示是否操作成功与所加的分值。得分通过1个四位一体7段LED数码管显示器显示,每队得分显示两位数,显示范围为0~99分。本设计可以进行清零操作,清零后倒计时恢复40分钟,得分均为0,通过S3_3按钮实现,并通过蜂鸣器表示是否操作成功。二、设计思路本设计中由AVR核心板、数码管、蜂鸣器、3乘3矩阵键盘四部分组成。电路中PORT_B端口连接数码管,显示八位,完成倒计时与记录每队得分,PORT_C与3乘3矩阵键盘相连,由按键控制完成初始化、开始与暂停计时以及加分的功能,PORT_D与蜂鸣器端口相连,根据所加得分的不同,开始与暂停计时,初始化,蜂鸣器有不同的应答方式。本设计中的程序主要分为两个部分,即暂停计时时的显示与开始计时时的显示。暂停计时时与开始计时时都可以对每队加分,初始化。三、设计电路图图一接口模块电路AVR单片机程序设计——比赛计时计分器-2-图二蜂鸣器电路图三8路7段LED数码管电路AVR单片机程序设计——比赛计时计分器-3-图四3*3矩阵控制键盘电路四、设计过程1、关闭硬件实验平台电源。2、将下载器与主控单片机的下载口P5相连。3、使用3条2*5排线连接P10和P14端口、P11和P19端口、P13和P4端口,从电路图上分析,PB口与LED显示器相连,PC口与3*3矩阵按键相连,PD口与蜂鸣器相连。4、打开智能开发环境,新建一个新的工程项目。5、在左边的树形结构窗内,选择“工程管理-基本操作-功能描述&开发日志”,进行项目功能的描述。6、在左边的树形结构窗内,选择“工程管理-基本设置-HC595_165”,设置如下:工作模式:端口选择:595片选择:595数据输出:时钟:HC595PORTBBIT0BIT2BIT17、在左边的树形结构窗内,选择“工程管理-端口设置-端口B”,将引脚3-引脚5设置如下:8、增加全局函数SelectLED和DrawLED设置如下:SelectLED函数实现:使用情况功能选择输入输出名称置高置低引脚3使用IO输出A0A0_SetHighA0_SetLow引脚4使用IO输出A1A1_SetHighA1_SetLow引脚5使用IO输出A2A2_SetHighA2_SetLow返回类型函数参数参数类型SelectLEDvoidUint8u8_NumbervoidDrawLEDvoidUint8u8_Number,Uint8u8_PointvoidAVR单片机程序设计——比赛计时计分器-4-voidSelectLED(uint8u8_Number){//HC595_165_Write595Byte(0xff);//Select595;//DeSelect595;DrawLED(255,0);switch(u8_Number){case0:A2_SetLow;A1_SetLow;A0_SetLow;break;case1:A2_SetLow;A1_SetLow;A0_SetHigh;break;case2:A2_SetLow;A1_SetHigh;A0_SetLow;break;case3:A2_SetLow;A1_SetHigh;A0_SetHigh;break;case4:A2_SetHigh;A1_SetLow;A0_SetLow;break;case5:A2_SetHigh;A1_SetLow;A0_SetHigh;break;case6:A2_SetHigh;A1_SetHigh;A0_SetLow;break;case7:A2_SetHigh;A1_SetHigh;A0_SetHigh;break;}}DrawLED函数实现:VoidDrawLED(uint8u8_Number,uint8u8_Point){uint8u8_Char=0;switch(u8_Number){case0:u8_Char=0xc0;break;case1:u8_Char=0xf9;break;case2:u8_Char=0xa4;break;case3:u8_Char=0xb0;break;case4:u8_Char=0x99;break;case5:u8_Char=0x92;break;case6:u8_Char=0x82;break;case7:u8_Char=0xf8;break;case8:u8_Char=0x80;break;case9:u8_Char=0x90;break;case11:u8_Char=0xff;break;case255:u8_Char=0xFF;break;}if(u8_Point==1){CLRBIT(u8_Char,BIT7);}HC595_165_Write595Byte(u8_Char);Select595;DeSelect595;}AVR单片机程序设计——比赛计时计分器-5-9、在左边的树形结构窗内,选择“工程管理-端口设置-端口C”,将引脚0-引脚5设置如下:10、增加功能宏SelectS1、SelectS2、SelectS3设置如下:功能宏名称功能宏实现SelectS1S1_Select;S2_DeSelect;S3_DeSelect;SelectS2S1_DeSelect;S2_Select;S3_DeSelect;SelectS3S1_DeSelect;S2_DeSelect;S3_Select;11、在左边的树形结构窗内,选择“工程管理-端口设置-端口D”,将引脚4设置如下:使用情况功能选择输入输出名称置高置低使用IO输出BeepBeep_ShutBeep_Open12、在左边的树形结构窗内,选择“工程管理-用户程序-Main_Logic.c”,在程序编写窗口内输入程序。13、在左边的树形结构窗内,选择“工程管理-基本操作-生成下载”,点击“生成程序文件”按钮。14、程序编译成功后,接通硬件实验平台电源,将目标文件下载到硬件实验平台。四、设计程序voidMain_Logic(void){/***********************定义局部变量***********************/uint8a,b,c,d,e,f,g,h,k,i,j;/***************************初始化输入管脚***************************//*********************************初始化项目中用到的其它硬件和变量*********************************/Loop5:使用情况功能选择输入输出名称置高置低测试引脚0使用IO输出S1S1_DeSelectS1_Select引脚1使用IO输入R1R1_Test引脚2使用IO输出S2S2_DeSelectS2_Select引脚3使用IO输入R2R2_Test引脚4使用IO输出S3S3_DeSelectS3_Select引脚5使用IO输入R3R3_TestAVR单片机程序设计——比赛计时计分器-6-for(i=0;i10;i++){for(j=0;j5;j++){SelectLED(0);DrawLED(i,0);delay_1ms();SelectLED(1);DrawLED(i,0);delay_1ms();SelectLED(2);DrawLED(i,0);delay_1ms();SelectLED(3);DrawLED(i,0);delay_1ms();SelectLED(4);DrawLED(i,0);delay_1ms();SelectLED(5);DrawLED(i,0);delay_1ms();SelectLED(6);DrawLED(i,0);delay_1ms();SelectLED(7);DrawLED(i,0);delay_1ms();Beep_Open;delay_10ms();Beep_Shut;}}a=0;b=11;c=0;d=11;e=0;f=0;g=0;h=4;/**************************后台主循环**************************/while(1){/******************************在这里完成自己的项目逻辑******************************//*定时显示*/Loop8:for(k=0;k1;){SelectLED(0);DrawLED(h,0);delay_1ms();SelectLED(1);DrawLED(g,0);delay_1ms();SelectLED(2);DrawLED(f,0);delay_1ms();SelectLED(3);DrawLED(e,0);delay_1ms();SelectLED(4);DrawLED(d,0);delay_1ms();SelectLED(5);DrawLED(c,0);delay_1ms();SelectLED(6);DrawLED(b,0);delay_1ms();SelectLED(7);DrawLED(a,0);delay_1ms();SelectS1;R1_Test{}else{AVR单片机程序设计——比赛计时计分器-7-delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;c++;gotoLoop6;}}R2_Test{}else{delay_20ms();R2_Test{}else{Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_Shut;c=c+2;gotoLoop6;}}R3_Test{}else{delay_20ms();R3_Test{}else{Beep_Open;delay_30ms();delay_30ms();Beep_Shut;delay_30ms();delay_30ms();Beep_Open;delay_30ms();delay_30ms();Beep_Shut;delay_30ms();delay_30ms();Beep_Open;delay_30ms();delay_30ms();Beep_Shut;c=c+3;gotoLoop6;}}SelectS2;R1_Test{}else{delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;a++;gotoLoop7;}}AVR单片机程序设计——比赛计时计分器-8-R2_Test{}else{delay_20ms();R2_Test{}else{Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_Shut;a=a+2;gotoLoop7;}}R3_Test{}else{delay_20ms();R3_Test{}else{Beep_Open;delay_30ms();delay_30ms();Beep_Shut;delay_30ms();delay_