标题: 关于单片机中断(一小段代码看不懂,麻烦有空的大神进来帮忙看看 [打印本页]

作者: sls_qj    时间: 2018-5-15 11:24
标题: 关于单片机中断(一小段代码看不懂,麻烦有空的大神进来帮忙看看
  1. /*************定时器0中断服务程序***************/
  2. void time0_int() interrupt 1
  3. {
  4. static uchar value;
  5. TH0 = 0x3c;
  6. TL0 = 0xb0;     // 50ms
  7. value ++;
  8. if(value % 2 == 0)
  9. {
  10.   flag_100ms = 1 ;
  11. }
  12. }
复制代码
1、value没赋初值吧?if里怎么知道value是多少。。
2、if没有循环功能吧?执行完了不就出来了吗?
只学过汇编而且忘差不多了,时间有点紧迫所以想直接问比较快,求助QAQ



作者: HC6800-ES-V2.0    时间: 2018-5-15 12:40
第一:你没看到有:value++;吗?
第二:下次中断,不就回来了?
作者: zhdp    时间: 2018-5-15 13:27
默认初值为0;没循环,但每累加2次执行一次if里面的语句;
作者: wulin    时间: 2018-5-15 13:40
这段程序不严谨,应该给value赋初值=0,由于定义的是静态变量static uchar value;,编译器默认初值=0,value在每次定时器0中断时自加1,所以他的值是从0~255周而复始,if(value % 2 == 0)判断value是偶数,flag_100ms标志置1,否则直接结束程序。
作者: tp80986735    时间: 2018-5-15 14:25
1,value静态变量默认初值唯一,并且每次中断进来后value保持上一次的值。
作者: tp80986735    时间: 2018-5-15 14:28
1,value是static静态变量,初始化值为0,并且每次进入中断value是保持上一次的值,也就是每次进入中断后value值加1。第一次进入是0,第二次是1,第三次是2.。。。
2,这是定时器中断,也就是每50ms就会执行一次,并且value保持上一次的值,也就是每100ms if条件成立,执行if条件下面的程序。
作者: sls_qj    时间: 2018-5-15 15:36
哇啊啊啊啊啊你们好善良,就这么一会这么多人回复,太感动了谢谢!!
先仔细看看你们说的

作者: fzhlpp    时间: 2018-5-15 16:13
开始的100ms可以成立一次,之后是每1秒大概成立4次,可能程序在测试阶段没完成,原本可能是每100ms就置位一次flag_100ms标志。但是应该在判断语句里清零静态寄存器:
if(value % 2 == 0)
{
  flag_100ms = 1 ;
  value=0;
}
这样就有点意思了,不然上面的程序都不好分析,因为255/2不能整除,后面的标志位出现的时机就不知道啥意思了.....
作者: sls_qj    时间: 2018-5-15 16:50
知道第一问了,第二问,为什么要有个if语句在这呢?
作者: zhdp    时间: 2018-5-15 17:48
zhdp 发表于 2018-5-15 13:27
默认初值为0;没循环,但每累加2次执行一次if里面的语句;

50ms中断一次,value +1,再50ms中断一次,再value +1,value/2表示偶数时执行if语句,但你没value清0,所以value到255时就不再增加了 value=255,不循环。if是判断语句,你没学过吗?
作者: penggc    时间: 2018-5-15 17:51
value默认是0,每次自增1;if是判断value的值是否是偶数情况,是就将falg_100ms置1,
作者: sls_qj    时间: 2018-5-15 19:30
zhdp 发表于 2018-5-15 17:48
50ms中断一次,value +1,再50ms中断一次,再value +1,value/2表示偶数时执行if语句,但你没value清0, ...

学过,但不知道这里为什么50ms中断一次。。。
作者: sls_qj    时间: 2018-5-15 19:33
噢噢噢噢知道了 是定时器 所以50ms中断一次




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1