不好意,沒把程充貼全,這是加了定時的程序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));
}
} |