单片机篮球积分器分解
基于单片机的篮球计时计分器设计设计

基于单片机的篮球计时计分器设计设计篮球计时计分器是一种用于篮球比赛计时和计分的设备。
基于单片机的篮球计时计分器设计可以实现自动计时、计分、显示比分等功能,使得篮球比赛更加准确和便捷。
本文将介绍基于单片机的篮球计时计分器的设计和实现。
设计思路:基于单片机的篮球计时计分器主要由显示模块、计时模块、计分模块、控制模块等组成。
其中,显示模块用于实时显示比赛时间和比分情况;计时模块用于计时并显示剩余时间;计分模块用于记录比赛双方的得分情况;控制模块用于整合各个模块的功能和控制比赛的进行。
首先,我们需要选择一款适合的单片机来实现篮球计时计分器。
一般情况下,AT89S52是比较常用的单片机,它具有较强的计算和控制能力,可以满足篮球计时计分器的需求。
接下来,我们需要确定显示模块的类型。
一种常见的显示模块是七段数码管,用于显示比赛时间和比分情况。
七段数码管可以通过单片机的IO口进行控制,显示时间和比分的变化。
计时模块可以通过在单片机中设置定时器来实现。
定时器可以定期产生一个中断信号,通过处理中断信号来实现计时功能。
可以设置定时器的初值和中断次数来实现精确的计时。
计分模块可以通过增加加减分按钮和设置相关的IO口来实现。
当按下加分按钮时,计分模块将调用相应的函数来增加得分;当按下减分按钮时,计分模块将调用相应的函数来减少得分。
计分模块还可以实现显示当前比分的功能。
控制模块是整个篮球计时计分器的核心模块。
通过对各个模块的控制和操作,实现比赛的正常进行。
控制模块还可以增加暂停和继续比赛的功能,通过设置相应的标志位来实现。
接下来,我们需要根据设计思路进行硬件电路的连接和单片机程序的编写。
硬件电路的连接包括七段数码管的连接、计时器连接、按钮连接等。
单片机程序的编写需要包括显示模块的控制程序、计时模块的中断处理程序、计分模块的加减分函数等。
最后,我们需要进行测试和优化。
测试可以通过模拟篮球比赛的环境,模拟时间和比分的变化,检查计时计分器的功能是否正常。
基于单片机的篮球比赛计分器设计毕业设计

摘要随着电子产品的逐渐发展,单片机在电子产品中占据着越来越重要的部位,篮球计时计分器就是以单片机为核心,分为计时电路,计分电路,时间暂停以及修改时间的,倒计时提醒电路,复位电路等。
在篮球比赛中作为记录比分和时间的重要依据[1]。
计时电路:根据篮球比赛的时间要求,设置好比赛的规定时间,通过编程,在显示器上显示出来,进而连接在大屏幕上,可供观众观看。
计分电路:在比赛开始后,每对进一个球,都会要有相应的得分,通过程序的设定也要把比分显示在显示器上,以便能够实时的传递给观众。
时间暂停和修改时间电路:在比赛过程中,可能会发生一些事情,需要更改时间或暂停时间,在这里我们选择应用按键的方式来改变比赛的时间。
复位电路:是单片机本身的外接电路,当程序进入死循环是或想要实现的功能没实现时,我们可以尝试着进行复位,看电路是否可以正常工作。
倒计时提醒电路:在比赛的最后,为了让运动员有心理准备,我们设置了倒计时提醒功能,在最后十秒时用蜂鸣器发声来提醒运动员,比赛即将结束。
本次实验通过以51单片机为核心,LCD显示屏进行显示,通过Proteus软件进行仿真,得到了预期的结果。
关键词:单片机;显示器;按键;ProteusAbstractWith the gradual development of electronic products, electronic products, SCM occupyan increasingly important part of basketball time points is microcontroller as the core, into the timing circuit, scoring circuit, time pause and modify time countdown Alert circuit, reset circuit.Timing circuit: According to the time requirements basketball game, good game settings specified time, through programming, show up on the display, and then connected to the big screen for the audience to watch.Scoring circuit: After the start of the game, for each goal scored will have the appropriate score, by setting the score of the program is displayed on the display should to be able to transfer to the audience in real time.Time to pause and modification time circuit: during the game, something might happen, you need to change the time or pause time, where we choose to apply the key ways to change the game time.Reset circuit: the external circuit microcontroller itself when the program enters an infinite loop or function you want to achieve is not achieved; we can try to reset, to see whether the circuit is working properly.Countdown to remind Circuit: In the last game, in order to allow the athletes have been psychologically, we set the countdown reminder, in the final ten seconds with a small light flashes to remind players, the game is about to end.The experiments with 51 microcontroller core, LCD screen display, through the Proteus simulation software, to get the desired results.Keywords: microcontroller; monitor; button; Proteus目录摘要 (I)Abstract (I)1.1 目的及意义 (1)1.1.1设计(论文)的目的 (1)1.1.2设计(论文)的意义 (1)1.2 研究现状 (2)1.3 论文的主要工作 (2)1.4 章节安排 (2)第2章设计方案 (3)2.1 设计要求 (3)2.2 设计思路 (3)2.3 系统的硬件框图 (3)第3章器件介绍 (5)3.1 AT89C51单片机 (5)3.1.1 简介 (5)3.1.2主要功能 (6)3.1.3管脚说明 (6)3.2 LCD1602显示器 (8)3.2.1 DS1602的特性 (8)3.2.2管脚功能 (9)3.3 晶振 (10)3.4 蜂鸣器 (10)3.4.1 蜂鸣器的分类 (11)3.4.2 蜂鸣器的驱动方式 (12)3.5 排阻 (13)3.6 按键 (14)3.7 三极管 (14)3.7.1 三极管的分类 (15)3.7.2 三极管的工作状态 (15)3.8 电容 (16)第4章软件设计 (17)4.1 Proteus软件 (17)4.2 Keil软件 (18)4.2.1 Keil C51单片机软件开发的整体结构 (19)4.3 Proteus仿真实验结果 (20)4.3.1 时间显示 (21)4.3.2 分数显示 (22)4.3.3 倒计时功能 (23)4.3.4 24秒报警电路 (24)4.3.5 第二小节比赛 (25)4.3.6 交换电路 (26)4.3.7 按键电路 (26)4.3.8 复位电路 (27)4.3.8 晶振电路 (28)第5章硬件设计 (29)5.1 Protel DXP 软件 (29)5.2 Protel 原理图 (30)5.2.1 原理图绘制的步骤 (30)5.3 PCB版图 (31)5.4制板 (32)5.5 焊接、调试 (32)5.6实物图 (32)结论 (35)致谢 (36)参考文献 (37)第1章绪论1.1目的及意义1.1.1设计(论文)的目的随着科学技术的发展,单片机在我们生活中越来越被广泛的使用,由于单片机的集成度高,功能强,通用性好,具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便等优点使单片机迅速得到广泛的应用,现在已经成为各种电子产品中的关键部分。
基于单片机的篮球计时计分器设计

基于单片机的篮球计时计分器设计摘要随着科技的日益发展进步,单片机技术已经被广泛应用在科研、工作等重要领域内,目前也已经普及到我们的日常生活中,扮演着十分重要的角色。
本次设计是基于单片机的篮球计分器,以基本篮球规则为依据,设计结构简单且方便操作,对篮球比赛实现实时控制。
此次设计的计分器总共包括四个模块,他们是24秒显示、计时器、记分器、计节器。
实现的功能是:24秒显示能按键控制24秒计时器,当控球时间超过24秒时,可发出报警信号。
计时器可按键调节,可以随时暂停计时,暂停比赛,在每节结束和全场结束时报警。
记分器记录两队的积累分数,可通过按键分别加1、2、3分。
设计分为硬件设计和软件设计。
硬件设计的主要包括的是:LED数码管显示、按键控制系统设计以及辅助功能的设计。
软件设计包括:功能选择、倒计时的实现。
本文主要介绍了用单片机设计实现篮球计分器的整个流程,采用C语言编写程序。
设计引用MAX7219专用LED驱动芯片,解决了多位LED数码管同时显示的问题。
其中时间显示和比分显示部分由两组共阴极LED数码管显示。
时间显示部分可以以分为单位进行计时调整。
比分显示部分可以实现在半场结束后手动换场,两个显示模块均采用动态扫描方式进行显示。
按键控制部分采用独立按键,共设八个按键,实现调整分数、调整时间、比赛的开始/暂停、复位键和交换场地键等功能。
报警部分由蜂鸣器加三级管驱动,实现了发出按键声音和结束报警的功能。
采用单片机控制使这个系统按键操作使用简单,安装方便。
解决了篮球比赛计数器的安装问题,节约了线材,适合在各种规模的体育场馆使用,完全可以代替传统的用钟表进行计时的方法,当然稍加改动也可以用于其他球类比赛,是体育器材向智能化发展的一个实例。
关键词:STC89C51单片机;温度控制;恒温箱;DS18B20目录1 概述 (3)2 篮球计数器系统总体设计 (2)2.1基本功能介绍 (2)2.2系统构成框图 (3)2.3篮球计时器的工作过程 (3)3 系统的硬件设计 (4)3.1系统硬件部分组成 (4)3.2时钟频率电路设计 (6)3.3复位电路的设计 (7)3.4显示电路的设计 (8)3.5开关键盘的设计 (9)4 系统的软件设计 (10)4.1软件任务分析 (10)4.2主程序设计 (10)4.3键盘识别及处理程序设计 (11)4.4显示子程序设计 (12)4.5复位程序设计 (13)5 系统的调试 (14)5.1软件模拟调试 (14)5.2硬件接线 (15)5.3实物调试 (16)5.4调试总结 (19)结论与展望 (20)附录A系统原理图 (23)附录B系统仿真图 (24)附录C实物图 (25)附录D系统源程序 (26)1 概述单片机将我们带入了智能的电子领域,许多复杂的系统若用单片机进行设计,便能达到电路更简单、功能更齐全的效果。
单片机课程设计——篮球计时计分器

单片机课程设计报告篮球比赛计时计分器设计2009年6月18日摘要本设计是采用AT89C52单片机为核心设计的一个用于赛场的篮球计时计分器。
本设计采用定时器T0中断计时,显示部分分为计时和计分显示两部分,均采用共阴极LED显示。
计时部分计时范围宽,而且可定时设定与小时、分钟调整;计分部分调整灵活,显示范围宽,足以满足各种规模赛程需要。
两个显示模块均采用动态扫描方式显示。
在本设计中P3口(P3.0——P3.3)是计时计分显示共用的扫描口,P0口是计时数据输出口,P2口是计分数据输出口,计时计分均设有显示缓冲区(40H ——43H计分显示缓冲区,30H——33H计时显示缓冲区)。
本设计共有K1——K5六个设置按键,K1是甲加分建(按一次加一分),K2是乙加分键(按一次加一分),K3是定时切换键(定时设置与计时调时切换),K4是分钟调整键(计时与定时分钟调整),K5是分数位置交换键(交换甲、乙两队比分的位置)。
按键与P1口相接,低电平输入有效.。
报警部分由扬声器组成,当计时时间到时,输出低电平有效,由P1.3口输出脉冲信号驱动扬声器发出声音。
计时定时的原理与定时闹钟相同,为定时设置定时分钟计数单元,通过比较定时与计时的分计数单元判断比赛是否结束是否报警,定时与计时共用一个显示缓冲去,通过K3(定时切换键)进行显示切换,本设计可通过定时显示的秒位判断定时是否有效,如果秒位显示00说明无效(上次用过的定时),显示11说明有效(本次定时)。
定时时间到,扬声器报警,比赛结束,按K3键可停止报警(否则一直报警)。
关键词:单片机篮球计时计分器数码管按键报警器目录1 概述 (3)1.1单片机简介 (3)1.2课程设计的意义 (4)1.3任务与要求 (4)2 系统总体方案及硬件设计 (5)2.1、系统总体方案设计 (5)2.2、硬件系统设计 (5)2.2.1单片机的选择 (5)2.2.2、时钟电路模块 (6)2.2.3、复位电路模块 (7)2.2.4、按键控制模块 (8)2.2.5、数码管显示原理 (8)2.2.6、定时报警模块 (9)3、软件设计 (10)3.1、程序流程图 (10)3.2、程序分析 (11)4 PROTEUS软件仿真 (12)4.1、简介 (12)4.2、仿真过程 (12)5、调试分析 (15)6、课程设计心得体会 (16)参考文献: (16)附1、源程序代码 (17)附2、系统原理图 (24)1 概述1.1单片机简介单片机是指一个集成在一块芯片上的完整计算机系统。
基于单片机的篮球计分器设计c语言

基于单片机的篮球计分器设计(C语言)篮球比赛是一项充满激情和竞争的体育运动,而比赛中的计分系统则是至关重要的。
为了简化裁判员的工作,提高比赛的进行效率,我们需要设计一个基于单片机的篮球计分器。
本文将基于C语言来设计一个简单而实用的篮球计分器,并且通过详细的步骤和代码解释来展示整个过程。
一、需求分析在设计篮球比赛计分器时,我们首先要明确需求,包括但不限于:1. 计分功能:能够记录两支球队的得分,并且在比赛进行中能够进行加减分操作。
2. 计时功能:能够记录比赛的时间,并在比赛开始和结束时进行提示。
3. 显示功能:能够在LED或LCD上清晰地显示比赛的得分和时间。
4. 操作功能:提供简单的按钮操作来实现计分和计时的控制。
二、硬件设计基于需求分析,我们需要准备以下硬件设备:1. 单片机:选择一款常见的单片机,如STC89C52或者Arduino等。
2. 显示器件:可以选择LED数码管、LCD液晶显示器等。
3. 按钮开关:用于进行得分和时间的控制操作。
4. 电源供应:提供单片机和显示器件所需的电源。
三、软件设计1. 硬件连接:将单片机与显示器件、按钮开关进行合理的连接。
2. 编码开发:编写C语言程序,实现计分、计时和显示功能。
3. 调试测试:通过单片机仿真器或者实际硬件进行测试,确保程序的稳定可靠。
4. 优化完善:根据测试结果进行程序的优化和完善,确保篮球计分器能够满足实际比赛需求。
四、C语言程序设计在C语言程序设计过程中,我们需要着重考虑以下几个方面:1. 硬件端口定义:定义单片机与显示器件、按钮开关的硬件端口连接。
2. 初始化设置:初始化单片机和显示器件,包括显示模式、按键响应等。
3. 计分功能实现:编写加减分的逻辑判断和显示更新代码。
4. 计时功能实现:编写定时器中断和计时显示更新代码。
5. 用户操作响应:编写按钮按键中断的响应代码,实现得分和时间的控制。
五、程序调试在程序编写完成后,需要进行充分的调试测试,以确保程序的稳定性和可靠性。
单片机课程设计篮球计时计分器正文精选全文完整版

可编辑修改精选全文完整版基于单片机的篮球赛计时计分器的设计一系统设计方案1.1 设计题目篮球计时计分器1.2 系统功能要求本系统可实现功能如下:(1)主控部分:选择单片机为核心元件构成系统。
(2)计时部分:能记录整个赛程的比赛时间,并能修改时间、暂停时间。
(3)计分部分:能随时刷新甲、乙两队在整个赛程中的比分。
(4)中场交换比赛场地时,能交换甲、乙两队比分的位置。
(5)比赛时间结束时,能发出报警指令。
1.3 系统总体方案设计本设计由AT89C51编程控制LED七段数码管作球赛计时计分系统具有赛程定时设置、赛程时间暂停、性能稳定、操作方便且易携带等特点。
1.3.1系统设计方案论证本设计是基于89C52单片机的键盘控制及显示电路设计,从系统的设计功能上看,系统可分为两大部分,即键盘输入控制部分和显示部分,对于每一个部分都有不同的设计方案,起初我拟订了下面两种方案:第一种方案:键盘控制采用矩阵扫描键盘,可以用普通按键构成4×4矩阵键盘,直接接到89C51单片机的P0口,高四位作为行,低四位作为列,通过软件完成键盘的扫描和定位。
显示部分采用动态显示,采用移位寄存器74LS164和译码器74LS138通过显示驱动程序驱动七段数码管显示。
此方案成本低,所用到的两个外围芯片价格都很低廉,而且单片机的I/O口占用较少,可以节约单片机接口资源。
第二种方案:键盘控制采用独立是式键盘,每个按键的"接零端"均接地,每个按键的"测试端"各接一条输入线,通过检测输入线的电平状态就可以很容易地判断哪个键被按下了,这种方法操作速度高而且软件结构很简单。
这种方法比较适合按键较少或操作速度较高的场合。
显示部分采用静态显示方法,所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的接口用于笔划段字形代码。
这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码,因此,使用这种方法单片机中CPU 的开销小。
篮球计分器 单片机 程序

TH0=(65536-50000)/256; //初值重装
TL0=(65536-50000)%256;
count1++; // 计数加一,实现时间的计算
delayms(5) ;
}
void displayfen1(fen1) //显示时间分的个位
{ P2=0xfb ;
P0=table[fen1] ;
delayms(5) ;
}
void displaymiao10(miao10) // 显示时间秒 的十位
miao++;
if(miao==60) //计时一分时,分加一,秒重新开始
{ miao=0;
fen++;
displayfen(fen); //显示分的更新
sbit fm=P1^7 ; //蜂鸣器控制口
//定义全局变量
uchar count1,count2,miao10,miao1,fen10,fen1,adui10;
uchar adui1,bdui10,bdui1,fen,adui,bdui,x,a,b;
count2++; //count2加一,实现计时一秒 (20个中断 为时间一秒)
if(count2==20)
{
count2=0; //到一秒时,count2重新开始,时间秒加一
char miao;
char code table[]={
0x40,0x5B,0x22,0x0a, //数码管编码表
0x19,0x0c,0x04,0x5a,
单片机课程设计_基于单片机的篮球计分器设计

单片机系统课程设计成绩评定表设计课题:基于单片机的篮球计分器设计学院名称:电气工程学院专业班级:学生姓名:学号:指导教师:设计地点:设计时间:指导教师意见:成绩:签名:年月日单片机系统课程设计课程设计名称:基于单片机的篮球计分器设计专业班级:学生姓名:学号:指导教师:课程设计地点:课程设计时间:单片机系统课程设计任务书学生姓名专业班级学号题目课题性质工程设计课题来源选题指导教师主要内容(参数)利用89C51单片机设计篮球计分器系统,实现以下功能:(1)用4位LED显示器显示两队分数;(2)能够随时手动对A、B两队分别计分;(3)能够手动实现A、B两队的分数位置随场地交换而对应调换任务要求(进度)第1-2天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。
第3-4天:按照确定的方案设计单元电路。
要求画出单元电路图,元件及元件参数选择要有依据,各单元电路的设计要有详细论述。
第5-6天:软件设计,编写程序。
第7-8天:实验室调试。
第9-10天:撰写课程设计报告。
要求内容完整、图表清晰、文理流畅、格式规范、方案合理、设计正确,篇幅合理。
主要参考资料[1] 张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:国防工业出版社,2004[2]伟福LAB6000系列单片机仿真实验系统使用说明书[3] 阎石.数字电路技术基础(第五版).北京:高等教育出版社,2006审查意见系(教研室)主任签字:年月日目录1、概述 (4)1.1、研究背景 (4)1.2、基本功能及设计思路 (4)2、总体方案设计.................................... 错误!未定义书签。
2.1、方案选取...................................... 错误!未定义书签。
2.2、总体设计...................................... 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南工程学院课程设计课程名称单片机原理与应用课题名称比赛计分器设计专自动化班级1001班学号201001020121姓名刘朝露指导教师王迎旭汪超李晓秀等2013年 6 月7 日湖南工程学院课程设计任务书课程名称单片机原理与应用课题比赛计分器设计专业班级自动化1001班学生姓名刘朝露学号201001020121指导老师王迎旭汪超李晓秀等审批李晓秀任务书下达日期2013年6 月7 日任务完成日期2013年6 月21 日目录第一章系统的概述 (1)1.1系统的功能 (1)1.2设计内容及要求 (1)1.2.1 设计内容 (1)1.2.2 设计要求 (1)1.3按钮设置 (2)第2章总体方案设计 (2)2.1总体系统框图 (3)2.2系统组成 (5)第3章系统硬件设计 (6)3.1控制电路设计 (6)3.1.1 复位电路 (4)3.1.2 矩阵按钮电路 (4)3.2数码管显示电路设计 (6)第4章软件设计 (10)4.1主程序设计 (10)4.2各子程序设计 (11)4.2.1 延时子程序 (11)4.2.2 初始化子程序 (12)4.2.3 交换按钮程序 (12)4.2.4 状态部分程序 (11)4.2.5 加减部分程序 (14)仿真图 (16)设计总结 (17)参考文献 (18)附录:源程序清单 (19)电气信息学院课程设计评分表 (37)第1章系统概述1.1系统功能设计一个甲、乙两队比赛计分器,主要用于各种体育比赛记录分数。
采用矩阵式键盘作为输入。
基于以上思路,本次设计使用80C51实现一基于单片机的电子计分器的设计,其主要具有如下功能:(1)用户可分别对两队比分进行加1、加2、加3和减1,减2,减3操作。
(2)比分通过6个8段共阴极数码管显示器进行显示,每队比分显示三位,可以交换两队的比分。
(4)具有复位功能,通过复位键实现。
(5)预置分可通过加或减分按钮实现。
(6)比赛时间倒计时及其结束后蜂鸣器自动提醒。
1.2设计内容及要求1.2.1 设计内容:(1)给甲乙两队分别设置一个分数控制按钮,此按钮有7种状态,分别为+1、+2、+3、-1、-2、-3,+10(置数)。
(2)设置一个切换状态按钮,可以分别切换每一种状态,然后每一种状态会有相应的发光二极管点亮以区别是哪种状态。
(3)设置一个复位按钮,按下实现甲、乙队总分回到初试分及显示(4)设置一个交换分按钮,用于交换甲乙比分。
1.2.2 设计要求:方案合理、正确,系统稳定、可靠。
软件设计要求尽可能精练、简短和运行可靠。
硬件电路要求简单明了,以节约成本。
1.3 按钮设置本设计的宗旨是用最少的按键实现最多的功能。
设计中一共用到了5个按钮,分别为:清零按钮、甲的加分减分按钮,乙的加分减分按钮,切换状态按钮和交换比分按钮。
每个按钮的功能如下:控制甲的按钮:实现+1、+2、+3、-1、-2、-3,+10(置数)功能;控制乙的按钮:实现+1、+2、+3、-1、-2、-3,+10(置数)功能;切换按钮:实现甲乙的各种状态的切换;减缓比分按钮:交换甲乙的比分;清零按钮:实现甲乙比分清零;第2章总体方案设计2.1 总体系统框图此次设计80C51单片机为核心,配以一定的外围电路和软件,以实现比赛计分器的功能。
利用6个8段共阴级数码管显示器.采用动态显示输出比分,用户信息输入则采用4×4矩阵式键盘,起状态切换用发光二极管的状态表示。
用一片单片机可满足本设计的输入输出。
系统设计方案的硬件电路设计框图如图2-1所示。
图2-1 硬件电路设计2.2 系统组成系统由硬件部分和软件部分组成。
硬件电路由复位按钮、80C51单片机、矩阵键盘和7个发光二极管,6个数码管等组成。
软件部分主程序主要由系统初始化段、键盘识别、键值处理、8段共阴极LED显示器扫描显示子程序组成。
软件设计主要分为四个部分:信息输入、信息处理、显示输出。
信息输入时采用矩阵式键盘来实现,所以需要检测键盘有无按键的子程序;信息处理需要对用户通过键盘输入的不同信息进行辨别并执行相应的处理;显示输出考虑到成本和电路体积,决定采用动态输出,从而达到设计的目的。
第3章系统硬件设计3.1控制电路设计3.1.1 复位电路如图3-1所示,按钮与单片机的RST引脚相连,当每次按下该按钮后,系统将通过软件实现对计分回到初始值功能。
3.1.2在的行列线就导通了,所以如果一条线上是低电平,那么按键的另一条线也是低电平。
先给第一行送一个低电平,读取列值,就可以判定第一行上是否有按键按下,如果有按键,那么列线里面就有一条线为低电平。
如果都为高电平,说明第一行上没有按键被按下,接着给第二行送低电平,重复上述步骤,就可以读取按键了。
也可以用另外一种方法:先给行线全部写“0”,然后看列线是否有为低电平的,如果有说明那一列上有键被按下,让后要确定按键所在的行的,给所有列线写“0”,读取行线的值就可以确定按键的具体位置了,让后将两次读取的值,组成一个值j就得到了键值。
图3-2 矩阵键盘的接口电路3.2数码管显示电路设计显示器采用8段共阴极数码管显示器,来实现显示器的动态扫描,八个二极管连接一个阴极的结构,只要另一段为高电平,二极管就会发光,从而形成一段。
将八段顺序排列后就成为具有一定编码的共阴显示器了。
动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。
如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED 使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
显示电路如图4所示。
共阴极数码管显示图3-3 数码管显示电路数码管显示采用8个8段数码管显示器,来实现显示器的动态扫描显示采用动态扫描显示方法,即由显示器扫描显示子程序控制显示器逐个循环从左至右依次点亮各个显示器。
由单片机的P0口控制显示。
第4章软件设计4.1主程序设计主程序主要由系统初始化段、键盘识别、键值处理、6个8段共阴极LED显示器扫描显示子程序组成。
通过对以上各段和子程序的结合,以实现系统功能。
该系统主程序流程图如下图所示。
图4-1 系统主程序流程图图4-2扫描刷新显示子程序流程图4.2各子程序设计4.2.1 延时子程序void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}此段程序是根据实验板各硬件的参数具体设置的。
4.2.2 初始化子程序void init(){cnt=0;num=0;wela=0;dula=0;temp=0;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}初始化程序是用来对各定义的变量初始化的,每一次主程序执行之前都要先执行初始化程序以保证变量的值为初值。
4.2.3 交换按钮程序if(key4==0) //当交换键按下{delay(10);if(key4==0){m=bai;bai=aa;aa=m;n=shi;shi=bb;bb=n;p=ge;ge=cc;cc=p;while(!key4); //去抖delay(10);while(!key4);}}此程序就是当交换按键按下时,利用中间变量改变甲乙的每一位的数值,这样就能实现交换甲乙两队的比分,然后再给电路去抖动,就不会出现问题了。
4.2.4 状态部分程序for(i=0;i<4;i++){ if(key3==0){ if(key3==0){ num++;if(num==7)num=0;delay(5);switch(num){ case 0: cnt=-3;d7=0;d6=1;break;case 1: cnt=10;d1=0;d7=1;break;case 2: cnt=1;d2=0;d1=1;break;case 3: cnt=2;d3=0;d2=1;break;case 4: cnt=3;d4=0;d3=1;break;case 5: cnt=-1;d5=0;d4=1;break;case 6: cnt=-2;d6=0;d5=1;break; }}while(!key3);delay(10);while(!key3);}}该程序是主函数里面的部分程序,当切换分按钮按下时利用switch case 语句来实现甲乙各种状态之间的切换,并且同时控制了7个发光二极管的显示来表明当前处于什么状态。
切换到相应的状态时在执行显示扫描程序将实现切换功能。
4.2.5 加减部分程序if(key1==0) //甲控制按钮按下{ delay(10); //延时if(key1==0){ temp=temp+cnt; //实现加减运算if(temp==256)temp=0; }while(!key1); //去抖delay(10);while(!key1);bai=temp/100; //分离处百位shi=temp%100/10;ge=temp%10;}该程序是通过前段调用一个变量cnt来作为本次运算的加数,然后通过切换状态来做不同的运算。
这样就免去了很多不必要的程序,直接调用实现,简化了程序。
仿真图:设计总结这次课程设计虽然只有短短的两周时间,但我受益匪浅学会了很多东西。
刚开始拿到课题时,觉得自己无处入手,但通过老师的讲解和查询资料,开始有自己的思路,整理出了总体方案,然后设计出硬件原理图,源程序等。
在这次课程设计中,我在整个设计过程中懂得了许多东西,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对今后的学习工作和生活有非常大的帮助,并且提高了自己的动手实践操作能力,使自己充分体会到了在设计过程中的成功喜悦。
虽然这个设计做的不是很理想,但是在设计过程中所学到的东西是这次课程设计的最大收获和财富,使我受益良多。
课程设计是结束了,不过学习单片机知识的过程还没有终结,探索学习的奥妙,培养学习的兴趣,养成良好的学习习惯对我们来说才是最重要的。
与此同时我感受到了老师对学生的那种悔人不卷的精神,每天的固定时间,老师都来给我们指导,使我们少走弯路,顺利完成实习任务,感谢汪老师一路以来对我们的关心与帮助。
参考文献[1]《单片机原理与应用》王迎旭编机械工业出版社[2]《51系列单片机原理与接口技术实验指导》周向红编湖南工程学院[3]《微型计算机原理及应用》许立梓编机械工业出版社 2002[4]《微型计算机接口技术及应用》刘乐善编华中理工大学出版社 2000[5]《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社 2000[6]《16位微型计算机原理接口及其应用》周佩玲编中国科技大学出版社2000[7]《微型计算机原理与接口技术》吴秀清编中国科学技术出版社 2001[8]《微型计算机接口技术》邓亚平编清华大学出版社 2001[9]《单片机原理及及应用》王迎旭编机械工业出版社 2001[10]《单片机应用程序设计技术》周航慈著北京航空航天出版社2002[11]《单片机实用技术问答》谢宜仁主编人民邮电出版社 2002附录A:源程序清单#include <REGX52.H>#define uchar unsigned char#define uint unsigned int#define TH_value 0xb1#define TL_value 0xe0 //定时器工作于方式1,每20ms产生一个中断sbit speak=P3^7;sbit ext=P3^2;sbit led=P3^4;/**********BCD码字***************/uchar code bcd[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};/************0~9数字显示**************/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar munite; //比赛剩余分位数uchar second; //比赛剩余秒位数uchar part; //当前比赛的节次uchar s24; //24秒标志uchar red_mark; //红队得分uchar blue_mark; //蓝队得分uchar key_move; //设置位移动uchar key_red_add; //红队得分增加1uchar key_red_mul; //红队得分减少1uchar key_blue_add; //蓝队得分增加1uchar key_blue_mul; //蓝队得分减少1uchar key_pause; //暂停uchar key_reset; //24秒复位及进入下一节复位uchar time_tick1,time_tick2;uchar station; //状态标志位uchar flag; //跳亮标志位uchar talk1,talk2,num,num1; //报警信号标志/*******函数声明********/void init();void init_timer();void init_extra();uchar key_scan();void scanf(uchar p,uchar tw,uchar m,uchar s,uchar r,uchar b); void scanf1(uchar p,uchar r,uchar b);void scanf2(uchar tw,uchar r,uchar b);void scanf3(uchar m,uchar r,uchar b);void scanf4(uchar s,uchar r,uchar b);void play24();void playstop1();void playstop2();/*********延时程序,t=1时,延时1ms************/void delay(uchar t){int i,j;for(j=0;j<t;j++)for(i=0;i<110;i++);}/***********主程序************/void main(){init();init_timer();init_extra(); //初始化while(1){if(station==0) //状态0:比赛状态{scanf(part,s24,munite,second,red_mark,blue_mark);if(time_tick1==50){time_tick1=0;if(second==0) //时间计数{if(munite==0){if(part>=4){talk2=1; //终场报警操作TR0=0; //关闭定时器中断0TR1=1;}else{talk2=1; //小节结束报警TR1=1;TR0=0;}}else{munite--;second=59;}}elsesecond--;if(s24==0) //24秒计数{TR0=0;}else{if(s24<2){talk2=1;TR1=1;TR0=0;key_pause=0;}else if(s24<8){talk1=1;TR1=1;}s24--; //6秒提醒}}if(second==0&&munite==0) //操作进入下一节比赛{if(key_reset==1){s24=0x18;part++;key_reset=0;if(part==10)talk2=1; //比赛太久,报警if(part<5) //判断是否为加时赛,不是,延长12分钟if(key_red_add==1) //红队得分操作加{key_red_add=0;if(red_mark<0xff)red_mark++;}if(key_red_mul==1) //红队得分操作减{key_red_mul=0;if(red_mark>0)red_mark--;}if(key_blue_add==1) //蓝队得分操作加{key_blue_add=0;if(blue_mark<0xff)blue_mark++;}if(key_blue_mul==1) //蓝队得分操作减{key_blue_mul=0;if(blue_mark>0)blue_mark--;}}if(station==1) //比赛节次操作{TR1=1;flag=0;while(station==1){if(flag==0)scanf1(part,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //比赛节次操作加{if(part<0x09)part++;}if(key_red_mul==1) //比赛节次操作减{key_red_mul=0;if(part>1)part--;}}if(station!=1){TR1=0;flag=0;}}{TR1=1;flag=0;while(station==3){if(flag==0)scanf3(munite,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //分操作加,MAX=60{if(munite<0x3c)munite++;}if(key_red_mul==1) //分操作减{key_red_mul=0;if(munite>0)munite--;}}if(station!=3){TR1=0;flag=0;}}if(station==4) //计时秒操作{TR1=1;flag=0;while(station==4){if(flag==0)scanf4(second,red_mark,blue_mark);if(flag==1)scanf(part,s24,munite,second,red_mark,blue_mark);if(key_red_add==1) //秒操作加,MAX=60{key_red_add=0;if(second<0x3c)second++;}if(key_red_mul==1) //秒操作减{key_red_mul=0;if(second>0)second--;}}if(station!=4){TR1=0;flag=0;}}}}/************初始化************/void init(){munite=0x01;second=0x00;red_mark=0x00;blue_mark=0x00;part=0x01;s24=0x18;station=0x00;key_pause=0;key_move=0x00;key_red_add=0x00;key_red_mul=0x00;key_blue_add=0x00;key_blue_mul=0x00;key_reset=0x00;flag=0x00;}/************定时器0初始化**************/void init_timer(){TMOD=0x11;TH0=TH_value;TL0=TL_value;TH1=TH_value;TL1=TL_value;ET0=1;ET1=1;time_tick1=0;time_tick2=0;}/**************外部中断源初始化****************/ void init_extra(){EX0=1;EX1=1;IT0=1;IT1=1;EA=1;}/*****************定时器0***************/ void timer0()interrupt 1{time_tick1++;TH0=TH_value;TL0=TL_value;}/*************定时器1***************/ void timer1()interrupt 3{EA=0;TH1=TH_value;TL1=TL_value;time_tick2++;if(time_tick2==50){led=~led;time_tick2=0x00;if(flag==0)flag=1; //跳亮标志位elseflag=0;}if(talk1==1){EA=0;TH1=0xFD;TL1=0xF7;EA=1;speak=~speak;num++;if(num==200){num=0;talk1=0;TR1=0;}}if(talk2==1){EA=0;TH1=0xFD;TL1=0xF7;EA=1;speak=~speak;num++;if(num==200){num1++;num=0;if(num1==4){num1=0;talk2=0;TR1=0;}}}EA=1;}/***********外部中断0************/ void extra0()interrupt 0{if(key_pause==1){key_pause=0;TR0=0;}else{if(s24==0) ;else{key_pause=1;TR0=1;}}}/***********外部中断1*****************/ void extra1()interrupt 2{uchar dtemp;dtemp=key_scan();switch(dtemp){case 0xFE:key_move=1;break;case 0xFD:key_reset=1;break;case 0xF7:key_red_add=1;break;case 0xDF:key_red_mul=1;break;case 0xEF:key_blue_add=1;break;case 0xBF:key_blue_mul=1;break;default:break;}if(key_move==1){ station++;if(station==5)station=0;key_move=0;}}/*************键盘扫描****************/ uchar key_scan(){uchar temp;P1=0xFF;temp=P1;delay(3);if(temp==P1){return temp;}}/***************数码管驱动*******************/ void scanf2(uchar tw,uchar r,uchar b){P2=bcd[0];P0=table[10];delay(1);P2=bcd[1];P0=table[tw/10];delay(1);P2=bcd[2];P0=table[tw%10];delay(1);P2=bcd[3];P0=table[10];delay(1);P2=bcd[4];P0=table[10];delay(1);P2=bcd[5];P0=table[10];delay(1);P2=bcd[6];P0=table[10];delay(1);P2=bcd[7];P0=table[r/100];delay(1);P2=bcd[8];P0=table[r/10%10];delay(1);P2=bcd[9];P0=table[r%10];delay(1);P2=bcd[10];P0=table[b/100];delay(1);P2=bcd[11];P0=table[b/10%10];delay(1);P2=bcd[12];P0=table[b%10];delay(1);}/***************数码管驱动*******************/ void scanf3(uchar m,uchar r,uchar b){P2=bcd[0];P0=table[10];delay(1);P2=bcd[1];P0=table[10]; delay(1);P2=bcd[2];P0=table[10]; delay(1);P2=bcd[3];P0=table[m/10]; delay(1);P2=bcd[4];P0=table[m%10]; delay(1);P2=bcd[5];P0=table[10]; delay(1);P2=bcd[6];P0=table[10]; delay(1);P2=bcd[7];P0=table[r/100]; delay(1);P2=bcd[8];P0=table[r/10%10]; delay(1);P2=bcd[9];P0=table[r%10]; delay(1);P2=bcd[10];P0=table[b/100];delay(1);P2=bcd[11];P0=table[b/10%10];delay(1);P2=bcd[12];P0=table[b%10];delay(1);}电气信息学院课程设计评分表指导教师签名:________________日期:________________注:①表中标*号项目是硬件制作或软件编程类课题必填内容;②此表装订在课程设计说明书的最后一页。