用单片机产生pwm,有没有大神讲下它是怎么产生pwm的,中断是如何运行的,中断是如何被调用的呢

用单片机产生pwm,有没有大神讲下它是怎么产生pwm的,中断是如何运行的,中断是如何被调用的呢#include <STC12x5A60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar code pwm[54]={255,240,226,211,196,182,168,154,141,128,115,103,91,80,69,59,50,42,34,27,20,15,10,6,3,1,0,
0,1,3,6,10,15,20,27,34,42,50,59,69,80,91,103,115,128,141,154,168,182,196,211,226,240,255
}; // 反正弦变化
int index=0;
sbit P13=P1^3; //PCA模块0输出
sbit P14=P1^4; //PCA模块1输出

bit zf=0; //前后半周期标志
void init_pca(void)//pca计数器初始化函数
{
CMOD=0x02;//计数器0的溢出为PCA计数器的时钟源,允许pca中断使能
CCON=0x00;
CCAPM0=0x42;//8位PWM输出,无中断
CCAPM1=0x42;//8位PWM输出,无中断
CL=0x00;//清零pca计数器
CH=0x00;
CCAP0L=pwm[0]; //初始化spwm输出的占空比
CCAP0H=pwm[0];
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0];
CR=1;//运行pca计数器
}
void init_timer(void)//计数器初始化函数
{
TMOD= 0x01; //计数器0工作在方式模式1
TH0 = 0XF7;//T1的计数值为2048,若是11.0592M晶振,则中断频率为11.0592M/2048=5.4K
TL0 = 0xFF; //T1的计数值低位
AUXR=0xC0;//计数器均工作在1T模式。计数频率11.0592M
ET0 = 1; //开中计数器0断
TR0 = 1; //开启计数器0
}
void int_timer0(void) interrupt 1//计数器1中断函数
{
TH0=0xF7; //重装计数值
TL0=0xFF;
index++; //查表索引

if(index==54) //半周期转换,每半周期分为60份
{
CR=0; //关PCA计数
index=0;
zf=~zf; //半周期标志,zf=0,前半周期,zf=1,后半周期
if(zf) //设置后半周期
{
P13=0;
CCAPM0=0X00; //关闭模块0
CCAPM1=0X42; //设置模块1工作方式
}
else //设置前半周期
{
P14=0;
CCAPM1=0X00; //关闭模块1
CCAPM0=0X42; //设置模块0工作方式
}
CR=1; //开PCA计数
}

if(zf==0) //将下一小格的占空比赋给相应值
{
CCAP0H=pwm[index];
}
else
{
CCAP1H=pwm[index];
}
}
void main(void)
{
P14=0;
P13=0;
EA=1;//开总中断
init_pca();
init_timer();
while(1)//主循环
{
}
}

第1个回答  2016-07-04
你这段代码的意思很简单。
所谓PWM 就是 高电平和 低电平,所以你这有定义一个IO拉高拉低

占空比,就是高电平和低电平的比例。

所以,我们需要控制高电平 和 低电平的时间。

那么,CCAP0L=pwm[0]; //初始化spwm输出的占空比
CCAP0H=pwm[0];
CCAP1L=pwm[0]; //初始化spwm输出的占空比
CCAP1H=pwm[0]

就是定义了0 1两个定时器,

一个给高电平,一个给电平。

好,现在高低电平时间都有了,波形也就出来了追问

能具体的讲下这些语录怎么实现这些功能的吗0.0新人不太懂

追答

说成这样还不懂啊……

sbit P13=P1^3;

P13= 0, 现在波形是低电平了。

定时器1 ,延时……
到点了
P13=1; 现在是高电平了。

定时0 , 延时……
到点了,
回到
P13= 0,
这再看不懂你缺的就不是要解释这个了,你是单片机的相关都要补啊

追问

确实单片机这块都不懂。。。是这会学校有个答辩要用这个比较急。。这几天在恶补。。这个怎么从这个程序看它设置的pwm占空比是多少呢0.0

本回答被提问者和网友采纳