单片机课程设计--篮球记分牌
- 格式:doc
- 大小:3.18 MB
- 文档页数:16
单片机篮球计分器课程设计一、课程目标知识目标:1. 学生能够理解单片机的基本原理,掌握其编程方法。
2. 学生能够了解篮球计分器的工作原理,掌握相关电路的连接方式。
3. 学生能够运用已学过的数学知识,设计出合理的计分算法。
技能目标:1. 学生能够运用所学知识,独立完成单片机篮球计分器的编程与调试。
2. 学生能够通过小组合作,完成整个篮球计分器的硬件搭建和软件设计。
3. 学生能够运用所学知识解决实际问题,提高创新能力和动手实践能力。
情感态度价值观目标:1. 学生在课程学习中,培养对电子技术的兴趣,激发学习热情。
2. 学生通过团队合作,学会沟通、协作与分工,培养团队精神。
3. 学生能够认识到科技在体育领域的应用,增强科技改变生活的意识。
课程性质:本课程为实践性课程,结合单片机原理、编程、电路设计等多学科知识,旨在培养学生的动手实践能力和创新能力。
学生特点:本课程针对高中年级学生,他们在前期的学习过程中已经掌握了基本的电子技术、编程知识和数学知识,具备一定的自学能力和合作能力。
教学要求:教师需引导学生将所学知识运用到实际项目中,注重培养学生的实践能力和团队协作能力,同时关注学生的个性化发展,提高学生的综合素质。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
1. 理论知识:- 单片机原理:涉及单片机的结构、工作原理、编程语言等。
- 电路设计:讲解篮球计分器所需的基础电路知识,如数字电路、传感器等。
- 计分算法:介绍篮球计分器的计分原理及算法设计。
2. 实践操作:- 硬件搭建:指导学生进行单片机、传感器、显示屏等硬件的连接。
- 软件编程:教授学生编写单片机程序,实现计分器的功能。
- 调试与优化:引导学生对篮球计分器进行调试,找出问题并优化程序。
3. 教学大纲:- 第一周:单片机原理学习,熟悉编程环境。
- 第二周:电路设计及硬件连接,学习传感器应用。
- 第三周:计分算法设计,编写单片机程序。
《单片机原理及应用》篮球计分牌设计1 系统设计1.1 设计要求1.1.1 设计任务设计一个基于单片机的篮球计分牌,实现两队的计分与24秒计时功能。
1.1.2 性能指标要求(1) 按照题目要求独立设计系统所需电路,并完成硬件电路的制作及调试。
(2)结合硬件能够正常计分(1,2,3)。
(3)能够正常显示分值。
(4)能够正常修改工作模式(计分与24秒)。
(5)能够24秒的误差不小于1秒。
发挥部分能记录两队球员犯规次数计数。
1.2 设计思路及设计框图1.2.1设计思路根据实训的要求,需做出能够正常计分、 能记录两队犯规次数和24秒倒计时的电路板,先根据实训课件画出相应的原理图,然后再编写好程序,再依照原理图连接好元器后将程序拷入到板子上来实现其功能。
其中在程序中设计了延时函数,控制函数,主函数,中断方式。
它们分别起着24秒倒计时,加分,增加犯规次数,改变工作方式,复位等作用。
1.2.2总体设计框图→ ←2 各个模块程序的设计本次实训总共设计了4个模块,分别为数码管显示模块,由按键控制的控制模块,振荡电路模块,复位模块和蜂鸣器模块。
先对数码管进行段码的定义,由于本电路使用16位计时器的计时中断法,所以要循环20次才可到达1秒定时,当24s结束时蜂鸣器响。
并且然使用延时程序来给比赛双方加分和记录双方队员犯规的次数。
3 调试过程(1)先是用万用表将实训给予的元器件进行短路和断路的检查。
(2)然后利用proteus软件将已经设计好的原理图进行电路仿真测试,当仿真所显示出来的功能达到实训要求的功能时,就可以按照原理图把元器件插入到电路板上并进行焊接。
(3)完成焊接后,先是用万用表进行电路测试,检查是否存在短路,断路和虚焊等电路问题。
检查完后,把电源,地线和数据转接口连接好就将程序拷入到电路板中。
然后进行按钮功能的测试,发现数码管无法显示出来。
(4)得知是数码管模块出了问题后便开始进行逐一排查。
经过查阅资料得知A102J排阻要串联一个电阻才能使P0口高电平输出,从而让数码管点亮。
篮球记分牌1、项目名称:单片机篮球记分牌2、项目要求:实现为比赛的两个队计分,计时,中场暂停时蜂鸣器报警功能。
其中,加分可以实现每次加一分,两分和三分。
每个队加分时都有相应的指示灯点亮。
3、设计内容本设计是基于AT89C51单片机的篮球计时计分器,利用7段共阴LED作为显示器件。
在此设计中共接入了1个四位一体7段共阴LED显示器,1个四位一体7段共阴LED显示器,一个用来记录赛程时间,每次计时时间设置为2分钟。
另外一个数码管用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。
赛程计时采用正计时方式,比赛开始时启动计时,直至计时到到2分钟为止。
其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了四个按键,用于加一分,加两分,加三分和切换甲乙两队的加分等功能。
采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。
本篮球计时计分器主要包括单片机控制系统、计时显示模块、计分显示模块、定时报警,按键控制键盘模块。
通过这几个模块的协调工作就可以完成相应的计时计分控制和显示功能。
这四个模块的相互连接如下图(图1)所示:4、芯片简介:AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
注:实际产品需要增加时钟、复位电路。
#include "reg51.h" //51头文件#define KEY_IO P0 //键盘接口#define Lcd_Port P2 //定义数据端口sbit Lcd_RS = P3^5; //定义和LCD的连接端口,写数据指令端口sbit Lcd_RW = P3^6; //读写端口sbit Lcd_E = P3^7; //使能端口sbit Lcd_Busy = P2^7; //读忙端口char aa[10]={'0','1','2','3','4','5','6','7','8','9'};int score_a=0,score_b=0; //用于存储双方比分char dis_buff[4]={'0','0','0','0'}; //用于存放两队比分的十位、个位int temp,keytemp1,keytemp2; //临时变量//延时函数void delay(int t){int i,j; //延时变量for(i=0;i<t;i++) //t表示循环次数for(j=0;j<100;j++);}// 读忙信号判断void Read_Busy(void){int k=255;Lcd_Port=0xff;Lcd_RS = 0;Lcd_RW = 1;Lcd_E = 1;while((k--)&&(Lcd_Busy));Lcd_E = 0;}// 写指令函数void Write_Comm(int lcdcomm){Read_Busy( ); //先读忙Lcd_RS = 0; //端口定义为写指令Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口输入总使能Lcd_Port=lcdcomm; //数据端送指令Lcd_E = 0; //端口输入总禁止}//写数据函数void Write_Chr(int lcddata){Read_Busy( ); //先读忙Lcd_RS = 1; //端口写数据使能Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口总输入使能Lcd_Port = lcddata; //数据端口送数据Lcd_E = 0; //端口总输入禁止}//初始化LCDvoid Init_LCD(void){delay(2); //稍微延时,等待LCD进入工作状态 Write_Comm(0x38); //8位2行5*8Write_Comm(0x0c); //显示开/关,光标开闪烁开Write_Comm(0x01); //清显示Write_Comm(0x06); //文字不动,光标右移Write_Comm(0x02); //光标归位}//LED显示动态扫描函数void display(){dis_buff[0]=score_a/10; //送score_a的十位到显示数组里面dis_buff[1]=score_a%10; //送score_a的个位到显示数组里面dis_buff[2]=score_b/10; //送score_b的十位到显示数组里面dis_buff[3]=score_b%10; //送score_b的个位到显示数组里面Write_Comm(0x83); //确定显示位置,第1行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('A');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[0]]); //送显A队比分十位Write_Chr(aa[dis_buff[1]]); //送显A队比分个位Write_Comm(0xC3); //确定显示位置,第2行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('B');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[2]]); //送显B队比分十位Write_Chr(aa[dis_buff[3]]); //送显B队比分个位}//外部中断0中断服务子函数void ext0(void) interrupt 0 using 0 //通过与门触发中断来扫描按键{EX0=0; //关闭外部中断KEY_IO=0x03; //反转法第一步,置键盘接口0000 0011 keytemp1=(~KEY_IO)&0x03; //临时存储按键行状态到keytemp1低4位 delay(1);KEY_IO=0xF0; //反转法第二步,置键盘接口1111 0000 keytemp2=(~KEY_IO)&0xF0; //临时存储按键列状态到keytemp2高4位 temp= keytemp1|keytemp2; //将按键行列号存入tempswitch(temp) //根据按键行列号判断{case 0x11: //按键在第1行第1列score_a++; //A队比分加1if(score_a==100)score_a=99;break;case 0x21: //按键在第1行第2列score_a+=2; //A队比分加2if(score_a>=100)score_a=99;break;case 0x41: //按键在第1行第3列score_a+=3; //A队比分加3if(score_a>=100)score_a=99;break;case 0x81: //按键在第1行第4列if(score_a!=0)score_a--; //A队比分减1break;case 0x12: //按键在第2行第1列score_b++; //B队比分加1if(score_b==100)score_b=99;break;case 0x22: //按键在第2行第2列score_b+=2; //B队比分加2if(score_b>=100)score_b=99;break;case 0x42: //按键在第2行第3列score_b+=3; //B队比分加3if(score_b>=100)score_b=99;break;case 0x82: //按键在第2行第4列if(score_b!=0)score_b--; //B队比分减1break;}do //等待按键释放,防止按键抖动{KEY_IO=0x03;temp=(~KEY_IO)&0x03;}while(temp!=0);}//主函数void main(){Init_LCD( );EA=1; //开全局中断EX0=1; //开外部中断0IT0=0; //外部中断0低电平触发while(1){KEY_IO=0x03; //赋初值0000 0011display(); //送显EX0=1; //开外部中断0,即可以按键扫描 }}。
毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
长沙学院《单片机原理及应用》课程设计说明书题目篮球比分计分牌系(部) 电子与通信工程系专业(班级) 光电信息工程二班姓名龙敏学号2010041213指导教师刘辉、王新辉起止日期2012/12/10-2012/12/21《单片机原理及应用》课程设计任务书9系(部):电信系专业:2010级光电信息工程指导教师:王新辉、刘辉长沙学院课程设计鉴定表目录1. 课程设计任务书 (6)2. 系统总体方案选择与说明 (6)3. 系统结构框图与工作原理 (7)4. 各单元硬件设计说明及计算方法 (7)(1) 12864显示器 (7)(2)八位独立按键模块 (8)(3)51单片机定时器及初值计算方法 (8)5. 软件设计与说明(包括流程图) (8)6. 调试结果与必要的调试说明 (9)(1)实物图 (9)7. 使用说明 (10)8. 程序清单 (10)(1)比分倒计时子程序 (10)(2)加减分子程序 (11)9. 课程设计体会 (12)10. 参考文献。
(13)1. 课程设计任务书设计一个基于AT89S52单片机的篮球比赛记分牌,用12864液晶屏显示信息。
课题要求: (1)、启动时12864液晶屏第一行显示的内容是:比赛双方的队名。
第二行显示的内容是:比分为000:000。
第三行显示的内容是:本节剩余时间、进攻24秒倒计时。
第四行显示的内容是:设计者的姓名、班级和学号。
(2)设置如下按功能键,实现相应控制功能2. 系统总体方案选择与说明采用单片机和12864液晶显示电路实现该方案以单片机为核心,作为控制模块,并以12864液晶为显示模块,由单片机自带的时钟电路和定时器来实现计时,由于篮球比赛的规则较多,故以独立按键来输入需要控制的对象,由单片机的P1口来接键盘,液晶的数据线接在P0口相应的口线上。
如图2—1。
单片机实现系统框图2—13.系统模块层次结构图3—1 4. 各单元硬件设计说明及计算方法 (1) 12864显示器12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM (GDRAM )。
西安文理学院机械与材料工程学院课程设计报告专业班级课程单片机课程设计题目单片机课程设计篮球比赛计分牌的设计学号学生姓名指导教师2016年11月西安文理学院机械与材料工程学院课程设计任务书学生姓名 专业班级 学 号指导教师 职 称 讲师 教研室课 程 单片机课程设计 题目篮球比赛计分牌的设计 任务与要求设计任务:以AT89S51单片机为核心,设计一个篮球比赛计分牌。
裁判控制开始、暂停、清除和两队的加分按键。
比赛每节10分钟,允许暂停,且使用不同LED 表示比赛状态。
比赛开始,按下可开始按键,绿色LED 亮,进入10分钟倒计时。
比赛期间,若暂停键按下,倒计时暂停,黄色LED 亮;当再次按下暂停按键,比赛继续进行。
当倒计时为0,比赛结束,红色LED 亮,蜂鸣器响5秒。
比赛期间,裁判可通过加分按键分别给A 队或B 队加分,每按下一次加2分。
当清除按键按下,时间与分数全部清零。
设计要求:1.完成系统的硬件电路设计与软件设计;2.采用C51语言编程;3.采用Proteus 、Keil C 等软件实现系统的仿真调试;4.设计报告要求思路清晰,结构合理,语言流畅,书写格式符合要求。
开始日期 2016.11.7 完成日期 2016.11.222016年11月3日A 队成绩倒计时开始加分加分暂停暂停B 队成绩摘要单片机,亦称单片微电脑或单片微型计算机。
它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
本设计是基于AT89S51单片机的篮球计时计分器,利用7段共阴LED 作为显示器件。
在此设计中共接入了3个两位一体7段共阴LED显示器,一个用来记录赛程时间,其中2位用于显示A队成绩,2位用于显示B 队成绩,每队2个LED显示器显示范围可达到0~99分。
赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。
【篮球记分牌】篮球记分牌课程设计实验报告xx学校电子技术课程设计报告题目学院自动化与电气工程学院专业班级学号学生姓名指导教师完成日期201X年xx月xx日篮球记分牌摘要围绕设计要求对篮球记分牌进行设计。
首先根据功能要求提出单片机STC89S52RC为控制核心的设计方案;其次进行硬件系统和软件系统的设计,并且根据本次设计所用的V3.72开发板原理图进行设计,然后根据所设计的电路图级程序用Proteus和Keil进行了仿真,验证了设计方案的正确性,最后,把程序烧进开发板中来完成篮球记分牌的硬件电路。
调试和测试结果表明基本上都能满足此次课程设计的要求。
本次课程设计,有效加深和巩固了单片机的基础知识,提高了我们的实际动手能力,具有及其深远的意义。
关键词:单片机独立按键蜂鸣器at24c02数码管一、设计要求1.比赛开始,比分能够全部清零,数码管前2位,末二位做记分用,当中2位做24秒倒计时用。
2.24秒倒计时时间到,蜂鸣器响、指示灯亮,重新开始倒计时(按下开始键),蜂鸣器停止鸣叫、指示灯灭。
3.比分进行增加后,倒计时从24秒重新开始倒计时。
任意时刻24秒可以重新开始倒计时。
必要时候能够关闭倒计时。
4.利用AT24C02或者单片机内部资源保存比分,支持复位保存,掉电保存功能。
二、系统设计及仿真2.1、系统总体设计图2-1系统结构图思想汇报专题本系统采用单片机STC89S52RC为控制核心,系统主要包括显示模块、按键控制模块、蜂鸣器报警模块等。
下面对各模块的设计进行论证。
1)显示模块单片机系统中,往往需要多位显示。
动态显示是一种最常见的多位显示方法,应用非常广泛。
所有数码管段选都连接在一起的时候,怎么让数码管显示不一样的数字呢?动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。
首先我们来看一下显示模块电路原理图:图2-274ls138结构图图2-3数码管段选图本实验使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选2)按键控制模块方案一:采用矩阵键盘。
电子技术课程设计报告篮球赛电子计时记分牌学院:机电年级专业:电信学号:*名:**指导教师:侯** 卢**完成时间:2011-7-10成绩:中国陕西杨凌摘要篮球赛电子计时记分牌是根据篮球比赛特点设计的独立的信息采集、分配、评判和显示的系统,能实现比赛时间和分数的实时、准确、快捷处理和呈现。
本设计原理简单,主要采用AT89C52单片机作为微控制器,集合矩阵键盘、数码管和LED指示灯,通过键盘控制记分牌的工作状态,通过数码管和LED指示灯来反馈信息。
本设计在充分考虑了篮球比赛的实际情况基础上设计,具有友好的人机交互接口,并且可以防止人为误操作造成的不良后果,具有一定的实用性。
关键字:单片机;AT89C52;计时记分牌;篮球比赛目录1 设计任务 (1)1.1 设计的目的和意义 (1)1.2 设计任务与要求 (1)2 硬件系统设计 (1)2.1 总体方案设计 (1)2.2 芯片选型与具体电路设计 (2)2.2.1 单片机的选型 (2)2.2.2 复位和振荡电路的设计 (2)2.2.3 键盘输入模块的设计 (3)2.2.4 信息提示模块的设计 (3)2.3 系统总体电路 (4)2.4 系统所用元器件 (6)3 软件系统设计 (6)3.1 软件系统总体设计方案 (6)3.2 软件系统流程图 (7)3.2.1 主程序流程图 (9)3.2.2 按键检测子程序设计 (10)3.2.3 数码管显示子程序设计 (10)4 系统调试 (12)5 总结 (13)5.1 经验总结 (13)5.2 心得体会 (14)参考文献 (14)附录:篮球赛电子计时记分牌单片机程序代码 (15)1 设计任务1.1 设计的目的和意义目前球场记分牌在传统操作模式下,采用记分员手动翻动记分牌记分,工作方式单一。
由于种种弊端,电子记分板已经开始在一些大型的体育场流行起来,不仅发展速度迅猛并会逐渐取代传统的电子记分牌。
电子记分板根据篮球比赛的特点,采用单片机为核心控制LED 数码管,具有亮度高、可视性好、功耗小、使用寿命长等优点;具有性能稳定,尺寸适中,运输安装方式灵活,物美价廉等特点,特别适用于中、小型体育馆和训练馆。
单片机实现篮球记分牌的设计目录摘要 (2)第1章引言1.1 单片机的特点及发展概况 (3)1.2 单片机的基本组成 (3)1.3 单片机的特点 (3)1.4 单片机的应用 (3)1.5 单片机的发展概况 (4)1.6单片机在篮球记分牌中的应用 (4)第2章篮球记分牌硬件设计2.1 设计题目分析 (5)2.2 系统硬件设计 (5)2.3 硬件设计电路图 (13)第3章篮球记分牌系统软件设计3.1 软件设计思路及程序流程图 (15)3.2 程序清单 (26)第4章毕业设计小结计心得及改进 (41)致谢 (42)参考文献 (43)摘要:单片机是把主要计算机功能部件都集成在一块芯片上的微型计算机。
它是一种集计数和多接口于一体的微控制器,被广泛应用在智能产品和工业自动化上,而51单片机是个单片机中最为典型和最有代表性的一种本次毕业设计的主要任务是设计一个篮球比赛记分牌,包括硬件设计和软件设计。
硬件设计的主要任务是:LED数码管显示、按键控制系统设计以及辅助功能的设计。
软件设计包括:功能选择、倒计时的实现。
本文主要介绍了单片机实现篮球记分牌的整个设计流程,采用汇编语言编写程序。
本课题选择AT89C51为核心控制元件,设计了日常比赛中用到的篮球记分牌。
设计同时引用MAX7219专用LED驱动芯片,解决了多位LED数码管同时显示的问题,硬件结构紧凑,成本低。
该单片机篮球记分牌可适应不同篮球规则,通过按键修改每个设置。
运行可靠,具有一定的使用价值和竞争价值。
关键词: AT89C51单片机、LED数码管、MAX7219、汇编、篮球记分牌第一章引言1.1单片机的特点及发展概况单片机是一个单芯片形态,面向控制对象的嵌入式应用计算机系统.它的出现及发展使计算机技术从通用型数值计算领域进入到智能化的控制领域.从此,计算机技术在两个重要领域——通用计算机领域和嵌入式计算机领域都得到了极其重要的发展,并正在深深地改变着我们的社会。
西安文理学院机械与材料工程学院课程设计报告专业班级课程单片机课程设计题目单片机课程设计篮球比赛计分牌的设计学号学生姓名指导教师2016年11月西安文理学院机械与材料工程学院课程设计任务书学生姓名 专业班级 学 号指导教师 职 称 讲师 教研室课 程 单片机课程设计 题目篮球比赛计分牌的设计 任务与要求设计任务:以AT89S51单片机为核心,设计一个篮球比赛计分牌。
裁判控制开始、暂停、清除和两队的加分按键。
比赛每节10分钟,允许暂停,且使用不同LED 表示比赛状态。
比赛开始,按下可开始按键,绿色LED 亮,进入10分钟倒计时。
比赛期间,若暂停键按下,倒计时暂停,黄色LED 亮;当再次按下暂停按键,比赛继续进行。
当倒计时为0,比赛结束,红色LED 亮,蜂鸣器响5秒。
比赛期间,裁判可通过加分按键分别给A 队或B 队加分,每按下一次加2分。
当清除按键按下,时间与分数全部清零。
设计要求:1.完成系统的硬件电路设计与软件设计;2.采用C51语言编程;3.采用Proteus 、Keil C 等软件实现系统的仿真调试;4.设计报告要求思路清晰,结构合理,语言流畅,书写格式符合要求。
开始日期 2016.11.7 完成日期 2016.11.222016年11月3日A 队成绩倒计时开始加分加分暂停暂停B 队成绩摘要单片机,亦称单片微电脑或单片微型计算机。
它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
本设计是基于AT89S51单片机的篮球计时计分器,利用7段共阴LED 作为显示器件。
在此设计中共接入了3个两位一体7段共阴LED显示器,一个用来记录赛程时间,其中2位用于显示A队成绩,2位用于显示B 队成绩,每队2个LED显示器显示范围可达到0~99分。
赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。
单片机课程设计报告题目篮球记分牌学院自动化与电气工程学院专业自动化班级自动化103学号学生姓名指导教师完成日期2012年12月15日篮球记分牌一.设计要求:1、比赛开始,比分能够全部清零,数码管前2位、末2位做记分用,当中2位做24秒倒计时用。
2、24秒倒计时时间到,蜂鸣器响、指示灯亮,重新开始倒计时,蜂鸣器停止鸣叫、指示灯灭。
3、比分进行增加后,倒计时从24秒重新开始倒计时。
任意时刻24秒可以重新开始倒计时。
必要时候能够关闭倒计时。
4、利用AT24C02或者单片机内部资源保存比分,支持复位保存,掉电保存功能。
5、其他附加功能。
二.原理图:三.实验流程图:四.实验程序:Main.c文件:/****************************************************************************** ***************函数名:篮球记分牌说明:比赛开始,比分能够全部清零,数码管前2位、末2位做记分用,当中2位做24秒倒计时用。
24秒倒计时时间到,蜂鸣器响、指示灯亮,重新开始倒计时,蜂鸣器停止鸣叫、指示灯灭。
比分进行增加后,倒计时从24秒重新开始倒计时。
任意时刻24秒可以重新开始倒计时。
必要时候能够关闭倒计时。
作者:完成日期:2012.12.2/****************************************************************************** ****************/#include<stc12c5a60s2.h>#include <intrins.h>#include"eeprom.h"#define uchar unsigned char#define uint unsigned int/***********端口定义*************//*数码管段选用P0口,位选用P2口*//******指示灯******/sbit LED=P3^4;/********蜂鸣器*********/sbit FMQ=P3^5;/******数组定义*******/uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x07f,0x6f};//0,1,2,3,4,5,6,7, 8,9uchar password[6]; //掉电保存6位数组/***********变量定义*************/uchar fen1; //甲队初始得分uchar fen2; //乙队初始得分uchar fen3; //甲乙两队上下半场换分uchar SJ; //时间变量值uchar cxjs=1; //重新计时标志位uchar key; //矩阵键盘按键值uchar temp; //矩阵键盘P1口寄存变量uchar time; //中断计数器/***********************************************************函数名称:delay函数功能:基本延时程序入口参数:无出口参数:无备注:无***********************************************************/void delay(uchar x){ uchar j;while((x--)!=0){ for(j=0;j<125;j++){;}}}/*********************************************************** 函数名称:display函数功能:数码管显示程序入口参数:fen1,fen2,SJ出口参数:无备注:无***********************************************************/ void display(void){uchar m;for(m=6;m>0;m--){delay(2);if(m==6){P2 = 0XFE;P0 = table[fen1/10];}if(m==5){P2 = 0XFD;P0 = table[fen1%10];}if(m==4){P2 = 0XFB;P0 = table[SJ/10];}if(m==3){P2 = 0XF7;P0 = table[SJ%10];}if(m==2){P2 = 0XEF;P0 = table[fen2/10];}if(m==1){P2 = 0XDF;P0 = table[fen2%10];}}}/*********************************************************** 函数名称:keyscan函数功能:4X4矩阵键盘扫描程序入口参数:无出口参数:无备注:读取的键值赋给了key***********************************************************/ void keyscan(void){temp=P1;if(temp!=0xf0){delay(120);if(temp!=0xf0){P1=0xfe;temp=P1;delay(120);switch(temp){case(0xee):key=0;break;case(0xde):key=1;break;case(0xbe):key=2;break;case(0x7e):key=3;break;}P1=0xfd;temp=P1;delay(120);switch(temp){case(0xed):key=4;break;case(0xdd):key=5;break;case(0xbd):key=6;break;case(0x7d):key=7;break;}P1=0xfb;temp=P1;delay(120);switch(temp){case(0xeb):key=8;break;case(0xdb):key=9;break;case(0xbb):key=10;break;case(0x7b):key=11;break;}P1=0xf7;temp=P1;delay(120);switch(temp){case(0xe7):key=12;break;case(0xd7):key=13;break;case(0xb7):key=14;break;case(0x77):key=15;break;}}}}/*********************************************************** 函数名称:keydown函数功能:4X4矩阵键盘判断程序入口参数:无出口参数:无备注:判断是否有按键按下***********************************************************/ void keydown(void){P1=0xF0;if(P1!=0xF0){delay(150); //消抖if(P1!=0xF0){ keyscan();}}}/*********************************************************** 函数名称:timer0init函数功能:定时器初始化部分程序入口参数:无出口参数:无备注:设置定时器0工作方式***********************************************************/ void timer0init(){TMOD &= 0xf0; //定时器0工作方式1TMOD |= 0x01;}/*********************************************************** 函数名称:timer0函数功能:中断服务程序入口参数:无出口参数:无备注:此程序无调用***********************************************************/void timer0 (void) interrupt 1 using 0{TH0=0x15;TL0=0xa0;time=time+1;if(time==20){time=0;SJ=SJ-1;if(SJ==0){SJ=0;EA=0;FMQ=0;LED=0;}}}/***********************************************************函数名称:setpassword函数功能:掉电保存程序入口参数:无出口参数:无备注:此程序调用eeprom_eares擦除扇区程序,eeprom_write字节编程程序***********************************************************/void setpassword(){eeprom_eares(0x0000);eeprom_write(0x0000,fen1/10);eeprom_write(0x0001,fen1%10);eeprom_write(0x0002,SJ/10);eeprom_write(0x0003,SJ%10);eeprom_write(0x0004,fen2/10);eeprom_write(0x0005,fen2%10);}/***********************************************************函数名称:getpassword函数功能:读出eeprom内存储值入口参数:无出口参数:无备注:无***********************************************************/void getpassword(){uchar i;for(i=0;i<6;i++)password[i]=eeprom_read(i);}/***********************************************************函数名称:main函数功能:主程序入口参数:无出口参数:无备注:实现功能:通过按键开始/停止,暂停/继续计时和对甲乙两队的加分***********************************************************/void main(){LED=1;FMQ=1;P2=0xFF;P1=0xF0;SJ=24;fen1=0;fen2=0;key=16;/*定时器设置*/timer0init();ET0=1;TR0=1;while(1){display();keydown();if(key==0) //开始按键{EA=1;}if(key==1) //甲队加分按键{fen1=fen1+1;cxjs=0;}if(key==2) //乙队加分按键{fen2=fen2+1;cxjs=0;}if(key==3) //暂停计时{EA=0;}if(key==4) //停止按键{fen1=0;fen2=0;SJ=24;EA=0;FMQ=1;LED=1;}if(key==5) //上下半场换分{fen3=fen1;fen1=fen2;fen2=fen3;}if(cxjs==0) //重新计时{SJ=24;cxjs=1;}if(key==6) //保存当前值{setpassword();}if(key==7) //调用前次记录{getpassword();fen1=password[0]*10+password[1];SJ=password[2]*10+password[3];fen2=password[4]*10+password[5];EA=0;}key=16; //此处赋值key,否则key将一直保留按键后的值 }}Eeprom.c文件:#define eeprom#include"eeprom.h"//-------------------------------------------------------------------------------------------------------//EEPROM操作//------------------------------------------------------------------------------------------------------//定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数//#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值#define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值//#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值union union_temp16{unsigned int un_temp16;unsigned char un_temp8[2];}my_unTemp16;unsigned char eeprom_read(unsigned int add); //读一字节,调用前需打开IAP 功能void eeprom_write(unsigned int add, unsigned char ch); //字节编程,调用前需打开IAP 功能void eeprom_eares(unsigned int add); //擦除扇区void IAP_Disable(); //关闭IAP 功能void IAP_Disable(){//关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,//一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关IAP_CONTR = 0; //关闭IAP 功能IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用IAP_ADDRH = 0;IAP_ADDRL = 0;}//读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节unsigned char eeprom_read(unsigned int add){IAP_DATA = 0x00;IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址//EA = 0;IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关return (IAP_DATA);}//字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据void eeprom_write(unsigned int add, unsigned char ch){IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器//EA = 0;IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//擦除扇区, 入口:DPTR = 扇区地址void eeprom_eares(unsigned int add){IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令my_unTemp16.un_temp16 = add;IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址//EA = 0;IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动_nop_();//EA = 1;IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态, //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关}//-------------------------------------------------------------------------------------------------------Eeprom.h文件:#ifndef _eeprom_h_#define _eeprom_h_#ifdef eeprom#include<stc12c5a60s2.h>#include"intrins.h"#define EXET#else#define EXET extern#endif//typedef unsigned char INT8U;//typedef unsigned int INT16U;EXET unsigned char eeprom_read(unsigned int add); //读一字节,调用前需打开IAP 功能EXET void eeprom_write(unsigned int add, unsigned char ch); //字节编程,调用前需打开IAP 功能EXET void eeprom_eares(unsigned int add); //擦除扇区#endif五.实验仿真:六.实验实物图:七.实验总结:通过这次单片机课程设计,我学到了很多东西。