找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1592|回复: 1
打印 上一主题 下一主题
收起左侧

数码管显示的单片机篮球比赛记分牌程序、Proteus仿真

[复制链接]
跳转到指定楼层
楼主
1、比赛开始,比分能够全部清零,数码管前2位、末2位做记分用,当中2位做24秒倒计时用。
2、24秒倒计时时间到,蜂鸣器响、指示灯亮,重新开始倒计时,蜂鸣器停止鸣叫、指示灯灭。
3、比分进行增加后,倒计时从24秒重新开始倒计时。任意时刻24秒可以重新开始倒计时。必要时候能够关闭倒计时。
4、利用AT24C02或者单片机内部资源保存比分,支持复位保存,掉电保存功能

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:

  1. #include<REG51.h>                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include"keybord.h"
  3. #include"timer.h"
  4. #include"string.h"
  5. #include"i2c.h"

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. unsigned char key_num = 0;        //按键值
  10. unsigned char A_Score = 0;        //A队比分
  11. unsigned char B_Score = 0;        //B队比分
  12. //unsigned char Second = 24;        //24秒倒计时
  13. unsigned char Start_flag = 0;     //开始标志位
  14. unsigned char Clear_flag = 0;     //清除标志位

  15. unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  16.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  17. unsigned char PassWord[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};//显示1-8的值

  18. unsigned char DisplayData[8] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};

  19. void DigDisplay();
  20. void Display();

  21. /*******************************************************************************
  22. * 函 数 名       : main
  23. * 函数功能                 : 主函数
  24. * 输    入       : 无
  25. * 输    出             : 无
  26. *******************************************************************************/
  27. void main()
  28. {
  29.     unsigned char i,num=0;

  30.     Timer0_Init();

  31.      A_Score=At24c02Read(1);          //在地址1内读出数据并赋值A_Score
  32.      B_Score=At24c02Read(50);         //在地址50内读出数据并赋值B_Score
  33.             

  34.         while(1)
  35.         {
  36.         Display();                   //调用显示函数
  37.         key_num = KeyPro();          //获取按键值

  38.         if(Second == 0xff)           //判断秒数是否记到,0-1 ,计到0再减1
  39.         {
  40.             Second = 24;             //Second重新赋值24
  41.             Start_flag = 0;          //开始标志位清零
  42.             TR0 = 0;                 //关闭定时器0
  43.             TR1 = 1;                 //打开定时器1 ,为无源蜂鸣器提供振荡频率
  44.         }
  45.         if(Clear_flag)
  46.         {           
  47.             At24c02Write(50,0);   //在地址50内写入数据B_Score
  48.             Clear_flag = 0;
  49.         }
  50.         if(key_num == 0)          //比赛开始
  51.         {
  52.             TR0 = 1;              //打开定时0开始计数
  53.             TR1 = 0;
  54.             LED = 1;
  55.             Beep = 1;
  56.             Start_flag = 1;  
  57.         }
  58.         else if(key_num == 1)     //比赛暂停
  59.         {
  60.             TR0 = 0;
  61.             TR1 = 0;
  62.             Start_flag = 0;  
  63.         }

  64.         else if(key_num == 2)    //A队加1分
  65.         {
  66.             if(Start_flag)
  67.             {
  68.                 A_Score++;
  69.                 Second = 24;
  70.                 At24c02Write(1,A_Score);   //在地址1内写入数据A_Score
  71.             }   
  72.         }
  73.         else if(key_num == 6)    //A队加2分
  74.         {
  75.             if(Start_flag)
  76.             {
  77.                 A_Score += 2;
  78.                 Second = 24;
  79.                 At24c02Write(1,A_Score);   //在地址1内写入数据A_Score
  80.             }   
  81.         }
  82.         else if(key_num == 10)    //A队加3分
  83.         {
  84.             if(Start_flag)
  85.             {
  86.                 A_Score += 3;
  87.                 Second = 24;
  88.                 At24c02Write(1,A_Score);   //在地址1内写入数据A_Score
  89.             }   
  90.         }
  91.         else if(key_num == 3)    //B队加1分
  92.         {
  93.             if(Start_flag)
  94.             {
  95.                 B_Score++;
  96.                 Second = 24;
  97.                 At24c02Write(50,B_Score);   //在地址50内写入数据B_Score
  98.             }   
  99.         }
  100.         else if(key_num == 7)    //B队加2分
  101.         {
  102.             if(Start_flag)
  103.             {
  104.                 B_Score += 2;
  105.                 Second = 24;
  106.                 At24c02Write(50,B_Score);   //在地址50内写入数据B_Score
  107.             }   
  108.         }
  109.         else if(key_num == 11)    //B队加3分
  110.         {
  111.             if(Start_flag)
  112.             {
  113.                 B_Score += 3;
  114.                 Second = 24;
  115.                 At24c02Write(50,B_Score);   //在地址50内写入数据B_Score
  116.             }   
  117.         }
  118.         else if(key_num == 4)     //清除比分
  119.         {
  120.             A_Score = 0;
  121.             B_Score = 0;
  122.             At24c02Write(1,0);   //在地址1内写入数据0,清除比分
  123.             At24c02Write(50,0);   //在地址50内写入数据0,清除比分
  124.             Clear_flag = 1;
  125.             Second = 24;
  126.             TR0 = 0;   
  127.         }
  128.         else if(key_num == 5)
  129.         {
  130.             Second = 24;   
  131.         }

  132.                         
  133.         }               
  134. }

  135. /*******************************************************************************
  136. * 函 数 名         : delay
  137. * 函数功能                   : 延时函数,i=1时,大约延时10us
  138. *******************************************************************************/
  139. void delay(unsigned int i)
  140. {
  141.         while(i--);        
  142. }

  143. /*******************************************************************************
  144. * 函 数 名         : DigDisplay
  145. * 函数功能                   : 数码管显示函数,显示比分数据
  146. *******************************************************************************/
  147. void Display()
  148. {
  149.     LSA=1;LSB=1;LSC=1;//显示第7位
  150.     P0=smgduan[A_Score/10];//发送段码
  151.     delay(100); //间隔一段时间扫描        
  152.         P0=0x00;//消隐

  153.     LSA=0;LSB=1;LSC=1; //显示第6位
  154.     P0=smgduan[A_Score%10];//发送段码
  155.     delay(100); //间隔一段时间扫描        
  156.         P0=0x00;//消隐

  157.     LSA=0;LSB=0;LSC=1;//显示第4位
  158.     P0=smgduan[Second/10];//发送段码
  159.     delay(100); //间隔一段时间扫描        
  160.         P0=0x00;//消隐

  161.     LSA=1;LSB=1;LSC=0;//显示第3位
  162.     P0=smgduan[Second%10];//发送段码
  163.     delay(100); //间隔一段时间扫描        
  164.         P0=0x00;//消隐

  165.     LSA=1;LSB=0;LSC=0;//显示第1位
  166.     P0=smgduan[B_Score/10];//发送段码
  167.     delay(100); //间隔一段时间扫描        
  168.         P0=0x00;//消隐

  169.     LSA=0;LSB=0;LSC=0;//显示第0位
  170.     P0=smgduan[B_Score%10];//发送段码
  171.     delay(100); //间隔一段时间扫描        
  172.         P0=0x00;//消隐
  173. }

  174. /*******************************************************************************
  175. * 函 数 名         : DigDisplay
  176. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  177. *******************************************************************************/
  178. void DigDisplay()
  179. {
  180.         unsigned char i;
  181.         for(i=0;i<8;i++)
  182.         {
  183.                 switch(i)         //位选,选择点亮的数码管,
  184.                 {
  185.                         case(0):
  186.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  187.                         case(1):
  188.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  189.                         case(2):
  190.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  191.                         case(3):
  192.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位
  193.                         case(4):
  194.                                 LSA=0;LSB=0;LSC=1; break;//显示第4位
  195.                         case(5):
  196.                                 LSA=1;LSB=0;LSC=1; break;//显示第5位
  197.                         case(6):
  198.                                 LSA=0;LSB=1;LSC=1; break;//显示第6位
  199.                         case(7):
  200.                                 LSA=1;LSB=1;LSC=1; break;//显示第7位        
  201.                 }
  202.                 P0=DisplayData[i];//发送段码
  203.                 delay(100); //间隔一段时间扫描        
  204.                 P0=0x00;//消隐
  205.         }
  206. }
复制代码

Keil代码与Proteus8.8仿真下载:
篮球比赛计分牌.7z (74.1 KB, 下载次数: 37)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:908826 发表于 2021-12-21 09:02 | 只看该作者
我就是好奇这种记分牌不就是实时的吗?往24c02里面存是啥意思。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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