微电脑控制简易球赛计分牌的设计与制作
2015-02-05贵州电子信息职业技术学院通信工程系吴政江
贵州电子信息职业技术学院通信工程系 吴政江
微电脑控制简易球赛计分牌的设计与制作
贵州电子信息职业技术学院通信工程系 吴政江
球类比赛中裁判需要计分时通常需要计分牌,以便及时、准确、清楚地记录并显示比赛双方的得分,体现比赛的公正性以及渲染比赛的紧张气氛。传统的计分牌采用黑板加粉笔方式,计分麻烦且不环保。用单片机来设计计分牌可谓得心应手。本文介绍一款微电脑控制简易球赛计分牌的设计与制作。硬件上,它是一个具有数码管显示、按键输入、数据运算等比较完整的单片机应用系统。软件上,采用C语言编程。旨在向广大单片机爱好者介绍单片机应用系统的基本开发过程以及C语言程序设计方法。
单片机;计分牌;设计;制作
引言
电子信息类专业各骨干课程不但有较难理解的理论分析,也有大量的实际应用电路,因而既要学习理论,更要动手实践,理论性和实践性均很强。然而,当前职业学校学生普遍存在文化基础不牢,接受能力不佳,学习积极性、分析问题与解决问题能力不高的现实情况。因此,长期以来,职业学校电子信息类专业各骨干课程理论教学方法枯燥,实验教学可操作性差,课程设计缺乏创新,结果大多数学生对这些课程理论理解不清,实验走过场,课程设计找枪手,考试弄虚作假。针对这一问题,我们提出了用计算机仿真技术对电子信息类专业各骨干课程进行教学改革的思想。本文是用Proteus仿真软件对单片机课程进行教学改革的一个综合应用。用单片机设计一个简易球赛计分牌。硬件上,它是一个具有数码管显示、按键输入、数据运算等比较完整的单片机应用系统。软件上,采用C语言编程。
1 电路结构与工作原理
1.1 球赛计分牌功能模块划分
(1)人机对话功能模块。计分牌应能及时输入比赛双方得分,故电路要求有人机对话功能。这里用4个按键来改变比赛双方得分,按键SW1与SW2用来增加及减少比赛一方(如A方)得分数;按键SW3与SW4用来增加及减少比赛另一方(如B方)得分数。
(2)显示模块。采用4只共阳极数码管显示得分情况,最大显示比分为99∶99,基本能满足小型比赛要求。其中“∶”由两只红色发光二极管代替,开机时即亮。
(3)单片机模块。这里采用AT89C51单片机加复位电路与时钟电路即可,无需外扩存储器与I/O口。
(4)电源模块。单片机所需的+5V电源可由220伏的交流市电经降压、整流、滤波与稳压得到。
1.2 硬件电路设计
根据以上功能模块划分,确定球赛计分牌硬件电路[1]如图1所示(电源电路略去未画,实际制作时应补上)。对该电路简要分析如图1所示。
(1)核心部分是由AT89C51单片机与复位电路以及时钟电路组成的单片机最小应用系统。
(2)根据计分牌功能要求,用4个共阳极数码管显示比赛双方得分,数字显示中间分隔符“∶”利用两只红色发光二极管来实现。
(3)Q1、Q2、Q3、Q4为4个共阳极数码管驱动三极管,目的是增强单片机I/O口的电流驱动能力。
(4)由于本项目涉及到的按键数较少,故采用独立式键盘结构。4只按键分别连接单片机的P1.4~P1.7口(实际制作时可任选单片机其他I/O口,但程序应作相应的调整)。
2 软件规划与设计
根据硬件电路,设比赛双方为A与B,按键SW1与SW2设为A方得分加、减按键;按键SW3与SW4设为B方得分加、减按键。程序采用模块化设计,由主函数及相关子函数组成。
2.1 主函数
完成对四个独立按键的无限循环判断,并调动态扫描函数显示比赛双方得分数。其流程图[2]如图2所示。
2.2 动态扫描函数
完成BCD码转换、动态数码管显示,同时用于按键延时消抖。
图1 球赛计分牌电路
2.3 5ms延时函数
完成5ms延时,供动态扫描函数调用。
这里给出C语言参考源程序如下所示。
#include〈reg51.h〉
#define uchar unsigned char
#define uint unsigned int
sbit sw1=P1ˆ7; //定义A方增加键
sbit sw2=P1ˆ6; //定义A方减少键
sbit sw3=P1ˆ5; //定义B方增加键
sbit sw4=P1ˆ4; //定义B方减少键
uchar duanma[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x 92,0x82,0xF8,0x80,0x90}; //共阳极数码管0到9的段码
uchar weima[4]={0x7f,0xbf,0xdf,0xef}; //共阳极数管位码
uchar xianshi[4]={0,0,0,0}; //显示缓存器
uint jishu=0,affs=0,bffs=0; //定义变量
void dtsm(void); //声明动态扫描函数
/*延时约5毫秒函数*/
void delay05ms(void)
{
uchar j,k;
for(j=10;j〉0;j--)
for(k=110;k〉0;k--);
}
如图2所示。
/*主函数*/
void main(void)
{
while(1) //无限循环
{
dtsm(); //*******************按键判断**** ********************************
if(sw1==0) //A方加分键按下吗
{
dtsm(); //调动态扫描函数兼作延时消抖
if(sw1==0) //A方加分键还按下吗
图2 计分牌主函数流程图
{
affs++; //A方分数加1
if(affs==100)affs=99; //最大为99
while(sw1==0)dtsm(); //等待A方加分键释放
}
}
if(sw2==0) //A方减分键按下吗
{
dtsm(); //调动态扫描函数兼作延时消抖
if(sw2==0) //A方减分键还按下吗
{
affs--; //A方分数减1
if(affs==-1)affs=0; //最小为0
while(sw2==0)dtsm(); //等待A方减分键释放
}}
if(sw3==0) //判断B方加分键
{
dtsm();
if(sw3==0)
{
bffs++;
if(bffs==100)bffs=99;
while(sw3==0)dtsm();
}}
if(sw4==0) //判断B方减分键
{
dtsm();
if(sw4==0)
{
bffs--;
if(bffs==-1)bffs=0;
while(sw4==0)dtsm();
}}}}
/*动态扫描函数*/
void dtsm(void)
{
xianshi[0]=duanma[affs/10]; //分离A方分数十位
xianshi[1]=duanma[affs%10]; //分离A方分数个位
xianshi[2]=duanma[bffs/10]; //分离B方分数十位
xianshi[3]=duanma[bffs%10]; //分离B方分数个位
//*******************动态扫描**************** *****************
jishu++;
if(jishu==4)jishu=0;
P2=0x00;
P2=weima[jishu]; //送位码
P0=xianshi[jishu]; //送段码
delay05ms();
}
本程序采用模块化设计有利于程序的升级与修改。程序中按键“去抖”不用延时子函数而用动态扫描函数代替,可以提高程序效率,避免在调用延时子函数时数码管亮度下降甚至出现闪烁现象。调用一次动态扫描函数相当于延时约8ms。这是采用动态数码管显示时的应用技巧之一。
3 系统调试
(1)启动Proteus软件,并用其绘制图1所示电路原理图。
(2)启动Keil软件。建立工程,输入上述C语言源程序并编译调试生成二进制的目标文件。
(3)将第(2)步生成的二进制目标文件加载到第(1)步所绘电路原理图的AT89C51单片机中,然后仿真运行。按下SW1~SW4中的任一按键,观察相应的数码管显示是否变化,其变化是否符合要求。
(4)购买元器件,按硬件电路焊好电路板,将参考程序写入AT89C51单片机,通电。按下SW1~SW4中的任一按键,观察相应的数码管显示是否变化,其变化是否符合要求。调试完成后,将产品投入实际的球类比赛(如篮球比赛)中使用,看是否能适应实际的现场比赛。
4 结束语
文中从电路结构与工作原理、软件规划与设计以及系统调试等三个方面简要介绍了微电脑控制简易球赛计分牌的设计与制作。是采用Proteus仿真软件对单片机原理及应用课程进行教学改革的一个综合性应用实例。硬件上,它是一个具有数码管显示、按键输入、数据运算等比较完整的单片机应用系统。软件上,采用C语言编程。涉及单片机的内部结构及最小应用系统、独立式键盘结构与设计、LED数码管接口技术及其动态显示原理以及C语言程序设计等单片机知识。旨在向广大单片机爱好者介绍单片机应用系统的基本开发过程以及C语言程序设计方法。
[1]吴政江,张定祥.单片机原理及应用(基于C语言)[M].北京:化学工业出版社,2013.
[2]舒伟红.单片机原理与实训教程[M].北京:科学出版社,2008.
2014年贵州省高校人文社会科学研究项目“基于计算机仿真技术的电子信息类骨干课程课改研究”(负责人:吴政江;编号:14ZC261)。
吴政江,贵州电子信息职业技术学院副教授,主要研究方向:单片机与嵌入式系统、电子信息技术、职业教育等。