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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3044|回復(fù): 12
收起左側(cè)

單片機(jī)定時(shí)器程序問題

[復(fù)制鏈接]
ID:688985 發(fā)表于 2020-2-10 19:08 | 顯示全部樓層 |閱讀模式
求教:定時(shí)器中這部分放在主函數(shù)中,程序不能正常運(yùn)行。放在定時(shí)器函數(shù)中可以正常運(yùn)行,請問是怎么回事?
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;
                        
}

回復(fù)

使用道具 舉報(bào)

ID:332444 發(fā)表于 2020-2-10 19:58 | 顯示全部樓層
從理論上來說描述的問題是不存在的,紅色部分正確的代碼放在主函數(shù)中一定是可以正常運(yùn)行的,除非主函數(shù)中有其他的代碼影響了這段代碼的正確運(yùn)行。
回復(fù)

使用道具 舉報(bào)

ID:515682 發(fā)表于 2020-2-10 20:37 | 顯示全部樓層
1. 增加定時(shí)器定時(shí)長度測試一下
回復(fù)

使用道具 舉報(bào)

ID:515682 發(fā)表于 2020-2-10 20:38 | 顯示全部樓層
2. 將 bai shi ge計(jì)算放到 temp++后面試試。
回復(fù)

使用道具 舉報(bào)

ID:515682 發(fā)表于 2020-2-10 20:39 | 顯示全部樓層
后面帶了除法與取余計(jì)算,不知道你的這些變量是什么型的。
回復(fù)

使用道具 舉報(bào)

ID:515682 發(fā)表于 2020-2-10 20:42 | 顯示全部樓層
不知道你這些變量是什么 類型的,后面的bai shi ge 每次都要做除法與取余運(yùn)算,這些都是比較耗時(shí)間的。
放在主函數(shù)里的話,也許你沒算玩 aa已經(jīng)加了好幾次了,所以你沒法切到aa==20

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



回復(fù)

使用道具 舉報(bào)

ID:688985 發(fā)表于 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;//設(shè)置定時(shí)器0為工作方式1;
        TH0=(65536-50000)/256;//定時(shí)器高8位值;
        TL1=(65536-50000)%256;//定時(shí)器低8位值;
        EA=1;//開總中斷;
        ET0=1;//打開定時(shí)器0中斷;
        TR0=1;//啟動(dòng)定時(shí)器0;
}
回復(fù)

使用道具 舉報(bào)

ID:275826 發(fā)表于 2020-2-10 21:43 | 顯示全部樓層
應(yīng)該是全局與局部變量設(shè)置問題
回復(fù)

使用道具 舉報(bào)

ID:245004 發(fā)表于 2020-2-10 22:40 | 顯示全部樓層
定時(shí)器時(shí)間短,中斷太頻繁了。一般這樣寫可以避免此類問題:
批注 2020-02-10 223801.png


回復(fù)

使用道具 舉報(bào)

ID:691354 發(fā)表于 2020-2-10 22:54 | 顯示全部樓層
aa是定義的全局變量嗎?這個(gè)邏輯上是沒錯(cuò)的,我以前也寫過類似程序
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2020-2-11 07:37 | 顯示全部樓層
1.紅色部分代碼放在主函數(shù)中可能是因?yàn)橹骱瘮?shù)查詢aa周期大于中斷周期,前一次查詢aa<20,后一次查詢aa>20,aa不能及時(shí)清0而出錯(cuò)。
2.如果在主函數(shù)中改變查詢條件 if (aa>=20),雖然不會出錯(cuò)但有可能積累誤差而計(jì)時(shí)不準(zhǔn)。
3.比較好的方案是添加一個(gè)標(biāo)志,在主函數(shù)中查詢這個(gè)標(biāo)志。
定義一個(gè)全局位變量
bit flag;

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

使用道具 舉報(bào)

ID:462827 發(fā)表于 2020-2-11 13:21 | 顯示全部樓層
bai=temp/100;
shi=temp%100/10;
ge=temp%10;

這幾個(gè)可放在主函數(shù)中,其它的仍放在中斷里就行了。
回復(fù)

使用道具 舉報(bào)

ID:688985 發(fā)表于 2020-2-11 15:59 | 顯示全部樓層
感謝各位大師的指導(dǎo)
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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