找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1598|回复: 7
收起左侧

求教关于单片机定时器中断程序的一个小问题,求大佬们指点,非常感谢!

[复制链接]
ID:796670 发表于 2020-7-15 18:22 | 显示全部楼层 |阅读模式
这是完整的程序,让小灯循环点亮一秒,熄灭一秒
请问最后一张图中的 i 是什么?为什么要判断 i 等于1000?
教程里说 i 起始是1毫秒,这是为什么啊?
求大佬们解答,谢谢!

1

1

2

2

3

3

4

4


回复

使用道具 举报

ID:86926 发表于 2020-7-16 08:13 | 显示全部楼层
i就是个变量啊,定时器1ms中断一次,中断一次i就累加一次,当i加到1000,就是1000ms,1000ms等于1秒,清零变量 i 的值,取反输出LED的状态,这样就能实现你说的功能了
回复

使用道具 举报

ID:475247 发表于 2020-7-16 09:31 | 显示全部楼层
一个经验告诉你,当你对一些代码的意思不是很了解时,你可以改变数字看看变化现象,多试几次!代码的意思与目地你就知道是怎么回事了
回复

使用道具 举报

ID:796670 发表于 2020-7-16 10:37 | 显示全部楼层
还有谁? 发表于 2020-7-16 09:31
一个经验告诉你,当你对一些代码的意思不是很了解时,你可以改变数字看看变化现象,多试几次!代码的意思与 ...

谢谢指点
回复

使用道具 举报

ID:796670 发表于 2020-7-16 10:38 | 显示全部楼层
蓝魄 发表于 2020-7-16 08:13
i就是个变量啊,定时器1ms中断一次,中断一次i就累加一次,当i加到1000,就是1000ms,1000ms等于1秒,清零 ...

谢谢!
回复

使用道具 举报

ID:804115 发表于 2020-7-16 13:34 | 显示全部楼层
1. 请问最后一张图中的 i 是什么?为什么要判断 i 等于1000?
答:i就是时间量,单位是毫秒,初始值设置的为0,定时器设定的1毫秒产生一次中断,在中断中进行了i++的操作,也就是说,i每过1毫秒就加1,所以 “判断i等于1000” 就是要判断i是否达到了1000毫秒,如果达到了,就让灯改变状态,同时,还要让i变为初值,进行下一轮的计时。
2. 教程里说 i 起始是1毫秒,这是为什么啊?
答:教程写错了,i起始是0毫秒。
回复

使用道具 举报

ID:451718 发表于 2020-7-16 16:17 | 显示全部楼层
1.先要了解单片机的定时器功能。  void Timer0 Interupt 1()  函数,就是你的定时器中断函数,单片机会每隔一个固定的时间,进来执行一次这个中断函数。 固定时间就是1ms 。 为什么是1ms , 因为你 Timer0 Init()函数里面已经给定了初值,另外,每次进入中断函数后,又给TH0 和  TL0重新赋值。 依次循环。  为什么TH0  和 TL0 赋值就可以循环? 请自行恶补 定时器工作原理。

2.知道了1ms定时器工作原理,  就可以明白,每隔1ms,i++; 加到1000以后,就重新赋值为0 (其实这里判断条件改成 >=1000更合理,因为不知道你的单片机还会不会响应其它更高级别的中断),括号里面的内容,不懂就不用看了, 以后慢慢会懂的。
回复

使用道具 举报

ID:804329 发表于 2020-7-16 16:57 | 显示全部楼层
定时器初始化计数器1ms进入一次中断服务函数,进入一次中断服务函数后让i的值加一,即每1ms进入一次中断,i值加一。因此若要1s改变一次灯状态的话,就要进入1000次中断服务函数(1s=1000ms)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表