51单片机写个程序,好像在中断里面出不来了,主程序只运行了一部分,之后一直在中断里面运行
中断10ms进入一次,中断程序不是出来后继续主程序运行吗,难道这个中断运行时间大于10ms导致一直在中断里面吗voidInterruptTimer1()interrupt...
中断10ms进入一次,中断程序不是出来后继续主程序运行吗,难道这个中断运行时间大于10ms导致一直在中断里面吗
void InterruptTimer1() interrupt 3
{
static unsigned int tmr1s = 0; //1秒定时器
TH1 = T1RH; //定时器重新加载重载值
TL1 = T1RL;
KeyScan();
if (flagStart) //倒计时启动时处理1秒定时
{
tmr1s++;
if (tmr1s >= 10)
{
tmr1s = 0;
flag1s = 1;
}
}
else //倒计时为启动时1秒定时器始终归零
{
tmr1s = 0;
}
count1 = hour1*3600+min1*60+sec1;
count2 = hour2*3600+min2*60+sec2;
LCD_display();
}
void LCD_display()
{
Get_Weight();//显示当前重量
LCD1602_write_com(0x80);
LCD1602_write_word("Weight=");
LCD1602_write_data(Weight_Shiwu/1000 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
LCD1602_write_word("Kg");
}
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
if(Weight_Shiwu >= 0)
{
Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue); //计算实物的实际重量
}
else
{
Weight_Shiwu = 0;
}
} 展开
void InterruptTimer1() interrupt 3
{
static unsigned int tmr1s = 0; //1秒定时器
TH1 = T1RH; //定时器重新加载重载值
TL1 = T1RL;
KeyScan();
if (flagStart) //倒计时启动时处理1秒定时
{
tmr1s++;
if (tmr1s >= 10)
{
tmr1s = 0;
flag1s = 1;
}
}
else //倒计时为启动时1秒定时器始终归零
{
tmr1s = 0;
}
count1 = hour1*3600+min1*60+sec1;
count2 = hour2*3600+min2*60+sec2;
LCD_display();
}
void LCD_display()
{
Get_Weight();//显示当前重量
LCD1602_write_com(0x80);
LCD1602_write_word("Weight=");
LCD1602_write_data(Weight_Shiwu/1000 + 0x30);
LCD1602_write_data('.');
LCD1602_write_data(Weight_Shiwu%1000/100 + 0x30);
LCD1602_write_data(Weight_Shiwu%100/10 + 0x30);
LCD1602_write_word("Kg");
}
void Get_Weight()
{
Weight_Shiwu = HX711_Read();
Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取净重
if(Weight_Shiwu >= 0)
{
Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/GapValue); //计算实物的实际重量
}
else
{
Weight_Shiwu = 0;
}
} 展开
5个回答
展开全部
跟我之前一样,对中断,定时器了解的不够透彻,被老师训了之后查资料搞实验后终于搞清楚了,下面说说我的看法:千万不要在中断函数中做多余的事!!!只能做最基本的操作,比如置标志位,让一个数加一等,与延时有关的操作千万不要做!你10ms进一次中断,在里面又扫描按键,又显示液晶,这里面花的时间远远地超过10ms,它肯定死在中断里出不来啊,因为你不关闭中断的话它一直10ms进去,最好在中断里设置几个标志位,进中断就让标志位置1,然后出中断,在主循环里判断标志位,如果标志位置1了,就清零标志位,然后做其他的动作。好好想一想,思路一定要清晰!
2022-05-26
展开全部
您这???把中断当成主程序了呢???中断的时间不宜太长,栈会溢出的,中断好比程序给你一个碗用来盛多余的水,结果你把整个水库的水都倒碗里,那岂不是就完蛋了吗?
其次,检查一下自己清标志位是不是写成了:XX==0;(哈哈哈cao我刚刚就这么写的,程序还没报错。)
其次,检查一下自己清标志位是不是写成了:XX==0;(哈哈哈cao我刚刚就这么写的,程序还没报错。)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果真如你所说,那么问题出在keyscan()函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开中断以后,在中断服务子程序中设置一个中断次数计数器,统计达到2次后
中断次数计数器清0,然后再把莫寄存器加一。
中断次数计数器清0,然后再把莫寄存器加一。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
原创,有的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询