久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10497|回復: 10
收起左側

單片機籃球計時計分器(源程序+仿真圖+原理圖)

  [復制鏈接]
ID:262632 發表于 2020-2-29 14:42 | 顯示全部樓層 |閱讀模式
該設計的總的原理電路圖如圖1.2所示。當按下不同的按鍵時,顯示器上顯示相應的數據,每一節12分鐘結束喇叭響。可實現所以既定功能。
1.png

單片機源程序如下:
  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)
回復

使用道具 舉報

ID:659974 發表于 2020-3-9 10:56 | 顯示全部樓層
顯示器能換成LED的嗎
回復

使用道具 舉報

ID:786187 發表于 2020-6-21 22:56 | 顯示全部樓層
能教下嗎
回復

使用道具 舉報

ID:786805 發表于 2020-6-28 02:57 | 顯示全部樓層
程序很好,沒有問題,太感謝了,向大佬學習
回復

使用道具 舉報

ID:774633 發表于 2020-6-28 08:50 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:774631 發表于 2020-6-28 08:51 | 顯示全部樓層
真的是臥虎藏龍,學習了。
回復

使用道具 舉報

ID:828639 發表于 2020-10-19 09:04 | 顯示全部樓層
PCB文件用什么打開呀,求大佬解答
回復

使用道具 舉報

ID:837992 發表于 2020-11-3 09:07 | 顯示全部樓層
程序沒有問題,十分感謝大佬,向大佬學習
回復

使用道具 舉報

ID:891769 發表于 2021-3-15 12:47 | 顯示全部樓層
需要用Keil5打開才能編譯成功
回復

使用道具 舉報

ID:894520 發表于 2021-3-24 12:13 來自手機 | 顯示全部樓層
仿真圖和原理圖的文件用什么軟件打開?麻煩各位大佬解答一下
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线中文字幕视频 | 免费午夜视频 | 久久视频精品 | 97国产一区二区 | 天天艹日日干 | 我爱操| 国产精品一区二区av | 色频| 色综合天天天天做夜夜夜夜做 | 免费xxxx大片国产在线 | 欧美一区二区大片 | 中文字幕一区在线 | 国产成人精品免高潮在线观看 | 黄a网 | 日韩在线视频一区二区三区 | 狠狠操狠狠色 | 欧美综合国产精品久久丁香 | 天天操夜夜爽 | a级大片免费观看 | 午夜三区| 免费在线看a | 免费一区二区三区 | 亚洲欧洲国产视频 | 999久久久久久久久6666 | 精品九九久久 | 鲁一鲁资源影视 | 国产目拍亚洲精品99久久精品 | 亚洲一区二区三区四区五区午夜 | 亚洲国产精品网站 | 中文字幕日韩欧美一区二区三区 | 欧美精品一区二区在线观看 | 午夜a v电影 | 韩日精品在线观看 | 免费亚洲婷婷 | 欧美日韩在线成人 | 欧美精品三区 | 91在线精品视频 | 麻豆国产一区二区三区四区 | 成人精品国产免费网站 | 黄色精品 | 51ⅴ精品国产91久久久久久 |