AVR单片机Atmega48程序设计报告比赛计时计分器.docx
《AVR单片机Atmega48程序设计报告比赛计时计分器.docx》由会员分享,可在线阅读,更多相关《AVR单片机Atmega48程序设计报告比赛计时计分器.docx(29页珍藏版)》请在冰豆网上搜索。
AVR单片机Atmega48程序设计报告比赛计时计分器
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按钮实现,并通过蜂鸣器表示是否操作成功。
2、设计思路
本设计中由AVR核心板、数码管、蜂鸣器、3乘3矩阵键盘四部分组成。
电路中PORT_B端口连接数码管,显示八位,完成倒计时与记录每队得分,PORT_C与3乘3矩阵键盘相连,由按键控制完成初始化、开始与暂停计时以及加分的功能,PORT_D与蜂鸣器端口相连,根据所加得分的不同,开始与暂停计时,初始化,蜂鸣器有不同的应答方式。
本设计中的程序主要分为两个部分,即暂停计时时的显示与开始计时时的显示。
暂停计时时与开始计时时都可以对每队加分,初始化。
3、设计电路图
图一接口模块电路
图二蜂鸣器电路
图三8路7段LED数码管电路
图四3*3矩阵控制键盘电路
4、设计过程
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数据输出:
时钟:
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
Uint8u8_Number
void
DrawLED
void
Uint8u8_Number,Uint8u8_Point
void
SelectLED函数实现:
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;
}
9、在左边的树形结构窗内,选择“工程管理-端口设置-端口C”,将引脚0-引脚5设置如下:
使用情况
功能选择
输入输出
名称
置高
置低
测试
引脚0
使用
IO
输出
S1
S1_DeSelect
S1_Select
引脚1
使用
IO
输入
R1
R1_Test
引脚2
使用
IO
输出
S2
S2_DeSelect
S2_Select
引脚3
使用
IO
输入
R2
R2_Test
引脚4
使用
IO
输出
S3
S3_DeSelect
S3_Select
引脚5
使用
IO
输入
R3
R3_Test
10、增加功能宏SelectS1、SelectS2、SelectS3设置如下:
功能宏名称
功能宏实现
SelectS1
S1_Select;S2_DeSelect;S3_DeSelect;
SelectS2
S1_DeSelect;S2_Select;S3_DeSelect;
SelectS3
S1_DeSelect;S2_DeSelect;S3_Select;
11、在左边的树形结构窗内,选择“工程管理-端口设置-端口D”,将引脚4设置如下:
使用情况
功能选择
输入输出
名称
置高
置低
使用
IO
输出
Beep
Beep_Shut
Beep_Open
12、在左边的树形结构窗内,选择“工程管理-用户程序-Main_Logic.c”,在程序编写窗口内输入程序。
13、在左边的树形结构窗内,选择“工程管理-基本操作-生成下载”,点击“生成程序文件”按钮。
14、程序编译成功后,接通硬件实验平台电源,将目标文件下载到硬件实验平台。
四、设计程序
voidMain_Logic(void)
{
/*
**********************
定义局部变量
**********************
*/
uint8a,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++;
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;
}
}
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_30ms();
Beep_Open;
delay_30ms();
delay_30ms();
Beep_Shut;
delay_30ms();
delay_30ms();
Beep_Open;
delay_30ms();
delay_30ms();
Beep_Shut;
a=a+3;
gotoLoop7;
}
}
SelectS3;
R1_Test
{
}
else
{
delay_20ms();
R1_Test
{
}
else
{
Beep_Open;
delay_200ms();
Beep_Shut;
gotoLoop3;
}
}
R3_Test
{
}
else
{
delay_20ms();
R3_Test
{
}
else
{
gotoLoop5;
}
}
}
/*A队定时得分累计*/
for(b=0;b<10;b++)
{
if(a>9)a=a-10;
for(;a<10;)
{
gotoLoop8;
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;)
{
gotoLoop8;
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;)
{
gotoLoop4;
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;)
{
gotoLoop4;
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;)
{
gotoLoop3;
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--;
gotoLoop1;
}
}
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--;
gotoLoop1;
}
}
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--;
gotoLoop1;
}
}
SelectS2;
R1_Test
{
}
else
{
delay_20ms();
R1_Test
{
}
else
{
Beep_Open;
delay_300ms();
Beep_S