一、设计目的本设计是基于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与蜂鸣器端口相连,根据所加得分的不同,开始与暂停计时,初始化,蜂鸣器有不同的应答方式。
本设计中的程序主要分为两个部分,即暂停计时时的显示与开始计时时的显示。
暂停计时时与开始计时时都可以对每队加分,初始化。
三、设计电路图图一接口模块电路图二蜂鸣器电路图三 8路7段LED数码管电路图四 3*3矩阵控制键盘电路四、设计过程1、关闭硬件实验平台电源。
2、将下载器与主控单片机的下载口P5相连。
3、使用3条2*5排线连接P10和P14端口、P11和P19端口、P13和P4端口,从电路图上分析,PB口与LED显示器相连,PC口与3*3矩阵按键相连,PD口与蜂鸣器相连。
4、打开智能开发环境,新建一个新的工程项目。
5、在左边的树形结构窗内,选择“工程管理-基本操作-功能描述&开发日志”,进行项目功能的描述。
工作模式:端口选择:595片选择:595数据输出:时钟:HC595 PORTB BIT0 BIT2 BIT17、在左边的树形结构窗内,选择“工程管理-端口设置-端口B”,将引脚3-引脚5设置如下:使用情况功能选择输入输出名称置高置低引脚3 使用IO 输出A0 A0_SetHigh A0_SetLow 引脚4 使用IO 输出A1 A1_SetHigh A1_SetLow 引脚5 使用IO 输出A2 A2_SetHigh A2_SetLow8、增加全局函数SelectLED和DrawLED设置如下:返回类型函数参数参数类型SelectLED void Uint8 u8_Number void DrawLED void Uint8 u8_Number,Uint8 u8_Point void SelectLED函数实现:void SelectLED(uint8 u8_Number) {//HC595_165_Write595Byte(0xff); //Select595;//DeSelect595;DrawLED(255,0);switch (u8_Number){case 0:A2_SetLow;A1_SetLow;A0_SetLow;break;case 1:A2_SetLow;A1_SetLow;A0_SetHigh;break;case 2:A2_SetLow;A1_SetHigh;A0_SetLow;break;case 3:A2_SetLow;A1_SetHigh; A0_SetHigh; break;case 4:A2_SetHigh; A1_SetLow; A0_SetLow; break;case 5:A2_SetHigh; A1_SetLow; A0_SetHigh; break;case 6:A2_SetHigh; A1_SetHigh; A0_SetLow; break;case 7:A2_SetHigh; A1_SetHigh; A0_SetHigh; break;}}DrawLED函数实现:Void DrawLED(uint8 u8_Number,uint8 u8_Point) {uint8 u8_Char=0;switch (u8_Number){case 0:u8_Char=0xc0;break;case 1:u8_Char=0xf9;break;case 2:u8_Char=0xa4;break;case 3:u8_Char=0xb0;break;case 4:u8_Char=0x99;break; case 5:u8_Char=0x92;break;case 6:u8_Char=0x82;break;case 7:u8_Char=0xf8;break;case 8:u8_Char=0x80;break;case 9:u8_Char=0x90;break;case 11:u8_Char=0xff;break;case 255:u8_Char=0xFF;break;}if (u8_Point==1){CLRBIT(u8_Char,BIT7);}HC595_165_Write595Byte(u8_Char);Select595;DeSelect595;}9、在左边的树形结构窗内,选择“工程管理-端口设置-端口C”,将引脚0-引脚5设置如下:10、增加功能宏SelectS1、SelectS2、SelectS3设置如下:11、在左边的树形结构窗内,选择“工程管理-端口设置-端口D”,将引脚4设置如下:12、在左边的树形结构窗内,选择“工程管理-用户程序-Main_Logic.c”,在程序编写窗口内输入程序。
13、在左边的树形结构窗内,选择“工程管理-基本操作-生成下载”,点击“生成程序文件”按钮。
14、程序编译成功后,接通硬件实验平台电源,将目标文件下载到硬件实验平台。
四、设计程序void Main_Logic(void){/***********************定义局部变量***********************/uint8 a,b,c,d,e,f,g,h,k,i,j;/*************************** 初始化输入管脚***************************//********************************* 初始化项目中用到的其它硬件和变量******************************** */Loop5:for (i=0;i<10;i++){for (j=0;j<5;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;k<1;){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{delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;c++;goto Loop6;}}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;goto Loop6;}}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;goto Loop6;}}SelectS2;R1_Test{}else{delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;a++;goto Loop7;}}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;goto Loop7;}}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;a=a+3;goto Loop7;}}SelectS3;R1_Test{}else{delay_20ms();R1_Test{}else{Beep_Open;delay_200ms();Beep_Shut;goto Loop3;}}R3_Test{}else{delay_20ms();R3_Test{}else{goto Loop5;}}}/*A队定时得分累计*/for (b=0;b<10;b++){if(a>9) a=a-10;for (;a<10;){goto Loop8;Loop7:if(k<1) a=a;}if(b==11) b=0;}/*B定时队得分累计*/for (d=0;d<10;d++){if(c>9) c=c-10;for (;c<10;){goto Loop8;Loop6:if(k<1) c=c;}if(d==11) d=0;}/*A队计时得分累计*/for (b=0;b<10;b++){if(a>9) a=a-10;for (;a<10;){goto Loop4;Loop2:if(k<1) a=a;}if(b==11) b=0;}/*B队计时得分累计*/for (d=0;d<10;d++){if(c>9) c=c-10;for (;c<10;){goto Loop4;Loop1:if(k<1) c=c;}if(d==11) d=0;}/*倒数计时*/for (h=3;h<10;h--){for (g=9;g<10;g--){for (f=5;f<10;f--){for (e=9;e<10;){goto Loop3;Loop4:if(k<1)e=e;}}}}/*计时显示*/Loop3:for (k=0;k<1;){for (i=0;i<112;i++){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{delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;c++;e--;goto Loop1;}}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;e--;goto Loop1;}}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;e--;goto Loop1;}}SelectS2;R1_Test{}else{delay_20ms();R1_Test{}else{Beep_Open;delay_300ms();Beep_Shut;a++;e--;goto Loop2;}}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;e--;goto Loop2;}}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;a=a+3;e--;goto Loop2;}}SelectS3;R2_Test{}else{delay_20ms();R2_Test{}else{Beep_Open;delay_200ms();Beep_Shut;goto Loop8;}}R3_Test{}else{delay_20ms();R3_Test{}else{goto Loop5;}}}delay_1ms();delay_1ms();delay_1ms();delay_1ms();delay_1ms();delay_1ms();e--;goto Loop4;}/***************************************** 以下语句为喂狗程序,大部分工程都不应删除**************************************** */#ifdef Per_WDTwdt_reset();#endif}}五、程序流程。