找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8976|回復(fù): 12
打印 上一主題 下一主題
收起左側(cè)

新手請(qǐng)教各位,為什么定時(shí)器時(shí)間不對(duì)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:217075 發(fā)表于 2017-7-4 13:40 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3;        //個(gè)位選通               
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;                          //千位選通打開(kāi)
        P0=table[qian];          //千位段選
        delayms(5);                  //延時(shí)
        qiwe=1;                          //千位選通關(guān)閉

        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;                          //設(shè)置定時(shí)器0和1為工作方式1
        TH0=(65536-45872)/256;//裝初值
        TL0=(65536-45872)%256;
        TH1=(65536-45872)/256;
        TL1=(65536-45872)%256;
        EA=1;                                   //開(kāi)總中斷
        ET0=1 ;                                   //開(kāi)定時(shí)器0中斷
        TR0=1;                                   // 啟動(dòng)定時(shí)器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í)函數(shù)約延時(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清零再計(jì)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清零再計(jì)20次
                num++;
                if(num==3600)                //數(shù)碼管計(jì)到3600后歸零
                        num=0;
                qian=num/1000;
                bai=num%1000/100        ; //把一個(gè)四位數(shù)送數(shù)碼管
                shi=num%1000%100/10;       
                ge=num%1000%100%10;               
        }       
}
       
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:217075 發(fā)表于 2017-7-4 13:47 | 只看該作者
搞了2天了,我不會(huì)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:164602 發(fā)表于 2017-7-4 16:59 | 只看該作者
你的程序,我在我的板子上試過(guò)了。
從計(jì)時(shí)來(lái)說(shuō),可能不是十分準(zhǔn),但效果還是在的。
計(jì)時(shí)一小時(shí),我等不了,我通過(guò)賦值3580,過(guò)20下,是真的清了零,再計(jì)時(shí)的。LED燈也在閃。
沒(méi)有問(wèn)題啊。
你只發(fā)出來(lái)程序,不知道你的目標(biāo)是什么,是否達(dá)到。
從標(biāo)題來(lái)說(shuō),你說(shuō)的時(shí)間不對(duì),是指準(zhǔn)確的時(shí)間嗎?那個(gè)是不容易調(diào)到百分之百的,因?yàn)槎〞r(shí)器中斷發(fā)生后,執(zhí)行了一些語(yǔ)句,那是要占時(shí)間的,當(dāng)然不準(zhǔn)了。
回復(fù)

使用道具 舉報(bào)

地板
ID:97438 發(fā)表于 2017-7-4 17:07 | 只看該作者
  if(num2=20)????這里錯(cuò)了
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2017-7-4 17:52 | 只看該作者
hsujinshan 發(fā)表于 2017-7-4 13:47
搞了2天了,我不會(huì)了

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit gewe=P1^3;        //個(gè)位選通               
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;                   //千位選通打開(kāi)
        P0=table[qian];          //千位段選
        delayms(2);               //延時(shí)
        qiwe=1;                   //千位選通關(guān)閉
       
        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;                          //設(shè)置定時(shí)器0和1為工作方式1
        TH0=(65536-45872)/256;//裝初值
        TL0=(65536-45872)%256;
//        TH1=(65536-45872)/256;
//        TL1=(65536-45872)%256;
        EA=1;                                   //開(kāi)總中斷
        ET0=1 ;                                   //開(kāi)定時(shí)器0中斷
        TR0=1;                                   // 啟動(dòng)定時(shí)器0
//        ET1=1;                                   
//        TR1=1;                                   
        while(1)
        {
                qian=table[num/1000];
                bai=table[num%1000/100]; //把一個(gè)四位數(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í)函數(shù)約延時(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清零再計(jì)20次
                led1=~led1;
        }               
        if(num2>=20)                           //如果到了20次約為1秒
        {        
                num2=0;                           //把num2清零再計(jì)20次
                num++;
                if(num>=3600)                //數(shù)碼管計(jì)到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清零再計(jì)20次
                num++;
                if(num==3600)                //數(shù)碼管計(jì)到3600后歸零
                num=0;
                qian=num/1000;
                bai=num%1000/100        ; //把一個(gè)四位數(shù)送數(shù)碼管
                shi=num%1000%100/10;        
                ge=num%1000%100%10;               
        }        
}*/
回復(fù)

使用道具 舉報(bào)

7#
ID:7485 發(fā)表于 2017-7-4 20:55 | 只看該作者
(65536-45872)?是多少的晶振?
回復(fù)

使用道具 舉報(bào)

8#
ID:217075 發(fā)表于 2017-7-5 10:41 | 只看該作者
12M晶振
回復(fù)

使用道具 舉報(bào)

9#
ID:111634 發(fā)表于 2017-7-5 11:17 | 只看該作者
工作方式1需重裝定時(shí)常數(shù),就會(huì)產(chǎn)生誤差。工作方式2不需重裝定時(shí)常數(shù),不會(huì)產(chǎn)生誤差。
回復(fù)

使用道具 舉報(bào)

10#
ID:124330 發(fā)表于 2017-7-5 11:46 | 只看該作者
程序沒(méi)什么問(wèn)題,就是定時(shí)器1中斷的里面的判斷==你寫(xiě)成了賦值=
回復(fù)

使用道具 舉報(bào)

11#
ID:124330 發(fā)表于 2017-7-5 11:48 | 只看該作者
如果是12M晶振賦初值50000更精確一點(diǎn)
回復(fù)

使用道具 舉報(bào)

12#
ID:105206 發(fā)表于 2017-7-5 14:16 | 只看該作者
完全可以用1 個(gè)定時(shí)器就可以搞定的。
回復(fù)

使用道具 舉報(bào)

13#
ID:184970 發(fā)表于 2017-7-5 16:54 | 只看該作者
你現(xiàn)在算的這個(gè)是按11.0592M的晶振算的,12M的話(huà)直接-50000就可以了,相對(duì)會(huì)更準(zhǔn)一些
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表