首页 理论教育零起点学习单片机多语言编程-定时器/计数器设置与应用

零起点学习单片机多语言编程-定时器/计数器设置与应用

【摘要】:涉及乐曲编程时,就必须了解定时器/计数器的设置。一般作为定时器选用16位计数器,这时最大定时时间就是机器周期时间×65536。T/C=0为定时器方式,T/C=1为计数器方式。M1 M0是选择定时器/计数器工作模式位:定时控制寄存器其各位标志如下:MSB表示最高有效位,LSB表示最低有效位。

本实验机装有一只蜂鸣器,可以发出各种声音。涉及乐曲编程时,就必须了解定时器/计数器的设置。另外,很多实用项目也会用到它。这部分内容在本书第三章汇编语言中已经介绍过,但考虑到可能有读者直接看C语言部分,因此本节将先简单介绍一下定时器/计数器,作为C语言编程的前导。

1.定时器/计数器TC0/TC1介绍

定时器/计数器,即Timer/Counter,是8051系列单片机内的一个组件,简写为T/C。有两个相同的定时器/计数器,T/C0和T/C1。若作为定时器用,由内部机器时钟脉冲作为定时计数,累积到计满溢出停止,这个脉冲数就是定时时间。若作为计数器用,要由外部输入脉冲作为计数器,累计计数个数,累积到计满溢出停止,脉冲数就是计数个数。

一般作为定时器选用16位计数器,这时最大定时时间就是机器周期时间×65536。若晶体振荡器频率为6MHz,则定时器最大定时时间为

2μs×65536=0.13s

为了控制T/C工作,在8051系列单片机内设有关的寄存器。

(1)定时模式寄存器(TMOD)

其各位标志如下:

MSB表示最高有效位,LSB表示最低有效位。

单片机复位后,TMOD=0x00。其中,低4位控制T/C0,高4位控制T/C1。GATE是一个选通门。当GATE=0时,不管978-7-111-47138-7-Chapter04-111.jpg978-7-111-47138-7-Chapter04-112.jpg引脚是电平或低电平,均不影响定时器的选通;当GATE=1时,只有978-7-111-47138-7-Chapter04-113.jpg978-7-111-47138-7-Chapter04-114.jpg引脚为高电平,才能作为定时器选通条件之一。

T/C=0为定时器方式,T/C=1为计数器方式。

M1 M0是选择定时器/计数器工作模式位:

(2)定时控制寄存器(TCON)

其各位标志如下:

MSB表示最高有效位,LSB表示最低有效位。

单片机复位后,TCON=0x00。

TF1是T/C1的溢出标志。当T/C1计数溢出时,TF1=1。进入中断服务程序后,由硬件自动清“0”。

TR1是T/C1运行控制位。若令TR1=1,T/C1进入工作,TR1=0,T/C1停止工作,均由软件控制。

TF0是T/C0的溢出标志。当T/C0计数溢出时,TF0=1,进入中断服务程序后,由硬件自动清0。

TR0是T/C0运行控制位。若令TR0=1,T/C0进入工作,TR0=0,T/C0停止工作。均由软件控制。

IE1是外部脉冲触发中断978-7-111-47138-7-Chapter04-117.jpg请求标志位。当单片机检测到978-7-111-47138-7-Chapter04-118.jpg引脚上出现外部中断脉冲的下降沿时,则IE1=1,请求中断,进入中断服务程序后由硬件自动清0。

IT1是外部脉冲触发中断978-7-111-47138-7-Chapter04-119.jpg类型控制位。由软件设置或清除。当ITl=l时,是下降沿触发;当IT1=0时,是电平触发。

IE0是外部脉冲触发中断978-7-111-47138-7-Chapter04-120.jpg请求标志位。其功能和操作类同IE1。IT0是外部脉冲触发中断978-7-111-47138-7-Chapter04-121.jpg类型控制位。其功能和操作类同IT1。

2.【例4-39】 灯D0闪烁运行,间隔时间0.5s。用T/C0控制定时,查询方式

(1)确定定时器T/C0各SFR的内容

1)确定TMOD值。

例如,选用T/C0做定时器,工作方式选mode1,即16位定时器,则TMOD=00000001B=0x01。

2)计算定时常数TH0/TL0。

例如,定时时间设为0.5s。在晶体振荡器频率为6MHz时T/C0的最大定时时间只达到0.13s,但可用软件达到要求。T/C0定时时间选T/C0=0.1s,靠软件重复5次,总定时时间T=5×0.1=0.5s。设定时常数为T0,则

T0=216-定时时间(μs)/机器周期(μs)

T0=65536-(100×103/2)

=65536-50000

=15536

实际上,T0就是一个预设计数值。15536+50000=65536,刚好计满产生溢出,表示定时时间到。因为T/C0是由2个8位定时器组成,必须将T0分解为高8位TH0和低8位TL0,即

TH0=15536/256=60=0x3C

TL0=15536-(256×60)=176=0xB0也可以用C语言列出表达式:

TH0=(65536-100×103/2)/256=60=0x3C

TL0=(65536-100×103/2)%256=176=0xB0

3)确定TCON值。(www.chuimin.cn)

TCON=00H,其TR0在软件中设置,TF0在软件中检测。

(2)编辑C语言源程序

(3)编译

(4)执行

1)软仿真。调试的方法是根据T/C0内容,通过人工施加变化控制定时器溢出标志位TF0的状态,观察程序的执行。操作如下:

①进入软仿真状态,调出端口P1状态窗口。

②单击“外部设备”→Timer→Timer0,调出定时器T/C0窗口。

③单击“跟踪”,执行到第9语句,Timer 0的定时常数已设定。但由于TF0=0,程序在此停留等待。人工置TF0=1,即“√”,表示定时器溢出。

④单击“跟踪”,进入a=a+1=0+1=1。当进入语句17、18、19,重置后,TF0=0。再次进入TF0查询状态。

⑤重复以上操作,直到变量a=5,灯D0取反,D0=0,D0点亮。

⑥在T/C0处于运行状态时,若直接由TL0/TH0增加到溢出,一直单击“跟踪”,这要消耗约几小时的时间。要解决这个问题,必须让TF0=1,人工产生定时器T/C0溢出。

⑦从第11语句开始执行,完成一次循环后,a=a+1。再次设TF0=1进入下一次循环,直到a=0x05。

⑧由于a=0x05,执行语句14,D0取反,同时a=0。

程序又返回到第9语句,重新开始下一次循环。这样连续执行,每隔0.1×5=0.5s,灯D0变化一次。

2)下载到实验机 程序执行后,灯D0闪烁,间隔0.5s。

(5)程序点评

在本例中,充分利用了调试的方法,对程序的走向,变量的控制进行了详细的仿真。在不涉及硬件条件下,检验了程序的运行。为实际硬件执行创造了条件。

3.【例4-40】 利用定时器T/C0做方波发生器,占空比为50%,频率为1kHz,查询方式

(1)确定定时器T/C0各SFR的内容

1)确定TMOD值。

选用T/C0做定时器。工作方式选mode1,即16位定时器。TMOD=0000 0001B=0x01。

2)计算定时常数。

要求P2.7输出频率f=1kHz,周期T=1/1kHz=1ms,占空比50%,据此定时器的定时时间应为1ms/2=0.5ms。设定时常数为T0,有

T0=65536-(0.5×103/2)

=65536-250

=65286

因为T/C0是由2个8位定时器组成,必须将T0分解为高8位TH0和低8位TL0,即

TH0=65286/256=255=0xFF

TL0=65286-(256×255)=65286-65280=0x06

3)确定TCON值。

其中TR0作为T/C0的启动在程序中设置,TF0由溢出决定,TCON初值仍为00。

(2)编辑C语言源程序

(3)编译

(4)执行

1)软仿真。本例与上例基本相同,若上例已经理解,本例可略去调试。

2)下载到目标机。程序执行后,蜂鸣器发出1kHz音频声。单击“RST”,可模拟莫尔斯电码发报。

(5)程序点评

本例练习定时器发声,采用查询方式。