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

標題: 單片機外部中斷0中啟動定時器2,無法再觸發外部中斷0 [打印本頁]

作者: litingkun    時間: 2021-10-5 17:10
標題: 單片機外部中斷0中啟動定時器2,無法再觸發外部中斷0
單片機程序如下,想實現的功能中兩個按鈕分別是啟動和停止。按下啟動燈亮 開啟INT0,按下停止燈滅 關閉INT0。啟動后按INT0切換指示燈的狀態,并啟動定時器T2(定時器2的中斷程序未寫)。
但在中斷中加入定時器T2的設置命令就無法通過 再按停止——啟動——INT0來實現切換了,此時再按INT0進不了中斷。
還請高手指點一下。
void pressBtn(void)
{
if (I_start == 0 && BtnState == 0)                                
        {        
        Delay(1);
        if (I_start==1)                                                               
                return;                                                                        
        BtnState        =         1;                                                                                 
        Q_motor                =         1;                                                                           
        Q_light                =         1;                                                                                                                                
        EA                        =        1;                                                                                
        EX0                        =        1;                                                                                
        EX1                        =        1;                                                                                

        Objshot                =        0;                                                                                
        
        }                                                                                         
if (I_stop == 0 && BtnState == 1)                                       
        {        
        Delay(1);
        if (I_stop==1)                                                               
                return;
        while (TR0);                                                               
        BtnState=        0;                                                                 
        Q_motor        =        0;                                                         
        Q_light        =        0;                                                               
        EA                =        0;
        EX0                =        0;
        EX1                =        0;               
        }
}

void Initobj(void) interrupt 0
{
if((Objshot==0 && C_obj==0) ||(Objshot==1 && C_obj==1))                  
{
        Q_light                =        ~Q_light;                                                                        
        ACC_delay        =        0;                                                                                       
        AUXR                 |=         0x10;                    //屏蔽此語句可實現中斷切換   Q_light                                 
        IE2                  |=         0x04;                            //屏蔽此語句可實現中斷切換   Q_light                  
        EX0                 =         0;                                                                                                                                                                                                         
}
Objshot=~Objshot;                                                           

}

void main(void)
{
Q_light                =        0 ;                                                        
BtnState        =        0 ;                                                        
                                                         

/*
Timer2初始化  設T2 為2ms
*/
AUXR         |=         0x04;                                                
T2L         =         0x9A;                                                        
T2H         =         0xA9;                                                        

InitAD(1);
InitAD(0);                                                        

Labelshot        =        0;                                                

while(1)
        {                                                  
        pressBtn();                                                                                       
        do                                                                                                        
        {
                ADC_obj=Get_ADC10bitResult(1);                                         
        }
        while(ADC_obj!=Get_ADC10bitResult(1));
        do
        {
                ADC_label=Get_ADC10bitResult(0);                                 
        }
        while(ADC_label != Get_ADC10bitResult(0));
        }  
}


作者: 188610329    時間: 2021-10-5 17:52
如果你開了 T2 中斷,而沒有寫T2 中斷程序, 程序就會死。

所以,你開了T2 中斷,至少要寫一個空的T2 中斷程序,
作者: litingkun    時間: 2021-10-5 17:56
好的,明白,謝謝
作者: npn    時間: 2021-10-5 18:45
你開了兩個中斷,為何只有1個帶 interrupt 的函數?
作者: 188610329    時間: 2021-10-5 18:55
npn 發表于 2021-10-5 18:45
你開了兩個中斷,為何只有1個帶 interrupt 的函數?

你可以參見樓主正文第二行的括號里的內容。

我是看見這句話,就直接就跳過他的程序了。



作者: litingkun    時間: 2021-10-6 08:20
加進定時中斷程序還是一樣,只要 AUXR  和 IE2指令在 void Initobj(void) interrupt 0里面結果一樣。外部中斷只能執行一次。我將開啟定時中斷的AUXR和IE2語句移到main()里面,通過Int0中斷更改變變量運行就可以,但出現按啟動按鈕后,還沒觸發外部中斷,定時中斷自動被執行。
作者: lkc8210    時間: 2021-10-6 11:41
說了那么多,還是沒有說用什么型號的單片機
根據AUXR的設置和有ADC
是STC15W4XXAS嗎?

還有。。。把程序貼全一點
去頭去尾的,想幫你檢查都要推理一下代碼的運作
C_obj是什么鬼?
作者: 188610329    時間: 2021-10-6 19:47
litingkun 發表于 2021-10-6 08:20
加進定時中斷程序還是一樣,只要 AUXR  和 IE2指令在 void Initobj(void) interrupt 0里面結果一樣。外部中 ...

由于代碼不全,只能靠猜, 就你目前的代碼,有如下兩個疑惑, 都是有可能會卡死程序的,你看一下。  


while (TR0);                <== 這個 TR0 通過什么控制? 你能保證 如果卡在這里,有地方 讓TR0 = 0么?                                      
        BtnState=        0;                                                                 
        Q_motor        =        0;                                                         
        Q_light        =        0;                                                               
        EA                =        0;       <===  你這里關閉了所有的中斷, 你什么地方會再把中斷打開?
        EX0                =        0;
        EX1                =        0;               
作者: litingkun    時間: 2021-10-6 22:02
TR0可以去掉的,T0定時器還沒用,所以TR0會一直都是零。
作者: litingkun    時間: 2021-10-6 22:22
不好意,沒把程充貼全,這是加了定時的程序main.c,程序想通過按 I_start啟動, Q_light亮起,后通過按中斷0啟動定時中斷,在定時到一定時間后,定時中斷將 Q_light關掉。之后按下I_stop按鈕,再按一下I_start燈亮,再按中斷0應該是又重復上面動作,但實際上亮沒有變化。
請高手有時間幫忙看一下。C_Obj用于控制上升沿觸發還是下降沿觸發的一個開關。
#include <reg51.h>
#include <intrins.h>
#include <ad.h>




sbit I_start         =         P2^4;                                                //啟動按鈕
sbit I_stop         =         P2^3;                                                //停止按鈕
sbit I_obje         =        P3^2;                                            //測物觸發
sbit I_label        =         P3^3;                                               
sbit C_obj                 =        P5^5;                                                  //測物沿轉換
sbit C_label         =         P5^4;                                               
sbit Q_pulse         =         P1^4;                                                //脈沖輸出
sbit Q_motor        =         P1^3;                                                //電機輸出
sbit Q_light        =         P1^2;                                                //指示燈輸出
                                    


b1 BtnState;                                                           //啟動/停止按鈕狀態 0停止 1啟動
u8 ADC_obj;                                                                //測物延時模擬量
u8 ADC_label;                                                          //測物延時模擬量

b1 Labelshot;
u8 ACC_delay;
b1 Objshot;       

u8 x;

/*****************************************************************************

** 函數名稱: pressBtn()

** 功能描述: 按鈕啟動/停止

** 全局變量: BtnState

** 調用模塊: main()

** 輸入: 無

** 輸出: 無

******************************************************************************/
void pressBtn(void)
{
if (I_start == 0 && BtnState == 0)                                //啟動按鈕按下 停止狀態 -啟動
        {       
        Delay(1);
        if (I_start==1)                                                                //誤觸發判斷
                return;                                                                        
        BtnState        =         1;                                                                                 //運行狀態置1
        Q_motor                =         1;                                                                            //啟動電機
        Q_light                =         1;                                                                                //綠燈亮                                                               
        EA                        =        1;                                                                                //中斷使能
        EX0                        =        1;                                                                                //外部中斷0中斷允許位
        EX1                        =        1;                                                                                //外部中斷1中斷允許位

        Objshot                =        0;                                                                                //測物觸發狀態
       
        }                                                                                         
if (I_stop == 0 && BtnState == 1)                                //停止按鈕按下 動行狀態 -停止       
        {       
        Delay(1);
        if (I_stop==1)                                                                //誤觸發判斷
                return;
        //while (TR0);                                                               
        BtnState=        0;                                                                 //運行狀態置1
        Q_motor        =        0;                                                            //啟動電機
        Q_light        =        0;                                                                //綠燈亮
        EA                =        0;
        EX0                =        0;
        EX1                =        0;               
        }
}
/*****************************************************************************

** 函數名稱: Obj_Time()

** 功能描述: 中斷3 測物觸發延時中斷

** 全局變量:

** 調用模塊: -

** 輸入: 無

** 輸出: 無

******************************************************************************/
void Obj_time(void) interrupt 12
{

if (ADC_obj == ACC_delay)                                                       //定時計數,最小定時量2ms  最大量254ms ACC_delay定時器計數值 每次INT0觸發時清零
{
Q_light        =~Q_light;
AUXR        |=        ~0x10;                                             //加速定時器,關閉定時中斷
IE2          |=         ~0x04;
ACC_delay        =        0;
EX0                 =         1;                                                                                               
}
else
ACC_delay++;                                                                                               
}
/*****************************************************************************

** 函數名稱: Initobj()

** 功能描述: 中斷0 測物觸發

** 全局變量: bit Objshot ,bit TACP0(TR0)

** 調用模塊: -

** 輸入: 無

** 輸出: 無

******************************************************************************/
void Initobj(void) interrupt 0
{

if((Objshot==0 && C_obj==0) ||(Objshot==1 && C_obj==1))                   //沿判斷設置,C_obj=0上升沿
{       
        ACC_delay        =        0;                                                                                        //初始化定時時長
        EX0                 =         0;                                                                                        //關閉外部中斷0
        IE2                  |=         0x04;                                           //使能定時器中斷
        AUXR                 |=         0x10;                                           //啟動定時器                                                                                                        
}
Objshot=~Objshot;                                                                   //取反

}
/*****************************************************************************

** 函數名稱: mina()

** 功能描述: 主程序

** 全局變量:BtnState 啟動狀態

** 調用模塊:

** 輸入: 無

** 輸出: 無

******************************************************************************/
void main(void)
{
Q_light                =        0 ;                                                        //初始化 啟動燈
BtnState        =        0 ;                                                        //設備初始設備置 停止
                                                         

/*
Timer2初始化  設T2 為2ms
*/
AUXR         |=         0x04;                                                //定時器時鐘1T模式
T2L         =         0x9A;                                                        //設置定時初始值
T2H         =         0xA9;                                                        //設置定時初始值

InitAD(1);
InitAD(0);                                                        //初始化ADC 只啟動 設置speed

Labelshot        =        0;                                                //標簽觸發狀態           ?
while(1)
        {                                                 
        pressBtn();                                                                                        //開關按鈕掃描  按鈕啟動/停止
        do                                                                                                        //采集2次如果相同就停止,如果不同繼續采集
        {
                ADC_obj=Get_ADC10bitResult(1);                                         //讀取ADC1數據 測物延時
        }
        while(ADC_obj!=Get_ADC10bitResult(1));
        do
        {
                ADC_label=Get_ADC10bitResult(0);                                 //讀取ADC0數據 標簽觸發延時
        }
        while(ADC_label != Get_ADC10bitResult(0));
        }        
}
作者: 188610329    時間: 2021-10-6 23:48
AUXR        |=        ~0x10;                                             //加速定時器,關閉定時中斷
IE2          |=         ~0x04;
上述寫法,你所有定時器的時間都不對了……
關閉T2定時中斷的話……
AUXR        &=        ~0x10;        
IE2          &=         ~0x04;
而實際上,一般只要關了定時器,中斷不用管……

最后,ad.h 呢?
             ADC_obj=Get_ADC10bitResult(1);                                         //讀取ADC1數據 測物延時
這里面寫的啥,不知道啊……
作者: litingkun    時間: 2021-10-7 00:43
感謝!
這是AD.c 和AD.h 的文件,就是筒單讀取指定端口AD的函數,AD測試過了沒什么問題。
#ifndef          __AC_H_
#define   __AC_H_


#include <reg51.h>
#include <intrins.h>

sfr P1ASF = 0x9D;



//sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
//sfr ADC_RES     =   0xBD;           //ADC高8位結果
//sfr ADC_LOW2    =   0xBE;           //ADC低2位結果
//sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

extern void Delay(u16 n);
extern void InitAD(u8 channel);
extern u8        Get_ADC10bitResult(u8 channel);
#endif


#include "AD.H"



/*****************************************************************************

** 函數名稱: Delay

** 功能描述: 延時程序

** 全局變量:

** 調用模塊: -

** 輸入: 無

** 輸出: 無

******************************************************************************/
void Delay(u16 n)
{
        unsigned int x;
        while(n--)
        {
                x=5000;
                while(x--);
        }

}
/*****************************************************************************

** 函數名稱: InitAD()  

** 功能描述: AD初始化

** 全局變量:

** 調用模塊: -

** 輸入: 無

** 輸出: 無

******************************************************************************/

void InitAD(u8 channel)
{
  P1ASF |= (1 << channel);                                       //設置P1口為AD口
  ADC_RES = 0;
  ADC_RESL = 0;                                                           //清除結果寄存器
  ADC_CONTR |= 0x80;                                                          //540脈沖采集1次 0x80:POWER
  Delay(2);                                                               //ADC上電并延時


}
/*****************************************************************************

** 函數名稱: Get_ADC10bitResult

** 功能描述: 讀取AD數據

** 全局變量:

** 調用模塊: -

** 輸入: 無

** 輸出: 無

******************************************************************************/
u8 Get_ADC10bitResult(u8 channel)  //channel = 0~7
{       

ADC_CONTR |= 0x08 | channel;                                                   //start the ADC         0x08:ADC_START
_nop_();
_nop_();
_nop_();                                                                                               
while((ADC_CONTR & 0x10) == 0);                                   //wait for ADC finish
ADC_CONTR &= ~0x10;                                                     //清除ADC結束標志
return ADC_RES;
}
作者: litingkun    時間: 2021-10-7 00:48
188610329 發表于 2021-10-6 23:48
AUXR        |=        ~0x10;                                             //加速定時器,關閉定時中斷
...

感謝大神指點,應該是這樣。




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