/********************************************************************************************
* PWM波形输出实验
//单片机类型:PIC
//编程软件:MPLAB IDE
//下载软件:PIC+PRO
//编程芯片:pic16f877
//外围模块:LED
* 说明: //通过定时器0 控制 LED的亮度转换的时间(本程序设置为1s)
//PR2 控制 周期
// CCPR1L 控制 占空比
现象:灭————渐亮————最亮————渐暗————灭
* CPU型号: PIC16F877A
* 晶振: 4MHz
* 说明:
* 编程者:JinXiang_XIAO
* 编程日期:2012年2月5号
*********************************************************************************************/
////////////头文件///////////////
#include <pic.h> //调用头文件
__CONFIG(0x3F31); //芯片配置字
#define uchar unsigned char
signed int a;
bit flag=0;
/*该程序用于使CCP1模块产生分辨率为10位的PWM波形,占空比可调/
/******CCP初始化******/
void CCP1INIT(void)
{
PORTB=0xff; //高电平
TRISB=0xff; //输入
RBPU=0; /*RB端口弱上拉电路全部使能(作用在哪里呢?)*/
a=0Xff; /*由于LED的负极接IO管脚 占空比越也大 灯越暗*/
CCPR1L=a; /*255(不是256)这个数值的占空比最大*/
CCP1CON=0X0C; /*设置CCP1模块为PWM工作方式,且其工作*/
/*循环的低2位为00,高8位为11111111=FF*/
PR2=0XFF; /*设置PWM的工作周期通过公式可得周期为256us*/
TRISC=0XFB; /*设置CCP1 RC2引脚为输出方式*/
OPTION=0X07;//预分频为 1:256
INTCON=0Xa0;//GIE 置1 TMROIE 置1 TMR0IF 置0 其余的也置0
TMR0=0X3D;//附初值 等于61 (256-61)*256=49920~~50000us~~50ms
}
void interrupt TMR0INT()
{
uchar i;
TMR0IF=0;//置零
i++;
if(i==20)//说明一秒到了
{
i=0;
if(!flag)//占空比渐渐的小 就是灯渐渐的亮
a-=35;
if(flag)//占空比渐渐的大小 就是灯渐渐的暗
a+=35;
if(a<0)//占空比最小 就是最亮
{ a=0; flag=1;}
if(a>255)//占空比最大 就是最亮暗
{ a=255; flag=0;}
}
TMR0=0X3D;//赋初值
}
/*主程序*/
void main(void)
{
CCP1INIT(); /*CCP1模块的PWM工作方式初始化*/
T2CON=0X04; /*打开TMR2,且使其前分频为0,*/
/*同时开始输出PWM波形*/
while(1)
{
//RC2=0; /* 为什么启动了ccp1的功能 RC2就使用不了啊*/
CCPR1L=a;
}
/*系统开始输出PWM波形,如果*/
/*系统是多任务的,则可以在此执行其它任务,*/
} /*而不会影响PWM波形的产生*/