m0_46257320 2020-06-19 10:43 采纳率: 0%
浏览 242

未使用中断的定时器会出现不准确的问题吗?

大家好,定时器定时1ms,然后累积到1000次,秒数加一,构成一个动态数码管显示的秒表,我没有使用到中断。但是,下载到学习板上,间隔的时间远大于1s,这是为什么呢?
#include

typedef unsigned char u8;
typedef unsigned int u16;

#define GPIO_LED P0

sbit LSA = P2^4;
sbit LSB = P2^5;
sbit LSC = P2^6;

u8 code smgduan[16]=
{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
u8 LEDduan[8]=
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

void delay(u8 i)
{
while(i--);
}

void display()
{
u8 i = 0;
for(i=0; i<8; i++)
{
switch(i)
{
case(0): LSA = 0; LSB = 0; LSC = 0; break;
case(1): LSA = 1; LSB = 0; LSC = 0; break;
case(2): LSA = 0; LSB = 1; LSC = 0; break;
case(3): LSA = 1; LSB = 1; LSC = 0; break;
case(4): LSA = 0; LSB = 0; LSC = 1; break;
case(5): LSA = 1; LSB = 0; LSC = 1; break;
case(6): LSA = 0; LSB = 1; LSC = 1; break;
case(7): LSA = 1; LSB = 1; LSC = 1; break;
}
GPIO_LED = LEDduan[i];
delay(100);
GPIO_LED = 0x00;
}
}

void main()
{
u16 cnt = 0;
u16 num = 0;
TMOD |= 0x01;
TH0 = 0xFC;
TL0 = 0x18;//定时器定时1ms
TR0 = 1;
while(1)
{
if(TF0 == 1)
{
TH0 = 0xFC;
TL0 = 0x18;
TF0 = 0;
cnt++;
if(cnt == 1000)
{
cnt = 0;
num++;
}
}
LEDduan[0] = smgduan[num/10000000%10];
LEDduan[1] = smgduan[num/1000000%10];
LEDduan[2] = smgduan[num/100000%10];
LEDduan[3] = smgduan[num/10000%10];
LEDduan[4] = smgduan[num/1000%10];
LEDduan[5] = smgduan[num/100%10];
LEDduan[6] = smgduan[num/10%10];
LEDduan[7] = smgduan[num/1%10];
display();
}
}

  • 写回答

1条回答 默认 最新

  • 人在旅途QvQ 2020-06-19 11:01
    关注

    代码段比较少,我说一下我的怀疑点。
    1. 下面代码1ms执行一次,从代码量上和计算除法上认为,比较消耗执行时间。你可以把这部分临时去除,看看有没有关系。

            LEDduan[0] = smgduan[num / 10000000 % 10];
            LEDduan[1] = smgduan[num / 1000000 % 10];
            LEDduan[2] = smgduan[num / 100000 % 10];
            LEDduan[3] = smgduan[num / 10000 % 10];
            LEDduan[4] = smgduan[num / 1000 % 10];
            LEDduan[5] = smgduan[num / 100 % 10];
            LEDduan[6] = smgduan[num / 10 % 10];
            LEDduan[7] = smgduan[num / 1 % 10];
            display();
    
    1. 如果问题一的处理时间长,下面TF0 == 1,可能在判断之前就满足了。你把定时设定长一些,读取TF0看看时间。
        while (1)
        {
            if (TF0 == 1)
            {
    
    1. 不使用中断的话,如果是单片机,可以使用指令数量做时间,我觉得也还算准确。项目中常用晶振实现。
    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?