单片机课程设计--篮球记分牌
单片机课程设计 记分牌的设计

这里选用的是国外进口的51系列兼容单片机C语言开发系统的C编写。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。给芯片提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。
开关电路图图3-3
LED灯电路图图3-4
3.4复位和振荡电路的设计
复位电路可以实现上电复位和按键复位两种复位方式:上电复位电路由电容串联电阻构成,由图并结合“电容电压不能突变”的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以适当组合RC的取值就可以保证可靠的复位。按键复位电路则是通过按下RESET按键拉高RST引脚电平来实现的。
按键电路图图3-7
3.6信息显示模块
信息显示用到1个4位8段共阴极数码管和一个蜂鸣器。
数码管显示3位数字,第一位为权数,第二位为隔开符号(中间的一个横杠),第三、第四位一起进行分数的加减。由于P0口的驱动能力有限,所以外接了一排阻,从而增强了对数码管的驱动能力。数码管采用共阳极连接方式,其阴极分别接单片机P0~P7口,当单片机某口输出低电平时,对应的数码管亮。电路图如图3-8.
三、硬件设计
3.1总体方案设计
篮球积分器的硬件电路分成主控模块、键盘输入模块、信息提示模块三部分进行设计。
主控模块以AT89S51为核心,完成输入输出信息处理、计时器中断相应、数值计算等,协调整个系统有条不紧的工作。键盘输入模块作为人机交互接口,允许用户控制系统的工作状态,完成如记分开始/暂停、记分清零、比赛队伍分数调整等功能。信息提示模块包含4个2位8段数码管和一个蜂鸣器,用于实时显示系统工作状态,方便用户进行下一步操作。
单片机课程设计篮球比赛计分牌的设计

尺寸:适合篮球比赛场地,易于安装和拆卸
显示:清晰可见,易于读取分数和计时信息
设计:简洁大方,易于操作
颜色:鲜艳醒目,易于识别
显示清晰:能够清晰地显示比赛分数、时间等信息
操作简便:操作简单,易于使用
稳定性高:能够长时间稳定运行,避免故障
易于维护:易于维护和维修,降低维护成本
单片机最小系统包括:单片机、电源、晶振、复位电路
晶振:为单片机提供稳定的时钟信号
复位电路:在系统启动时,将单片机复位到初始状态
电源:为单片机提供稳定的电源电压
单片机最小系统设计需要考虑的因素:稳定性、可靠性、成本、可扩展性等
显示模块类型:LCD或LED
显示内容:比分、时间、犯规次数等
接口设计:I2C、SPI或其他
显示模块控制:通过单片机控制显示内容
显示模块接口:与单片机连接
显示模块尺寸:根据实际需求选择
功能:接收用户输入,控制计分牌的显示
应用实例:篮球比赛计分牌、电子秤、遥控器等
设计要点:按键的布局、微控制器的选择、显示模块的接口
模块组成:按键、微控制器、显示模块
电源模块的作用:为计分牌提供稳定的电源
电源模块的组成:电源适配器、电源线、电源开关等
电源模块的选择:根据计分牌的功率需求选择合适的电源模块
电源模块的安装:按照说明书进行安装,确保电源模块与计分牌的连接正确、牢固
电源滤波:使用电源滤波器,减少电源噪声干扰
屏蔽设计:使用金属外壳,屏蔽电磁干扰
接地设计:良好的接地设计,减少静电干扰
软件抗干扰:使用软件滤波算法,减少信号噪声干扰
C语言:广泛应用,易于理解和学习
功能测试:测试计分牌的各项功能,如计分、计时等
单片机课程设计(篮球计分器)

检查电源:确保电源正常,电压稳定 检查连接:确保所有硬件连接正确,无松动或损坏 检查硬件功能:确保所有硬件功能正常,如LED灯、按键等 检查程序运行:确保程序运行正常,无错误或异常 检查数据传输:确保数据传输正常,无丢失或错误 检查稳定性:确保硬件在长时间运行下仍能保持稳定工作
软件调试的目的:发现并修复软件中的错误 软件调试的方法:使用调试工具,如断点、单步执行等 软件调试的步骤:设置断点、执行程序、查看变量值、分析错误原因 软件调试的技巧:使用日志记录、使用单元测试等
提高解决问题的能力和创新能力
添加标题
添加标题
添加标题
添加标题
学会使用单片机进行硬件设计和软 件开发
培养团队合作精神和沟通能力
Байду номын сангаас
功能要求:实现篮 球计分功能,包括 得分、犯规、暂停 等
硬件要求:使用单 片机、LED显示屏、 按键等硬件设备
软件要求:编写 程序,实现篮球 计分器的功能
设计要求:设计 简洁、易于操作, 满足实际需求
结束程序:关闭计时器、计分器等设备,退出程序
程序功能:检测按键是否被 按下
程序流程:初始化、循环扫 描、判断按键状态、执行相 应操作
初始化:设置按键引脚为输 入模式,并初始化为高电平
循环扫描:不断循环检测按 键状态,直到按键被按下或 松开
判断按键状态:根据按键引 脚的电平变化判断按键是否 被按下或松开
软件设计:优化代码结构, 提高运行效率
硬件设计:考虑成本和性能, 选择更合适的元器件
用户体验:增加用户友好的 界面和操作方式
功能扩展:增加更多的功能, 如数据统计、比赛记录等
技术发展趋势:智能化、网络化、 小型化
技术挑战:提高稳定性、降低功耗、 提高准确性
单片机篮球计分器课程设计

单片机篮球计分器课程设计一、课程目标知识目标: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,即可以按键扫描 }}。
基于51单片机的篮球记分牌设计课程设计

毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计报告题目篮球记分牌学院自动化与电气工程学院专业自动化班级自动化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五.实验仿真:六.实验实物图:七.实验总结:通过这次单片机课程设计,我学到了很多东西。