编程语言应用

注册

 

发新话题 回复该主题

自学单片机第五十五篇定时器定时1秒程序 [复制链接]

1#
北京白癜风医院 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/

先看下的步骤,按照步骤写出代码。

1,晶振是12M。

2,一个机器周期时间是1微秒。

3,定时最小分度为50毫秒。

4,所需的初始值是.

5,计算出对应初始值的十六位十六进制数是:0x3CB0

6,得出TH0=0x3C,TL0=0xB0。

7,工作模式是定时器,工作方式是16位定时。TMOD=0x01。

8,打开T0定时器开关,ET0=1;TR0=1;

9,打开中断总开关,EA=1;

10,设置中断响应函数。voidT0_Routine()interrupt1{}

打开软件,开始写程序。

(经过一段时间,程序写完了)

首先是定义一个用于显示中断的LED灯,通过控制闪烁来让我们看到定时器的工作。

然后是一个用来计算进入定时器多少次的变量,因为我们定时一次是50毫秒,而需要定时一秒的时间,就要定时20次才行,所以需要一个变量,来累积,查着是否到了20次,也就是1秒。

主函数就是设置中断的参数。

然后是中断函数,需要注意,每次进入中断都需要对初始值进行重新赋值,不然进入中断后的TH0和TL0是空的,都是0x00,会导致计数出现错误,进而定时不正确。

定时函数中需要写入中断完成需要响应的函数,不然就无法动作。

当然也可以进行其他设置。

写完后通过仿真看下效果。

示波器中的波形就是小灯的输出波形,一个是0.25秒,可以看出一个高电位占了四格,也就是1秒,小灯是亮1秒灭1秒。很精确的。

看完这个案例,有没有什么想法呢?

第一个就是为什么定义变量要定义到最开始,而不是定义到中断中呢?

第二个是定时器的函数只能在定时器中书写吗?

第三个是定时器还有其他用途吗?

首先看第一个问题,为什么定义变量要定义到最开始,而不是定义到中断中呢?

在主程序中,一般都是把用到的变量定义到主程序的内部,为什么这回吧变量定义到了最开始呢?主程序也没有用,只有中断程序用到了,不用定义全局变量的。当我们把这个变量定义到中断中,会发生什么呢?

PWM调速器电机马达速度调节单片机开发脉冲调制器小型调光淘宝¥13购买已下架

有兴趣可以测试下,会发现,中断没有输出,为什么会发生这种情况?

可以这么理解一下,当程序进入中断后,会逐句运行,首先是运行变量的赋值i=0;然后是高低八位数据的重置,接着是i++,累积次数,然后是判断i是否达到要求,因为此时等于1,所以没有达到要求,就退出中断了,主程序继续运行。然后时间到,进入中断,进入中断后,就又是对变量i赋值i=0,这时问题就来了,我们如果每进入一次中断,就赋值一次,那么到什么时候,也无法加到20,也就无法完成led=~led这句指令,对外就无法输出。

那就没有办法了吗?一个内部变量,定义到全局,会占用系统资源,明显的其他程序用不到,只有中断才能用到。

是有办法可以解决的,在编程中,有这样一个方法,当我们定义完变量后,不希望再次读取该变量时,变量被重复赋值的话,可以使用一个关键字,用来说明这个变量是静态变量,仅定义一次,无需再次赋值,就是说,这个变量的赋值,只会在第一次进入程序时赋值一次,之后就不会再初始化了。

这个关键字是“static”,如果把赋值语句前加上static,就会收获不一样的效果。

当我们再次运行程序时,就会发现输出正常了,因为尽管不断的进入中断,但对于staticunsignedchari=0这条语句,只在第一次进入时读取了一次,其他时间,进入中断,都不再做出反应了。这样以后的i就正常累积了。到了20,才会归零。

这就是为什么普通的定义变量只能放在最前边了。

分享 转发
TOP
发新话题 回复该主题