找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9814|回复: 3
收起左侧

单片机篮球计分器设计仿真及程序

[复制链接]
ID:234651 发表于 2018-6-12 11:29 | 显示全部楼层 |阅读模式
可以实现A、B两队的分数记录,12分钟倒计时、和场地互换功能。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

设计图

设计图


单片机源程序如下:
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}/*1~9、空格和-的字型码*/
  4.                         ,display[8]={1,2,4,8,16,32,64,128};//动态显示数码管
  5. uchar score[2]={0,0},time[2]={12,0},byte[8]={0},j=0,h=0;//score数组记录A、B两队份数time
  6. //数组记录倒计时分、秒时间,byte
  7. //数组记录八个数码管的显示字,j记
  8. //录按键s0按下的次数,h记录时间
  9. //中断1的次数;
  10. bit start=0;                                                                //start为12分倒计时是否开始时的标志位;
  11. sbit alrm=P3^0;                                                        //alrm为响铃脉冲输出端
  12. unsigned int t=0;                                                        //响铃脉冲个数
  13. void delay1(uchar t)                                                //延时程序,最短5ms
  14. {
  15.         unsigned char m,n,k;
  16.         for(m=t;m>0;m--)
  17.         for(n=10;n>0;n--)
  18.         for(k=250;k>0;k--);
  19. }

  20. void jishi()                                        //倒计时程序
  21. {
  22.   if(start==1)                                                //如果倒计时标志有效,则开始倒计时
  23.   {
  24.   if(time[1]==0)                                       
  25.   {
  26.   if(time[0]==0)                        //如果分秒位都为0时,开启时间中断0,输出响铃脉冲
  27.   {
  28.   start=0;
  29.   ET0=1;
  30.   TR0=1;
  31.   }
  32.   else                                        //如果秒位为0,分位不为0,则秒位跳为59,分位减1
  33.   {
  34.   time[0]--;
  35.   time[1]=59;
  36.   }
  37.   }
  38.   else time[1]--;                        //如果分秒位都不为0,则秒位减1
  39.   }
  40. }
  41. void TIMER0() interrupt 1 using 0                        //时间中断0;用于产生响铃脉冲
  42. {        
  43.         TH0=0xfc;                                                //1ms的计数初始状态
  44.         TL0=0x18;
  45.         t++;
  46.         alrm=!alrm;
  47.         if(t==5000)                                                //如果输出5000个脉冲,则停止响铃
  48.         {
  49.         t=0;
  50.         ET0=0;
  51.         TR0=0;
  52.         }
  53. }
  54. void TIMER1() interrupt 3 using 1
  55. {
  56.         TH1=0x63;
  57.         TL1=0xc0;                        //50ms初始值;
  58.         if((h++)==20)
  59.         {                            // 一秒是否到,如果到,则进行倒计时程序
  60.         h=0;
  61.         jishi();
  62.         }
  63. }
  64. void INT_0() interrupt 0 using 2                //外部中断0,记录按键按下次数
  65. {       
  66.         ET0=0;
  67.         delay1(1);                        //延时消抖
  68.         j++;
  69.         if(j==5)                                //如果按键s0按下五次,则归零
  70.         j=0;
  71.         ET0=1;
  72. }

  73. void jiaohuan()                        //分数交换,AB两队换场程序
  74. {
  75.         uchar temp;
  76.         temp=score[0];
  77.         score[0]=score[1];
  78.         score[1]=temp;
  79. }

  80. void INT_1() interrupt 2 using 3                //外部中断1
  81. {       
  82.         ET1=0;                                                //延时消抖
  83.         delay1(1);
  84.         if(j==1)                                                //如果s0按下的次数为1次,则score[1]加1
  85.         {
  86.                 score[1]++;
  87.                 if(score[1]==100)                        //分数到100后归零
  88.                 score[1]=0;
  89.         }
  90.         else if(j==2)
  91.                 {
  92.                 score[0]++;                                //如果s0按下的次数为2次,则score[0]加1
  93.                 if(score[0]==100)                        //分数到100后归零
  94.                 score[0]=0;
  95.                 }
  96.         else if(j==3)                                //如果s0按下的次数为3次,则两队分数交换
  97.                 jiaohuan();
  98.         else  if(j==4)                 //如果s0按下的次数为4次        ,则打开倒计时或关闭倒计时       
  99. start=!start;
  100.         else;
  101.         ET1=1;       
  102.        
  103. }
  104. void by(void)
  105. {       
  106.                 byte[5]=11;                        //第五个数码管一直显示为"-"
  107.                 if(j==4)                                //如果s0按下的次数为4,则显示倒计时
  108.                 {
  109.                          byte[3]=time[0]/10;
  110.                         byte[4]=time[0]%10;
  111.                         byte[6]=time[1]/10;
  112.                         byte[7]=time[1]%10;

  113.                 }
  114.                 else                         //否则显示比分
  115.                 {       
  116.                         byte[3]=score[0]/10;
  117.                         byte[4]=score[0]%10;
  118.                         byte[6]=score[1]/10;
  119.                         byte[7]=score[1]%10;       
  120.                 }

  121. }
  122. void blank()
  123. {
  124.         if(j==1)                //如果s0按下1次;第7、8个数码管闪烁跳动
  125.         {
  126.                 byte[7]=10,byte[6]=10;
  127.         }
  128.         else if(j==2)        //如果s0按下2次;第4、5个数码管闪烁跳动
  129.         {
  130.                 byte[3]=10,byte[4]=10;
  131.         }
  132.         else if(j==3)        //如果s0按下3次;第4、5、7、8个数码管闪烁跳动
  133.         {
  134.         byte[7]=10,byte[6]=10;
  135.         byte[4]=10,byte[3]=10;
  136.         }
  137.         else;
  138.        
  139. }
  140. void bitshow()
  141. {        if(h<=10)                //前半秒正常显示,后半秒根据s0按下的次数相应的数码管闪烁
  142.                 by();       
  143.         else
  144.                 blank();
  145. }
  146. void dis()
  147. {        uchar  i;
  148.            while(1)                        //        死循环显示
  149.         {       
  150.                 bitshow();                        //求每一位的显示
  151.                 for(i=3;i<=7;i++)
  152.                 {
  153.                 P0=~display[i];                //P0口控制扫描显示的数码管
  154.                 P1=tab[byte[i]];                //P1口输出字型码
  155.                 delay1(1);                        //延时5ms,增加显示亮度
  156.                 }
  157.         }

  158. }       
  159. void main(void)
  160. {       
  161.         TMOD=0x11;
  162.         EA=1;
  163.         EX0=1;
  164.         EX1=1;
  165.         ET1=1;
  166.         IT1=1;
  167.         IT0=1;
  168.         TR1=1;                                        //开启时间中断1,两个外部中断
  169.         IP=5;                                        //中断优先级控制
  170.         dis();                                        //显示子程序
  171.        
  172. }

复制代码

所有资料51hei提供下载:
篮球计分器设计仿真及程序.zip (99.46 KB, 下载次数: 94)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:450734 发表于 2018-12-20 14:54 | 显示全部楼层
咱们这个数码管型号是cc还是ca啊,共阳极还是公阴极啊
回复

使用道具 举报

ID:550827 发表于 2019-5-30 10:21 | 显示全部楼层
应该是ca呢
回复

使用道具 举报

ID:652786 发表于 2019-12-4 13:35 | 显示全部楼层
你实物怎么连接啊?那个NOT那个地方
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表