找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1805|回复: 2
收起左侧

单片机秒表程序

[复制链接]
ID:512872 发表于 2019-10-3 10:43 | 显示全部楼层 |阅读模式
秒表,计数单位分秒,可实现暂停,开始
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit S1=P1^0;  //流水灯顺时针流水
  6. sbit S2=P1^1;  //流水灯逆时针
  7. uchar code discode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};        //送段码0-9和"-"
  8. uchar disbitcode[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  9. uchar disbuf[8]={0,0,10,0,0,10,0,0};
  10. uchar disbuf1[8]={0,0,10,0,0,10,0,0};                                                      //显示缓冲区
  11. uchar cent,fensecond,second,minite;       
  12. /*函数申明*/
  13. void display(void);                       
  14. void ini(void);
  15. void t0(void);

  16. /*************延时程序**************/                                                                                         
  17. void delay(uint m)                 
  18.   {
  19.           while(--m);
  20.   }

  21. /*************初始化程序**************/
  22. void ini(void)                               
  23.          {
  24.                      TMOD=0x01;
  25.                   TH0=0XEC;
  26.                   TL0=0X78;
  27.                   ET0=1;
  28.                   EA=1;
  29.          }
  30. void zd (void)                               
  31.          {          
  32.            uchar i;
  33.         disbuf1[0]=disbuf[0];
  34.         disbuf1[1]=disbuf[1];
  35.         disbuf1[3]=disbuf[3];
  36.         disbuf1[4]=disbuf[4];
  37.         disbuf1[6]=disbuf[6];
  38.         disbuf1[7]=disbuf[7];               
  39.           for(i=0;i<8;i++)
  40.          {
  41.                 P0=discode[disbuf1[i]];
  42.                 P2=disbitcode[i];
  43.                 delay(100);       
  44.          }
  45.         }
  46. void shuma()
  47. {  
  48.            while((S1==1)&&(S2==1))
  49.         {
  50.         P0=0X8C;
  51.         P2=0X01;
  52.         }
  53. }
  54. /*************显示程序**************/
  55. void display(void)                  
  56.   {
  57.           uchar i;
  58.           for(i=0;i<8;i++)
  59.          {
  60.                 P0=discode[disbuf[i]];
  61.                 P2=disbitcode[i];
  62.                 delay(100);       
  63.         }
  64.   }
  65. /*************中断程序**************/
  66. void t0(void) interrupt 1 using 0     //用第0组寄存器
  67.          {
  68.                   cent++;
  69.                  if(cent==17)
  70.                 {
  71.                            cent=0;
  72.                            fensecond++;
  73.                            if(fensecond==60)
  74.                         {
  75.                                           fensecond=0;
  76.                                           second++;

  77.                                  if(second==60)
  78.                                 {
  79.                                           second=0;
  80.                                           minite++;
  81.                                                    
  82.                                         if(minite==60)
  83.                                         {
  84.                                                 minite=0;
  85.                                         }
  86.                                 }
  87.                          }
  88.                                 disbuf[0]=fensecond%10;  //更新显示缓冲区
  89.                             disbuf[1]=fensecond/10;
  90.                                 disbuf[3]=second%10;
  91.                                 disbuf[4]=second/10;
  92.                                   disbuf[6]=minite%10;       
  93.                                 disbuf[7]=minite/10;                  
  94.                 }

  95.                   TH0=0xFC;
  96.                   TL0=0x18;
  97.          }
  98.          
  99. void main(void)
  100. {                                                                                           
  101.          uchar i,j;
  102.          ini();
  103.          shuma();
  104.        
  105.          while(1)
  106.   {          
  107.       i=S1;  
  108.           j=S2;
  109.          while((i==0)&(j==1))        //按键1去抖以及动作
  110.    {
  111.       delay(10);
  112.           j=S2;
  113.       if((i==0)&(j==1))
  114.      {         
  115.         P3=0xff;                                       
  116.                  P2=0x00;
  117.                   TR0=1;
  118.                   display();
  119.                   TR0=0;   
  120.      }
  121.   }
  122.       i=S1;
  123.     while((j==0)&(i==1))        //按键1去抖以及动作
  124.    {
  125.        i=S1;
  126.       delay(10);
  127.       if((j==0)&(i==1))
  128.      {         
  129.                 P3=0xff;                                       
  130.                   zd();  
  131.      }
  132.   }
  133. }      
  134. }                       
复制代码


秒表.zip

24.02 KB, 下载次数: 7, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2019-10-3 15:17 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:512872 发表于 2019-10-3 15:59 | 显示全部楼层
代码注释需要吗
W$IEFLDAK8E4810PPTH$IPM.png

三合一(3).pdf

1.25 MB, 下载次数: 3, 下载积分: 黑币 -5

原理图

pcb3.~(1).pcbdoc.Zip

14.43 MB, 下载次数: 3, 下载积分: 黑币 -5

pcb图

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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