找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机设计,计时器,计分器视频教程与proteus仿真及源代码

[复制链接]
跳转到指定楼层
楼主
该项目基本满足以下要求
1.一个四位一体数码管显示比赛时间,时间格式如:15:00,两个三位一体数码管显示甲乙两对的比分,比分格式如:008。
2.比赛时间采用倒计时方式,以一秒的频率减时,上电时默认初值为15:00.
3.甲乙队比分采用三位数,上电初值为000,最大值为999,满足常理要求,未开始比赛以及比赛结束后比分无法加减,
4.比赛未开始之前,可以通过ADD1、DEC1键对比较时间的分钟进调时,通过ADD2、DEC2键对比较时间的秒进行调时。
5.可随时暂停/启动比赛时间。
6.比赛进行时,可以通过ADD1、DEC1键对甲队比分加、减,可以通过ADD2、DEC2对乙队比分加、减。每按一次键,加/减1分。
7.当一节比赛完后,可以通过(EXCHANGE)换场键换场,换场后,比分交换显示,交换后,下一节比赛开始时,相应的比分加减键也随之交换。
8.当比赛结束时,发出报警。



视频教程下载地址:http://www.51hei.com/bbs/dpj-100315-1.html

单片机源程序如下:
  1. /*
  2. 倒计时计算器,数码管显示 默认值15:00

  3. 共阳数码管

  4. */
  5. #include <reg52.h>


  6. void delay(int ms);
  7. void dispaly(char min,char sec,int sco1,int sco2);
  8. void key_scan(void);


  9. /*共阳极数码管的0-9数字编码*/
  10. code unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  11. sbit s8 = P3^6;
  12. sbit s9 = P3^7;
  13. sbit buz = P3^4;


  14. char m = 15;   //默认的分钟
  15. char sec = 0;  //默认的秒钟

  16. int sc1 = 0;   //默认甲方的比分
  17. int sc2 = 0;   //默认乙方的比分

  18. char buz_flag = 0; //默认报警标志为0,不报警
  19. char status = 0;  //状态标志,0的时候表示非比赛状态,1表示比赛状态


  20. int main(void)
  21. {        
  22.         /*使用定时器进行计时*/
  23.         //初始化定时器0
  24.         TMOD=0xf1;  //设置T0为工作方式1    16位的定时器模式
  25.     TH0=(65535-50000)/256;     //50ms中断一次  
  26.     TL0=(65535-50000)%256;      
  27.     /*Timer0工作在模式0下时为13位定时/计数器,
  28.     TL0只使用前5位,故对32进行求余/模    */  
  29.   
  30.      
  31.     ET0=1;      //开定时器0中断  
  32.             
  33.         P3 = 0x3f;
  34.         
  35.         /*外部中断0 的初始化*/
  36.         IT0 = 1;                           //设置为下降沿触发
  37.     EX0 = 1;                           //外部中断0中断允许位
  38.         
  39.         
  40.         EA=1;       //开总中断
  41. //        TR0=1;      //启动定时器0

  42.         while(1)
  43.         {
  44.                 dispaly(m,sec,sc1,sc2);
  45.                 key_scan();
  46.                 if(buz_flag)
  47.                 {
  48.                         buz = 0;
  49.                 }
  50.         }

  51. }


  52. /*按键扫描*/
  53. void key_scan(void)
  54. {
  55.         static char key_flag = 0;  //按键按下标志 ,检测到按下之后为1,否则为0
  56.         static char key_count = 0;
  57.         static unsigned char key_val = 0;   //检测到按键之后保存的按键值
  58.         int t;
  59.         
  60.         P1  = 0xff;
  61.         
  62.         if(P1 != 0xff)   //有按键按下了
  63.         {
  64.                 if(key_flag == 1) //表示已经检测到按键了
  65.                 {
  66.                         key_count++;
  67.                         if(key_count > 15)
  68.                         {
  69.                                 key_count = 0;
  70.                                 if(P1 == key_val)   //确实 有按键按下了
  71.                                 {
  72.                                         switch(key_val)  //进行按键处理
  73.                                         {
  74.                                                 case 0xfe:
  75.                                                         //add1
  76.                                                         if(status)
  77.                                                         {
  78.                                                                 sc1 += 1;
  79.                                                         }
  80.                                                         else
  81.                                                         {
  82.                                                                 m += 1;
  83.                                                         }
  84.                                                         break;
  85.                                                 case 0xfd:
  86.                                                         //dec1
  87.                                                         if(status)
  88.                                                         {        
  89.                                                                 if(sc1 > 0)
  90.                                                                 {
  91.                                                                         sc1 -= 1;
  92.                                                                 }
  93.                                                         }
  94.                                                         else
  95.                                                         {
  96.                                                                 if(m>0)
  97.                                                                 {
  98.                                                                         m -= 1;
  99.                                                                 }
  100.                                                         }
  101.                                                         break;
  102.                                                 case 0xfb:
  103.                                                         //add2
  104.                                                         if(status)
  105.                                                         {
  106.                                                                 sc2 += 1;
  107.                                                         }
  108.                                                         else
  109.                                                         {
  110.                                                                 if(sec<59)
  111.                                                                 {
  112.                                                                         sec += 1;                                                
  113.                                                                 }
  114.                                                         }
  115.                                                         break;
  116.                                                 case 0xf7:
  117.                                                         //dec2
  118.                                                         if(status)
  119.                                                         {        
  120.                                                                 if(sc2 > 0)
  121.                                                                 {
  122.                                                                         sc2 -= 1;
  123.                                                                 }
  124.                                                         }
  125.                                                         else
  126.                                                         {
  127.                                                                 if(sec>0)
  128.                                                                 {
  129.                                                                         sec -= 1;
  130.                                                                 }
  131.                                                         }
  132.                                                         break;
  133.                                                 case 0xef:
  134.                                                         //exchang
  135.                                                         t = sc1;
  136.                                                         sc1 = sc2;
  137.                                                         sc2 = t;
  138.                                                         break;
  139.                                         }
  140.                                 }
  141.                                 else
  142.                                 {
  143.                                         key_val = 0;  //还原默认值
  144.                                         key_flag = 0;  //还原默认值
  145.                                         key_count = 0;
  146.                                 }
  147.                         }
  148.                         
  149.                 }
  150.                 else
  151.                 {
  152.                         key_val = P1;  //保存按键的值
  153.                         key_flag = 1;  //检测到了按键
  154.                 }
  155.         }
  156.         else
  157.         {
  158.                 key_val = 0;  //还原默认值
  159.                 key_flag = 0;  //还原默认值
  160.                 key_count = 0;
  161.         }
  162.         
  163. }



  164. void exint0() interrupt 0                //中断服务函数的书写格式
  165. {
  166. //    if(IE0 == 1)                      //产生了外部中断,IE 自动置为1
  167.     {
  168.         if(status)
  169.                 {
  170.                         status = 0 ;  //切换到非比赛状态
  171.                         TR0 = 0   ;   //关闭定时器0
  172.                 }        
  173.                 else
  174.                 {
  175.                         status = 1 ;  //切换到非比赛状态
  176.                         TR0 = 1   ;   //启动定时器1
  177.                 }
  178.     }
  179. }


  180. char counter = 0;

  181. /******T0中断函数*******/  
  182. void Timer0()interrupt 1  
  183. {  
  184.     TH0=(65535-50000)/256;     //50ms中断一次  
  185.     TL0=(65535-50000)%256;  
  186.     counter++;  
  187.     while(counter>=20)  
  188.     {  
  189.         counter=0;
  190.                 if(sec == 0)
  191.                 {
  192.                         m --;
  193.                         sec = 60;
  194.                         if(m == 0)
  195.                         {
  196.                                 buz_flag = 1;    //报警标志设置
  197.                         }
  198.                 }
  199.         sec--;  
  200.     }  
  201. }  



  202. //led数码管显示,4个参数分别表示分钟秒钟,分数1和分数2
  203. void dispaly(char min,char sec,int sco1,int sco2)
  204. {
  205.         char buf[10];
  206.         char i;
  207.         
  208.         buf[0] = min/10%10;  //分钟的十位
  209.         buf[1] = min%10;     //分钟的各位
  210.         buf[2] = sec/10%10;  //秒钟的十位
  211.         buf[3] = sec%10;     //秒钟的各位        
  212.         buf[4] = sco1/100%10;  //分数1的百位
  213.         buf[5] = sco1/10%10;     //分数1的十位        
  214.         buf[6] = sco1%10;      //分数1的个位
  215.         buf[7] = sco2/100%10;  //分数2的百位
  216.         buf[8] = sco2/10%10;     //分数2的十位        
  217.         buf[9] = sco2%10;      //分数2的个位        
  218.         
  219.         for(i=0;i<8;i++)
  220.         {
  221.                 P0 = table[buf[i]];
  222.                 P2 = 1<<i;
  223.                 delay(1);
  224.                 P2 = 0;               
  225.         }
  226. ……………………

  227. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
4.bisaijifenqi.rar (31.68 KB, 下载次数: 23)
4.bisaijifenqi-1208.rar (25.22 KB, 下载次数: 19)
在单片机视频中的项目二部分,有源代码及完整的视频,谢谢大家,希望大家共同进步




评分

参与人数 1黑币 +5 收起 理由
a756312364 + 5

查看全部评分

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

使用道具 举报

沙发
ID:257065 发表于 2017-12-9 16:48 | 只看该作者
亲,你的工程文件用什么打开啊
回复

使用道具 举报

板凳
ID:257065 发表于 2017-12-9 22:35 | 只看该作者
打开就弹出这个窗口,百度不出来哪的问题

1.png (29.9 KB, 下载次数: 42)

1.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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