登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 带有计次功能的秒表

[复制链接]
发表于 2019-2-2 22:17:53 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 数码管动态刷新
中断,定时器
按键的扫描和消抖
学习安排: 通过最近学习的把在学校没做成功的带有计次功能的秒表做出来
开始时间: 2019-01-31
结束时间: 2019-02-02
在学校做出来有暂停功能的秒表之后,和手机秒表做精确度实验时,看见手机秒表里有计次功能,就想做出来带有计次功能的秒表,当时做好之后,计次的值并不是自己实际记下的,程序也不错,当时很困惑,这几天把定时器和按键的又练了练,还是没找到为啥,今天把头文件改成STC12C5A60S2之后编译,出现的一条错误,
“'DATA': SEGMENT TOO LARGE
“  原来是当时建的用来储存计次数据的数组太大了,超过了这个单片机的RAM,在学校的时候还不知道怎么添加宏晶的单片机,当时用的那个型号可能RAM比较大,keil没检查出来错误。

看主程序
void main()
{
   unsigned long sec = 0;
    bit backup = 1;   //按键值备份,保存前一次的扫描值
   bit backup4 = 1;
   bit backup12 = 1;
    char  times = 0;  //按键计数,记录按键按下的次数
   
    EA = 1;       //使能总中断
    ENLED = 0;    //使能数码管进行显示
    TMOD = 0x11;  //设置T0,T1均为模式1
    ET0  = 1;     //使能T0中断
   ET1  = 1;     //使能T1中断
    TR0  = 1;     //启动T0
   TR1  = 1;     //启用T1
    p23 = 0;      //启用K4 K12 K16

    while (1)
    {
          if(flag1s == 1)    //时间增加0.00999s
           {
           flag1s = 0;
           sec++;            //计时时间增加0.01s
      }
       if(jici == 0&&h<15)     //启用计次
       {
        jicihuancunqu[h]=sec;//记下当前时间
         h++;
         jici =~jici;   
       }
       if(jici == 0&&h == 15)
       {
        jicihuancunqu[14]=sec;//保留最后一个计次数据
        jici =~jici;
       }
               if(menu ==0)    //显示当前时间
        {         
           LedBuff[0] = LedChar[sec%10];
           LedBuff[1] = LedChar[sec/10%10];
            LedBuff[2] = daidianLedChar[sec/100%60%10];//秒位
            LedBuff[3] = LedChar[sec/100%60/10%10];
           LedBuff[4] = daidianLedChar[sec/6000%10];//分钟位
            LedBuff[5] = LedChar[sec/60000%10];
        }
        else if(1 == menu)//显示计次时间
        {
       LedBuff[0] = LedChar[jicihuancunqu[k]%10];
           LedBuff[1] = LedChar[jicihuancunqu[k]/10%10];
            LedBuff[2] = daidianLedChar[jicihuancunqu[k]/100%60%10];//秒位
            LedBuff[3] = LedChar[jicihuancunqu[k]/100%60/10%10];
           LedBuff[4] = daidianLedChar[jicihuancunqu[k]/6000%10];//分钟位
       if (jicihuancunqu[k]<59900)
            LedBuff[5] = LedChar[k+1];//表示第几次记的时间
       else LedBuff[5] = LedChar[jicihuancunqu[k]/60000%10];//大于10分钟显示时间
        }
         
     if (KeySta4 != backup4)  //判断计次按键是否按下
        {
            if (backup4 == 0)  
      {
       if(0 == menu)
        jici =~jici;
       else
       {
        k++;
        if (k>14)
         k = 0;
       }
      }
            backup4 = KeySta4;
        }
   
    if (KeySta12 != backup12)  //判断模式按键是否按下
        {
            if (backup12 == 0)  
      {
       menu = ~menu;
      }
            backup12 = KeySta12;
        }
   
        if (KeySta != backup)  //判断暂停/启动按键是否按下
        {
            if (backup == 0)  //完成 奇数  次按下,时间暂停
      {
       cntkey=~cntkey;
       buzzer = 0;//蜂鸣器响
       for(j=0;j<40000;j++);
       buzzer = 1;
      }
            backup = KeySta;  //更新备份为当前值,以备进行下次比较
        }
   
}
}

中断2.png
中断0.png
说明及相关定义.png
精确度测试.png

秒表演示视频.zip

1.89 MB, 下载次数: 458

添加STC头文件到KEIL中并建立第一个工程.pdf

1.28 MB, 下载次数: 478

好懒~~不想说~~~
发表于 2019-2-17 22:29:27 | 显示全部楼层
1.png
进入设置,把红框处改成large模式可以缓解空间不够的情况,
但是如果程序应用于仿真中时,仿真中需要打开外部存储,才能正常运行程序。
Carpe.Diem.
 楼主| 发表于 2019-2-19 18:30:03 来自手机 | 显示全部楼层
如果让他嘎斯 发表于 2019-2-17 22:29
进入设置,把红框处改成large模式可以缓解空间不够的情况,
但是如果程序应用于仿真中时,仿真中需要打 ...

好的,挺好用的,感谢分享。
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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