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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這是單片機中斷優先級造成的嗎?

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 wtm_lxy 于 2019-3-19 08:35 編輯

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

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

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

#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;   //數碼管位選,4個數碼管
sbit L1=P2^1;
sbit L2=P2^2;
sbit L3=P2^3;

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

uint count;   //定時計數

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最右邊的數碼管顯示
        P0=DSY_CODE[d%10];           
        DelayMS(5);
        
        L3=1;L2=0;L1=1;L0=1;    //P2=0xfb;     //左邊第三個數碼管  1111 1011
        P0=DSY_CODE[d%100/10];           
        DelayMS(5);
               
        L3=1;L2=1;L1=0;L0=1;     //P2=0xfd;     //左邊第二個數碼管  1111 1101
        P0=DSY_CODE[d%1000/100]|0x80;   //加小數點顯示
        DelayMS(5);
        
        L3=1;L2=1;L1=1;L0=0;    //P2=0xfe;     //左邊第一個數碼管  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); //空循環;轉換結束信號,沒結束時EOC一直為0,轉換結束為高電平
               
                OE=1;                //輸出使能
                temp=P3*1.0/255*500;   //ADC0808輸出和輸入之間的關系,P3是輸出值,temp是輸入值
                temp=3.4*temp;  //轉換為壓力顯示,有可能是4位數
                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”聲明函數為中斷服務函數
                 //其后的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, 下載次數: 101)

ADC0808采集電壓并顯示02.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2019-3-18 20:53 | 只看該作者
T0設置錯誤:定時器模式2是8位自動重載,最大定時時間256us,超過255部分溢出無效,你這樣設置的結果是定時14us。
回復

使用道具 舉報

板凳
ID:466164 發表于 2019-3-18 22:14 | 只看該作者
不是優先級導致
TMOD=0x02; 模式0000  0010 你選模式2  八位自動裝載你看你賦值還不一樣
        TH0=(65536-3500)/256;    //0x14;   
        TL0=(65536-3500)%256;    //0x00;
再看你中斷,又給賦值
void Time1() interrupt 3 using 0 //“interrupt”聲明函數為中斷服務函數
                 //其后的3為定時器T1的中斷編號;0表示使用第0組工作寄存器
{
        count++;   //自加1  每次1ms
          TH1=(65536-1000)/256;        //定時器T1的高8位重新賦初值
        TL1=(65536-1000)%256;      //定時器T1的高8位重新賦初值
}
估計問題出在此處
回復

使用道具 舉報

地板
ID:487930 發表于 2019-3-19 08:31 | 只看該作者
wulin 發表于 2019-3-18 20:53
T0設置錯誤:定時器模式2是8位自動重載,最大定時時間256us,超過255部分溢出無效,你這樣設置的結果是定時 ...

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

問題是T1好像沒有生效。
我用T1來控制報警指示和保存臨時電壓值。這個if(count==3000)總是不能成立。
回復

使用道具 舉報

5#
ID:487930 發表于 2019-3-19 08:33 | 只看該作者
7358655 發表于 2019-3-18 22:14
不是優先級導致
TMOD=0x02; 模式0000  0010 你選模式2  八位自動裝載你看你賦值還不一樣
        TH0=(65 ...

        TMOD=0x02;
        TH0=0x14;   
        TL0=0x00;   
        IE=0x82;
        TR0=1;
應該不是T0的問題吧?我改成這樣了。
我的問題是T1沒有生效?T0是正常的。
回復

使用道具 舉報

6#
ID:495226 發表于 2019-3-21 10:58 | 只看該作者
把 if(count==3000)改成  if(count>=3000)試試,主循環怎么能那么巧判斷到3000,如果你正在送顯示時中斷計數可能超過3000了
回復

使用道具 舉報

7#
ID:69072 發表于 2019-3-21 20:49 | 只看該作者
不一定 protues仿真軟件 本身也存在一些問題
建議用最新版本
回復

使用道具 舉報

8#
ID:427430 發表于 2019-3-21 21:35 | 只看該作者
.不會2.因為在默認情況下(即每次單片機復位時),中斷優先級寄存器ip為xxx0 0000b,未設置ip時,所有中斷都是同等級的!
回復

使用道具 舉報

9#
ID:495752 發表于 2019-3-21 21:46 | 只看該作者

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久一区二区三区 | 日本一区二区视频 | 欧美日韩黄色一级片 | 久久国产精品久久 | 中文久久 | 精品综合网| 九七午夜剧场福利写真 | 五月婷亚洲 | 欧美日韩电影一区 | 日本欧美黄色片 | 婷婷久久一区 | 久久国内精品 | 天天干天天玩天天操 | 精品久久电影 | 精品国产欧美一区二区三区成人 | 天天干天天干 | 亚洲欧美一区二区三区在线 | 成人国产在线观看 | 日韩欧美视频网站 | 成人在线精品视频 | 狠狠操狠狠干 | 一级特黄在线 | 亚洲精品黄色 | 亚洲欧洲成人在线 | av大片在线| 黄色国产视频 | av一级| 国产黄色大片 | 国产精品一区视频 | 欧美理论 | 国产综合av | 国产91丝袜 | 久久久综合网 | 亚洲成av人影片在线观看 | 一区二区三区四区不卡视频 | 日韩一区二区在线视频 | 91av久久久 | 一区二区国产精品 | 久亚州在线播放 | 亚洲精品久久久一区二区三区 | 精品国产乱码久久久久久闺蜜 |