不好意,没把程充贴全,这是加了定时的程序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));
}
} |