单片机课程设计(篮球记分器)

发布者:RadiantSoul最新更新时间:2015-07-08 来源: 51hei关键字:单片机  课程设计  篮球记分器 手机看文章 扫描二维码
随时随地手机看文章
电路图:


本程序已经通过软件仿真与硬件制作,
首发于:www.51hei.com ,代码可任意修改,但不可用于商业目的.
单片机型号是:stc89c52,晶振12兆赫.用了3个4为一体化的数码管.
完整代码下载地址:http://www.51hei.com/f/lqwwe.rar 
#include
 #define uchar unsigned char
 #define uint unsigned int
 void delay(uchar x);         //延时(时间较短)
 void delay1(uchar x);        //延时(时间较长)
 void Js_Jf_Scan(void);       //数码管动态扫描显示函数
 void Key_if(void);          //A、B两队分值处理函数
 void Js_50ms(void);        //定时50ms中断函数
 void Key_Y(void);         //预置时间函数
 void Ptime(uchar);         //时间处理函数
 void sound(void);          //鸣笛警示函数
 void jiaohuan(void);    //场地交换
 sbit CL1=P2^0;           //B队4位计分数码管位控线
 sbit CL2=P2^1;
 sbit CL3=P2^2;
 sbit CL4=P2^3;
 sbit KL1=P2^4;           // A队4位计分数码管位控线
 sbit KL2=P2^5;
 sbit KL3=P2^6;
 sbit KL4=P2^7;
 sbit S1=P1^3;            //驱动4位计时数码管位控线
 sbit S2=P1^2;
 sbit S3=P1^1;
 sbit S4=P1^0;
 sbit YK1=P1^6;          //预置分钟的十位
 sbit YK2=P1^7;          //预置分钟的个位
 sbit music=P1^4;         //P1.4接喇叭,发声,鸣笛
 sbit Key1=P3^0;         //B队加分键
 sbit Key2=P3^1;         //B队减分键
 sbit Key3=P3^4;         //A队加分键
 sbit Key4=P3^5;         //A队减分键
 sbit JH=P1^5;
 sbit Int_Key=P3^2;                    //鸣笛键
 sbit Star=P3^6;                       //开始按钮
 sbit Puse=P3^7;                      //停止按钮   
 int m=0,ms=0,mg=0;                  //秒钟的十位、个位以及秒钟的变量说明
 int fs=0,fg=0,f,fy,num=0;              //分钟的十位、个位以及分钟的变量说明
 int g,s,b,q,sum=0;                     //B队定义个十百位
 int g1,s1,b1,q1,sum1=0;               // A队定义个十百位
 int LED_Num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,}; //段码
 
 void main(void)
 {
  TMOD=0x01;                    //设置T0为工作方式1,作为16位计数器
  TH0=(65535-50000)/256;           //设置T0的高8位,并且T0的计数值为50ms
  TL0=(65535-50000)%256;          //设置T0的低8位
  music=0;                        //初值喇叭不响
  EA=1;                          //开放所有中断
  ET0=1;                         //允许定时/计数器T0溢出中断
  EX0=1;                         //允许外部中断0
  IT0=1;                          //设置外部中断0为边沿触发方式(下降沿)
  while(1)                        //无穷循环,程序一直运行
  {
   Key_Y();                    //预置场次比赛时间
   if(Star==0&&f!=0&&Puse!=0)  //按下“开始键”,设置好比赛时间,并且未按“停止”键时,比赛正式开始
   {
    TR0=1;                 //启动定时器T0,开始计时
    Key_if();                //开始计分
   }
   else
   {
    TR0=0;               //比赛还未开始或比赛结束时间到,停止计时
   }
   Js_Jf_Scan();                //将相应的分数、时间同步进行显示
  }
 }[page]
 /*******************设置场次比赛时间********************/
 void Key_Y(void)
 {
  if(YK1==0)                     //初始状态,分钟的十位为0
  {
   delay(1);                    //延时去抖动
   fs=fs+1;                    //分十位加1分
   fy=fs*10+fg;                //求出预置时间的分钟值
   f=fy;
   while(YK1==0);      //中间变量                     
  }
  if(YK2==0)                     //初始状态,分钟的个位为0
  {
   delay(1);                    //延时去抖动
   fg=fg+1;                    //分个位加1分
   fy=fs*10+fg;                //求出预置时间的分钟值
   f=fy;                       //中间变量
   while(YK1==0);                     
  }
  Js_Jf_Scan();
 }
 /********T0中断服务函数,每隔50ms产生一次中断********/
 void Js_50ms(void)interrupt 1 using 1   //定时器T0中断,用工作寄存器组1
 {
  TH0=(65535-50000)/256;         //定时器T0的高8位
  TL0=(65535-50000)%256;        //定时器T0的低8位
  num++;                        //每50ms累加一次
  Ptime(num);                    //调用时间处理函数
 }
 /**********************时间处理函数********************/
 void  Ptime(uchar time)
 {  
  if(time==20)                   //如果为1s(50ms*20=1s)
  {
   num=0;
   m--;                     //每到1s,计时器累加1次
   ms=m/10;                 //秒的十位
   mg=m%10;                //秒的个位
   if(m<0)                 //如果为1min
   {
    m=59;                  //秒钟置0
       mg=m%10;            //秒钟的个位置0
    ms=m/10;              //秒钟的十位置0
    f--;                   //分钟开始在预设的比赛时间基础上倒计时
    fs=f/10;               //分钟的十位
    fg=f%10;              //分钟的个位
    if(f==0)               //分钟数倒计时到0
    {
     TR0=0;            //时间到,停止计时
    }   
   }
  }
 }
 /******************数码管动态扫描显示******************/
 void Js_Jf_Scan(void)
 {
  uchar j;
  for(j=0;j<=5;j++)
  {
   KL4=0;P0=LED_Num[g1];delay(1);KL4=1;  /*将A队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   KL3=0;P0=LED_Num[s1];delay(1);KL3=1;  /*将A队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   KL2=0;P0=LED_Num[b1];delay(1);KL2=1;  /*将A队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   KL1=0;P0=LED_Num[q1];delay(1);KL1=1;  /*将A队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   CL4=0;P0=LED_Num[g];delay(1);CL4=1;   /*将B队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   CL3=0;P0=LED_Num[s];delay(1);CL3=1;    /*将B队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   CL2=0;P0=LED_Num[b];delay(1);CL2=1;    /*将B队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   CL1=0;P0=LED_Num[q];delay(1);CL1=1;   /*将B队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   S4=0;P0=LED_Num[mg];delay(1);S4=1;   /*将秒钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   S3=0;P0=LED_Num[ms];delay(1);S3=1;  /*将秒钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   S2=0;P0=LED_Num[fg];delay(1);S2=1;  /*将分钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
   S1=0;P0=LED_Num[fs];delay(1);S1=1;    /*将分钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  }
 }
 /*****************判断是哪个队加分或者减分*****************/
 void Key_if(void)
 {
  if(Key1==0)                      //当按键按下时
  {
   delay(1);                     //延时去抖动
   sum=sum+1;                   //B队加1分
  }
  if(Key2==0 && sum>=1)           //减分按键按下并且中得分不得少于1分
  {
   delay(1);                     //延时去抖动
   sum=sum-1;                   //B队减1分
  }
  if(Key3==0)                      //当按键按下时
  {
   delay(1);                     //延时去抖动
   sum1=sum1+1;               //A队加1分
  }
     if(Key4==0 && sum1>=1)         //减分按键按下并且中得分不得少于1分
  {
   delay(1);                     //延时去抖动
   sum1=sum1-1;               //A队减1分
  }
  q=0;                            // A队分值的千位默认为0
  b=sum/100;                      //求出A队分值的百位
  s=sum/10-b*10;                   //求出A队分值的十位
  g=sum%10;                      //求出A队分值的个位
  q1=0;                           // B队分值的千位默认为0
  b1=sum1/100;                    //求出B队分值的百位
  s1=sum1/10-b1*10;                //求出B队分值的十位
  g1=sum1%10;                    //求出B队分值的个位
 }
 /***********************鸣笛处理***********************/
 void sound(void) interrupt 0 using 0  //外部中断0(),用工作寄存器组0
 {
  uchar i,j;
  if(Int_Key==0)                    //判断鸣笛键是否按下,有按下就鸣笛
  {
   for(i=0;i<8;i++)               //控制一种发音的时间
   {
    for(j=0;j<250;j++)          //控制发音的频率,延时长,频率低,音低
    {
     music=~music;         //取反
     delay1(1);             //延时去抖动
    }
           Js_Jf_Scan();
   }
   for(i=0;i<16;i++)              //控制另一种发音的时间
   {
      for(j=0;j<250;j++)          //控制发音的频率,延时短,频率高,音高
    {  
     music=~music;         //取反
     delay(1);              //延时去抖动
    }
           Js_Jf_Scan();
 }
 }
  else
   music=0;                     //喇叭不响
 }
  /*******************场地交换函数*******************/
 void jiaohuan(void)
 {
  int t;
  if(JH==0)
  { 
   sum=t;
   t=sum1;
   sum1=t;
  }
 
 }
 
 /*******************延时1.8ms的子程序*******************/
 void delay1(uchar x)
 {
  uchar k;
  while(x--)
   for(k=0;k<215;k++);     //延时长
 }
 /*******************延时1.0ms的子程序*******************/
 void delay(uchar x)
 {
  uchar k;
  while(x--)
   for(k=0;k<120;k++);     //延时短
 }

关键字:单片机  课程设计  篮球记分器 引用地址:单片机课程设计(篮球记分器)

上一篇:单片机—多任务编程
下一篇:用在摩托车上的遥控时钟

推荐阅读最新更新时间:2024-03-16 14:24

AT89C51单片机频率计的C源程序设计
本文是基于AT89C51单片机的频率计的C源程序。该频率计主要实现的功能有如下几个: 1. 测试功能 它表明数字频率计所具备的全部测试功能,一般包括测频,周期,累计脉冲数,频率比,时间间隔及自较等功能。 2. 测量范围 它说明不同功能的有效测量范围。如测频率时,测量范围是数字频率计处于正常工作条件下,被测信号的频率范围,一般用频率的上,下限值表示,低端大部分从10Hz开始;高端因不同的频率计而异。因此高端频率是确定低,中,高速计数器的依据。在测量周期时,测量范围常用周期的最大值,最小值表示。 3. 输入特性 数字频率计一般有2~3个输入通道,测试不同项目时,被测信号可经不同的通道输入仪器。输入特性是表明数字式频率计于被
[单片机]
ATMEGA16A单片机的多点测温系统完成版 Proteus仿真程序
0.png (38.96 KB, 下载次数: 18) 下载附件 保存到相册 2019-6-29 04:45 上传 单片机源程序如下: /************************************************************************** *实验名 :DS18B20模块 *实验效果 :单总线调试,此代码可用于测多点温度 *显示 :此代码用了LCD显示读取地址位 *平台 : Atmega16,基于8MHz *调试时间 :2019年6月7日 23:14 ***************************************************
[单片机]
ATMEGA16A<font color='red'>单片机</font>的多点测温系统完成版 Proteus仿真程序
单片机avr c语言位运算 与或非 异或逻辑 运算介绍 详解
位运算是指按二进制位进行的运算。在单片机中位运算通常用于I/O端口的输入输出控制和逻辑判断。 C语言提供的位运算符有: 运算符 含义 功能 & 按位与 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。 | 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1。 按位异或 若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真) ~ 取反 ~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。 左移 左移运算符是用来将一个数的各二进制位全部左移N位,右补0
[单片机]
<font color='red'>单片机</font>avr c语言位运算 与或非 异或逻辑 运算介绍 详解
基于AT89C51单片机的RS232-GPIB控制设计
越来越多的测量仪器提供GPIB(General Purpose Intefface Bus)总线接口,通过该总线可以方便快捷地连接带有GPIB接口的仪器及计算机,组成一个GPlB网络。GPIB设备与计算机连接时,需要借助GPIB接口板卡,但这些GPIB接口板卡价格昂贵,给仪器与计算机连接带来不便。在大多数情况下计算机只连接一台GPIB接口仪器,并不需要这些功能复杂价格昂贵的GPIB板卡。面对单台仪器与计算机连接的功能需求,本文设计了一种性价比突出的RS232一GPIB控制器,该控制器利用计算机最常用的RS232接口,控制带有GPIB接口的仪器,在计算机与仪器之间建立数据传输的通道。同时,支持SCPI(Standard Comman
[单片机]
基于AT89C51<font color='red'>单片机</font>的RS232-GPIB控制<font color='red'>器</font>设计
芯驰科技E3高性能MCU正式量产出货
近日,芯驰科技首批高性能MCU“控之芯”E3正式交付给客户,意味着芯驰科技MCU进入量产时代,可以为行业提供高性能、高功能安全的系列车规MCU芯片产品。 芯驰科技E3高性能MCU正式量产出货 自今年4月发布以来,芯驰科技克服疫情带来的各种困难和挑战,E3通过了AEC-Q100各项严格的可靠性测试,并于10月实现量产交付。 芯驰科技E3系列产品基于ARM Cortex-R5F,功能安全等级达到ASIL D,温度等级支持AEC-Q100 Grade 1,CPU主频高达800MHz,具有高达6个CPU内核,是现有量产车规MCU中性能最高的产品,填补国内高端高安全级别车规MCU市场的空白。 芯驰科技E3高性能M
[汽车电子]
芯驰科技E3高性能<font color='red'>MCU</font>正式量产出货
单片机C语言程序设计:ADC0809数模转换与显示
ADC0809 数模转换与显示c语言程序 /*名称:ADC0809数模转换与显示 说明:ADC0809采样通道3输入的 模拟量,转换后的结果显示在数码管上。 */ #include《reg51.h》 #defineucharunsignedchar #defineuintunsignedint //各数字的数码管段码(共阴) ucharcodeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; sbitCLK=P1^3;//时钟信号 sbitST=P1^2;//启动信号 sbitEOC=P1^1;//转换结束
[嵌入式]
定时中断是什么意思,定时中断的工作原理
定时器中断是由单片机中的定时器溢出而申请的中断。51单片机中有两个定时器T0和T1。STM32中共有11个定时器。 一、定时器中断是什么意思 定时器中断是由单片机中的定时器溢出而申请的中断。 51单片机中有两个定时器T0和T1: (1)TF0:定时器T0溢出中断请求。当定时器TO产生溢出时,TO中断请求标志TF0置1,请求中断处理。 (2)TF1:定时器T1溢出中断请求。当定时器Tl产生溢出时,T1中断请求标志TF1置1,请求中断处理。 Stm32共有11个定时器: 1、两个高级定时器:TIM1、TIM8-------------------------APB2 2、四个通用定时器:TIM2~TIM5-------------
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved