×
单片机 > 单片机程序设计 > 详情

PIC单片机-PWM波

发布时间:2020-08-25 发布时间:
|

一、编写程序,使用RC2的PWM功能生成频率250Hz的正弦波

#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

uint8 gDutycount = 0;

const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,

                            100, 95, 90, 85, 80, 75, 70, 65, 60, 55,

                            50, 45, 40, 35, 30, 25, 20, 15, 10, 5,

                            0, 5, 10, 15, 20, 25, 30, 35, 40, 45

                           };

 

/*******************************************************************************

* 函 数 名: PWM_Init(void)

* 函数功能: PWM初始化设置

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void PWM_Init(void)

{

    CCPR1L = 0x7F;      //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的

    CCP1CON = CCP1CON | 0x3C;   //CCP1[5:4] = 11

    TRISC2 = 0;         //设置RC2为输出模式

}

 

/*******************************************************************************

* 函 数 名: Time2_Init(void)

* 函数功能: 定时器2初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void Time2_Init(void)

{

    T2CON = 0x0C;       //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1

    PR2 = 255;          //正弦波周期为250Hz

    TMR2IF = 0;         //定时器2中断标志位清零

    GIE = 1;            //开总中断

    PEIE = 1;           //开外设中断

    TMR2IE = 1;         //开定时器中断

}

 

/*******************************************************************************

* 函 数 名: main(void)

* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void main(void)

{

    PWM_Init();

    Time2_Init();

    while(1)

    {

    }

}

 

/******************************************************************************

* 函 数 名: Timer2_ISR(void)

* 函数功能: 中断函数

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Timer2_ISR(void)

{

    if(TMR2IF)

    {

        ++gDutycount;

        if(gDutycount == 39)

        {

            gDutycount = 0;

        }

        CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期

        TMR2IF = 0;

    }

}

电路接法:

二、编写程序,实现呼吸灯

利用上述程序,动态改变PWM占空比,以实现动态改变LED供给电压的大小,加以适当延时,即可实现呼吸灯。


跳线接法:取下RC2和RD0的短接帽,用杜邦线一头接RC2里面,一头接RD0外面,再短接P14。


#include

 

#define uint8 unsigned char

#define uint16 unsigned int

 

__CONFIG(FOSC_HS &WDTE_OFF &BOREN_OFF &PWRTE_OFF &LVP_OFF); //设置配置位

//WDTE_OFF:disable watchdog timer       看门狗禁止

//LVP_OFF:low voltage programming disabled  低电压编程禁止

//FOSC_HS:high speed crystal/resonator  4M以上晶振选择HS高速

//PWRTDIS:disable power up timer

//BOREN_OFF:disable brown out reset

 

uint8 gDutycount = 0;

uint16 count = 0 ;

const char SINETABLE[40] = {50, 55, 60, 65, 70, 75, 80, 85, 90, 95,

                            100, 95, 90, 85, 80, 75, 70, 65, 60, 55,

                            50, 45, 40, 35, 30, 25, 20, 15, 10, 5,

                            0, 5, 10, 15, 20, 25, 30, 35, 40, 45

                           };

 

/*******************************************************************************

* 函 数 名: PWM_Init(void)

* 函数功能: PWM初始化设置

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void PWM_Init(void)

{

    CCPR1L = 0x7F;      //初始值,通过调节CCPR1L:CCP1[5:4]的值来达到调节占空比的目的

    CCP1CON = CCP1CON | 0x3C;   //CCP1[5:4] = 11

    TRISC2 = 0;         //设置RC2为输出模式

}

 

/*******************************************************************************

* 函 数 名: Time2_Init(void)

* 函数功能: 定时器2初始化

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void Time2_Init(void)

{

    T2CON = 0x0C;       //启用后分频器,分频比1:2,TIMER2计数允许,前置分频器分频比1:1

    PR2 = 255;          //正弦波周期为250Hz

    TMR2IF = 0;         //定时器2中断标志位清零

    GIE = 1;            //开总中断

    PEIE = 1;           //开外设中断

    TMR2IE = 1;         //开定时器中断

}

 

/*******************************************************************************

* 函 数 名: main(void)

* 函数功能: 用PWM输出,调节占空比来调节LED灯的亮度

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

void main(void)

{

    PWM_Init();

    Time2_Init();

    while(1)

    {

    }

}

 

/******************************************************************************

* 函 数 名: Timer2_ISR(void)

* 函数功能: 中断函数

* 入口参数: 无

* 返    回: 无

*******************************************************************************/

 

void interrupt Timer2_ISR(void)

{

    if(TMR2IF)

    {

        ++count;

        if(count == 75)

        {

            ++gDutycount;

            if(gDutycount == 39)

            {

                gDutycount = 0;

            }

            CCPR1L = SINETABLE[gDutycount]; // 根据sin表改变PWM波周期

            count = 0;

        }

        TMR2IF = 0;

    }

}


关键字:PIC单片机  PWM波 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
AVR单片机语音识别电路模块设计