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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機外部中斷0中啟動定時器2,無法再觸發外部中斷0

[復制鏈接]
跳轉到指定樓層
樓主
ID:961122 發表于 2021-10-5 17:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機程序如下,想實現的功能中兩個按鈕分別是啟動和停止。按下啟動燈亮 開啟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));
        }  
}

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

使用道具 舉報

沙發
ID:624769 發表于 2021-10-5 17:52 | 只看該作者
如果你開了 T2 中斷,而沒有寫T2 中斷程序, 程序就會死。

所以,你開了T2 中斷,至少要寫一個空的T2 中斷程序,
回復

使用道具 舉報

板凳
ID:961122 發表于 2021-10-5 17:56 | 只看該作者
好的,明白,謝謝
回復

使用道具 舉報

地板
ID:57657 發表于 2021-10-5 18:45 | 只看該作者
你開了兩個中斷,為何只有1個帶 interrupt 的函數?
回復

使用道具 舉報

5#
ID:624769 發表于 2021-10-5 18:55 | 只看該作者
npn 發表于 2021-10-5 18:45
你開了兩個中斷,為何只有1個帶 interrupt 的函數?

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

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


回復

使用道具 舉報

6#
ID:961122 發表于 2021-10-6 08:20 | 只看該作者
加進定時中斷程序還是一樣,只要 AUXR  和 IE2指令在 void Initobj(void) interrupt 0里面結果一樣。外部中斷只能執行一次。我將開啟定時中斷的AUXR和IE2語句移到main()里面,通過Int0中斷更改變變量運行就可以,但出現按啟動按鈕后,還沒觸發外部中斷,定時中斷自動被執行。
回復

使用道具 舉報

7#
ID:161164 發表于 2021-10-6 11:41 | 只看該作者
說了那么多,還是沒有說用什么型號的單片機
根據AUXR的設置和有ADC
是STC15W4XXAS嗎?

還有。。。把程序貼全一點
去頭去尾的,想幫你檢查都要推理一下代碼的運作
C_obj是什么鬼?
回復

使用道具 舉報

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

使用道具 舉報

9#
ID:961122 發表于 2021-10-6 22:02 | 只看該作者
TR0可以去掉的,T0定時器還沒用,所以TR0會一直都是零。
回復

使用道具 舉報

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

使用道具 舉報

11#
ID:624769 發表于 2021-10-6 23:48 | 只看該作者
AUXR        |=        ~0x10;                                             //加速定時器,關閉定時中斷
IE2          |=         ~0x04;
上述寫法,你所有定時器的時間都不對了……
關閉T2定時中斷的話……
AUXR        &=        ~0x10;        
IE2          &=         ~0x04;
而實際上,一般只要關了定時器,中斷不用管……

最后,ad.h 呢?
             ADC_obj=Get_ADC10bitResult(1);                                         //讀取ADC1數據 測物延時
這里面寫的啥,不知道啊……
回復

使用道具 舉報

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

使用道具 舉報

13#
ID:961122 發表于 2021-10-7 00:48 | 只看該作者
188610329 發表于 2021-10-6 23:48
AUXR        |=        ~0x10;                                             //加速定時器,關閉定時中斷
...

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕第一页在线 | 精久久久 | 99色视频 | 91性高湖久久久久久久久_久久99 | 久草在线在线精品观看 | 高清视频一区二区三区 | 久久久久一区 | 成人精品鲁一区一区二区 | 国产日韩欧美一区二区在线播放 | 麻豆视频在线免费观看 | 99re6在线视频精品免费 | 亚洲精品一区二三区不卡 | 国产精品av久久久久久久久久 | 色橹橹欧美在线观看视频高清 | 国产一区二区三区在线视频 | 三级视频网站 | 国产亚洲日本精品 | 福利视频1000| 国产成人精品久久二区二区91 | 九九免费视频 | 欧美国产亚洲一区二区 | 中文字幕一区二区三区四区五区 | 久久高清免费视频 | 亚洲精品女优 | 精品1区| 一区二区三区国产在线观看 | 欧美一区视频 | 天天曰天天曰 | 精品一区二区三区视频在线观看 | 国产成人啪免费观看软件 | 欧美在线视频二区 | 国产成人精品免高潮在线观看 | 在线观看亚洲精品视频 | 一级毛片免费完整视频 | 国产a爽一区二区久久久 | 欧美精品一区二区免费视频 | 亚洲国产中文字幕 | 日本二区在线观看 | 18成人在线观看 | 久久久久久久亚洲精品 | 国产高清免费 |