找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8851|回復: 12
收起左側

新手請教各位,為什么定時器時間不對?

[復制鏈接]
ID:217075 發(fā)表于 2017-7-4 13:40 | 顯示全部樓層 |閱讀模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3;        //個位選通               
sbit shwe=P1^2;
sbit bawe=P1^1;
sbit qiwe=P1^0;
sbit led1=P2^0;         //二極管
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
                                        0x92,0x82,0xf8,0x80,0x90};
void delayms(uint);
void display1(uchar,uchar);
void dispiay2(uchar,uchar);
uchar num1,num2,qian,bai,shi,ge;
uint num;

void display1(uchar qian,uchar bai)
{
        qiwe=0;                          //千位選通打開
        P0=table[qian];          //千位段選
        delayms(5);                  //延時
        qiwe=1;                          //千位選通關閉

        bawe=0;
        P0=table[bai];
        delayms(5);
        bawe=1;
}

void display2(uchar shi,uchar ge)
{
        shwe=0;
        P0=table[shi];
        delayms(5);
        shwe=1;

        gewe=0;
        P0=table[ge];
        delayms(5);
        gewe=1;       
}
void main()
{
        TMOD=0x11;                          //設置定時器0和1為工作方式1
        TH0=(65536-45872)/256;//裝初值
        TL0=(65536-45872)%256;
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        EA=1;                                   //開總中斷
        ET0=1 ;                                   //開定時器0中斷
        TR0=1;                                   // 啟動定時器0
        ET1=1;                                  
        TR1=1;                                  
        while(1)
        {
                display2(shi,ge);
                display1(qian,bai);
        }
}

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)                //延時函數(shù)約延時xms
                for(j=110;j>0;j--);
}

void TO_time() interrupt 1
{
        TH0=(65536-45872)/256;        //重裝初值
        TL0=(65536-45872)%256;
        num1++;
        if(num1==4)                                //到了4次=200ms
        {
                num1=0;                                //把num1清零再計20次
                led1=~led1;
        }               
}

void T1_time() interrupt 3
{
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        num2++;
        if(num2=20)                           //如果到了20次約為1秒
        {       
                num2=0;                           //把num2清零再計20次
                num++;
                if(num==3600)                //數(shù)碼管計到3600后歸零
                        num=0;
                qian=num/1000;
                bai=num%1000/100        ; //把一個四位數(shù)送數(shù)碼管
                shi=num%1000%100/10;       
                ge=num%1000%100%10;               
        }       
}
       
回復

使用道具 舉報

ID:217075 發(fā)表于 2017-7-4 13:47 | 顯示全部樓層
搞了2天了,我不會了
回復

使用道具 舉報

ID:164602 發(fā)表于 2017-7-4 16:59 | 顯示全部樓層
你的程序,我在我的板子上試過了。
從計時來說,可能不是十分準,但效果還是在的。
計時一小時,我等不了,我通過賦值3580,過20下,是真的清了零,再計時的。LED燈也在閃。
沒有問題啊。
你只發(fā)出來程序,不知道你的目標是什么,是否達到。
從標題來說,你說的時間不對,是指準確的時間嗎?那個是不容易調到百分之百的,因為定時器中斷發(fā)生后,執(zhí)行了一些語句,那是要占時間的,當然不準了。
回復

使用道具 舉報

ID:97438 發(fā)表于 2017-7-4 17:07 | 顯示全部樓層
  if(num2=20)????這里錯了
回復

使用道具 舉報

ID:213173 發(fā)表于 2017-7-4 17:28 | 顯示全部樓層
   if(num2=20)  //如果到了20次約為1秒....少一個=。 if(num2==20)
只要用一個定時器就可以完成,不必開T1。
void TO_time() interrupt 1
{
        TH0=(65536-45872)/256;        //重裝初值
        TL0=(65536-45872)%256;
        num1++;
        num2++;
        if(num1>=4)                                //到了4次=200ms
        {
                num1=0;                                //把num1清零再計20次
                led1=~led1;
        }               
        if(num2>=20)                           //如果到了20次約為1秒
        {        
                num2=0;                           //把num2清零再計20次
                num++;
                if(num>=3600)                //數(shù)碼管計到3600后歸零
                num=0;
                qian=num/1000;
                bai=num%1000/100; //把一個四位數(shù)送數(shù)碼管
                shi=num%1000%100/10;        
                ge=num%1000%100%10;               
        }        
}
兩個顯示程序也可以合并在一起
回復

使用道具 舉報

ID:213173 發(fā)表于 2017-7-4 17:52 | 顯示全部樓層
hsujinshan 發(fā)表于 2017-7-4 13:47
搞了2天了,我不會了

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3;        //個位選通               
sbit shwe=P1^2;
sbit bawe=P1^1;
sbit qiwe=P1^0;
sbit led1=P2^0;         //二極管
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
                   0x92,0x82,0xf8,0x80,0x90};
void delayms(uint);
void display1(uchar,uchar,uchar,uchar);
//void dispiay2(uchar,uchar);
uchar num1,num2,qian,bai,shi,ge;
uint num;

void display1(uchar qian,uchar bai,uchar shi,uchar ge)
{
        qiwe=0;                   //千位選通打開
        P0=table[qian];          //千位段選
        delayms(2);               //延時
        qiwe=1;                   //千位選通關閉
       
        bawe=0;
        P0=table[bai];
        delayms(2);
        bawe=1;

        shwe=0;
        P0=table[shi];
        delayms(2);
        shwe=1;
       
        gewe=0;
        P0=table[ge];
        delayms(2);
        gewe=1;        
}

void main()
{
        TMOD=0x01;                          //設置定時器0和1為工作方式1
        TH0=(65536-45872)/256;//裝初值
        TL0=(65536-45872)%256;
//        TH1=(65536-45872)/256;
//        TL1=(65536-45872)%256;
        EA=1;                                   //開總中斷
        ET0=1 ;                                   //開定時器0中斷
        TR0=1;                                   // 啟動定時器0
//        ET1=1;                                   
//        TR1=1;                                   
        while(1)
        {
                qian=table[num/1000];
                bai=table[num%1000/100]; //把一個四位數(shù)送數(shù)碼管
                shi=table[num%1000%100/10];        
                ge=table[num%1000%100%10];               
//                display2(shi,ge);
                display1(qian,bai,shi,ge);
        }
}

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)                //延時函數(shù)約延時xms
                for(j=110;j>0;j--);
}

void TO_time() interrupt 1
{
        TH0=(65536-45872)/256;        //重裝初值
        TL0=(65536-45872)%256;
        num1++;
        num2++;
        if(num1>=4)                                //到了4次=200ms
        {
                num1=0;                                //把num1清零再計20次
                led1=~led1;
        }               
        if(num2>=20)                           //如果到了20次約為1秒
        {        
                num2=0;                           //把num2清零再計20次
                num++;
                if(num>=3600)                //數(shù)碼管計到3600后歸零
                        num=0;
        }        
}
/*
void T1_time() interrupt 3
{
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        num2++;
        if(num2=20)                           //如果到了20次約為1秒
        {        
                num2=0;                           //把num2清零再計20次
                num++;
                if(num==3600)                //數(shù)碼管計到3600后歸零
                num=0;
                qian=num/1000;
                bai=num%1000/100        ; //把一個四位數(shù)送數(shù)碼管
                shi=num%1000%100/10;        
                ge=num%1000%100%10;               
        }        
}*/
回復

使用道具 舉報

ID:7485 發(fā)表于 2017-7-4 20:55 | 顯示全部樓層
(65536-45872)?是多少的晶振?
回復

使用道具 舉報

ID:217075 發(fā)表于 2017-7-5 10:41 | 顯示全部樓層
12M晶振
回復

使用道具 舉報

ID:111634 發(fā)表于 2017-7-5 11:17 | 顯示全部樓層
工作方式1需重裝定時常數(shù),就會產生誤差。工作方式2不需重裝定時常數(shù),不會產生誤差。
回復

使用道具 舉報

ID:124330 發(fā)表于 2017-7-5 11:46 | 顯示全部樓層
程序沒什么問題,就是定時器1中斷的里面的判斷==你寫成了賦值=
回復

使用道具 舉報

ID:124330 發(fā)表于 2017-7-5 11:48 | 顯示全部樓層
如果是12M晶振賦初值50000更精確一點
回復

使用道具 舉報

ID:105206 發(fā)表于 2017-7-5 14:16 | 顯示全部樓層
完全可以用1 個定時器就可以搞定的。
回復

使用道具 舉報

ID:184970 發(fā)表于 2017-7-5 16:54 | 顯示全部樓層
你現(xiàn)在算的這個是按11.0592M的晶振算的,12M的話直接-50000就可以了,相對會更準一些
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表