单片机技术课程设计报告篮球计时计分器.docx
《单片机技术课程设计报告篮球计时计分器.docx》由会员分享,可在线阅读,更多相关《单片机技术课程设计报告篮球计时计分器.docx(52页珍藏版)》请在冰豆网上搜索。
![单片机技术课程设计报告篮球计时计分器.docx](https://file1.bdocx.com/fileroot1/2022-12/16/86bfe455-065f-49cd-b4ae-bf9899f8da9b/86bfe455-065f-49cd-b4ae-bf9899f8da9b1.gif)
单片机技术课程设计报告篮球计时计分器
课设报告
单片机技术
福建工程学院软件学院
题目:
基于单片机的篮球计时计分器
班级:
物联网2班
姓名:
孙建兴
学号:
指导老师:
郑旭丹
日期:
2013年12月24日
1 摘要
本文主要内容是利用AT89C51单片机与160*128的液晶组合设计的篮球计时计分器,在像素为160*128的液晶上显示时间,分数,节次等信息,并可通过按键来加分,暂停时间,攻守方互换,进入下一节等操作。
本课题是基于单片机技术和160*128的广泛应用而提出。
本次做的篮球计时计分器是以单片机为核心,结合PGALCD显示器,再配以相应的软件,达到实现模拟篮球计时计分的目的.近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
利用单片机实现的篮球计时计分器是单片机与PGA的组合应用,可以很好得模拟常见的篮球计时计分,对于开发单片机更深层次应用有非常现实的意义。
2 设计要求
要求能够在LCD上显示队伍名称,各队得分,节次,每节剩余时间,24秒进攻时间计时,比赛状态,以及通过按键加分,暂停时间,攻守方互换,进入下一节等操作,还要通过蜂鸣器表现节次结束,24秒进攻时间结束,比赛结束时的笛声。
2.1 功能需求
1、信息显示,包括:
队伍名称,比赛状态,,进攻方,两队得分,节次,节次剩余时间,24秒进攻时间剩余时间。
2、按键,包括:
加1分,加2分,加3分,启动、暂停,复位,下一节,A队进攻,B队进攻,8个按键的功能实现。
3、对进攻方的加分,攻守方互换时进攻时间的重置,进攻时间结束时攻守方互换等算法实现。
4、节次结束,24秒进攻时间结束,比赛结束时的笛声。
2.2 设计要求
1、通过LCD显示各种计分计时信息。
2、通过控制键实现:
加1分,加2分,加3分,启动、暂停,复位,下一节,A队进攻,B队进攻,8个按键功能。
3 硬件设计及描述
3.1 总体描述
系统硬件电路图如下图3-1所示:
图3-1硬件整体结构图
系统的主要芯片包括Atmel公司的8位单片机AT89C51,PG60128ALCD,蜂鸣器以及一个八个按键组成。
下面将对这些芯片分别予以介绍。
3.1.1AT89C51单片机简介
STC是美国公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,可灵活应用于各种控制领域。
图3-2单片机引脚图
1.主要特性
·与MCS-51产品指令系统完全兼容
·4k字节可重擦写Flash闪速存储器
·1000次擦写周期
·全静态操作:
0Hz-24MHz
·三级加密程序存储器
·128×8字节内部RAM
·32个可编程I/O口线
·2个16位定时/计数器
·6个中断源
·可编程串行UART通道
·低功耗空闲和掉电模式
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2.管脚说明
Vcc:
电源电压
GND:
地
P0:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
Flash编程和程序校验期间,P1接收低8位地址。
P2:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。
Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
作输入端时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,如下表所示:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
AT89C5l中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路。
3.1.2PGLCD简介
PGLCD是像素可寻址的图形液晶显示屏模块
1.芯片特性
●160X128字符显示点阵;
●并行8线数据通信;
●白色点阵,蓝色背景,独立LED背光电源;
●工作温度宽,工业级LCM,超薄外型设计。
2.操作说明
图3-3PG引脚说明
图3-4PG内部结构及时序图
图3-5读数据时序图与读/写时间表
图3-6设置显示起始说明
3.2 系统总体框图
图3.1总体框图
3.3 Proteus电路图
图3.2Proteus电路图
3.4 各部分硬件介绍
1、PGALCD液晶显示模块:
图3.3液晶显示模块
2、通过控制键实现:
加1分,加2分,加3分,启动、暂停,复位,下一节,A队进攻,B队进攻,8个按键功能。
图3.4独立键盘模块
4 软件设计流程及描述
4.1 程序流程图
图4.1程序流程图
4.2函数模块及功能
1、ucharStatus_BIT_01();//状态位STA1,STA0判断(读写指令和读写数据)
2、ucharStatus_BIT_3();//状态位ST3判断(数据自动写状态)
3、ucharLCD_Write_Command_P2(ucharcmd,ucharpara1,ucharpara2);//写双参数的指令
4、ucharLCD_Write_Command_P1(ucharcmd,ucharPara1);//写单参数的指令
5、ucharLCD_Write_Command(ucharcmd);//写无参数的指令
6、ucharLCD_Write_Data(uchardat);//写数据
7、ucharLCD_Read_Data();//读数据
8、voidSet_LCD_POS(ucharrow,ucharcol)reentrant;//设置当前地址功能说
9、voidcls();//清屏
10、ucharLCD_Initialise();//LCM初始化明
11、ucharDisplay_Str_at_xy(ucharx,uchary,char*fmt,ucharwb)reentrant;//ASCII(8*16)及汉字(16*16)显示函数
12、voidOutToLCD(ucharDat,ucharx,uchary);//显示辅助函数
13、voidLine(unsignedcharx1,unsignedchary1,unsignedcharx2,unsignedchary2,ucharMode)reentrant;//在指定位置画线
14、voidPixel(unsignedcharPointX,unsignedcharPointY,ucharMode);//在指定坐标画点
15、voidShow_Score_A();
/*
功能:
显示A队得分。
变量:
dat_str1[4],用于存取A队分数。
参数:
无。
返回值:
无。
调用函数:
Display_Str_at_xy(),显示A队分数在指定位置。
*/
16、voidshow_Score_B();//显示B队得分
/*
功能:
显示B队得分。
变量:
dat_str1[4],用于存取B队分数。
参数:
无。
返回值:
无。
调用函数:
Display_Str_at_xy(),显示B队分数在指定位置。
*/
17、voidshow_Section();
/*
功能:
显示节次。
变量:
dat_str1[2],用于存取节次。
参数:
无。
返回值:
无。
调用函数:
Display_Str_at_xy(),显示节次在指定位置。
5 功能实现(功能介绍+照片)
1、计分器计时计分界面。
图5.1计分器计时计分界面
6 心得体会
通过本次课程设计增加了我对单片机各模块功能的了解。
实验过程让我更加了解并进一步掌握了中断,定时计数,键盘等程序编写。
以及更加懂得了通过Proteus构造自己所需要的外围电路,进行仿真实验。
单片机应用系统中,通常需要人机对话功能,能够随时发出各种控制命令和输入数据,报告应用系统的运行状态与结果。
该系统设计能够很实用得简单模拟篮球计时计分效果具有较高的可用性。
还可以通过修改程序,增加加时赛更好的完善该系统。
液晶显示技术的普及应用和发展,给仪器、设备的小型化及智能化带来了光辉的前景,特别是点阵图形式液晶显示模块,它具有体积小、重量轻、低电压、底功耗之优点,因而在显示内容和显示功能等方面表现出了独特的性能。
由于液晶显示器已成为日常工作和生活中各种显示仪器、仪表、和袖珍电子产品的重要组成部分,因此对于点阵图形液晶显示器件(模块)的开发、设计、应用和研究对于将来的从事有关液晶显示技术方面的工作具有重要意义。
7 源程序
/********************************************************************篮球计分计时器.c
*******************************************************************/
#include
#include
#include
#include
#include
#include"LCD_.h"
externucharLCD_Initialise();
externucharLCD_Write_Command(ucharcmd);
externucharLCD_Write_Command_P1(ucharcmd,ucharparal);
externucharLCD_Write_Command_P2(ucharcmd,ucharparal,ucharpara2);
externucharLCD_Write_Data(uchardat);
externvoidPixel(ucharx,uchary,ucharMode);
externvoidSet_LCD_POS(ucharrow,ucharcol)reentrant;
externvoidLine(ucharx1,uchary1,ucharx2,uchary2,ucharMode)reentrant;//以上在中断中也有用到所以定义为可重入函数
externvoidDraw_Image(uchar*G_Buffer,ucharStart_Row,ucharStart_Col)reentrant;
externvoidDisplay_Str_at_xy(ucharx,uchary,char*Buffer,ucharwb)reentrant;
externvoidcls();
sbitbuzzer=P3^3;
sbitAdd_1=P1^0;
sbitAdd_2=P1^1;
sbitAdd_3=P1^2;
sbitA_attack=P1^3;
sbitstart_or_stop=P1^4;
sbitB_attack=P1^5;
sbitreset=P1^6;
sbitnext_section=P1^7;
intA_Score=0,B_Score=0;
ucharsection=1,MM=12,Last_MM=0,SS=0,Last_SS=0,team=0,A_time=24,Last_A_time=0,B_time=24,Last_B_time=0,count=0,status=0;
voiddelay(uintms)
{
uchari;
while(--ms)for(i=0;i<120;i++);
}
voidsounder(uchart)
{
uchari,j;
for(i=0;i<150;i++)
{
buzzer=~buzzer;
for(j=0;j}
}
//显示A队得分
voidShow_Score_A()
{
chardat_str1[4]={0,0,0,0};
dat_str1[0]=A_Score/100+'0';
dat_str1[1]=(A_Score%100)/10+'0';
dat_str1[2]=A_Score%10+'0';
Display_Str_at_xy(26,24,dat_str1,0);
}
//显示B队得分
voidshow_Score_B()
{
chardat_str1[4]={0,0,0,0};
dat_str1[0]=B_Score/100+'0';
dat_str1[1]=(B_Score%100)/10+'0';
dat_str1[2]=B_Score%10+'0';
Display_Str_at_xy(102,24,dat_str1,0);
}
//显示节次
voidshow_Section()
{
chardat_str1[2]={0,0};
dat_str1[0]=section%10+'0';
Display_Str_at_xy(66,46,dat_str1,0);
}
//显示节次剩余时间
voidshow_section_time()
{
chardat_str1[3]={0,0,0};
if(SS!
=Last_SS)
{
Last_SS=SS;
dat_str1[0]=SS/10+'0';
dat_str1[1]=SS%10+'0';
Display_Str_at_xy(114,68,dat_str1,0);
}
if(MM!
=Last_MM)
{
Last_MM=MM;
dat_str1[0]=MM/10+'0';
dat_str1[1]=MM%10+'0';
Display_Str_at_xy(90,68,dat_str1,0);
}
}
voidshow_attack_time()
{
chardat_str1[3]={0,0,0};
//显示A对进攻剩余时间
if(team==0)
{
if(A_time!
=Last_A_time)
{
Last_A_time=A_time;
dat_str1[0]=A_time/10+'0';
dat_str1[1]=A_time%10+'0';
Display_Str_at_xy(90,112,dat_str1,0);
sounder(80);
}
}
//显示B对进攻剩余时间
else
{
if(B_time!
=Last_B_time)
{
Last_B_time=B_time;
dat_str1[0]=B_time/10+'0';
dat_str1[1]=B_time%10+'0';
Display_Str_at_xy(90,112,dat_str1,0);
sounder(80);
}
}
}
//显示进攻方
voidshow_attacker()
{
if(team==0)
Display_Str_at_xy(74,90,"A",0);
else
Display_Str_at_xy(74,90,"B",0);
}
//显示状态
voidshow_status()
{
if(status==0)
Display_Str_at_xy(117,46,"暂停",1);
else
Display_Str_at_xy(117,46,"进行中",1);
}
voidshow_maker()
{
Display_Str_at_xy(26,2,"《单片机程序设计》",0);
Display_Str_at_xy(35,24,"篮球计分计时器",0);
Display_Str_at_xy(39,46,"物联网1102班",0);
Display_Str_at_xy(20,68,"制作者:
游建南,吴华榕",0);
Display_Str_at_xy(20,90,"福建工程学院软件学院",0);
Display_Str_at_xy(46,112,"2013/12/8",0);
}
//画主菜单
voidDraw_Menu_UI()
{
Line(0,0,159,0,1);
Line(159,0,159,127,1);
Line(159,127,0,127,1);
Line(0,127,0,0,1);
Display_Str_at_xy(30,2,"A队",0);
Display_Str_at_xy(106,2,"B队",0);
Show_Score_A();
Display_Str_at_xy(76,24,":
",0);
Show_Score_B();
Display_Str_at_xy(2,46,"当前节次:
",0);
show_Section();
Display_Str_at_xy(75,46,"状态:
",0);
Display_Str_at_xy(117,46,"暂停",1);
Display_Str_at_xy(2,68,"本节剩余时间:
",0);
Display_Str_at_xy(90,68,"12",0);
Display_Str_at_xy(106,68,":
",0);
Display_Str_at_xy(114,68,"00",0);
Display_Str_at_xy(2,90,"当前进攻方:
",0);
Display_Str_at_xy(74,90,"A",0);
Display_Str_at_xy(2,112,"进攻剩余时间:
",0);
Display_Str_at_xy(90,112,"24",0);
}
/*
*按键检测
*/
voidcheck_key()
{
ucharscore=0;
//加分
if((Add_1==0||Add_2==0||Add_3==0)&&status==1)
{
if(Add_1==0)
sco