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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2690|回復: 12
收起左側

單片機定時器程序問題

[復制鏈接]
ID:688985 發表于 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;
                        
}

回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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



回復

使用道具 舉報

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;
}
回復

使用道具 舉報

ID:275826 發表于 2020-2-10 21:43 | 顯示全部樓層
應該是全局與局部變量設置問題
回復

使用道具 舉報

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


回復

使用道具 舉報

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

使用道具 舉報

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;
    }                    
回復

使用道具 舉報

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

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

使用道具 舉報

ID:688985 發表于 2020-2-11 15:59 | 顯示全部樓層
感謝各位大師的指導
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av第一页 | 精品欧美一区二区三区久久久 | 日韩在线视频一区 | 亚洲欧美在线观看 | 天天艹天天干天天 | 一区二区国产在线观看 | 欧美三级电影在线播放 | 亚洲电影第1页 | 成人免费一级视频 | 日本中出视频 | 精精精精xxxx免费视频 | 91久久| 久久久久国产 | 伊人免费在线观看 | 91玖玖| 国产精品免费在线 | 91久久国产精品 | 国精品一区二区 | 在线成人av| 九九热在线免费视频 | 91视频网| 在线观看中文字幕 | 久久亚洲欧美日韩精品专区 | 人人干免费| 在线观看国产视频 | 亚洲精品久久久一区二区三区 | 男人的天堂在线视频 | 春色av| 欧美一区二区小视频 | 国产一区二区自拍 | 国产精品美女一区二区三区 | 91中文视频 | 在线免费亚洲视频 | 成人h视频在线 | 一级毛片在线播放 | 亚洲欧美一区二区三区国产精品 | 国产福利在线视频 | 日本成人中文字幕 | 亚洲成人99 | 日韩中文字幕一区二区 | 一级黄色网页 |