单片机技术课程设计报告篮球计时计分器Word下载.docx
《单片机技术课程设计报告篮球计时计分器Word下载.docx》由会员分享,可在线阅读,更多相关《单片机技术课程设计报告篮球计时计分器Word下载.docx(52页珍藏版)》请在冰豆网上搜索。
![单片机技术课程设计报告篮球计时计分器Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/18/266f5d2c-f308-44b1-a781-826365853422/266f5d2c-f308-44b1-a781-8263658534221.gif)
加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.2PG160128LCD简介
PG160128LCD是像素可寻址的图形液晶显示屏模块
1.芯片特性
●160X128字符显示点阵;
●并行8线数据通信;
●白色点阵,蓝色背景,独立LED背光电源;
●工作温度宽,工业级LCM,超薄外型设计。
2.操作说明
图3-3PG160128引脚说明
图3-4PG160128内部结构及时序图
图3-5读数据时序图与读/写时间表
图3-6设置显示起始说明
3.2
系统总体框图
图3.1总体框图
3.3
Proteus电路图
图3.2Proteus电路图
3.4
各部分硬件介绍
1、PG160128ALCD液晶显示模块:
图3.3液晶显示模块
图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<
intrins.h>
string.h>
stdlib.h>
stdio.h>
#include"
LCD_160128.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;
150;
i++)
{
buzzer=~buzzer;
for(j=0;
j<
t;
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+'
dat_str1[2]=A_Score%10+'
Display_Str_at_xy(26,24,dat_str1,0);
voidshow_Score_B()
chardat_str1[4]={0,0,0,0};
dat_str1[0]=B_Score/100+'
dat_str1[1]=(B_Score%100)/10+'
dat_str1[2]=B_Score%10+'
Display_Str_at_xy(102,24,dat_str1,0);
//显示节次
voidshow_Section()
chardat_str1[2]={0,0};
dat_str1[0]=section%10+'
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+'
dat_str1[1]=SS%10+'
Display_Str_at_xy(114,68,dat_str1,0);
if(MM!
=Last_MM)
{
Last_MM=MM;
dat_str1[0]=MM/10+'
dat_str1[1]=MM%10+'
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+'
dat_str1[1]=A_time%10+'
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+'
dat_str1[1]=B_time%10+'
//显示进攻方
voidshow_attacker()
Display_Str_at_xy(74,90,"
A"
0);
B"
//显示状态
voidshow_status()
if(status==0)
Display_Str_at_xy(117,46,"
暂停"
1);
进行中"
voidshow_maker()
Display_Str_at_xy(26,2,"
《单片机程序设计》"
Display_Str_at_xy(35,24,"
篮球计分计时器"
Display_Str_at_xy(39,46,"
物联网1102班"
Display_Str_at_xy(20,68,"
制作者:
游建南,吴华榕"
Display_Str_at_xy(20,90,"
福建工程学院软件学院"
Display_Str_at_xy(46,112,"
2013/12/8"
//画主菜单
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队"
Display_Str_at_xy(106,2,"
B队"
Show_Score_A();
Display_Str_at_xy(76,24,"
:
"
Show_Score_B();
Display_Str_at_xy(2,46,"
当前节次:
show_Section();
Display_Str_at_xy(75,46,"
状态:
暂停"
Display_Str_at_xy(2,68,"
本节剩余时间:
Display_Str_at_xy(90,68,"
12"
Display_Str_at_xy(106,68,"
:
Display_Str_at_xy(114,68,"
00"
Display_Str_at_xy(2,90,"
当前进攻方:
Display_Str_at_xy(74,90,"
Display_Str_at_xy(2,112,"
进攻剩余时间:
Display_Str_at_xy(90,112,"
24"
*按键检测
*/
voidcheck_key()
ucharscore=0;
//加分
if((Ad