求助!!关于51单片机定时器

[复制链接]
 楼主| lin168335255 发表于 2011-11-10 20:52 | 显示全部楼层 |阅读模式
#include<reg52.h>
sbit latch1=P2^1;
sbit latch2=P2^2;
void delay(unsigned int t);
unsigned char weima[8]=
{0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char duanma[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char LED[]={0xcf,0xf3,0xfc,0xf3};
unsigned char tempdata[10];
void delay(unsigned int t);
void display(unsigned char firstbite,unsigned char num);
main(void)
{
unsigned int m=30,n,i=0;
P1=0xcf;
TMOD=0x10;
TH1=0x3c;      
  TL1=0xb0;         
  TR1=1;
while(1)
{
  if(TF1==1)
   {
    TF1=0;
    n++;
    TH1=0x3c;      
     TL1=0xb0;   
    if(n==20)
    {
     n=0;
     if(m>0) m--;
     if(m==0)
     {
         i++;
      P1=LED[i];
      if(i==3)i=0;
         m=30;
     }
   
     }
   }
    tempdata[0]=duanma[m/10];
   tempdata[1]=duanma[m%10];
    display(3,2);   
}
}
  void delay(unsigned int t)
{
while(t--);
}
void display(unsigned char firstbite,unsigned char num)
{
unsigned int i;
for(i=0;i<num;i++)
{
  P0=0;
  latch2=1;
  latch2=0;
  P0=weima[i+firstbite];
  latch1=1;
  latch1=0;
  P0=tempdata[i];
  latch2=1;
  latch2=0;
     delay(200);
}
}
这个程序的定时不准 我本来定的间隔是1s 结果运行时是1.04s左右,通过改初值也无法精确到一秒,总会多或少0.0几秒,请高手给看看是怎么回事?晶振是12MHZ的  谢谢
NE5532 发表于 2011-11-10 21:23 | 显示全部楼层
我看到一大堆跟定时器不相干的代码,先删干净了再来。
ayb_ice 发表于 2011-11-11 08:07 | 显示全部楼层
本帖最后由 ayb_ice 于 2011-11-11 11:04 编辑

//------------
// t0.c

void isr_t0(void) interrupt 1
{
    extern void reload_t0(void);
   
    reload_t0();
   
    other()....
}

//------------
// t0.asm
//---------------------------------------
// 系统定时器0初值重装载
//---------------------------------------
// void reload_t0(void);
    ?PR?reload_t0?SYSTEM SEGMENT CODE
    rseg    ?PR?reload_t0?SYSTEM
    $reguse reload_t0(a,psw)
    public  reload_t0
    T0_RELOAD   EQU     -1250   // 1.25MS*8=10MS
reload_t0:
        setb   c
        jbc     ea,$+3+1
        clr      c
        push    psw
        CLR     TR0
        MOV     A,TL0
        ADD     A,#LOW (T0_RELOAD + 7)
        MOV     TL0,A
        MOV     A,TH0
        ADDC    A,#HIGH (T0_RELOAD + 7)
        MOV     TH0,A
        SETB    TR0
        pop     psw
        mov     ea,c
        ret
chenczy 发表于 2011-11-11 11:10 | 显示全部楼层
在网上随便就能找到个定时器程序,对比一下就知道问题在那了
冷血疯子鱼 发表于 2011-11-11 16:34 | 显示全部楼层
仿真时调试一下,装载时有时会这样,因为定时是一个累加的过程,个人见解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部