方波频率的检测和倍频的程序

 

#include

#include

#define uchar unsigned char

#define uint unsigned int

/*输出给舵机的控制信号:周期18ms,脉宽由原始控制信号输入脉宽和陀螺反馈输入脉宽计算得到的

方波*/

sbit P1_2=P1^2;

//sbit EXF2=T2CON^6;                    /*T2外中断标志位*/

uchar flag_int0;                        // 外中断输入的标志位

uint HELMNUM=0;                 /*存放输出给舵机的控制信号的脉宽时间*/

uchar N;                            // 定时器溢出次数

uchar time_sgn;                     // 输入方波的周期变量

uchar T1H,T1L;                      // 定时器T1的高低位变量

 

main()

{

/*初始化:打开INT0INT1T2,设置T2的优先级为最高*/

// 这是因为T2所记录的中断是输出信号的控制周期,所以其优先有必要设为最高。

    EA=1;  IT0=1; IT1=1;

    EX0=1; EX1=1; ET2=1;

T2CON=0x08;         /*设置T2工作方式:允许接收P1.1引脚的下降沿中断,计数器停止*/

    TMOD=0x99;          /*设置T0T1工作方式:门控方式1定时*/

    TR0=1; TR1=1;

    for (;;);

}

// 外中断0的控制T1计数子程序

void int0svr(void) interrupt 0 using 1

{

if (flag_int0==1)

{

flag_int0=0;

T1H=TH1;

T1L=TL1;

time_sgn=N*65536+T1H*256*T1L;

TH1=0;

TL1=0;

}

if (flag_int0==0)

{

flag_int0=1;

TH1=0;

TL1=0;

TR1=1;

}

}

 

// T1计数子程序

void timer1(void)  interrupt 3 using 1

{

TH1=0;                          // 定时器T1的高四位赋值

TL1=0;                          // 定时器T1的低四位赋值

N=N+1;                          // 定时器的溢出次数

}

 

/* 定时计数器2的中断服务子程序 */

void timer2(void) interrupt 5 using 3

{

// 判断中断类型:EXF2=1时为P1.1引脚下降沿触发的中断;TF2=1T2定时时间到触发的中断

if (TF2)

    {

        TF2=0;

        TH2=- (time_sgn /4)/256;

        TL2=- (time_sgn /4)%256;

        T2CON=0x0c;

    }

P1_2=!P1_2;

}

你可能感兴趣的:(timer,include,工作,c)