一、编写程序,使用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/resonator4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out resetuint8 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;
}
}
【PIC单片机-PWM波】 电路接法:
文章图片
二、编写程序,实现呼吸灯 利用上述程序,动态改变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/resonator4M以上晶振选择HS高速
//PWRTDIS:disable power up timer
//BOREN_OFF:disable brown out resetuint8 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 定时器中断1(外设中断)
- PIC之休眠问题
- PIC单片机之看门狗
- PIC单片机之SPI从机框架
- PIC CCP_PWM 呼吸灯
- PIC单片机之PWM
- 关于PIC16F877A PWM计算的问题
- PIC单片机|PIC单片机的PWM波的简单调制+proteus仿真实现直流电机的启动