如何在AT89S517中编程实现方波

在AT89S51系统中,已知震荡频率12MHz,用定时器/计数器T1实现从P1.1产生高电平宽度是10ms,低电平宽度20ms的矩形波,编程实现,计算TMOD和定时器T1初值

参考这个看看咯:
1.时钟频率12MHz,一个机器周期1us,在计算TH1和TL1的初值的时候定时多少微秒直接用定时器最大值减去多少微秒,再分别给TH1和TL1赋值
2.利用定时器T1中断,那么TMOD应赋值为0x10,并且选择TH1和TL1以及TR1还有中断号3
3.高电平宽度为10ms,低电平宽度为20ms的矩形波,一个矩形波周期为30ms,最小时间单位为10ms,因此定时中断使用10mS,初值即为 (65536-10000)=0xB1E0,并在里面做计数进行高低电平的切换

#include<reg51.h>
 
sbit SW_OUT=P1^1;
unsigned int out_cnt=0;
void main()
{
    TMOD=0x10;// TMOD初始值,定时器T1做16位计数器使用
    TH1=0xB1;//(65536-10000)/256,定时器T1初值 最小时间单位为10ms,即10000us
    TL1=0xE0;//(65536-10000)%256
    EA=1;//允许总中断
    ET1=1;//允许T1中断
    TR1=1;//启动T1,开始计数
    SW_OUT=1;//初始化高电平
    while(1);
}
// 实现10mS高电平,20mS低电平
void timer1_inter() interrupt 3
{
    TH1=0xB1;//重装初值
    TL1=0xE0;
    out_cnt++;
    if(out_cnt==1)
    {
        SW_OUT = 0;//第一次中断发生,取反置低电平
    }
    if(out_cnt==3)
    {
        SW_OUT = 1;//取反置高电平
        out_cnt=0;//并重置计数为0
    }
}