久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 單片機(jī)兩個(gè)定時(shí)器一塊用,定時(shí)時(shí)間不準(zhǔn)確?附源程序 [打印本頁(yè)]

作者: stayalone838    時(shí)間: 2022-12-15 20:16
標(biāo)題: 單片機(jī)兩個(gè)定時(shí)器一塊用,定時(shí)時(shí)間不準(zhǔn)確?附源程序
問(wèn)題主要出在定時(shí)器0那里,里面所有定時(shí)操作都不準(zhǔn)確。我定時(shí)器賦的初值是為50ms準(zhǔn)備的,我想要定時(shí)500ms,按理說(shuō)進(jìn)入定時(shí)器中斷10次就可以定500ms了,可是實(shí)際我燒錄后,速度非常快,軟件調(diào)試發(fā)現(xiàn)根本不到500ms,只能把判斷條件改到進(jìn)入定時(shí)器中斷74次,調(diào)試才500ms...希望有知道的大佬解答一下。

以下是單片機(jī)代碼
#include <REGX52.H>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

#define SMG_A_DP_PORT P0
#define LED_PORT P2

u8 gsmg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x76,0x79,0x38,0x38,0x3f,0x40};

u16 NUM=432;
u8 bai,shi,ge,aa,bb,cc,t,times,flag,flag1;

void delay(u16 x)
{
        u16 y,z;
         for(y=0;y<x;y++)
                for(z=0;z<115;z++);
}

void smg_display()
{
        u8 i;
        if(flag1==1)
        {
                  cc=10;bb=11;aa=12;bai=13;shi=14;ge=15;
        }
        else
        {
                 cc=7;bb=6;aa=5;
        }
         for(i=0;i<6;i++)
        {
                 switch(i)
                {
                         case(0):LSA=0;LSB=0;LSC=0;SMG_A_DP_PORT=gsmg_code[ge];delay(1);break;
                        case(1):LSA=1;LSB=0;LSC=0;SMG_A_DP_PORT=gsmg_code[shi];delay(1);break;
                        case(2):LSA=0;LSB=1;LSC=0;SMG_A_DP_PORT=gsmg_code[bai];delay(1);break;
                        case(3):LSA=1;LSB=1;LSC=0;SMG_A_DP_PORT=gsmg_code[aa];delay(1);break;
                        case(4):LSA=0;LSB=0;LSC=1;SMG_A_DP_PORT=gsmg_code[bb];delay(1);break;
                        case(5):LSA=1;LSB=0;LSC=1;SMG_A_DP_PORT=gsmg_code[cc];delay(1);break;
                }
                P0=0x00;
        }
}

void timer0_init()
{
         TMOD=0x01;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void timer1_init()
{
         TMOD=0x10;
        TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        EA=1;
        ET1=1;
        TR1=1;
}

void main()
{
        timer0_init();
         timer1_init();

        while(1)
        {
                 smg_display();
        }
}

void timer0() interrupt 1
{
        u8 i,u;
         TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        t++;
        if(flag!=1)//控制LED流水燈
        {
                if(t==74)//要定時(shí)0.5秒,可是正確的數(shù)字無(wú)法達(dá)到...
                {
                         t=0;
                        if(i<8)
                        {
                                 LED_PORT=_crol_(0xfe,i);
                                i++;
                        }
                        if(i>7)
                        {
                                 LED_PORT=_cror_(0x7f,u);
                                u++;
                        }
                        if(u==7)
                        {
                                i=0;
                                u=0;
                        }
                }
        }
        else//控制LED閃爍
        {
                 if(t%20==0)
                {
                         LED_PORT=0x00;
                        delay(500);
                        LED_PORT=0xff;
                }
                if(t==60)
                {
                         TR0=0;//關(guān)閉定時(shí)器0
                        LED_PORT=0xff;
                        flag1=1;//控制顯示字母
                }
        }         
}

void timer1() interrupt 3
{
         TH1=(65535-50000)/256;
        TL1=(65535-50000)%256;
        times++;
        if(times==2)
        {
                times=0;
                 NUM--;
                bai=NUM/100;
                shi=NUM/100/10;
                ge=NUM%10;
        }
        if(NUM==398)//NUM=398時(shí),流水燈停止
        {
                 TR0=0;
                LED_PORT=0xff;
                TH0=(65535-50000)/256;
                TL0=(65535-50000)%256;
                t=0;
                TR0=1;//再次打開(kāi)定時(shí)器0
                flag=1;//定時(shí)器0 else條件成立,LED閃爍
                TR1=0;//關(guān)閉定時(shí)器1保持字母數(shù)據(jù)顯示
        }
}


作者: wpppmlah    時(shí)間: 2022-12-15 22:08
請(qǐng)問(wèn)你是根據(jù)所使用的晶振來(lái)計(jì)算定時(shí)器時(shí)間的嗎?

作者: wulin    時(shí)間: 2022-12-16 07:20
定時(shí)器精度誤差是由晶振頻率誤差和代碼編寫(xiě)合理共同確定的。樓主選用的晶振頻率與代碼是否相適應(yīng)不得而知,但開(kāi)兩個(gè)相同定時(shí)時(shí)間的中斷肯定是不當(dāng)?shù)模⑶疫在T1中斷中操作T0。
作者: lkc8210    時(shí)間: 2022-12-16 07:56
因?yàn)槟愕腡MOD用了"="來(lái)設(shè)定
定時(shí)器1的設(shè)定覆蓋了定時(shí)器0
令定時(shí)器0變?yōu)?3位定時(shí)器
作者: wufa1986    時(shí)間: 2022-12-16 08:05
新手常犯毛病,老手都是用&|操作來(lái)修改寄存器
作者: yueguang3048    時(shí)間: 2022-12-16 09:24
wufa1986 發(fā)表于 2022-12-16 08:05
新手常犯毛病,老手都是用&|操作來(lái)修改寄存器

一語(yǔ)中的
作者: lmn2005    時(shí)間: 2022-12-16 10:43
中斷程序盡量不要運(yùn)行太多太復(fù)雜的代碼。
作者: wulin    時(shí)間: 2022-12-16 12:36
地板指出的錯(cuò)誤是其定時(shí)時(shí)間超快的主要問(wèn)題!
作者: ningsy    時(shí)間: 2022-12-16 16:45
第一,設(shè)置定時(shí)器的代碼盡量從STC-ISP(定時(shí)器計(jì)算器)里復(fù)制,不容易出錯(cuò);

第二,中斷函數(shù)里執(zhí)行代碼不能太多了。我前兩天也遇到了類(lèi)似問(wèn)題,代碼放在中斷函數(shù)里運(yùn)行速度超慢,后來(lái)移到main()里,只在中斷函數(shù)里放時(shí)間標(biāo)志位,就正常了。
作者: coody_sz    時(shí)間: 2022-12-16 21:41
如果定時(shí)器使用自動(dòng)重裝,則中斷一定會(huì)準(zhǔn)確(精度與主頻一致),問(wèn)題是你的程序要及時(shí)響應(yīng)。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品视频一区二区三区, | 国产精品爱久久久久久久 | 有码一区 | av一区在线观看 | 日韩aⅴ在线观看 | 一级黄在线观看 | 福利精品| 午夜影院在线观看免费 | 久久国产日本 | 777zyz色资源站在线观看 | 日韩一区二区在线视频 | 免费国产视频在线观看 | 亚洲最新网址 | 欧美日韩大陆 | 婷婷综合网 | 日本成年免费网站 | 午夜视频在线 | 亚洲视频一区在线观看 | av香蕉| 日韩精品一区二区三区第95 | 国产免费视频 | 日韩视频在线一区 | 日本福利一区 | 99爱视频 | 成人免费网站 | 欧美日韩亚洲国产 | 国产精品亚洲综合 | 久久伊人免费视频 | 日本黄视频在线观看 | 中文字幕成人在线 | 欧美日本韩国一区二区三区 | 久久香蕉网 | 成人永久免费视频 | 五月激情六月婷婷 | 日日天天 | 在线成人av | 乱码av午夜噜噜噜噜动漫 | 精品丝袜在线 | 福利网址 | 91在线成人 | 天天爽夜夜爽精品视频婷婷 |