#define MAIN_Fosc 11059200L //定义主时钟
#include "15W4KxxS4.H"
#define uint16 unsigned int
#define uint8 unsigned char
/**************************************
功能描述:延时函数
入口参数:uint16 x ,该值为1时,延时1ms
返回值:无
***************************************/
void delay_ms(uint16 x)
{
uint16 j,i;
for(j=0;j<x;j++)
{
for(i=0;i<1100;i++);
}
}
/**************************************************************************************
功能描述:对PWM3和PWM3进行初始化
入口参数:无
返回值:无
**************************************************************************************/
void PWM2PWM3_Configuration(void)
{
PWMCFG &= 0xBF; //将CBTADC位置0,即PWM计数器归零时不触发ADC转换
PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零
P_SW2 |= 0x80; //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
//对PWM2的初始化部分
PWM2CR |= 0x08; //将PWM2_PS位置1,选择PWM2的输出引脚是P2.7
PWMCR |= 0x01; //将ENC2O位置1,PWM2的端口为PWM输出口,受PWM波形发生器控制
PWMCFG &= 0xFE; //将C2INI位置0,设置PWM2输出端口的初始电平为低电平
PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零
PWM2CR |= 0x04; //将EPWM2I位置1,使能PWM2中断
PWM2CR &= 0xFD; //将EC2T2SI位置0,关闭T2翻转时中断
PWM2CR &= 0xFE; //将EC2T1SI位置0,关闭T1翻转时中断
//对PWM3的初始化部分
PWM3CR |= 0x08; //将PWM3_PS位置1,选择PWM3的输出引脚是P4.5
PWMCR |= 0x02; //将ENC3O位置1,PWM3的端口为PWM输出口,受PWM波形发生器控制
PWMCFG &= 0xFD; //将C3INI位置0,设置PWM3输出端口的初始电平为低电平
PWMIF &= 0xFD; //将C3IF位置0,PWM3中断标志位,需软件清零
PWM3CR |= 0x04; //将EPWM3I位置1,使能PWM3中断
PWM3CR &= 0xFD; //将EC3T2SI位置0,关闭T2翻转时中断
PWM3CR &= 0xFE; //将EC3T1SI位置0,关闭T1翻转时中断
//对PWM2和PWM3翻转计数器赋初值
PWM2T1 =1; //赋值PWM2第一次翻转计数器值
PWM2T2 = 0x00FA; //赋值PWM2第二次翻转计数器值
PWM3T1 =1; //赋值PWM3第一次翻转计数器值
PWM3T2 = 0x00FA; //赋值PWM3第二次翻转计数器值
//对PWM波形发生器时钟源进行初始化
PWMCKS |= 0x10; //将SELT2位置1,PWM时钟源为定时器2溢出脉冲
PWMC = 0x00FA; //PWM计数器赋值(同时对PWMCH和PWMCL进行了赋值)
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
P_SW2 &= 0x7F; //将EAXSFR位置0,恢复访问XRAM
//PWM外部异常控制寄存器的操作
PWMFDCR &= 0xDF; //将ENFD位置0,关闭PWM外部异常检测功能
PWMFDCR &= 0xF7; //将ENDI位置0,关闭PWM异常检测中断
PWMFDCR &= 0xFB; //将FDCMP位置0,比较器与PWM无关
PWMFDCR &= 0xFD; //将FDIO位置0,P2.4的状态与PWM无关
PWMFDCR &= 0xFE; //将FDIF位置0,PWM异常检测中断标志位,需软件清零
IP2 |= 0x40; //将PPWM位置1,使能PWM中断为最高优先级中断
//使能PWM波形发生器
PWMCR |= 0x80; //将ENPWM位置1,使能PWM波形发生器,PWM计数器开始计数
PWMCR &= 0xBF; //将ECBI位置0,禁止PWM计数器归零中断
}
/***************************************************************************
* 描 述 : PWM中断服务函数
* 入 参 : 无
* 返回值 : 无
**************************************************************************/
void PWM(void) interrupt PWM_VECTOR using 1
{
PWMIF &= 0xBF; //将CBIF位置0,PWM计数器归零中断标志位,需软件清零
PWMIF &= 0xFE; //将C2IF位置0,PWM2中断标志位,需软件清零
PWMIF &= 0xFD; //将C3IF位置0,PWM3中断标志位,需软件清零
}
/********************************************************
功能描述:主函数
入口参数:无
返回值:无
*********************************************************/
int main()
{
uint8 flag=1;
uint16 ledpwmval=0;
/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
// 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
//相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
// P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////
P2M1 &= 0x7F; P2M0 &= 0x7F; //设置P2.7为准双向口
P4M1 &= 0xDF; P4M0 &= 0xDF; //设置P4.5为准双向口
PWM2PWM3_Configuration(); //初始化PWM2和PWM3口
EA = 1; //允许总中断
while(1)
{
delay_ms(100); //延迟每次指示灯亮度的时间,更方便观察实验现象
if(flag) //如果标识符为1则递增变量ledpwmval
ledpwmval++;
else //如果标识符为0则递减变量ledpwmval
ledpwmval--;
if(ledpwmval>248) //如果变量ledpwmval递增到一定值则控制标识符为0,以实现ledpwmval递减
flag=0;
if(ledpwmval==1) //如果变量ledpwmval递减到一定值则控制标识符为1,以实现ledpwmval递增
flag=1;
P_SW2 |= 0x80; //将EAXSFR位置1,以访问PWM在扩展RAM区的特殊功能寄存器
PWM2T1 =(uint16)ledpwmval; //赋值PWM2第一次翻转计数器值(不断变化值)
PWM2T2 = 0x00FA; //赋值PWM2第二次翻转计数器值(定值)
PWM3T1 =(uint16)ledpwmval; //赋值PWM3第一次翻转计数器值(不断变化值)
PWM3T2 = 0x00FA; //赋值PWM3第二次翻转计数器值(定值)
P_SW2 &= 0x7F; //将EAXSFR位置0,恢复访问XRAM
}
}
|