标题: 基于LCD显示的篮球定时计分器的设计 [打印本页]

作者: 巴斯光年白    时间: 2016-6-6 20:51
标题: 基于LCD显示的篮球定时计分器的设计
    这是我大一期间制作的一个小设计,这是我第一个制作的设计哈,分享给又需要的朋友。




LCD1602显示的篮球定时计分器的51单片机程序:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. uchar code table[]=".. Play ball! ....";
  5. uchar code table1[]="Welcome to here!" ;
  6. sbit key_ST=P1^5;                 //功能键(开始/暂停)
  7. sbit key_A1=P1^0;                 //功能键(A队分数加1)
  8. sbit key_A2=P1^3;                 //功能键(A队分数加2)
  9. sbit key_1A=P1^6;                 //功能键(A队分数减1)
  10. sbit key_B1=P1^1;                 //功能键(B队分数加1)
  11. sbit key_B2=P1^4;                 //功能键(B队分数加2)
  12. sbit key_1B=P1^7;                 //功能键(B队分数减1)
  13. sbit key_EX=P1^2;                 //功能键(交换场地,A/B两队分数交换)
  14. sbit key_JS=P3^0;                 //功能键(比赛节数加1)
  15. sbit FMQ=P3^3;                         //蜂鸣器
  16. sbit lcdrs=P3^5;                 //LCD显示的数据/命令选择端
  17. sbit lcden=P3^4;                 //LCD显示的使能信号

  18. uchar flag,ms,mg,ss,sg,ags,agg,bgs,bgg,num,num1,num2,js=1,C,D,t,min=0,time_fmq;       
  19. int sec=12;

  20. void delayms(uint xms)                        //定义延时函数
  21. {
  22.         uint i,j;
  23.         for(i=xms;i>0;i--)
  24.                 for(j=110;j>0;j--);
  25. }

  26. void write_data(uchar date)                                        //定义为数据模式
  27. {
  28.         lcdrs=1;
  29.         P0=date;
  30.         delayms(5);
  31.         lcden=1;
  32.         delayms(5);
  33.         lcden=0;
  34. }
  35.                                                                        
  36. void write_com(uchar com)                                           //定义为命令模式
  37. {
  38.         lcdrs=0;
  39.         P0=com;
  40.         delayms(5);
  41.         lcden=1;
  42.         delayms(5);
  43.         lcden=0;
  44. }

  45. void lcd_init()                                                                   //LCD显示屏的初始化
  46. {
  47.         lcden=0;
  48.         write_com(0x38);
  49.         write_com(0x0c);
  50.         write_com(0x06);
  51.         write_com(0x01);
  52. }

  53. void init()                                                                          //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”)
  54. {
  55.         lcden=0;
  56.         write_com(0x82);
  57.         write_data('T');
  58.         write_data('-');

  59.         write_com(0x8a);
  60.         write_data('Q');
  61.         write_data('-');

  62.         write_com(0x80+0x43);
  63.         write_data('A');
  64.         write_data(':');

  65.         write_com(0x80+0x49);
  66.         write_data('B');
  67.         write_data(':');

  68. }

  69. void init_start()                                                                          //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”)
  70. {
  71.         lcden=0;
  72.         write_com(0x80+0x10);
  73.         for(num2=0;num2<16;num2++)
  74.         {
  75.                 write_data(table1[num2]);
  76.                 delayms(5);
  77.         }

  78.         write_com(0x80+0x50);
  79.         for(num2=0;num2<17;num2++)
  80.         {
  81.                 write_data(table[num2]);
  82.                 delayms(5);
  83.         }
  84.         for(num2=0;num2<16;num2++)
  85.         {
  86.                 write_com(0x18);
  87.                 delayms(400);
  88.         }
  89. }

  90. void display(uchar min,int sec,uchar C,uchar D,uchar js)                   //显示函数
  91. {
  92.         ss=sec/10;
  93.         sg=sec%10;
  94.         ms=min/10;
  95.         mg=min%10;
  96.         ags=C/10;
  97.         agg=C%10;
  98.         bgs=D/10;
  99.         bgg=D%10;

  100.         write_com(0x84);
  101.         write_data(0x30+ms);

  102.         write_data(0x30+mg);

  103.         write_data(':');

  104.         write_data(0x30+ss);

  105.         write_data(0x30+sg);

  106.         write_com(0x8d-1);
  107.         write_data(0x30+js);

  108.         write_com(0x80+0x45);
  109.         write_data(0x30+ags);
  110.         write_data(0x30+agg);

  111.         write_com(0x80+0x4b);
  112.         write_data(0x30+bgs);
  113.         write_data(0x30+bgg);               
  114. }

  115. void main()
  116. {
  117.         TMOD=0x11;                                                                //定义定时器0的工作方式为0001
  118.         TH0=(65536-45872)/256;                                        //装初值
  119.         TL0=(65536-45872)%256;
  120.         TH1=(65536-45872)/256;                                        //装初值
  121.         TL1=(65536-45872)%256;
  122.         EA=1;                                                                        //打开总中断
  123.         ET0=1;                                                                        //打开定时器0的中断
  124.         TR0=0;
  125.         ET1=1;
  126.         TR1=0;
  127.         lcd_init();
  128.         init_start();                                               
  129.         while(1)
  130.         {
  131.                 TR1=0;

  132.                 if(key_ST==0)                                               
  133.                 {
  134.                         delayms(5);
  135.                         if(key_ST==0)
  136.                         {
  137.                                 FMQ=0;
  138.                                 if(flag==0)
  139.                                 {
  140.                                         lcd_init();
  141.                                         init();
  142.                                 }
  143.                                 flag=1;
  144.                                 TR0=~TR0;       
  145.                         }
  146.                         while(!key_ST)
  147.                                 display(min,sec,C,D,js);
  148.                         FMQ=1;
  149.                 }

  150.                 if(key_A1==0)
  151.                 {
  152.                         delayms(5);
  153.                         if(key_A1==0)
  154.                         {       
  155.                                 FMQ=0;
  156.                                 C++;
  157.                         }
  158.                         while(!key_A1)
  159.                                 display(min,sec,C,D,js);
  160.                         FMQ=1;
  161.                 }

  162.                 if(key_A2==0)
  163.                 {
  164.                         delayms(5);
  165.                         if(key_A2==0)
  166.                         {
  167.                                 FMQ=0;
  168.                                 C+=2;
  169.                         }
  170.                         while(!key_A2)
  171.                                 display(min,sec,C,D,js);
  172.                         FMQ=1;
  173.                 }

  174.                 if(key_1A==0)
  175.                 {
  176.                         delayms(5);
  177.                         if(key_1A==0)
  178.                         {
  179.                                 FMQ=0;
  180.                                 C--;
  181.                         }
  182.                         while(!key_1A)
  183.                                 display(min,sec,C,D,js);
  184.                         FMQ=1;
  185.                 }

  186.                 if(key_B1==0)
  187.                 {
  188.                         delayms(5);
  189.                         if(key_B1==0)
  190.                         {
  191.                                 FMQ=0;
  192.                                 D++;
  193.                         }
  194.                         while(!key_B1)
  195.                                 display(min,sec,C,D,js);
  196.                         FMQ=1;
  197.                 }

  198.                 if(key_B2==0)
  199.                 {
  200.                         delayms(5);
  201.                         if(key_B2==0)
  202.                         {
  203.                                 FMQ=0;
  204.                                 D+=2;
  205.                         }
  206.                         while(!key_B2)
  207.                                 display(min,sec,C,D,js);
  208.                         FMQ=1;
  209.                 }

  210.                 if(key_1B==0)
  211.                 {
  212.                         delayms(5);
  213.                         if(key_1B==0)
  214.                         {
  215.                                 FMQ=0;
  216.                                 D--;
  217.                         }
  218.                         while(!key_1B)
  219.                                 display(min,sec,C,D,js);
  220.                         FMQ=1;
  221.                 }

  222.                 while(min==0&&sec==0)
  223.                 {
  224.                         TR0=0;
  225.                         TR1=1;
  226.                         if(key_ST==0)
  227.                         {
  228.                                 delayms(5);
  229.                                 if(key_ST==0)
  230.                                 {
  231.                                         FMQ=0;
  232.                                         min=11;
  233.                                         sec=60;
  234.                                         TR0=~TR0;
  235.                                 }
  236.                                 while(!key_ST)
  237.                                         display(min,sec,C,D,js);
  238.                                 FMQ=1;
  239.                         }
  240.                         if((key_EX==0)&&(js==2))
  241.                         {
  242.                                 delayms(10);
  243.                                 if((key_EX==0)&&(js=2))
  244.                                 {
  245.                                         FMQ=0;

  246.                                         write_com(0x80+0x43);
  247.                                         write_data('B');
  248.                                         write_com(0x80+0x49);
  249.                                         write_data('A');

  250.                                         t=C;
  251.                                         C=D;
  252.                                         D=t;
  253.                                 }
  254.                                 while(!key_EX)
  255.                                         display(min,sec,C,D,js);
  256.                                 FMQ=1;
  257.                         }
  258.                         if(key_JS==0)
  259.                         {
  260.                                 delayms(10);
  261.                                 if(key_JS==0)
  262.                                 {
  263.                                         FMQ=0;
  264.                                         js++;
  265.                                 }
  266.                                 while(!key_JS)
  267.                                         display(min,sec,C,D,js);
  268.                                 FMQ=1;
  269.                         }
  270.                         display(min,sec,C,D,js);
  271.                 }
  272.                 display(min,sec,C,D,js);
  273.         }
  274. }
  275. void T0_time()interrupt 1                //中断0控制晶码管显示时间
  276. {
  277.         TH0=(65536-45872)/256;                // 重装初值
  278.         TL0=(65536-45872)%256;
  279.         num++;
  280.         if(num==20)
  281.         {
  282.                 num=0;
  283.                 sec--;
  284.                 if(sec<0)
  285.                 {
  286.                         sec=59;
  287.                         min--;       
  288.                 }       
  289.         }
  290. }

  291. void T1_time()interrupt 3                //中断0控制晶码管显示时间
  292. {
  293.         TH1=(65536-45872)/256;                // 重装初值
  294.         TL1=(65536-45872)%256;
  295.         num1++;
  296.         if(num1==20)
  297.         {
  298.                 num1=0;
  299.                 time_fmq++;
  300.                 if(time_fmq>=4)
  301.                         FMQ=1;
  302.                 else
  303.                         FMQ=0;
  304.         }
  305. }
复制代码

Proteus仿真.rar

45.94 KB, 下载次数: 536, 下载积分: 黑币 -5

Proteus仿真图

程序代码.rar

39.31 KB, 下载次数: 435, 下载积分: 黑币 -5

原程序代码


作者: 高永显    时间: 2016-6-7 07:45
交换场地是怎么回是?
作者: 巴斯光年白    时间: 2016-6-7 18:38
高永显 发表于 2016-6-7 07:45
交换场地是怎么回是?

就是打完半场比赛后交换场地,左右显示交换一下
作者: yzwzfyz    时间: 2016-6-7 18:59
硬件设计的不错。
存在一个隐患:
喇叭无限流措施,如果驱动长期低电平,喇叭线圈通过三极管直接对地,不安全。
作者: 小调调    时间: 2016-6-7 23:07
厉害,是你自己写出来的吗?
作者: 大4531    时间: 2016-11-17 20:57
5他1啊可以
作者: 18692899115    时间: 2016-12-7 15:35
交换场地实现不了
作者: my51881054    时间: 2016-12-28 19:12
我的哥,厉害了
作者: 爱恋之城    时间: 2017-1-6 00:02
大神,膜拜
作者: 111111啊    时间: 2017-3-25 17:59
厉害了我的哥
作者: 972086553    时间: 2017-4-4 14:59
666  老哥 稳
作者: micmiutom    时间: 2017-5-5 10:42
交换场地是怎么回是
作者: 彬Lsl    时间: 2017-6-3 21:06
本帖最后由 彬Lsl 于 2017-6-4 10:53 编辑

请问,这个KEY_ST跟其他开关是怎么个连法

288cf746e71e95966b4499ec0dcb7b9.png (65.2 KB, 下载次数: 149)

288cf746e71e95966b4499ec0dcb7b9.png

作者: 彬Lsl    时间: 2017-6-4 10:50
yzwzfyz 发表于 2016-6-7 18:59
硬件设计的不错。
存在一个隐患:
喇叭无限流措施,如果驱动长期低电平,喇叭线圈通过三极管直接对地,不 ...

那需要怎么修改
作者: qqai123    时间: 2017-6-4 16:51
真不错
作者: 彬Lsl    时间: 2017-6-5 16:00
按照这个电路图焊接,代码烧进去后,但不行,

作者: 其味无穷    时间: 2017-6-9 17:12
就是想问一下,A、B队减一分怎么改成加三分,还有就是场地交换和节数加1,不好使啊
作者: pam    时间: 2017-6-13 22:15
厉害了
作者: 348652560    时间: 2017-6-15 17:39
非常好
作者: 其味无穷    时间: 2017-6-19 16:31
彬Lsl 发表于 2017-6-4 10:50
那需要怎么修改

你用过之后,他的那个喇叭是怎么回事,怎么不想
作者: 柠檬水i    时间: 2017-6-20 12:54
特别好
作者: 小铭    时间: 2017-7-4 11:36
新手,学习到了
作者: 大罗布    时间: 2017-9-22 21:23
厉害 崇拜 崇拜
作者: xxnn    时间: 2017-11-23 15:03
厉害了

作者: xxnn    时间: 2017-11-23 15:05
厉害了,可是我连接对了,显示不出
作者: CCCCCCCCude    时间: 2017-11-26 22:29
膜拜大神!
作者: 小白求知    时间: 2017-12-26 10:17
为什么我的运行不出来,有全部运行出来的吗?
作者: 天之蓝1994    时间: 2017-12-26 18:28
赞赞赞楼主
作者: 17年的51菜鸟    时间: 2017-12-26 22:02
大一就做出这样的设计,挺厉害的!
作者: 天道酬勤Ja    时间: 2017-12-28 21:55
请问开始功能的开关是怎么和后面的开关进行连接的
作者: lxlxlx    时间: 2018-1-1 17:25
if(time_fmq>=4)   FMQ=1;请问大佬这段程序是什么意思

作者: jhmjhm    时间: 2018-4-3 10:24
厉害啊,大一就能做这个了
作者: 大哥111    时间: 2018-6-4 14:25
请问开始功能的开关是怎么和后面的开关进行连接的
作者: 十船翔    时间: 2018-6-9 14:45
我们也有这个课题!
作者: 乱世灭神    时间: 2018-6-12 10:47
萌新看一下
作者: 再组    时间: 2018-6-18 15:35
交换场地怎么搞啊
作者: 我有一颗胖的心    时间: 2018-6-18 20:38
楼主大一做出去的,好强。是自学的吗?
作者: 1351142686    时间: 2018-6-18 21:56
赞一个,我要学好单片机
作者: liqiang1997    时间: 2018-6-18 22:04
牛逼,大神赞一个。
作者: 我有一颗胖的心    时间: 2018-6-19 12:34
楼主大神,LCD1602我找不到这个元器件啊,你是用proteus画的吗?
作者: huqinlin    时间: 2018-6-21 20:30
厉害了

作者: 971855113    时间: 2018-6-21 21:54
大神能发一下吗,我们期末考试就是这个
作者: 2452047173    时间: 2018-6-30 16:17
赞一个
作者: Asgore    时间: 2018-9-22 12:22
请问开始功能的开关是怎么和后面的开关进行连接的
作者: liuxiaojier    时间: 2018-9-23 15:50
希望可以借鉴一下大神的仿真图
作者: 会飞的鱼1710    时间: 2018-10-16 20:36
想问交换场地怎么不好用呀
作者: Feu_d    时间: 2018-10-20 20:21
码一下
作者: 张鹏小弟    时间: 2018-11-26 13:51
可以 但是交换场地是不是有点问题啊  点了没有反应
作者: 1476928506    时间: 2018-12-1 11:16
程序不错
作者: y358666395    时间: 2018-12-17 14:23
这个可以,但是 有复位键吗
作者: y358666395    时间: 2018-12-17 14:57
这个图 交换场地按键怎么使用啊?  还有比赛节数加一又是怎么用。。
作者: 梦里见回复    时间: 2018-12-17 21:49
想问如果用12864要怎么改程序
作者: 暗淡的紫    时间: 2019-1-12 19:01
谢谢老哥
作者: 763900682    时间: 2019-5-12 11:57
可以实现红外遥控吗

作者: 布谷鸟    时间: 2019-6-18 18:11
楼主可以加个你好友不( ^_^)/扣扣:3338235535
作者: zssa    时间: 2019-6-20 09:50
连接lcd的为什么只有这两个sbit lcdrs=P3^5;                 //LCD显示的数据/命令选择端 sbit lcden=P3^4;  
作者: Ginger001    时间: 2019-7-2 10:12
有没有大佬能分享下这个文件到邮箱1500452069@qq.com吗,黑币不够= =
作者: 小杨同学睡觉了    时间: 2020-1-5 19:42
这个具体的引脚到底对应哪些按键?
作者: CC救救我8    时间: 2020-1-15 13:45
谢谢分享!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1