51-单片机---定时器0和定时器1---8位自动重装载(模式2)-16位定时计数(模式1)

  • 16位定时计数(工作方式1)

  • 初始化函数

void timer_init()
{
    TMOD |= 0x01;  
    TH0 = 0x4C;
    TL0 = 0x00;

    EA = 1;  
    ET0 = 1; 
        
    TR0 = 1;//初始化定时器运行
}

  • 初值计算
  • 假设每次中断延时delay       =50ms
  • 时钟频率(时钟周期)OSC=11.0592MHZ
  • 机器频率(机器周期)         =11.0592MHZ/12(即一个机器周期等于12倍时钟周期)
  • 即1秒钟定时器计数次数为   =11.0592MHZ/12
  • 50ms,需要的定时器计数数目为=11.0592MHZ/12/20=46080
  • 16位寄存器(TH和TL),需要预填充数目=65536-46080=19456
  •  TH= (u8)(19456 / 256)=0X4C;
     TL=  (u8)(19456% 256)=0X00;
  • 即16进制,0X4C00,即TH存0X4C,TL存0X00

  • 8位自动重装载(工作方式2)

  • 初始化函数

void init_serial()                    
{
//    TH1= -(FOSC/12/32/BAUD); //Set auto-reload vaule
//    TL1= -(FOSC/12/32/BAUD); //Set auto-reload vaule


    SCON=0x50;  
    TMOD=0x20;      
    TH1=0XFD; 
    TL1=0XFD; 


    TR1=1;           
    ES=1;      
    EA=1;      
    RS485_RW=0;
}

  • 初值计算,假设波特率9600
  • BAUD = (Timer 1溢出率)*(2SMOD/32)=(OSC/((256-TH1)*12))*(2SMOD/32)=OSC/(256-TH1)*12)*(2SMOD/32)
  • SMOD=1时波特率加倍:     = 11059200 / 12 /16 / (256-TH或TL)
  • SMOD=0时波特率不加倍: = 11059200 / 12 /32 / (256-TH或TL) 
  • 假设晶振频率为11.0592MHz,波特率为9600,SMOD=0(不加倍),TH1初值应该为多少呢?
  • TH1=TL1=256-(2SMOD*OSC)/(BAUD*32*12)
  • TH1=TL1=256-11059200/(9600*32*12)=0xFD          【253即0xFD】
  • 即:9600 = 11059200 / 12 /16 / (256-253)

你可能感兴趣的:(c/c++,嵌入式物联网)