找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机篮球计时计分器(源程序+仿真图+原理图)

  [复制链接]
跳转到指定楼层
楼主
该设计的总的原理电路图如图1.2所示。当按下不同的按键时,显示器上显示相应的数据,每一节12分钟结束喇叭响。可实现所以既定功能。


单片机源程序如下:
  1. #include<reg51.h>//51单片机头文件
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. sbit K1=P3^2;//比赛倒计时开始/暂停
  5. sbit K2=P3^3;//24s倒计时重新开始
  6. sbit K3=P1^3;//乙队+1按键
  7. sbit K4=P1^2;//乙队+2按键
  8. sbit K5=P1^1;//甲队+1按键
  9. sbit K6=P1^0;//甲队+2按键
  10. sbit K7=P1^4;//甲队+3按键
  11. sbit K8=P1^5;//乙队+3按键
  12. sbit K9=P1^6;//预留按键
  13. sbit beep=P2^0;//蜂鸣器接口  
  14. sbit RS=P2^7;
  15. sbit E=P2^5;
  16. char miao,fen,num,time,aa;
  17. uchar bb,cc;
  18. uchar code table1[]={"H.T 000:000 R.T "};
  19. uchar code table2[]={"12:00  SEC-1  24"};
  20. //延时子函数
  21. void delay(uint z)  
  22. {
  23.         uint x;
  24.         uchar y;
  25.         for(x=z;x>0;x--)
  26.                   for(y=110;y>0;y--);
  27. }
  28. //LCD1602液晶写指令子函数
  29. void write_com(uchar com)
  30. {
  31.         RS=0;
  32.         P0=com;
  33.         delay(5);
  34.         E=1;
  35.         delay(5);
  36.         E=0;
  37. }
  38. //LCD1602液晶写数据子函数
  39. void write_date(uchar date)
  40. {
  41.         RS=1;
  42.         P0=date;
  43.         delay(5);
  44.         E=1;
  45.         delay(5);
  46.         E=0;
  47. }
  48. //LCD1602液晶初始化子函数
  49. void LCD1602_init()
  50. {
  51.         uchar i;
  52.         bb=0;    //H.T分数初始化
  53.         cc=0;    //R.T分数初始化
  54.         time=0;
  55.         TMOD=0x10;    //定时器1初始化
  56.         TL1=0x00;
  57.         TH1=0x4c;
  58.         EA=1;     //开总中断
  59.         ET1=1;     //开定时器1
  60.         TR1=0;     //定时器1不工作
  61.         EX0=1;     //开中断0
  62.         EX1=1;     //开中断1
  63.         IT0=1;     //中断0为边沿触发
  64.         IT1=1;     //中断1为边沿触发
  65.         E=0;
  66.         beep=0;
  67.         miao=0;
  68.         fen=12;
  69.         num=1;
  70.         aa=24;
  71.         write_com(0x38);  //LCD设置初始化
  72.         write_com(0x0c);
  73.         write_com(0x06);
  74.         write_com(0x01);
  75.         write_com(0x80);  //LCD显示初始化
  76.         for(i=0;i<16;i++)
  77.         {
  78.                   write_date(table1[i]);
  79.         }
  80.         write_com(0x80+0x40);
  81.         for(i=0;i<16;i++)
  82.         {
  83.                   write_date(table2[i]);
  84.         }
  85. }
  86. //分数更新子函数
  87. void point_lcd(uchar add,uchar dat)
  88. {
  89.         write_com(0x80+add);
  90.         write_date(0x30+dat/100);
  91.         write_date(0x30+(dat%100)/10);
  92.         write_date(0x30+dat%10);
  93.         write_com(0x80+add);
  94. }
  95. //按键扫描子函数
  96. void keyscan()
  97. {
  98.         if(K3==0)     //K3按下H.T分数加一
  99.         {
  100.                   while(K3==0);
  101.                 bb++;
  102.                   point_lcd(0x04,bb);  //分数显示更新
  103.                   if(K3==0)    //松手检测
  104.                   {
  105.                            while(K3==0);
  106.                            delay(20);
  107.                   }
  108.         }
  109.         else if(K4==0)    //S4按下H.T分数加二
  110.         {
  111.                   while(K4==0);
  112.                 bb=bb+2;
  113.                   point_lcd(0x04,bb);
  114.                   if(K4==0)
  115.                   {
  116.                            while(K4==0);
  117.                            delay(20);
  118.                   }
  119.         }
  120.         else if(K7==0)    //S4按下H.T分数加二
  121.         {
  122.                   while(K7==0);
  123.                 bb=bb+3;
  124.                   point_lcd(0x04,bb);
  125.                   if(K7==0)
  126.                   {
  127.                            while(K7==0);
  128.                            delay(20);
  129.                   }
  130.         }
  131.         else if(K5==0)    //S5按下R.T分数加一
  132.         {
  133.                   while(K5==0);
  134.                 cc++;
  135.                   point_lcd(0x08,cc);
  136.                   if(K5==0)
  137.                   {
  138.                            while(K5==0);
  139.                            delay(20);
  140.                   }
  141.         }
  142.         else if(K6==0)    //S6按下R.T分数加2
  143.         {
  144.                   while(K6==0);
  145.                 cc=cc+2;
  146.                   point_lcd(0x08,cc);
  147.                   if(K6==0)
  148.                   {
  149.                            while(K6==0);
  150.                            delay(20);
  151.                   }
  152.         }
  153.         else if(K8==0)    //S6按下R.T分数加2
  154.         {
  155.                   while(K8==0);
  156.                 cc=cc+3;
  157.                   point_lcd(0x08,cc);
  158.                   if(K8==0)
  159.                   {
  160.                            while(K8==0);
  161.                            delay(20);
  162.                   }
  163.         }
  164. }
  165. //比赛倒计时/24s倒计时
  166. void counter_down()
  167. {
  168.         uchar i;
  169.         if(time>=20)     //每1s倒计时做减一操作
  170.         {
  171.                   miao--;
  172.                   aa--;
  173.                   write_com(0x80+0x4e);  //24s倒计时显示
  174.                   write_date(0x30+aa/10);
  175.                   write_date(0x30+aa%10);
  176.                 write_com(0x80+0x4e);
  177.                   if(aa==0)    //24s结束发出3s连续报警
  178.                   {
  179.                            beep=1;
  180.                            delay(3000);
  181.                            beep=0;
  182.                            aa=24;
  183.                   }
  184.                   if((miao==0)&&(fen==0))  //检测一节比赛是否结束
  185.                   {
  186.                            TR1=0;     //定时器1暂停
  187.                            write_com(0x80+0x44);
  188.                            write_date(0x30);
  189.                            num++;
  190.                            aa=24;    //24s计时复位
  191.                            write_com(0x80+0x4e);  //24s倒计时显示
  192.                            write_date(0x30+aa/10);
  193.                            write_date(0x30+aa%10);
  194.                         write_com(0x80+0x4e);
  195.                            if(num<5)    //每节结束蜂鸣器发出8s的间断报警
  196.                            {
  197.                             for(i=80;i>0;i--)
  198.                             {
  199.                                      beep=1;
  200.                                      delay(500);
  201.                                      beep=0;
  202.                                      delay(500);
  203.                             }
  204.                            }
  205.                            if(num==5)    //终场结束,蜂鸣器发出10s的连续警报声
  206.                            {
  207.                              beep=1;
  208.                              delay(10000);
  209.                              num=0;
  210.                            }       
  211.                            beep=0;     //蜂鸣器关闭
  212.                         write_com(0x80+0x4b); //更新"SEC-?"
  213.                         write_date(0x30+num);
  214.                         write_com(0x80+0x4b);
  215.                         miao=0;     //倒计时复位
  216.                         fen=12;
  217.                   }
  218.                   if(miao==-1)
  219.                   {
  220.                            miao=59;
  221.                            fen--;
  222.                   }
  223.                   write_com(0x80+0x40);  //更新倒计时显示
  224.                   write_date(0x30+fen/10);
  225.                   write_date(0x30+fen%10);
  226.                   write_com(0x80+0x43);
  227.                   write_date(0x30+miao/10);
  228.                   write_date(0x30+miao%10);
  229.                 write_com(0x80+0x43);
  230.                   time=0;
  231.         }
  232. }
  233. //主函数
  234. void main()
  235. {
  236.         LCD1602_init();
  237.         while(1)
  238.         {
  239.                   keyscan();  //分数按键检测
  240.         }
  241. }
  242. //外部0中断子函数
  243. void wb0() interrupt 0  //比赛时间开始/暂停
  244. {
  245.         TR1=~TR1;     //定时器1工作/暂停
  246.         if(TR1==1)  //当倒计时工作时,S1按下定时器立即停止工作
  247.         {
  248.                   PT1=0;
  249.         }
  250.         else   //倒计时不工作时,S1按下倒计时立即工作
  251.         {
  252.                   PT1=1;
  253.         }
  254.         if(K1==0)     //松手检测
  255.         {
  256.                   while(K1==0);
  257.                    counter_down();
  258.           //        delay(20);
  259.         }
  260. }
  261. //外部1中断子函数
  262. void wb1() interrupt 2   //24s倒计时重新开始
  263. {
  264.         aa=24;
  265.         write_com(0x80+0x4e);   //24s倒计时显示
  266.         write_date(0x30+aa/10);
  267.         write_date(0x30+aa%10);
  268.         write_com(0x80+0x4e);
  269.         if(K2==0)      //松手检测
  270.         {
  271.                   while(K2==0)
  272.                   {
  273.                            counter_down();
  274.                   }
  275.                   delay(20);
  276.         }
  277. }
  278. //定时器1中断子函数
  279. void t1() interrupt 3   //定时器1中断20次为1s
  280. {
  281.         time++;
  282.         TL1=0x00;
  283.         TH1=0x4c;
  284.         counter_down();     //倒计时
  285. }
复制代码

所有资料51hei提供下载:
篮球计分器.zip (554.66 KB, 下载次数: 263)


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

使用道具 举报

沙发
ID:659974 发表于 2020-3-9 10:56 | 只看该作者
显示器能换成LED的吗
回复

使用道具 举报

板凳
ID:786187 发表于 2020-6-21 22:56 | 只看该作者
能教下吗
回复

使用道具 举报

地板
ID:786805 发表于 2020-6-28 02:57 | 只看该作者
程序很好,没有问题,太感谢了,向大佬学习
回复

使用道具 举报

5#
ID:774633 发表于 2020-6-28 08:50 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
ID:774631 发表于 2020-6-28 08:51 | 只看该作者
真的是卧虎藏龙,学习了。
回复

使用道具 举报

7#
ID:828639 发表于 2020-10-19 09:04 | 只看该作者
PCB文件用什么打开呀,求大佬解答
回复

使用道具 举报

8#
ID:837992 发表于 2020-11-3 09:07 | 只看该作者
程序没有问题,十分感谢大佬,向大佬学习
回复

使用道具 举报

9#
ID:891769 发表于 2021-3-15 12:47 | 只看该作者
需要用Keil5打开才能编译成功
回复

使用道具 举报

10#
ID:894520 发表于 2021-3-24 12:13 来自手机 | 只看该作者
仿真图和原理图的文件用什么软件打开?麻烦各位大佬解答一下
回复

使用道具 举报

11#
ID:935839 发表于 2021-6-10 09:30 来自手机 | 只看该作者
jockli 发表于 2021-3-24 12:13
仿真图和原理图的文件用什么软件打开?麻烦各位大佬解答一下

Keil5和ISIS
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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