如何在AT89S51系统中编程实现方波?

在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);
}