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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3016|回復: 12
打印 上一主題 下一主題
收起左側

單片機定時器程序問題

[復制鏈接]
跳轉到指定樓層
樓主
求教:定時器中這部分放在主函數中,程序不能正常運行。放在定時器函數中可以正常運行,請問是怎么回事?
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;
                        
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

13#
ID:688985 發表于 2020-2-11 15:59 | 只看該作者
感謝各位大師的指導
回復

使用道具 舉報

12#
ID:462827 發表于 2020-2-11 13:21 | 只看該作者
bai=temp/100;
shi=temp%100/10;
ge=temp%10;

這幾個可放在主函數中,其它的仍放在中斷里就行了。
回復

使用道具 舉報

11#
ID:213173 發表于 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;
    }                    
回復

使用道具 舉報

10#
ID:691354 發表于 2020-2-10 22:54 | 只看該作者
aa是定義的全局變量嗎?這個邏輯上是沒錯的,我以前也寫過類似程序
回復

使用道具 舉報

9#
ID:245004 發表于 2020-2-10 22:40 | 只看該作者
定時器時間短,中斷太頻繁了。一般這樣寫可以避免此類問題:



回復

使用道具 舉報

8#
ID:275826 發表于 2020-2-10 21:43 | 只看該作者
應該是全局與局部變量設置問題
回復

使用道具 舉報

7#
ID:688985 發表于 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;
}
回復

使用道具 舉報

6#
ID:515682 發表于 2020-2-10 20:42 | 只看該作者
不知道你這些變量是什么 類型的,后面的bai shi ge 每次都要做除法與取余運算,這些都是比較耗時間的。
放在主函數里的話,也許你沒算玩 aa已經加了好幾次了,所以你沒法切到aa==20

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



回復

使用道具 舉報

5#
ID:515682 發表于 2020-2-10 20:39 | 只看該作者
后面帶了除法與取余計算,不知道你的這些變量是什么型的。
回復

使用道具 舉報

地板
ID:515682 發表于 2020-2-10 20:38 | 只看該作者
2. 將 bai shi ge計算放到 temp++后面試試。
回復

使用道具 舉報

板凳
ID:515682 發表于 2020-2-10 20:37 | 只看該作者
1. 增加定時器定時長度測試一下
回復

使用道具 舉報

沙發
ID:332444 發表于 2020-2-10 19:58 | 只看該作者
從理論上來說描述的問題是不存在的,紅色部分正確的代碼放在主函數中一定是可以正常運行的,除非主函數中有其他的代碼影響了這段代碼的正確運行。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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