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
2、_3按钮实现,并通过蜂鸣器的不同工作方式表示是否操作成功与所加的分值。得分通过1个四位一体7段LED数码管显示器显示,每队得分显示两位数,显示X围为099分。本设计可以进行清零操作,清零后倒计时恢复40分钟,得分均为0,通过S3_3按钮实现,并通过蜂鸣器表示是否操作成功。二、 设计思路本设计中由AVR核心板、数码管、蜂鸣器、3乘3矩阵键盘四部分组成。电路中PORT_B端口连接数码管,显示八位,完成倒计时与记录每队得分,PORT_C与3乘3矩阵键盘相连,由按键控制完成初始化、开始与暂停计时以与加分的功能,PORT_D与蜂鸣器端口相连,根据所加得分的不同,开始与暂停计时,初始化,蜂鸣器有不同的应答
3、方式。本设计中的程序主要分为两个部分,即暂停计时时的显示与开始计时时的显示。暂停计时时与开始计时时都可以对每队加分,初始化。三、 设计电路图图一 接口模块电路图二 蜂鸣器电路图三 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、 在左边的树形结构窗内,选择“工程管理-基本操作-功能描
4、述&开发日志”,进行项目功能的描述。6、 在左边的树形结构窗内,选择“工程管理-基本设置-HC595_165”,设置如下:工作模式:端口选择:595片选择:595数据输出:时钟:HC595PORTBBIT0BIT2BIT17、 在左边的树形结构窗内,选择“工程管理-端口设置-端口B”,将引脚3-引脚5设置如下:使用情况功能选择输入输出名称置高置低引脚3使用IO输出A0A0_SetHighA0_SetLow引脚4使用IO输出A1A1_SetHighA1_SetLow引脚5使用IO输出A2A2_SetHighA2_SetLow8、 增加全局函数SelectLED和DrawLED设置如下:返回类型函
5、数参数参数类型SelectLEDvoidUint8 u8_NumbervoidDrawLEDvoidUint8 u8_Number,Uint8 u8_PointvoidSelectLED函数实现:- 15 - / 15void 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_SetL
6、ow; 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_
7、SetHigh; break;DrawLED函数实现:VoidDrawLED(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
8、;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设置如下:使用情况功能选择输入输出名称置高置低测试
9、引脚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_Test10、 增加功能宏SelectS1、SelectS2、SelectS3设置如下:功能宏名称功能宏实现SelectS1S1_Select;S2_DeSelect;S3_DeSelect;SelectS2S1_DeSelect;S2_Select;S3_DeSelect;SelectS3S1_DeSelect
10、;S2_DeSelect;S3_Select;11、 在左边的树形结构窗内,选择“工程管理-端口设置-端口D”,将引脚4设置如下:使用情况功能选择输入输出名称置高置低使用IO输出BeepBeep_ShutBeep_Open12、 在左边的树形结构窗内,选择“工程管理-用户程序-Main_Logic.c”,在程序编写窗口内输入程序。13、 在左边的树形结构窗内,选择“工程管理-基本操作-生成下载”,点击“生成程序文件”按钮。14、 程序编译成功后,接通硬件实验平台电源,将目标文件下载到硬件实验平台。四、设计程序void Main_Logic(void)/*定义局部变量*/uint8 a,b,c,
11、d,e,f,g,h,k,i,j;/*初始化输入管脚*/*初始化项目中用到的其它硬件和变量*/ Loop5: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);
12、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(
13、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_Testelse delay_20ms();R1_Testelse Beep_Open;delay_300ms();Beep_Shut;c+
14、;goto Loop6;R2_Testelse delay_20ms();R2_Testelse Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_Shut;c=c+2;goto Loop6;R3_Testelse delay_20ms();R3_Testelse Beep_Open;delay_30ms();delay_30ms();Beep_Shut;delay_30ms();delay_30ms();Beep_Open;delay_30ms();delay_30ms();Beep_Sh
15、ut;delay_30ms();delay_30ms();Beep_Open;delay_30ms();delay_30ms();Beep_Shut;c=c+3;goto Loop6;SelectS2;R1_Testelse delay_20ms();R1_Testelse Beep_Open;delay_300ms();Beep_Shut;a+;goto Loop7;R2_Testelse delay_20ms();R2_Testelse Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_
16、Shut;a=a+2;goto Loop7;R3_Testelse delay_20ms();R3_Testelse 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_Testelse delay_20ms();
17、R1_Testelse Beep_Open;delay_200ms();Beep_Shut;goto Loop3;R3_Testelse delay_20ms();R3_Testelse goto Loop5;/*A队定时得分累计*/for (b=0;b9) a=a-10;for (;a10;)goto Loop8;Loop7:if(k1) a=a;if(b=11) b=0;/*B定时队得分累计*/for (d=0;d9) c=c-10;for (;c10;)goto Loop8;Loop6:if(k1) c=c;if(d=11) d=0;/*A队计时得分累计*/for (b=0;b9) a=
18、a-10;for (;a10;)goto Loop4;Loop2:if(k1) a=a;if(b=11) b=0;/*B队计时得分累计*/for (d=0;d9) c=c-10;for (;c10;)goto Loop4;Loop1:if(k1) c=c;if(d=11) d=0;/*倒数计时*/for (h=3;h10;h-)for (g=9;g10;g-)for (f=5;f10;f-)for (e=9;e10;)goto Loop3;Loop4:if(k1) e=e;/*计时显示*/Loop3:for (k=0;k1;)for (i=0;i112;i+)SelectLED(0);Draw
19、LED(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_T
20、estelse delay_20ms();R1_Testelse Beep_Open;delay_300ms();Beep_Shut;c+;e-;goto Loop1;R2_Testelse delay_20ms();R2_Testelse Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_Shut;c=c+2;e-;goto Loop1;R3_Testelse delay_20ms();R3_Testelse Beep_Open;delay_30ms();delay_30ms();Beep
21、_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_Testelse delay_20ms();R1_Testelse Beep_Open;delay_300ms();Beep_Shut;a+;e-;goto Loop2;R2_Testelse delay_20ms();R2_Teste
22、lse Beep_Open;delay_100ms();Beep_Shut;delay_100ms();Beep_Open;delay_100ms();Beep_Shut;a=a+2;e-;goto Loop2;R3_Testelse delay_20ms();R3_Testelse 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;del
23、ay_30ms();delay_30ms();Beep_Shut;a=a+3;e-;goto Loop2;SelectS3;R2_Testelse delay_20ms();R2_Testelse Beep_Open;delay_200ms();Beep_Shut;goto Loop8;R3_Testelse delay_20ms();R3_Testelse goto Loop5;delay_1ms();delay_1ms();delay_1ms();delay_1ms();delay_1ms();delay_1ms();e-;goto Loop4;/*以下语句为喂狗程序,大部分工程都不应删除*/#ifdef Per_WDTwdt_reset();#endif五、程序流程