设MCS51单片机的晶振fosc=6MHz,试对定时器T1初始化,使之工作在模式2,产生200微秒的定时,并用查询T1溢出标志位的方法,控制P1.0输出周期为2ms的方波。 (1)初值计算
时间: 2024-06-02 15:14:21 浏览: 101
定时器T1工作在模式2下,计算计数器的初值需要使用以下公式:
初值 = 65536 - (定时时间 / Tclk)
其中,定时时间为所需的定时时间(单位为秒),Tclk为定时器T1的时钟周期,等于晶振频率fosc除以12。
将200微秒转化为秒,得到定时时间为0.0002秒。将fosc除以12得到Tclk为500kHz。
代入公式得到初值:
初值 = 65536 - (0.0002 / 0.0000020833) = 54560
因为初值需要用两个8位寄存器TH1和TL1组成,所以需要将54560转化为16进制,得到D550H。
(2)控制P1.0输出周期为2ms的方波
通过查询T1溢出标志位,可以判断定时器T1是否达到设定的定时时间。当T1溢出时,TH1和TL1会自动重装初值,计数器重新开始计数。
根据题目要求,控制P1.0输出周期为2ms的方波,即需要每隔2ms将P1.0的输出状态取反一次。因此,可以在T1溢出时,在中断服务程序中将P1.0状态取反。
具体实现代码如下:
#include <reg51.h>
#define FOSC 6000000L // 晶振频率
#define T1MS (65536-FOSC/12/1000) // 1ms定时器初值
#define T200US (65536-FOSC/12/5000) // 200us定时器初值
sbit LED = P1^0; // 定义LED控制引脚
void T1_Init(void)
{
TMOD |= 0x10; // 设置T1为模式2
TH1 = T200US / 256; // 设置T1初值
TL1 = T200US % 256;
ET1 = 1; // 允许T1中断
TR1 = 1; // 启动T1
}
void T1_ISR(void) interrupt 3
{
TH1 = T200US / 256; // 重新设置T1初值
TL1 = T200US % 256;
LED = ~LED; // 取反LED状态
}
void main()
{
T1_Init(); // 初始化定时器T1
EA = 1; // 开启总中断
while(1); // 程序循环
}
阅读全文