在AT89S51系统中,已知震荡频率是6MHz,用定时器/计数器T1采用定时器方式1实现从P1.1产生周期4ms的方波,编程实现,并计算出TMOD和定时器T1初值,初值用16进制表示。
#include <reg51.h>
sbit OUT = P1^1;
// 定时器中断初始化
void timer1_init()
{
EA = 0;
TMOD = 0X11;
TH1 = (65535-10000)/256;
TL1 = (65535-10000)%256;
ET1 = 1;
TR1 =1;
EA = 1;
}
// 定时器中断
void timer1() interrupt 3
{
TH1 = (65535-10000)%256;
TL1 = (65535-10000)%256;
OUT = ~OUT;
}
void main()
{
void timer1_init();
while(1)
{
}
}
参考
6M晶振的机器周期(12分频)是500K(0.5M),也就是一个周期2uS,4mS周期方波需要每2mS翻转一次,也就是1000个周期,因此定时器计数初值为,65536-1000,即0xFC18,高字节FCH,低字节18H
#include <reg51.h>
sbit SW_OUT = P1^1;
// 定时器初始化
void timer1_init()
{
EA = 0;
TMOD = 0x10; // T1选择方式1
TH1 = 0xFC; // 定时器初始值高字节
TL1 = 0x18; // 定时器初始值低字节
ET1 = 1;
TR1 =1;
EA = 1;
}
// 定时器中断
void timer1() interrupt 3
{
TH1 = 0xFC;
TL1 = 0x18;
SW_OUT = ~SW_OUT;
}
void main()
{
void timer1_init();
while(1);
}