欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機定時器程序問題 [打印本頁]

作者: xiaocui007    時間: 2020-2-10 19:08
標題: 單片機定時器程序問題
求教:定時器中這部分放在主函數中,程序不能正常運行。放在定時器函數中可以正常運行,請問是怎么回事?
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;  
                     if (aa==20)
                         { aa=0;        
                           
                          if(temp==100)
                                   temp=0;        
                                temp++;
                         }
                                
                        bai=temp/100;
                        shi=temp%100/10;
                        ge=temp%10;
                        
}


作者: xianfajushi    時間: 2020-2-10 19:58
從理論上來說描述的問題是不存在的,紅色部分正確的代碼放在主函數中一定是可以正常運行的,除非主函數中有其他的代碼影響了這段代碼的正確運行。
作者: 智多星520    時間: 2020-2-10 20:37
1. 增加定時器定時長度測試一下
作者: 智多星520    時間: 2020-2-10 20:38
2. 將 bai shi ge計算放到 temp++后面試試。
作者: 智多星520    時間: 2020-2-10 20:39
后面帶了除法與取余計算,不知道你的這些變量是什么型的。
作者: 智多星520    時間: 2020-2-10 20:42
不知道你這些變量是什么 類型的,后面的bai shi ge 每次都要做除法與取余運算,這些都是比較耗時間的。
放在主函數里的話,也許你沒算玩 aa已經加了好幾次了,所以你沒法切到aa==20

有3個方法可以測試
1. 加大定時器定時長度測試一下。
2. 將ge shi bai計算放到 temp++后面
3. 將aa==20改為 aa>=20




作者: xiaocui007    時間: 2020-2-10 21:21
這是我的程序:
#include<reg51.h>
//#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar temp,bai,shi,ge;
uint aa,time;
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void init();
sbit wela=P2^7;
sbit dula=P2^6;
void main()
{
        init();
        time=60;

         while(1)
        {
                               
               
                display(bai,shi,ge);
                                             

        }
                         
         
}                                          
       

void display(uchar bai,uchar shi,uchar ge)
{
                                        dula=1;
                                        P0=table[bai];
                                        dula=0;
                                        P0=0x00;   
                                        wela=1;
                                        P0=0xf7;
                                        wela=0;
                                    delay(time) ;

                                        dula=1;
                                        P0=table[shi];
                                        dula=0;
                                        P0=0x00;   
                                        wela=1;
                                        P0=0xef;
                                        wela=0;
                                        delay(time) ;
                                       
                                        dula=1;
                                        P0=table[ge];
                                        dula=0;
                                        P0=0x00;   
                                        wela=1;
                                        P0=0xdf;
                                        wela=0;
                                        delay(time) ;

                                       
}

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
        {
                for(y=110;y>0;y--);
        }       
}

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;  
                     if (aa==20)
                         { aa=0;       
                           
                          if(temp==100)
                                   temp=0;       
                                temp++;
                         }
                               
                        bai=temp/100;
                        shi=temp%100/10;
                        ge=temp%10;
                       
}

void init()
{
        temp=0;
        wela=0;
        dula=0;
        TMOD=0x01;//設置定時器0為工作方式1;
        TH0=(65536-50000)/256;//定時器高8位值;
        TL1=(65536-50000)%256;//定時器低8位值;
        EA=1;//開總中斷;
        ET0=1;//打開定時器0中斷;
        TR0=1;//啟動定時器0;
}
作者: tyrl800    時間: 2020-2-10 21:43
應該是全局與局部變量設置問題
作者: bh2030693    時間: 2020-2-10 22:40
定時器時間短,中斷太頻繁了。一般這樣寫可以避免此類問題:




作者: 尼古拉斯-趙四    時間: 2020-2-10 22:54
aa是定義的全局變量嗎?這個邏輯上是沒錯的,我以前也寫過類似程序
作者: wulin    時間: 2020-2-11 07:37
1.紅色部分代碼放在主函數中可能是因為主函數查詢aa周期大于中斷周期,前一次查詢aa<20,后一次查詢aa>20,aa不能及時清0而出錯。
2.如果在主函數中改變查詢條件 if (aa>=20),雖然不會出錯但有可能積累誤差而計時不準。
3.比較好的方案是添加一個標志,在主函數中查詢這個標志。
定義一個全局位變量
bit flag;

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        aa++;  
        if(aa==20)
        {
                aa=0;        
                flag=1;
        }
}
主函數中查詢
        if(flag==1)
        {
                flag=0;
                temp++;
                bai=temp/100;
                shi=temp%100/10;
                ge=temp%10;
    }                    

作者: hantu    時間: 2020-2-11 13:21
bai=temp/100;
shi=temp%100/10;
ge=temp%10;

這幾個可放在主函數中,其它的仍放在中斷里就行了。
作者: xiaocui007    時間: 2020-2-11 15:59
感謝各位大師的指導




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1