61单片机项目 - 定时器Timer A/B

实现功能:设置不同的计数初值、不同的占空比和不同的时钟源,IOB8和一个发光二极管连接,用户通过观察二极管点亮的持续时间和熄灭持续的时间观察信号波形的占空比变化和频率。

实验现象:计数初值不同、占空比不同、时钟源不同,发光二极管的亮灭状态变化就不同。

拓展:使用汇编语言实现TimerB定时器实验:当输入时钟源频率分别为Fosc/2、Fosc/256、32768HZ、8192HZ、4096HZ时观察输出频率,设置不同的计数初值,使得每次的计数时间都为2s.

这个地方,大家需要了解定时器的机制就可以明白了

#include "SPCE061A.H"
#define	uint unsigned int
int main()
{
    //if is Fosc/2(其余的可以自行改写计时器初始的值(间隔时间为1S))
    uint count = 0;
    uint is = 0;
    *P_IOA_Dir = 0xffff;
    *P_IOA_Attrib = 0xffff;
    *P_IOA_Data = 0x0000;
    *P_TimerA_Ctrl = C_TMA1_FOSC_2 + C_TMA_PWM_D2;
    *P_TimerA_Data = 0xf9ff;
    *P_INT_Ctrl = C_IRQ1_TMA;
    asm("INT OFF");//这个汇编函数的使用时为了禁止开启中断函数,不是禁止开启中断
    while(1)
    {
        if(*P_INT_Ctrl & C_IRQ1_TMA)
        {
            count ++;
            *P_INT_Clear = C_IRQ1_TMA;
        }
        if(count == 8000 * 2)
        {
            count = 0;
            is = !is;
            *P_IOA_Data = is;
        }
        *P_Watchdog_Clear = C_WDTCLR;
    }
    return 0;
}

#include "SPCE061A.H"/此处的间隔时间为1S测试的计时器的频率为Fosc/256
#define uint unsigned int
#define uint unsigned char
int main()
{
    uint rev = 0x0000,ncount = 0x0000;
    *P_IOA_Dir = 0x00ff;
    *P_IOA_Attrib = 0x00ff;
    *P_IOA_Data = 0x0000;
    *P_TimerA_Data = 0xfc17;
    *P_TimerA_Ctrl = C_TMA1_FOSC_256 + C_TMA_PWM_D3;
    *P_INT_Ctrl = C_IRQ1_TMA;
    asm("INT OFF");
    while(1)
    {
        if(*P_INT_Ctrl & C_IRQ1_TMA)
        {
            ncount ++;
            *P_INT_Clear = C_IRQ1_TMA;
        }
        if(ncount == 48 * 4)
        {
            ncount = 0;
            rev = ~rev;
            *P_IOA_Data = rev;
        }
        *P_Watchdog_Clear = C_WDTCLR;
    }
    return  0;
}
#include "SPCE061A.H"//以时基信息为频率(间隔为2S)
#define uint unsigned int
#define uint unsigned char
int main()
{
    uint rev = 0x0000,ncount = 0x0000;
    *P_IOA_Dir = 0x00ff;
    *P_IOA_Attrib=0x00ff;
    *P_IOA_Data=0x0000;
    *P_TimeBase_Setup=0x0000;
    *P_TimerA_Data=0xfffb;
    *P_TimerA_Ctrl=C_TMA_PWM_D3+C_TMA2_TMB1+C_TMA1_1;
    *P_INT_Ctrl=C_IRQ1_TMA;
    asm("INT OFF");
    while(1)
    {
        if(*P_INT_Ctrl&C_IRQ1_TMA)
        {
            ncount++;
            *P_INT_Clear=C_IRQ1_TMA;
        }
        if(ncount==4)
        {
            ncount=0;
            rev=~rev;
            *P_IOA_Data=rev;
        }
        *P_Watchdog_Clear=C_WDTCLR;
    }
    return  0;
}



你可能感兴趣的:(61单片机项目 - 定时器Timer A/B)