《单片机技术课程设计报告(篮球计时计分器).doc》由会员分享,可在线阅读,更多相关《单片机技术课程设计报告(篮球计时计分器).doc(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课设报告福建工程学院软件学院题 目: 基于单片机的篮球计时计分器班 级: 物联网2班姓 名: 孙建兴学 号: 3112113229指导老师: 郑旭丹日 期: 2013 年 12 月 24 日 目录1摘要32设计要求32.1功能需求32.2设计要求43硬件设计及描述43.1总体描述43.2系统总体框图123.3Proteus电路图123.4各部分硬件介绍134软件设计流程及描述144.1程序流程图144.2函数模块及功能155功能实现(功能介绍+照片)166心得体会177源程序171摘要本文主要内容是利用AT89C51单片机与160*128的液晶组合设计的篮球计时计分器,在像素为160*128的
2、液晶上显示时间,分数,节次等信息,并可通过按键来加分,暂停时间,攻守方互换,进入下一节等操作。本课题是基于单片机技术和160*128的广泛应用而提出。本次做的篮球计时计分器是以单片机为核心,结合PG160128ALCD 显示器,再配以相应的软件,达到实现模拟篮球计时计分的目的. 近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据
3、具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。 单片机应用的重要意义在于,它从根本上改变了传统的控制系统设计思想和设计方法。从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。 利用单片机实现的篮球计时计分器是单片机与PG160128A的组合应用,可以很好得模拟常见的篮球计时计分,对于开发单片机更深层次应用有非常现实的意义。2设计要求要求能够在160128LCD上显示队伍名称,各队得分,节次,每节剩余时间,24秒进攻时间计时,比赛状态,以及通过按键加分,暂停时间,攻守方互换,进入
4、下一节等操作,还要通过蜂鸣器表现节次结束,24秒进攻时间结束,比赛结束时的笛声。2.1功能需求1、 信息显示,包括:队伍名称,比赛状态,进攻方,两队得分,节次,节次剩余时间,24秒进攻时间剩余时间。2、 按键,包括:加1分,加2分,加3分,启动、暂停,复位,下一节,A队进攻,B队进攻,8个按键的功能实现。3、 对进攻方的加分,攻守方互换时进攻时间的重置,进攻时间结束时攻守方互换等算法实现。4、 节次结束,24秒进攻时间结束,比赛结束时的笛声。2.2设计要求1、 通过160128LCD显示各种计分计时信息。2、 通过控制键实现:加1分,加2分,加3分,启动、暂停,复位,下一节,A队进攻,B队进攻
5、,8个按键功能。3硬件设计及描述3.1总体描述系统硬件电路图如下图3-1所示:图3-1硬件整体结构图系统的主要芯片包括Atmel公司的8位单片机AT89C51,PG60128ALCD,蜂鸣器以及一个八个按键组成。下面将对这些芯片分别予以介绍。3.1.1 AT89C51单片机简介STC是美国公司生产的低电压,高性能CMOS8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(PEROM)和128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元,可灵活应用
6、于各种控制领域。图3-2单片机引脚图1. 主要特性与MCS-51产品指令系统完全兼容4k字节可重擦写Flash闪速存储器1000次擦写周期全静态操作:0Hz24MHz三级加密程序存储器1288字节内部RAM32个可编程IO口线2个16位定时计数器6个中断源可编程串行UART通道低功耗空闲和掉电模式 AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个IO 口线,两个16位定时计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU
7、的工作,但允许RAM,定时计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。2.管脚说明Vcc:电源电压GND:地P0 :P0 口是一组8 位漏极开路型双向IO 口,也即地址数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在FIash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1 :P1是一个带内部上拉电阻
8、的8位双向IO口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。Flash编程和程序校验期间,P1接收低8位地址。P2 :P2是一个带有内部上拉电阻的8位双向IO口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存
9、储器(例如执行MOVXDPTR指令)时,P2口送出高8位地址数据。在访问8 位地址的外部数据存储器(如执行MOVXRI 指令)时,P2 口线上的内容(也即特殊功能寄存器(SFR)区中R2寄存器的内容),在整个访问期间不改变。Flash编程或校验时,P2亦接收高位地址和其它控制信号。P3: P3口是一组带有内部上拉电阻的8 位双向IO 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3 口将用上拉电阻输出电流(IIL)。P3口除了作为一般的IO口线外,更重要的用途是它的第二功能,如下表
10、所示:P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(记时器0外部输入) P3.5 T1(记时器1外部输入) P3.6 /WR(外部数据存储器写选通) P3.7 /RD(外部数据存储器读选通) P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信
11、号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 /EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储
12、器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。AT89C5l 中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1 和XTAL2 分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路。3.1.2 PG160128LCD简介PG160128LCD是像素可寻址的图形液晶显示屏模块1. 芯片特性l 160 X 128 字符显示点
13、阵;l 并行 8 线数据通信;l 白色点阵,蓝色背景,独立LED背光电源;l 工作温度宽, 工业级 LCM, 超薄外型设计。2.操作说明图3-3 PG160128引脚说明图3-4 PG160128内部结构及时序图图3-5 读数据时序图与读/写时间表图3-6 设置显示起始说明3.2系统总体框图 单片机复位、晶振电路PG160128ALCD液晶显示模块蜂鸣器AT89C51 单片机按键中断(8个独立键盘)图3.1总体框图3.3Proteus电路图图3.2Proteus电路图3.4各部分硬件介绍1、 PG160128ALCD液晶显示模块: 图3.3液晶显示模块2、通过控制键实现:加1分,加2分,加3分
14、,启动、暂停,复位,下一节,A队进攻,B队进攻,8个按键功能。图3.4独立键盘模块4软件设计流程及描述4.1程序流程图图4.1程序流程图4.2函数模块及功能1、uchar Status_BIT_01(); / 状态位STA1,STA0判断(读写指令和读写数据)2、uchar Status_BIT_3(); / 状态位ST3判断(数据自动写状态)3、uchar LCD_Write_Command_P2(uchar cmd,uchar para1,uchar para2); / 写双参数的指令4、uchar LCD_Write_Command_P1(uchar cmd,uchar Para1);
15、/ 写单参数的指令5、uchar LCD_Write_Command(uchar cmd); / 写无参数的指令6、uchar LCD_Write_Data(uchar dat); / 写数据7、uchar LCD_Read_Data(); / 读数据8、void Set_LCD_POS(uchar row, uchar col) reentrant;/ 设置当前地址功能说9、void cls(); / 清屏10、uchar LCD_Initialise(); / LCM 初始化明11、uchar Display_Str_at_xy(uchar x,uchar y,char *fmt,ucha
16、r wb) reentrant;/ ASCII(8*16) 及 汉字(16*16) 显示函数12、void OutToLCD(uchar Dat,uchar x,uchar y);/显示辅助函数13、void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, uchar Mode) reentrant;/在指定位置画线14、void Pixel(unsigned char PointX,unsigned char PointY, uchar Mode); /在指定坐标画点15、void S
17、how_Score_A(); /*功能:显示A队得分。变量:dat_str14,用于存取A队分数。参 数: 无。返 回 值:无。调用函数:Display_Str_at_xy(),显示A队分数在指定位置。*/ 16、 void show_Score_B();/显示B队得分/*功能:显示B队得分。变量:dat_str14,用于存取B队分数。参 数: 无。返 回 值:无。调用函数:Display_Str_at_xy(),显示B队分数在指定位置。*/ 17、 void show_Section();/*功能:显示节次。变量:dat_str12,用于存取节次。参 数: 无。返 回 值:无。调用函数:Di
18、splay_Str_at_xy(),显示节次在指定位置。5功能实现(功能介绍+照片)1、计分器计时计分界面。图5.1 计分器计时计分界面6心得体会通过本次课程设计增加了我对单片机各模块功能的了解。实验过程让我更加了解并进一步掌握了中断,定时计数,键盘等程序编写。以及更加懂得了通过Proteus构造自己所需要的外围电路,进行仿真实验。单片机应用系统中,通常需要人机对话功能,能够随时发出各种控制命令和输入数据,报告应用系统的运行状态与结果。该系统设计能够很实用得简单模拟篮球计时计分效果具有较高的可用性。还可以通过修改程序,增加加时赛更好的完善该系统。液晶显示技术的普及应用和发展,给仪器、设备的小型
19、化及智能化带来了光辉的前景,特别是点阵图形式液晶显示模块,它具有体积小、重量轻、低电压、底功耗之优点,因而在显示内容和显示功能等方面表现出了独特的性能。由于液晶显示器已成为日常工作和生活中各种显示仪器、仪表、和袖珍电子产品的重要组成部分,因此对于点阵图形液晶显示器件(模块)的开发、设计、应用和研究对于将来的从事有关液晶显示技术方面的工作具有重要意义。7源程序/*篮球计分计时器.c*/#include #include #include #include #include #include LCD_160128.hextern uchar LCD_Initialise();extern ucha
20、r LCD_Write_Command(uchar cmd);extern uchar LCD_Write_Command_P1(uchar cmd,uchar paral);extern uchar LCD_Write_Command_P2(uchar cmd,uchar paral,uchar para2);extern uchar LCD_Write_Data(uchar dat);extern void Pixel(uchar x,uchar y, uchar Mode);extern void Set_LCD_POS(uchar row,uchar col) reentrant;ex
21、tern void Line(uchar x1,uchar y1,uchar x2,uchar y2,uchar Mode) reentrant;/以上在中断中也有用到所以定义为可重入函数extern void Draw_Image(uchar *G_Buffer,uchar Start_Row,uchar Start_Col)reentrant;extern void Display_Str_at_xy(uchar x,uchar y,char *Buffer,uchar wb) reentrant;extern void cls();sbit buzzer=P33;sbit Add_1=P
22、10;sbit Add_2=P11;sbit Add_3=P12;sbit A_attack=P13;sbit start_or_stop=P14;sbit B_attack=P15;sbit reset=P16;sbit next_section=P17;int A_Score=0,B_Score=0;uchar section=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;void delay(uint ms)uchar i;w
23、hile (-ms)for(i=0;i120;i+); void sounder(uchar t) uchar i,j; for(i = 0;i150;i+) buzzer=buzzer; for(j = 0;jt;j+); /显示A队得分void Show_Score_A()char dat_str14 = 0,0,0,0;dat_str10 = A_Score / 100+ 0;dat_str11 = (A_Score % 100) / 10+ 0;dat_str12 = A_Score % 10+ 0;Display_Str_at_xy(26,24,dat_str1,0); /显示B队得
24、分void show_Score_B() char dat_str14 = 0,0,0,0;dat_str10 = B_Score / 100+ 0;dat_str11 = (B_Score % 100) / 10+ 0;dat_str12 = B_Score % 10+ 0;Display_Str_at_xy(102,24,dat_str1,0); /显示节次void show_Section() char dat_str12 = 0,0;dat_str10 = section % 10+ 0;Display_Str_at_xy(66,46,dat_str1,0); /显示节次剩余时间voi
25、d show_section_time() char dat_str13 = 0,0,0;if(SS!=Last_SS)Last_SS=SS;dat_str10 = SS / 10+ 0;dat_str11 = SS % 10+ 0;Display_Str_at_xy(114,68,dat_str1,0);if(MM!=Last_MM) Last_MM=MM;dat_str10 = MM / 10+ 0;dat_str11 = MM % 10+ 0;Display_Str_at_xy(90,68,dat_str1,0); void show_attack_time()char dat_str1
26、3 = 0,0,0; /显示A对进攻剩余时间if(team=0)if(A_time!=Last_A_time)Last_A_time=A_time; dat_str10 = A_time / 10+ 0;dat_str11 = 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_str10 = B_time / 10+ 0;dat_str11 = B_time % 10+ 0;Display_
27、Str_at_xy(90,112,dat_str1,0);sounder(80);/显示进攻方void show_attacker() if(team=0) Display_Str_at_xy(74,90,A,0); else Display_Str_at_xy(74,90,B,0);/显示状态void show_status() if(status=0) Display_Str_at_xy(117,46,暂停 ,1); elseDisplay_Str_at_xy(117,46,进行中,1);void show_maker()Display_Str_at_xy(26,2,单片机程序设计,0);
28、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); /画主菜单void Draw_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_S
29、tr_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
30、(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);/* 按键检测*/ void check_key()uchar score=0;/加分if(Add_1=0|Add_2=0|Add_3=0)&status=1) if(Add_1=0) score=1; else if(Add_2=0) score=2;
31、else if(Add_3=0) score=3; if(team=0) A_Score+=score;Show_Score_A();status=0;team=1;ET0 = 0; TR0 = 0;show_status(); else if(team=1) B_Score+=score;Show_Score_B();status=0;team=0;ET0 = 0; TR0 = 0;show_status();A_time=24;B_time=24; /下一节if(next_section=0§ion38)count=0;if(SS=0) if(MM=0) next_section=
32、0; for(i=0;i25;i+)sounder(80);delay(5); a+; else SS=59; MM-; elseSS-;if(team=0)if(A_time1)start_or_stop=0;team=1;A_time=24;B_time=24;for(i=0;i25;i+)sounder(80);delay(5);a+;elseA_time-; else if(team=1)if(B_time1)start_or_stop=0;team=0;A_time=24;B_time=24;for(i=0;i25;i+)sounder(80);delay(5);a+;elseB_t
33、ime-; if(a=0) ET0 = 1; TR0 = 1;void main()LCD_Initialise();buzzer=0;show_maker();while(1)if(start_or_stop=0)break;cls();Draw_Menu_UI();TMOD = 0x01;TH0 = 0x3C;TL0 = 0xB0;ET0 = 0; TR0 = 0;EA = 1;while(1)check_key();show_section_time();show_attack_time();/*LCD_160128.c*/#include #include #include #incl
34、ude #include #include #include #define LCMDW XBYTE0x8000#define LCMCW XBYTE0x8100#define ASC_CHR_WIDTH 8 #define ASC_CHR_HEIGHT 12 #define HZ_CHR_HEIGHT 12 #define HZ_CHR_WIDTH 12 sbit RESET=P33;uchar code LCD_WIDTH = 20; uchar code LCD_HEIGHT = 128; uchar code ASC_MSK96*12= 0x00,0x00,0x00,0x00,0x00
35、,0x00,0x00,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/ 0x00,0x30,0x78,0x78,0x78,0x30,0x30,0x00,0x30,0x30,0x00,0x00,/ ! 0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/ 0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,/ # 0x30,0x30,0
36、x7c,0xc0,0xc0,0x78,0x0c,0x0c,0xf8,0x30,0x30,0x00,/ $ 0x00,0x00,0x00,0xc4,0xcc,0x18,0x30,0x60,0xcc,0x8c,0x00,0x00,/ % 0x00,0x70,0xd8,0xd8,0x70,0xfa,0xde,0xcc,0xdc,0x76,0x00,0x00,/ & 0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/ 0x00,0x0c,0x18,0x30,0x60,0x60,0x60,0x30,0x18,0x0c,0x00,0x
37、00,/ ( 0x00,0x60,0x30,0x18,0x0c,0x0c,0x0c,0x18,0x30,0x60,0x00,0x00,/ ) 0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,/ * 0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,/ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x60,0x00,/ , 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x
38、00,0x00,0x00,0x00,0x00,/ - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x00,0x00,/ . 0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,/ / 0x00,0x7c,0xc6,0xce,0xde,0xd6,0xf6,0xe6,0xc6,0x7c,0x00,0x00,/ 0 0x00,0x10,0x30,0xf0,0x30,0x30,0x30,0x30,0x30,0xfc,0x00,0x00,/ 1 0x00,0x78,0xcc,0xcc,0x0c,0x18,0x30,0x60,0xcc,0xfc,0x00,0x00,/