定时器初始化计数器1ms进入一次中断服务函数,进入一次中断服务函数后让i的值加一,即每1ms进入一次中断,i值加一。因此若要1s改变一次灯状态的话,就要进入1000次中断服务函数(1s=1000ms)。 |
1.先要了解单片机的定时器功能。 void Timer0 Interupt 1() 函数,就是你的定时器中断函数,单片机会每隔一个固定的时间,进来执行一次这个中断函数。 固定时间就是1ms 。 为什么是1ms , 因为你 Timer0 Init()函数里面已经给定了初值,另外,每次进入中断函数后,又给TH0 和 TL0重新赋值。 依次循环。 为什么TH0 和 TL0 赋值就可以循环? 请自行恶补 定时器工作原理。 2.知道了1ms定时器工作原理, 就可以明白,每隔1ms,i++; 加到1000以后,就重新赋值为0 (其实这里判断条件改成 >=1000更合理,因为不知道你的单片机还会不会响应其它更高级别的中断),括号里面的内容,不懂就不用看了, 以后慢慢会懂的。 |
1. 请问最后一张图中的 i 是什么?为什么要判断 i 等于1000? 答:i就是时间量,单位是毫秒,初始值设置的为0,定时器设定的1毫秒产生一次中断,在中断中进行了i++的操作,也就是说,i每过1毫秒就加1,所以 “判断i等于1000” 就是要判断i是否达到了1000毫秒,如果达到了,就让灯改变状态,同时,还要让i变为初值,进行下一轮的计时。 2. 教程里说 i 起始是1毫秒,这是为什么啊? 答:教程写错了,i起始是0毫秒。 |
蓝魄 发表于 2020-7-16 08:13 谢谢! |
还有谁? 发表于 2020-7-16 09:31 谢谢指点 |
一个经验告诉你,当你对一些代码的意思不是很了解时,你可以改变数字看看变化现象,多试几次!代码的意思与目地你就知道是怎么回事了 |
i就是个变量啊,定时器1ms中断一次,中断一次i就累加一次,当i加到1000,就是1000ms,1000ms等于1秒,清零变量 i 的值,取反输出LED的状态,这样就能实现你说的功能了 |