- #include <htc.h>
- #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 <htc.h>
- #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;
- }
- }
联系客服