AVR单片机Atmega48程序设计报告——比赛计时计分器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计目的
本设计是基于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 BIT1
7、在左边的树形结构窗内,选择“工程管理-端口设置-端口B”,将引脚3-引脚5设置如下:
使用情况功能选择输入输出名称置高置低
引脚3 使用IO 输出A0 A0_SetHigh A0_SetLow 引脚4 使用IO 输出A1 A1_SetHigh A1_SetLow 引脚5 使用IO 输出A2 A2_SetHigh A2_SetLow
8、增加全局函数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;
}