int time, SetTime;//使用时间与设定时间
int mode;
_Bool Run_bit;
int BackTime = 0;//反馈时间
int BackMode;//反馈模式
char BackBit;
char key;
Bit_TypeDef Temp[8] = {SET, SET, SET, SET, SET, SET, 0, 0};
void DIC200_Init(void);//控制器初始化
void Read_24c02_data(void);//读取数据
void Find_ID(void);///检测96位唯一ID
void err_in_out(void);
void Factory_Mode(void);//工厂模式
/**********工作模式**************/
void Tog_Mode(void);//点动
void Time_Mode(void);//时间模式
void Jop_Mode(void);//点动模式
int main(void)
{
DIC200_Init();
while (1)
{
IWDG_ReloadCounter();//最大间隔时间为1.86S 所以2S内必须喂狗
if ((!SW_UP0 || !SW_UP1 || !SW_UP2 || !SW_UP3 || !SW_DOWN0 || !SW_DOWN1 || !SW_DOWN2 || !SW_DOWN3) && VAR)//有一个修改参数的键按下并且电磁阀没有运行
{
delay_ms(10);
if ((!SW_UP0 || !SW_UP1 || !SW_UP2 || !SW_UP3 || !SW_DOWN0 || !SW_DOWN1 || !SW_DOWN2 || !SW_DOWN3) && VAR)
{
//EXTI->IMR &= ~(0x01 << 3);//关闭外部中断3
key = 1;
Key_Intput(&SetTime);//
}
}
if (Falling_Edge_Detection(SW_TIME, &Temp[0], 20) && !Run_bit)//按下切换模式
{
switch (mode)
{
case 0: TIME_LED = RESET;//如果之前是点动模式,那么就变为时间模式
mode = 1;
break;
case 1: TIME_LED = SET;
mode = 0;
break;
default: TIME_LED = SET;
mode = 0;
break;
}
Stor_Idata(mode, 22, 6);//保存当前模式
}
if (mode)
{
if (!SW_BACK) //间隔时间开启
{
BackTime = VR_GetData();//开始转换ADC的值
//printf("%d
", BackTime);
Tog_Mode();
}
else
Time_Mode();
}
else
Jop_Mode();
}
}
这是部分代码。就是SetTime这个变量在一天工作当中会有一到两次自动变为0(客户没有按按键,断电会从24C02读取上次的值),修改这个值的地方只有Key_Intput()这个函数,客户现在设定的值是30。不知道是什么原因造成的,望大神指导下方向。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM3->SR & TIM_IT_Update ) //检查TIM3更新中断
{
time++;
if (mode == 1)//时间模式
{
if (time >= SetTime)
{
TIM3->CR1 &= (uint16_t)0xfffe;//停用计时器
SHOT_LED = SET;
Run_bit = RESET;
}
}
TIM3->SR = (uint16_t)0xfffe; //清除TIMx更新中断标志
}
}
中断里面只用来作比较
一周热门 更多>