这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 坤创E-Geek/天科大新电社 » 求助!利用计时器和数码管写的秒表,误差比较大

共4条 1/1 1 跳转至

求助!利用计时器和数码管写的秒表,误差比较大

工程师
2019-01-24 14:20:33     打赏
/*************************************************************************
首先祝大家在蓝桥杯比赛上能取得好成绩
以下代码为我利用手头上的开发板(QX-MCS51)写下的小程序
利用计时器计时,数码管显示来实现的计时秒表,但运行起来总会出错还找不到错误位置,求各位大神帮忙看一下
*************************************************************************/

#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
 
sbit DU = P2^6;
sbit WE = P2^7;
sbit S2 = P3^0;
u8 code SMGdu[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u8 code SMGwe[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 a,b,c,ms;

void SMGHS()   //数码管显示函数
{
 static u8 wei;
 P0 = 0xff;
 WE = 1;
 P0 = SMGwe[wei];
 WE = 0;
 switch(wei)
 {
  case 0:DU = 1;P0 = SMGdu[a%10];DU = 0; break;
  case 1:DU = 1;P0 = SMGdu[a/10];DU = 0; break;
  case 2:DU = 1;P0 = 0x40;DU = 0; break;
  case 3:DU = 1;P0 = SMGdu[b%10];DU = 0; break;
  case 4:DU = 1;P0 = SMGdu[b/10];DU = 0; break;
  case 5:DU = 1;P0 = 0x40;DU = 0; break;
  case 6:DU = 1;P0 = SMGdu[c%10];DU = 0; break;
  case 7:DU = 1;P0 = SMGdu[c/10];DU = 0; break;
 }
 wei++;
 if(wei == 8)
  wei = 0;
}

void Delay_ms(u16 n)   //延时函数
{
 u8 j;
 while(n--)
  for(j=0;j<113;j++);
}

void time0init()   //计时器初始化函数
{
 EA = 1;
 ET0 = 1;
 TR0 = 1;
 TMOD = 0x01;
 TH0 = 0xf8;
 TL0 = 0xcc;    //放入计时初值(2ms)
}

void main()
{
 time0init();   //调用初始化函数
 while(1)
 { 
  if(ms == 5)
  {
ABC:
   ms = 0;
   a++;       //a为10ms位
   if(a == 100)
   {
    a = 0;
    b++;      //b为 s 位
    if(b == 60)
    {
     b = 0;
     c++;     //c为 min 位
     if(c == 60)
      c = 0;
    }
   }
  }
  if(S2 == 0)    //按下S2暂停计时
  {
   Delay_ms(10);
   if(S2 == 0)
   {
    while(S2 == 0);
    while(1)
    {
     if(S2 == 0)    //再次按下S2开始计时
     {
      Delay_ms(10);
      if(S2 == 0)
      {
       while(S2 == 0);
       goto ABC;
      }
     }
    }
   }
  }
 }
}
void timer0()interrupt 1
{
 TH0 = 0xf8;
 TL0 = 0xcc;  //重放初值
 ms++;
 SMGHS();
}





关键词: 蓝桥训练     程序     数码管     计时器    

高工
2019-01-24 18:35:05     打赏
2楼

如果想寻求各位大牛的帮助,建议在题目上加上求助二字。不然别人不知道你这个帖子是做什么的


菜鸟
2019-01-25 11:11:17     打赏
3楼

你错误到底在哪儿你应该说出来。

单单看你这程序,你想用按键停止计数,那么就应该用一个标志位来回切换,当标志位为0时,ET0 = 0,为1时,ET0 = 1。要想停止,就必须操作定时器。

另外我总觉得的你这个定时器设定的也有问题,你试验它能正常计数吗?


菜鸟
2019-01-25 15:39:55     打赏
4楼

你的按键确实没有问题,但是在后续多模块程序中弊端很大。

另外关于定时器可以使用STC—ISP提供的定时器计算器,那个很精准



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]