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

標題: 這是單片機中斷優(yōu)先級造成的嗎? [打印本頁]

作者: wtm_lxy    時間: 2019-3-18 13:26
標題: 這是單片機中斷優(yōu)先級造成的嗎?
本帖最后由 wtm_lxy 于 2019-3-19 08:35 編輯

我做采集模擬電壓控制指示燈的效果:
temp是采集到的模擬電壓值,tv是保存的臨時值。
我想實現(xiàn)的效果是:
當temp<=800時打開計數(shù)器1,同時保留當前的temp值;當計時3秒后,比較當前temp值與前面保存值的差值。

從反應效果看,count一直沒有值,好像是終端1沒有執(zhí)行
是不是優(yōu)先級導致它沒有執(zhí)行?
這個該怎么辦?

下面是完整的單片機程序代碼:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //段選
sbit CLK=P1^3;   //ADC0808的控制端口
sbit ST=P1^2;
sbit EOC=P1^1;
sbit OE=P1^0;   

sbit LED=P1^7;    //指示燈,電機轉動指示燈亮,不轉時熄滅

sbit L0=P2^0;   //數(shù)碼管位選,4個數(shù)碼管
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;

sbit LED2=P2^7;     //報警指示燈

uint count;   //定時計數(shù)

void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
                for(i=0;i<120;i++);
}
/******************顯示采集的電壓**********************************/
void Display_Result(uint d)
{
        P0=0x00;//消隱    加了這句后第一位不閃爍了。!
        
        L3=0;L2=1;L1=1;L0=1;   //P2=0xf7;     //1111 0111最右邊的數(shù)碼管顯示
        P0=DSY_CODE[d%10];           
        DelayMS(5);
        
        L3=1;L2=0;L1=1;L0=1;    //P2=0xfb;     //左邊第三個數(shù)碼管  1111 1011
        P0=DSY_CODE[d%100/10];           
        DelayMS(5);
               
        L3=1;L2=1;L1=0;L0=1;     //P2=0xfd;     //左邊第二個數(shù)碼管  1111 1101
        P0=DSY_CODE[d%1000/100]|0x80;   //加小數(shù)點顯示
        DelayMS(5);
        
        L3=1;L2=1;L1=1;L0=0;    //P2=0xfe;     //左邊第一個數(shù)碼管  1111 1110
        P0=DSY_CODE[d/1000];   
        DelayMS(5);

}

void main()
{
       uint temp;
       uint tv;

        EA=1;                  //開總中斷
        
        TMOD=0x10;             //使用定時器T1的模式1
        ET1=1;                 //定時器T1中斷允許         
        TH1=(65536-1000)/256; //定時器T1的高8位賦初值
        TL1=(65536-1000)%256; //定時器T1的高8位賦初值
        TR1=0;
        
        TMOD=0x02;
        TH0=(65536-3500)/256;    //0x14;   
        TL0=(65536-3500)%256;    //0x00;
        IE=0x82;
        TR0=1;
        
        while(1)
        {
                ST=0;ST=1;ST=0; //ADC啟動
                while(EOC==0); //空循環(huán);轉換結束信號,沒結束時EOC一直為0,轉換結束為高電平
               
                OE=1;                //輸出使能
                temp=P3*1.0/255*500;   //ADC0808輸出和輸入之間的關系,P3是輸出值,temp是輸入值
                temp=3.4*temp;  //轉換為壓力顯示,有可能是4位數(shù)
                Display_Result(temp);
               
                if(temp<=800)
                {       LED=0;        //電機啟動指示燈
                        TR1=1;         //打開計時器2
                        tv=temp;     //保存啟動時的壓力值
                }
               
                if(count==3000)
                {
                        count=0;
                        TR1=0;
                  if(temp-tv<=30 && LED==0)      //必須加上一個判斷,電機已經轉動并且增量小于30
                   {   
                          LED2=0;  //啟動后3秒,如果壓力沒有上升,就報警
                    }
                 }
               
                if(temp>=1200)
                {LED=1;  LED2=1;}
               
                OE=0;   //IF判斷必須加在“使能”的中間,否則P3沒有值了
               
        }
}

void Timer0() interrupt 1
{
        CLK=~CLK;
}

void Time1() interrupt 3 using 0 //“interrupt”聲明函數(shù)為中斷服務函數(shù)
                 //其后的3為定時器T1的中斷編號;0表示使用第0組工作寄存器
{
        count++;   //自加1  每次1ms
          TH1=(65536-1000)/256;        //定時器T1的高8位重新賦初值
        TL1=(65536-1000)%256;      //定時器T1的高8位重新賦初值
}

ADC0808采集電壓并顯示02.png (30.57 KB, 下載次數(shù): 101)

ADC0808采集電壓并顯示02.png

作者: wulin    時間: 2019-3-18 20:53
T0設置錯誤:定時器模式2是8位自動重載,最大定時時間256us,超過255部分溢出無效,你這樣設置的結果是定時14us。
作者: 7358655    時間: 2019-3-18 22:14
不是優(yōu)先級導致
TMOD=0x02; 模式0000  0010 你選模式2  八位自動裝載你看你賦值還不一樣
        TH0=(65536-3500)/256;    //0x14;   
        TL0=(65536-3500)%256;    //0x00;
再看你中斷,又給賦值
void Time1() interrupt 3 using 0 //“interrupt”聲明函數(shù)為中斷服務函數(shù)
                 //其后的3為定時器T1的中斷編號;0表示使用第0組工作寄存器
{
        count++;   //自加1  每次1ms
          TH1=(65536-1000)/256;        //定時器T1的高8位重新賦初值
        TL1=(65536-1000)%256;      //定時器T1的高8位重新賦初值
}
估計問題出在此處
作者: wtm_lxy    時間: 2019-3-19 08:31
wulin 發(fā)表于 2019-3-18 20:53
T0設置錯誤:定時器模式2是8位自動重載,最大定時時間256us,超過255部分溢出無效,你這樣設置的結果是定時 ...

我不是很明白,這里T0是給ADC0808做時鐘脈沖輸入端的,從檢測結果來看,是可以檢測到模擬值的。

問題是T1好像沒有生效。
我用T1來控制報警指示和保存臨時電壓值。這個if(count==3000)總是不能成立。
作者: wtm_lxy    時間: 2019-3-19 08:33
7358655 發(fā)表于 2019-3-18 22:14
不是優(yōu)先級導致
TMOD=0x02; 模式0000  0010 你選模式2  八位自動裝載你看你賦值還不一樣
        TH0=(65 ...

        TMOD=0x02;
        TH0=0x14;   
        TL0=0x00;   
        IE=0x82;
        TR0=1;
應該不是T0的問題吧?我改成這樣了。
我的問題是T1沒有生效?T0是正常的。
作者: ykchengong    時間: 2019-3-21 10:58
把 if(count==3000)改成  if(count>=3000)試試,主循環(huán)怎么能那么巧判斷到3000,如果你正在送顯示時中斷計數(shù)可能超過3000了
作者: 鳳姐438    時間: 2019-3-21 20:49
不一定 protues仿真軟件 本身也存在一些問題
建議用最新版本
作者: 無敵中華小子    時間: 2019-3-21 21:35
.不會2.因為在默認情況下(即每次單片機復位時),中斷優(yōu)先級寄存器ip為xxx0 0000b,未設置ip時,所有中斷都是同等級的!
作者: 愛是一縷陽光    時間: 2019-3-21 21:46

T0設置錯誤:定時器模式2是8位自動重載,最大定時時間256us,超過255部分溢出無效。也有可能是軟件模擬的問題。




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